bck
Alejandro Acuña
2024-11-11 f1cb4443aede6d4657bdc3396c8914d3a9f4fa93
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
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;
    }
 
}