package art.servers.etdserver.protocols.skp3;
|
|
import java.io.ByteArrayOutputStream;
|
|
public class SKP3_ProtocolWriter
|
{
|
public static final int STX = 0x7E;
|
public static final int ETX = 0x7E;
|
public static final int MASK = 0x7D;
|
public static final int STX_FLAG = 0x5E;
|
public static final int MASK_FLAG = 0x5D;
|
|
|
// COMMAND-RESPONSE
|
public static final int PING_CONTROLLER_QUERY = 0x81;
|
public static final int PING_CONTROLLER_RESPONSE = 0x01;
|
public static final int READ_SLAVE_DRIVER_VERSION_QUERY = 0x86;
|
public static final int READ_SLAVE_DRIVER_VERSION_RESPONSE = 0x06;
|
public static final int RESET_SLAVE_DRIVER_QUERY = 0xC7;
|
public static final int RESET_SLAVE_DRIVER_RESPONSE = 0x47;
|
public static final int CONFIGURE_DRIVER_QUERY = 0x8A;
|
public static final int CONFIGURE_DRIVER_RESPONSE = 0x0A;
|
public static final int READ_WRITE_TIME_QUERY = 0x8B;
|
public static final int READ_WRITE_TIME_RESPONSE = 0x0B;
|
public static final int READ_STATUS_CONTROLLER_QUERY = 0x8C;
|
public static final int READ_STATUS_CONTROLLER_RESPONSE = 0x0C;
|
public static final int READ_EVENT_QUERY = 0x8F;
|
public static final int READ_EVENT_RESPONSE = 0x0F;
|
public static final int READ_DATA_QUERY = 0xA0;
|
public static final int READ_DATA_RESPONSE = 0x20;
|
public static final int CLEAR_EVENTS_QUERY = 0xCF;
|
public static final int CLEAR_EVENTS_RESPONSE = 0x4F;
|
public static final int READ_DIAGNOSIS_DATA_QUERY = 0x90;
|
public static final int READ_DIAGNOSIS_DATA_RESPONSE = 0x10;
|
|
|
|
|
// ALARMS CFG CODES
|
public static final int ERROR_CFG_EXTERNAL_MEMORY = 0x01;
|
public static final int ERROR_CFG_RAM = 0x02;
|
public static final int ERROR_CFG_FLASH = 0x04;
|
public static final int ERROR_CFG_FRAM = 0x08;
|
public static final int ERROR_CFG_RTC = 0x10;
|
public static final int ERROR_CFG_WIZNET = 0x20;
|
public static final int ERROR_CFG_CPLD_HW = 0x40;
|
public static final int ERROR_CFG_CPLD_SW = 0x80;
|
|
|
// ALARMS ERROR CODES
|
public static final int ALARM_CFG_EXTERNAL_MEMORY_READ_ERROR = 0xFFFF;
|
|
public static final int ALARM_CFG_RAM_UNINITIALISED = 0xFFFF;
|
public static final int ALARM_CFG_RAM_SHORTCIRCUIT_DATA = 0xFFFE;
|
public static final int ALARM_CFG_RAM_SHORTCIRCUIT_ADDRESS = 0xFFFD;
|
|
public static final int ALARM_CFG_FLASH_UNINITIALISED = 0xFFFF;
|
public static final int ALARM_CFG_FLASH_LACK_COMMS = 0xFFFE;
|
public static final int ALARM_CFG_FLASH_MODEL_ERROR = 0xFFFD;
|
|
public static final int ALARM_CFG_FRAM_UNINITIALISED = 0xFFFF;
|
public static final int ALARM_CFG_FRAM_LACK_COMMS = 0xFFFE;
|
|
public static final int ALARM_CFG_RTC_UNINITIALISED = 0xFFFF;
|
public static final int ALARM_CFG_RTC_LACK_COMMS = 0xFFFE;
|
|
public static final int ALARM_CFG_WIZNET_UNINITIALISED = 0xFFFF;
|
public static final int ALARM_CFG_WIZNET_NO_COMMS = 0xFFFD;
|
|
public static final int ALARM_CFG_CPLD_HW_UNKNOWN_ERROR = 0xFFFF;
|
public static final int ALARM_CFG_CPLD_HW_WRITE_ERROR = 0xFFFE;
|
public static final int ALARM_CFG_CPLD_HW_LIMIT_EXCEEDED = 0xFFFD;
|
public static final int ALARM_CFG_CPLD_HW_UNKNOWN_COMMAND = 0xFFFC;
|
public static final int ALARM_CFG_CPLD_HW_UNKNOWN_STATE = 0xFFFB;
|
public static final int ALARM_CFG_CPLD_HW_OVERFLOW = 0xFFFA;
|
public static final int ALARM_CFG_CPLD_HW_LACK_BUFFER_SPACE1 = 0xFFF9;
|
public static final int ALARM_CFG_CPLD_HW_LACK_BUFFER_SPACE2 = 0xFFF8;
|
|
public static final int ALARM_CFG_CPLD_SW_UNKNOWN_ERROR = 0xFFFF;
|
public static final int ALARM_CFG_CPLD_SW_WRITE_ERROR = 0xFFFE;
|
public static final int ALARM_CFG_CPLD_SW_LIMIT_EXCEEDED = 0xFFFD;
|
public static final int ALARM_CFG_CPLD_SW_UNKNOWN_COMMAND = 0xFFFC;
|
public static final int ALARM_CFG_CPLD_SW_UNKNOWN_STATE = 0xFFFB;
|
public static final int ALARM_CFG_CPLD_SW_OVERFLOW = 0xFFFA;
|
public static final int ALARM_CFG_CPLD_SW_LACK_BUFFER_SPACE1 = 0xFFF9;
|
public static final int ALARM_CFG_CPLD_SW_LACK_BUFFER_SPACE2 = 0xFFF8;
|
|
|
// DATA IDENTIFIERS COUNTING
|
public static final int DATA_ID_TOTAL_L1 = 49;
|
public static final int DATA_ID_TOTAL_L2 = 51;
|
|
// DATA IDENTIFIERS LENGTH CLASSIFICATION
|
public static final int DATA_ID_K1_L1 = 7;
|
public static final int DATA_ID_K1_L2 = 9;
|
public static final int DATA_ID_K2_L1 = 195;
|
public static final int DATA_ID_K2_L2 = 515;
|
public static final int DATA_ID_K3_L1 = 196;
|
public static final int DATA_ID_K3_L2 = 516;
|
|
// DATA IDENTIFIERS SPEED
|
public static final int DATA_ID_AVG_SPEED_L1 = 77;
|
public static final int DATA_ID_AVG_SPEED_L2 = 78;
|
public static final int DATA_ID_MAX_SPEED_L1 = 71;
|
public static final int DATA_ID_MAX_SPEED_L2 = 72;
|
|
// DATA IDENTIFIERS SPEED CLASSIFICATION
|
public static final int DATA_ID_30_L1 = 334;
|
public static final int DATA_ID_30_L2 = 335;
|
public static final int DATA_ID_30_40_L1 = 330;
|
public static final int DATA_ID_30_40_L2 = 331;
|
public static final int DATA_ID_40_50_L1 = 332;
|
public static final int DATA_ID_40_50_L2 = 333;
|
public static final int DATA_ID_50_60_L1 = 63;
|
public static final int DATA_ID_50_60_L2 = 64;
|
public static final int DATA_ID_60_70_L1 = 65;
|
public static final int DATA_ID_60_70_L2 = 66;
|
public static final int DATA_ID_70_80_L1 = 336;
|
public static final int DATA_ID_70_80_L2 = 337;
|
public static final int DATA_ID_80_90_L1 = 338;
|
public static final int DATA_ID_80_90_L2 = 339;
|
public static final int DATA_ID_90_100_L1 = 376;
|
public static final int DATA_ID_90_100_L2 = 408;
|
public static final int DATA_ID_100_110_L1 = 377;
|
public static final int DATA_ID_100_110_L2 = 409;
|
public static final int DATA_ID_110_120_L1 = 378;
|
public static final int DATA_ID_110_120_L2 = 410;
|
public static final int DATA_ID_120_130_L1 = 379;
|
public static final int DATA_ID_120_130_L2 = 411;
|
public static final int DATA_ID_130_140_L1 = 380;
|
public static final int DATA_ID_130_140_L2 = 412;
|
public static final int DATA_ID_140_150_L1 = 381;
|
public static final int DATA_ID_140_150_L2 = 413;
|
public static final int DATA_ID_150_160_L1 = 382;
|
public static final int DATA_ID_150_160_L2 = 414;
|
public static final int DATA_ID_160_170_L1 = 383;
|
public static final int DATA_ID_160_170_L2 = 415;
|
public static final int DATA_ID_170_180_L1 = 384;
|
public static final int DATA_ID_170_180_L2 = 416;
|
public static final int DATA_ID_180_L1 = 385;
|
public static final int DATA_ID_180_L2 = 417;
|
|
|
// CFG MULTIPLIERS
|
public static final int CFG_MULTIPLIER_1 = 0;
|
public static final int CFG_MULTIPLIER_10 = 1;
|
public static final int CFG_MULTIPLIER_100 = 2;
|
public static final int CFG_MULTIPLIER_1000 = 3;
|
|
|
private ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
|
|
public SKP3_ProtocolWriter()
|
{
|
}
|
|
|
public void write(int data)
|
{
|
bos.write(data);
|
}
|
|
|
public void writeShort(int data)
|
{
|
bos.write((data >> 8) & 0xFF);
|
bos.write((data & 0xFF));
|
}
|
|
|
public void writeInt(int data)
|
{
|
bos.write((data >> 24) & 0xFF);
|
bos.write((data >> 16) & 0xFF);
|
bos.write((data >> 8) & 0xFF);
|
bos.write((data & 0xFF));
|
}
|
|
|
public void writeString(String data)
|
{
|
for (int i=0; i<data.length(); i++)
|
{
|
bos.write(data.charAt(i));
|
}
|
}
|
|
|
public void write(int[] data)
|
{
|
for (int i=0; i<data.length; i++)
|
{
|
write(data[i]);
|
}
|
}
|
|
|
public void writeSerialNumber(int serialNumber)
|
{
|
bos.write((serialNumber >> 8));
|
bos.write((serialNumber & 0xFF));
|
}
|
|
|
public void writeHeader()
|
{
|
bos.write('S');
|
bos.write('K');
|
bos.write('P');
|
bos.write('3');
|
}
|
|
|
public void STX()
|
{
|
bos.write(STX);
|
}
|
|
|
public void ETX()
|
{
|
bos.write(ETX);
|
}
|
|
|
public int[] applyMask(int[] command)
|
{
|
int newLength = 0;
|
for (int i=0; i<command.length; i++)
|
{
|
if ((command[i] == MASK) || (command[i] == STX) || (command[i] == ETX))
|
newLength++;
|
newLength++;
|
}
|
|
int[] result = new int[newLength];
|
int index = 0;
|
for (int i=0; i<command.length; i++)
|
{
|
if (command[i] == MASK)
|
{
|
result[index++] = MASK;
|
result[index++] = MASK_FLAG;
|
}
|
else if (command[i] == STX)
|
{
|
result[index++] = MASK;
|
result[index++] = STX_FLAG;
|
}
|
else
|
{
|
result[index++] = command[i];
|
}
|
}
|
|
return(result);
|
}
|
|
|
public byte[] createMessage()
|
{
|
SKP3_ProtocolWriter writer = new SKP3_ProtocolWriter();
|
|
int[] command = toIntegerArray();
|
writer.write(command);
|
writer.write(writer.crc(command));
|
|
return(createMessageMask(writer.applyMask(writer.toIntegerArray())));
|
}
|
|
|
private byte[] createMessageMask(int[] command)
|
{
|
SKP3_ProtocolWriter writer = new SKP3_ProtocolWriter();
|
|
writer.write(STX);
|
writer.write(command);
|
writer.write(ETX);
|
|
return(writer.toByteArray());
|
}
|
|
|
public int crc(int[] command)
|
{
|
int crc = 0;
|
for (int i=0; i<command.length; i++)
|
crc += command[i];
|
return(crc%256);
|
}
|
|
|
|
public byte[] toByteArray()
|
{
|
return bos.toByteArray();
|
}
|
|
|
public int[] toIntegerArray()
|
{
|
byte[] data = bos.toByteArray();
|
int[] result = new int[data.length];
|
for (int i=0; i<data.length; i++) result[i] = (int)data[i] & 0xFF;
|
return result;
|
}
|
|
}
|