package com.dev.nrf_lora_tester; import gnu.io.SerialPort; import gnu.io.UnsupportedCommOperationException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Date; import javax.swing.JOptionPane; import org.apache.logging.log4j.Logger; import sp_comm.CommSerialPort; import sp_comm.Comm_Socket; import main.page_debug_inf; import com.Com; import com.dev.ntm.cmd.NTM_Crc16; public class SPCommLora implements Runnable/*, SerialPortEventListener*/ { public static final int COMM_PORT_TYPE_Serial = 0; public static final int COMM_PORT_TYPE_Socket = 1; public static final short CMD_Read_Data = 0x00A0; public static final short CMD_Set_ID = 0x00A2; public static final short CMD_Get_Ver = 0x00A4; public static final short CMD_Set_RFCH = 0x00A8; public static final short CMD_Cal_VolOffset = 0x00B1; public static final short CMD_Cal_VolSlope = 0x00B2; private CommSerialPort m_SP_Comm = null; private Comm_Socket m_SocketComm = null; public ArrayList alLoraData = new ArrayList(0); public int[] m_SetModuleRFCH = new int[300]; public boolean CommThreadRunning = false; private ByteBuffer CommRxBuffer = null; private ByteBuffer CommTxBuffer = null; public short comm_tx_cnt = 0; public short comm_rx_cnt = 0; public int dt_target_addr = 0; public int dt_target_ver = 0; public int dt_target_ver2 = 0; public int dt_target_ver3 = 0; public int lora_start_addr = 1; public int lora_module_cnt = 2; public int lora_rf_ch_start = 0x17; public int lora_rf_ch = lora_rf_ch_start; public int lora_comm_time = 200; private int lora_comm_time_origin = 200; private int m_comm_error_count = 0; private short dt_usr_cmd = 0; private short dt_usr_cmd_data = 0; private boolean dt_normal_comm_en = true; int dt_multy_comm_type = CommSerialPort.mutycomm_Type_Samd09; private page_debug_inf dt_debug_inf; private int m_COMM_PORT_TYPE = 0; private Logger m_Log = null; public SPCommLora(int startaddr_t, int module_cnt, int rf_ch, int comm_time, int bitrate, int multy_com_type, page_debug_inf debug, Logger log) { lora_start_addr = startaddr_t & 0xFFFF; dt_target_addr = lora_start_addr; lora_module_cnt = module_cnt; lora_rf_ch_start = rf_ch; lora_comm_time = comm_time/module_cnt; if(lora_comm_time < 50) { lora_comm_time = 50; } lora_comm_time_origin = lora_comm_time; dt_multy_comm_type = multy_com_type; dt_debug_inf = debug; if(lora_module_cnt < 1) { lora_module_cnt = 1; } if(lora_module_cnt > 80) { lora_module_cnt = 80; } for(int n=0; n<(lora_module_cnt+2); n++) { alLoraData.add(new LoraModuleData()); } m_Log = log; } public void clearSetModuleRFCH() { for(int n=0; n= (lora_module_cnt+lora_start_addr)) { dt_target_addr = lora_start_addr; } CommTxBuffer.put((byte) ((a_tar_addr>>8)&0xFF)); CommTxBuffer.put((byte) (a_tar_addr&0xFF)); lora_rf_ch = a_tar_addr+lora_rf_ch_start; if(lora_rf_ch > 0) { lora_rf_ch -= 1; } CommTxBuffer.put((byte) (lora_rf_ch&0xFF)); int index = a_tar_addr-lora_start_addr; if(index < 0) { index = 0; } LoraModuleData lrData = alLoraData.get(index%alLoraData.size()); lrData.tx_cnt += 1; short cmd = CMD_Read_Data; if(0 == dt_target_ver) { cmd = CMD_Get_Ver; } if(dt_usr_cmd > CMD_Read_Data) { cmd = dt_usr_cmd; dt_usr_cmd = CMD_Read_Data; } tmp_bf.put((byte) 0xAB); tmp_bf.put((byte) 0xCD); tmp_bf.put((byte) 0x52);//ÉÏλ»úµ÷ÊÔÈí¼þ¹Ì¶¨ÎªµÚ82 loraÐŵÀ tmp_bf.put((byte) 0xF0); tmp_bf.putShort(cmd); if((CMD_Read_Data==cmd) || (CMD_Get_Ver==cmd)) { for(int n=0; n<4; n++) { tmp_bf.putShort((short) 0x00); } } else { switch(cmd) { case CMD_Set_ID: case CMD_Set_RFCH: { tmp_bf.putShort((short) 0xCDAB); tmp_bf.putShort((short) ((dt_usr_cmd_data<<8) | (dt_usr_cmd_data>>8))); tmp_bf.putShort((short) 0x00); tmp_bf.putShort((short) 0x00); } break; case CMD_Cal_VolOffset: case CMD_Cal_VolSlope: { tmp_bf.putShort((short) (dt_usr_cmd_data)); tmp_bf.putShort((short) 0x00); tmp_bf.putShort((short) 0x00); tmp_bf.putShort((short) 0x00); } break; } } } int crc = NTM_Crc16.CalCRC16(tmp_bf, tmp_bf.position()) & 0xFFFF; tmp_bf.putShort((short)crc); tmp_bf.flip(); CommTxBuffer.put(tmp_bf); CommTxBuffer.flip(); return a_tar_addr; } private boolean checkCommBuf(ByteBuffer buf_t) { boolean res = false; if(buf_t.limit() >= 5) { buf_t.position(buf_t.limit()-2); int crc = buf_t.getShort() & 0xFFFF; //crc = ((crc>>8)|(crc<<8)) & 0xFFFF; int crc_cal = NTM_Crc16.CalCRC16(buf_t, buf_t.limit()-2) & 0xFFFF; /*************************************************/ if(crc_cal == crc) { res = true; } /*************************************************/ } else { res = false; } return res; } public void tr_Msg(ByteBuffer bbf_tx, ByteBuffer bbf_rx, boolean showdat) { if(++comm_tx_cnt > 32500) { comm_tx_cnt = 0; } if(COMM_PORT_TYPE_Serial == m_COMM_PORT_TYPE) { m_SP_Comm.SP_Comm(bbf_tx, bbf_rx, dt_multy_comm_type, dt_debug_inf, showdat); } else { m_SocketComm.SocketComm(bbf_tx, bbf_rx, dt_debug_inf, showdat); } } private void closeCommPort() { if(COMM_PORT_TYPE_Serial == m_COMM_PORT_TYPE) { m_SP_Comm.serialPort.close(); } else { m_SocketComm.socketClose(); } } public void exitCommPortThread() { CommThreadRunning = false; } public void setCommCmd(short cmd, short cmd_data) { dt_usr_cmd = cmd; dt_usr_cmd_data = cmd_data; } public void setNormalCommState(boolean stat) { dt_normal_comm_en = stat; } public void setModule_Addr_Count(int addr, int rfch, int cnt) { lora_start_addr = addr & 0xFFFF; dt_target_addr = lora_start_addr; lora_rf_ch_start = rfch; lora_rf_ch = lora_rf_ch_start; lora_module_cnt = cnt; } private void processRxData(ByteBuffer bbf_rx, int start_addr, int soruce_addr) { if(false == checkCommBuf(bbf_rx)) { if(m_comm_error_count < 100) { m_comm_error_count += 1; } if((1==lora_module_cnt) && (m_comm_error_count>=3)) { dt_target_ver = 0; } return; } @SuppressWarnings("unused") byte ab,cd; if(bbf_rx.limit() > 12) { bbf_rx.position(0); ab = bbf_rx.get(); cd = bbf_rx.get(); short addr = (short) (bbf_rx.getShort()&0xFFFF); addr = (short) ((addr>>8) | (addr<<8)); short cmd = (short) (bbf_rx.getShort()&0xFFFF); int index = addr-start_addr; if(index >= 0) { LoraModuleData lrData = alLoraData.get(index%alLoraData.size()); if((SPCommLora.CMD_Read_Data == cmd) && (soruce_addr == addr)) { for(int n=0; n<4; n++) { int dat = bbf_rx.getShort()&0xFFFF; //dat = (short) ((dat>>8)|(dat<<8)); lrData.vol[n] = ((float)(dat&0xFFFF)) / 1000; } lrData.rx_cnt += 1; } else if((SPCommLora.CMD_Get_Ver == cmd) && (soruce_addr == addr)) { dt_target_ver = bbf_rx.getShort()&0xFFFF; dt_target_ver2 = bbf_rx.getShort()&0xFFFF; dt_target_ver3 = bbf_rx.getShort()&0xFFFF; lrData.rx_cnt += 1; } } if(SPCommLora.CMD_Set_RFCH == cmd) { m_SetModuleRFCH[addr] = SPCommLora.CMD_Set_RFCH; } else if(SPCommLora.CMD_Set_ID == cmd) { m_SetModuleRFCH[0] = SPCommLora.CMD_Set_ID; } if(++comm_rx_cnt > 32500) { comm_rx_cnt = 0; } m_comm_error_count = 0; } } public void run() { while(true == CommThreadRunning) { try { if(false == dt_normal_comm_en) { Thread.sleep(100); continue; } //---------------------- make tx data --------------------------// int tar_addr = makeCommTxData(); //----------------------- tx rx data ---------------------------// tr_Msg(CommTxBuffer, CommRxBuffer, true); //----------------------- process data -------------------------// processRxData(CommRxBuffer, lora_start_addr, tar_addr); //-------------------------------------------------------------// Thread.sleep(lora_comm_time); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); exitCommPortThread(); JOptionPane.showMessageDialog(null, "Monomer CommPort ´®¿ÚÒì³£: " + e.getMessage()); } } /******************************************************************************/ closeCommPort(); /******************************************************************************/ dt_debug_inf.addDebugInf(Com.get_DTF(new Date(), Com.DTF_YMDhms_S) + " CommPort is quit" + ", COMM_PORT_TYPE: " + m_COMM_PORT_TYPE + "\n"); /******************************************************************************/ } }