Qrb3000VirtualBoxHandler.java 5 KB
package com.example.mina.box.qrb3000;

import com.example.mina.base.AbstractVirtualBoxHandler;
import com.example.mina.entity.Qrb3000DataBuffer;
import com.example.mina.util.CommandHelper;
import com.example.mina.util.LogUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.mina.core.session.IoSession;

/**
 * @author dy
 * @date 21/03/05
 */
@Slf4j
public class Qrb3000VirtualBoxHandler
        extends AbstractVirtualBoxHandler<Qrb3000RequestMessage, Qrb3000ResponseMessage> {

    private Qrb3000DataBuffer dataBuffer;

    @Override
    protected void initMatrix() {

        int row = 100;
        int col = 100;
        int maxAttenuate = 63;

        dataBuffer = new Qrb3000DataBuffer(row, col, maxAttenuate);
    }

    @Override
    protected Qrb3000ResponseMessage handleMessage(Qrb3000RequestMessage message) {
        String cmd = new String(message.getInput()).trim();

        log.info("qrb3000VirtualBoxHandler receive: {}", cmd);

        byte[] buffer;

        int len = message.getReadNum();

        //F: Firmware Version / Unit ID  Page 82
        //02 XX XX 46 03 XX
        //response
        //06 XX XX 46 76 37 2E 30 30 20 50 76 32 2E 31 35 20…
        //ACK ADR ADR F v 7 . 0 0 P v 2 . 1 5 …
        //…58 52 4D 32 32 35 30 2F 30 33 32 58 30 33 32 3 XX
        //… X R M 2 2 5 0 / 0 3 2 X 0 3 2 ETX CHK

        if (len == 6) {
            buffer = new byte[]{0x06, 0x30, 0x30, 0x46, 0x76, 0x37, 0x2E, 0x30, 0x30, 0x20, 0x50
                    , 0x76, 0x32, 0x2E, 0x31, 0x35, 0x20, 0x58, 0x52, 0x4D, 0x32, 0x32, 0x35, 0x30
                    , 0x2F, 0x30, 0x33, 0x32, 0x58, 0x30, 0x33, 0x32, 0x3, 0x00};
            return Qrb3000ResponseMessage.builder().result(buffer).build();
        }

        if (len == 8) {
            switch (message.getInput()[0]) {
                case 0x30:
                    LogUtils.println(String.format("setAttenuation: %d, %d, %d", CommandHelper.BCD_REV[message.getInput()[3]], CommandHelper.BCD_REV[message.getInput()[4]], message.getInput()[5]));
                    dataBuffer.setAttenuation(CommandHelper.BCD_REV[message.getInput()[3]], CommandHelper.BCD_REV[message.getInput()[4]], message.getInput()[5]);
                    buffer = new byte[8];
                    buffer[0] = message.getInput()[0];
                    buffer[1] = message.getInput()[1];
                    buffer[2] = message.getInput()[2];
                    buffer[3] = message.getInput()[3];
                    buffer[4] = message.getInput()[4];
                    buffer[5] = (byte) dataBuffer.getAttenuation(CommandHelper.BCD_REV[message.getInput()[3]], CommandHelper.BCD_REV[message.getInput()[4]]);
                    buffer[6] = (byte) 0xAA;
                    buffer[7] = (byte) 0xAA;
                    return Qrb3000ResponseMessage.builder().result(buffer).build();

                case 0x68:
//                    dataBuffer.setOffset(Qrb3000CommandHelper.BCD_REV[message.getInput()[3]], random.nextInt(120) - 60 );

                    buffer = new byte[8];
                    buffer[0] = message.getInput()[0];
                    buffer[1] = message.getInput()[1];
                    buffer[2] = message.getInput()[2];
                    buffer[3] = message.getInput()[3];
                    buffer[4] = 0x00;//TODO
                    buffer[5] = 0x00;//TODO
                    buffer[6] = (byte) dataBuffer.getOffset(CommandHelper.BCD_REV[message.getInput()[3]]);
                    buffer[7] = (byte) 0xAA;
                    return Qrb3000ResponseMessage.builder().result(buffer).build();

                case 0x62:
                    return Qrb3000ResponseMessage.builder().result(message.getInput()).build();
                default:
                    break;
            }
        } else {
            buffer = new byte[8];
            buffer[0] = message.getInput()[0];
            buffer[1] = message.getInput()[1];
            buffer[2] = message.getInput()[2];
            buffer[3] = message.getInput()[3];
            buffer[4] = 0x00;//TODO
            buffer[5] = 0x00;//TODO
            buffer[6] = (byte) dataBuffer.getOffset(CommandHelper.BCD_REV[message.getInput()[3]]);
            buffer[7] = (byte) 0xAA;
            return Qrb3000ResponseMessage.builder().result(buffer).build();
        }

        buffer = new byte[len + 2];
        buffer[0] = (byte) 0xFE;
        buffer[1] = (byte) 0xFE;
        System.arraycopy(message.getInput(), 0, buffer, 2, len);

        return Qrb3000ResponseMessage.builder().result(buffer).build();

    }

    @Override
    public void sessionCreated(IoSession session) {

        log.info("--- abstractVirtual server session created");
    }

    @Override
    public void sessionOpened(IoSession session) {

        log.info("--- abstractVirtual server session Opened");
    }

    @Override
    public void sessionClosed(IoSession session) {

        log.info("--- abstractVirtual server session Closed");
    }

    @Override
    public void messageSent(IoSession session, Object message) {

        log.info("--- abstractVirtual 发送数据成功!{}", message);
    }

}