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