Qrb3000VirtualBoxHandler.java 3.92 KB
package com.example.mina.server.box.qrb3000;

import com.example.mina.server.base.AbstractVirtualBoxHandler;
import com.example.mina.server.entity.Qrb3000DataBuffer;
import com.example.mina.server.util.CommandHelper;
import com.example.mina.server.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 = message.getAnalyticalMessage();

        int len = message.getInput().length;

        //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 == message.LENGTH6) {
            return Qrb3000ResponseMessage.builder().result(buffer).build();
        }

        if (len == message.LENGTH8) {
//            byte[] input = message.getInput();
            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[5] = (byte) dataBuffer.getAttenuation(CommandHelper.BCD_REV[message.getInput()[3]],
                            CommandHelper.BCD_REV[message.getInput()[4]]);
                    return Qrb3000ResponseMessage.builder().result(buffer).build();

                case 0x68:
//                    dataBuffer.setOffset(Qrb3000CommandHelper.BCD_REV[message.getInput()[3]], random.nextInt(120) - 60 );
                    buffer[6] = (byte)dataBuffer.getOffset(CommandHelper.BCD_REV[message.getInput()[3]]);
                    return Qrb3000ResponseMessage.builder().result(buffer).build();

                case 0x62:
                    return Qrb3000ResponseMessage.builder().result(buffer).build();

                default:
                    break;
            }
        } else {
            buffer[6] = (byte) dataBuffer.getOffset(CommandHelper.BCD_REV[message.getInput()[3]]);
            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);
    }

}