Rbm3000VirtualBoxHander.java 4.17 KB
package com.example.mina.server.box.rbm3000;

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

/**
 * @author dy
 * @date 2021/3/5
 */
@Slf4j
public class Rbm3000VirtualBoxHander extends AbstractVirtualBoxHandler<Rbm3000RequestMessage, Rbm3000ResponseMessage> {

    private Rbm3000DataBuffer dataBuffer;

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

    @Override
    protected void initMatrix() {

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

        dataBuffer = new Rbm3000DataBuffer(row, col);
    }

    @Override
    protected Rbm3000ResponseMessage handleMessage(Rbm3000RequestMessage message) {

        byte[] buffer = message.getAnalyticalMessage();

        int len = message.getInput().length;

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

        if (len == message.LENGTH8) {
            switch (message.getInput()[0]) {
                case 0x30:
                    int row = message.getRow();
                    int col = message.getCol();

                    int rowCol = message.getRowCol();
                    int colRow = message.getColRow();

                    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[5] = CommandHelper.BCD[colRow];
                    buffer[6] = CommandHelper.BCD[rowCol];

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

                case 0x68:
                    boolean isA = message.isA();
                    int callPort = message.getCallPort();
                    int returnPort = message.getReturnPort();

                    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[4] = CommandHelper.BCD[returnPort];

                    return Rbm3000ResponseMessage.builder().result(buffer).build();
                case 0x62:
                    return Rbm3000ResponseMessage.builder().result(buffer).build();
                default:
                    break;
            }
        }

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

        return Rbm3000ResponseMessage.builder().result(buffer).build();
    }

    @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);
    }

}