RmasmVirtualBoxHandler.java 3.96 KB
package com.example.mina.server.box.rmasm;

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

import java.nio.charset.StandardCharsets;
import java.util.Random;

/**
 * @author 杜云山
 * @date 21/03/05
 */
@Slf4j
public class RmasmVirtualBoxHandler extends AbstractVirtualBoxHandler<RmasmRequestMessage, RmasmResponseMessage> {



    private RmasmDataBuffer dataBuffer;

    @Override
    protected void initMatrix() {
        int row = 32;
        int col = 32;
        int maxAttenuate = 30;

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

    @Override
    protected RmasmResponseMessage handleMessage(RmasmRequestMessage requestMessage) {
        String command = requestMessage.getCmd();
        //String[] split = command.replaceAll("\r\n", "").split(" ");

        int maxOutput = dataBuffer.getMaxCol();

        if ("SA".equals(requestMessage.getType())) {
            // Set Attenuator
            String index = requestMessage.getIndex();
            String atten = requestMessage.getAttn();
            int i = Integer.parseInt(index);
            int input = RmasmCommandHelper.getInput(i, maxOutput);
            int output = RmasmCommandHelper.getOutput(i, maxOutput);
            dataBuffer.setAttenuation(input, output, Integer.parseInt(atten));
            int attenuation = dataBuffer.getAttenuation(input, output);
            byte[] resultBytes = String.format("A%d:%ddB;\r\n", i, attenuation).getBytes(StandardCharsets.UTF_8);
            return RmasmResponseMessage.builder().result(resultBytes).build();
        }

        if ("RA".equals(requestMessage.getType())) {
            // Read Attenuator
            String index = requestMessage.getIndex();
            int startIndex;
            int endIndex;
            if (index.contains("-")) {
                String[] splitIndex = index.split("-");
                startIndex = Integer.parseInt(splitIndex[0]);
                endIndex = Integer.parseInt(splitIndex[1]);
            } else {
                startIndex = Integer.parseInt(index);
                endIndex = startIndex;
            }
            StringBuilder result = new StringBuilder();
            for (int i = startIndex; i <= endIndex; i++) {
                int input = RmasmCommandHelper.getInput(i, maxOutput);
                int output = RmasmCommandHelper.getOutput(i, maxOutput);
                int attenuation = dataBuffer.getAttenuation(input, output);
                result.append(String.format("A%d:%ddB;", i, attenuation));
            }

            byte[] resultBytes = result.append("\r\n").toString().getBytes(StandardCharsets.UTF_8);
            return RmasmResponseMessage.builder().result(resultBytes).build();
        }

        if ("RP".equals(requestMessage.getType())) {
            // Read power meter
            String index = requestMessage.getIndex();

            byte[] resultBytes = String.format
                    ("P%s:%.2f;\r\n", index, new Random().nextInt(99) + new Random().nextFloat() - 50)
                    .getBytes(StandardCharsets.UTF_8);
            return RmasmResponseMessage.builder().result(resultBytes).build();
        }
        byte[] resultBytes = new byte[0];
        return RmasmResponseMessage.builder().result(resultBytes).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);
    }

}