Rbm3000VirtualBoxHander.java 5.31 KB
package com.example.mina.box1;

import com.example.mina.base.AbstractVirtualBoxHandler;
import com.example.mina.base.CommandHelper;
import com.example.mina.entity.AeroflexDataBuffer;
import com.example.mina.entity.Entry;
import lombok.extern.slf4j.Slf4j;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;

/**
 * @author dy
 * @date 2021/3/5
 */
@Slf4j
public class Rbm3000VirtualBoxHander extends AbstractVirtualBoxHandler {

    private AeroflexDataBuffer dataBuffer;

    public Rbm3000VirtualBoxHander() {
        this.initMatrix();
    }

    @Override
    protected void initMatrix() {

        int row = 6;
        int col = 8;
        int maxAtten = 222;

        dataBuffer = new AeroflexDataBuffer(row, maxAtten);
    }

    @Override
    protected byte[] handleMessage(byte[] cmd, int len) {
        return new byte[0];
    }

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

        IoBuffer ioBuffer = (IoBuffer) message;
        byte[] bytes = new byte[ioBuffer.limit()];
        ioBuffer.get(bytes, ioBuffer.position(), ioBuffer.limit());

        byte[] result = handleCommand(bytes, bytes.length);

        session.write(IoBuffer.wrap(result));
    }

    @Override
    public void sessionCreated(IoSession session) {

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

    @Override
    public void sessionOpened(IoSession session) {

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

    @Override
    public void sessionClosed(IoSession session) {

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

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

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

    protected byte[] handleCommand(byte[] cmd, int len) {

        byte[] buffer;
        Entry[][] entries = dataBuffer.getMatrixData();

        if (len == 8) {
            switch (cmd[0]) {
                case 0x30:
                    int row = CommandHelper.BCD_REV[cmd[3]];
                    int col = CommandHelper.BCD_REV[cmd[4]];

                    int rowCol = 0;
                    int colRow = 0;

                    for (int i = 0; i < dataBuffer.getMaxCol(); i++) {
                        if (entries[row - 1][i].getValue() == 1) {
                            rowCol = i + 1;
                            break;
                        }
                    }
                    for (int i = 0; i < dataBuffer.getMaxRow(); i++) {
                        if (entries[i][col - 1].getValue() == 1) {
                            colRow = i + 1;
                        }
                    }

                    dataBuffer.setAttenuation(row, rowCol, 0);
                    dataBuffer.setAttenuation(row, col, 1);
                    dataBuffer.setAttenuation(colRow, col, 0);
                    dataBuffer.setAttenuation(colRow, rowCol, 1);

                    buffer = new byte[8];
                    buffer[0] = cmd[0];
                    buffer[1] = cmd[1];
                    buffer[2] = cmd[2];
                    buffer[3] = cmd[3];
                    buffer[4] = cmd[4];
                    buffer[5] = CommandHelper.BCD[colRow];
                    buffer[6] = CommandHelper.BCD[rowCol];
                    buffer[7] = (byte) 0x03;

                    return buffer;
                case 0x68:
                    boolean isA = (cmd[3] == (byte) 0x0A);
                    int callPort = CommandHelper.BCD_REV[cmd[4]];
                    int returnPort = 0;

                    if (isA) {
                        for (int i = 0; i < dataBuffer.getMaxCol(); i++) {
                            if (entries[callPort - 1][i].getValue() == 1) {
                                returnPort = i + 1;
                                break;
                            }
                        }
                    } else {
                        for (int i = 0; i < dataBuffer.getMaxRow(); i++) {
                            if (entries[i][callPort - 1].getValue() == 1) {
                                returnPort = i + 1;
                            }
                        }
                    }

                    buffer = new byte[8];
                    buffer[0] = cmd[0];
                    buffer[1] = cmd[1];
                    buffer[2] = cmd[2];
                    if (isA) {
                        buffer[3] = 0x0B;
                    } else {
                        buffer[3] = 0x0A;
                    }
                    buffer[4] = CommandHelper.BCD[returnPort];
                    buffer[5] = 0x00;
                    buffer[6] = 0x06;
                    buffer[7] = (byte) 0x03;

                    return buffer;
                case 0x62:
                    buffer = new byte[8];
                    buffer[0] = cmd[0];
                    buffer[1] = cmd[1];
                    buffer[2] = cmd[2];
                    buffer[3] = cmd[3];
                    buffer[4] = cmd[4];
                    buffer[5] = cmd[5];
                    buffer[6] = cmd[6];
                    buffer[7] = (byte) 0x03;

                    return buffer;
                default:
                    break;
            }
        }

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

        return buffer;
    }
}