Subversion Repositories HomeAutomation

Rev

Rev 758 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 758 Rev 759
Line 10... Line 10...
10
    private DaemonConnection dc;
10
    private DaemonConnection dc;
11
    private bool isBiosUpdate;
11
    private bool isBiosUpdate;
12
    private ulong dlOffset = 0;
12
    private ulong dlOffset = 0;
13
    //private Thread down;
13
    //private Thread down;
14
    private byte receiveID;
14
    private byte receiveID;
-
 
15
    private uint hwid;
-
 
16
    private bool HWID_INUSE;
15
   
17
   
16
    private enum dState { SEND_START, WAIT_ACK_PRG, SEND_PGM_DATA, WAIT_ACK_DATA, RESEND_ADDR, WAIT_DONE, SEND_DONE, SEND_BIOS_UPDATE, SEND_RESET, DONE, DEBUG_STATE2, WAIT_BOOT, SEND_EMPTY_START, WAIT_ACK_PRG_EMPTY, SEND_EMPTY_DATA, WAIT_ACK_EMPTY_DATA, SEND_DONE_EMPTY, WAIT_DONE_EMPTY};
18
    private enum dState { SEND_START, WAIT_ACK_PRG, SEND_PGM_DATA, WAIT_ACK_DATA, RESEND_ADDR, WAIT_DONE, SEND_DONE, SEND_BIOS_UPDATE, SEND_RESET, DONE, DEBUG_STATE2, WAIT_BOOT, SEND_EMPTY_START, WAIT_ACK_PRG_EMPTY, SEND_EMPTY_DATA, WAIT_ACK_EMPTY_DATA, SEND_DONE_EMPTY, WAIT_DONE_EMPTY};
17
   
19
   
18
    private const byte CAN_NMT              = 0x00;
20
    private const byte CAN_NMT              = 0x00;
19
   
21
   
Line 34... Line 36...
34
    private const byte MY_NID = 0x0;
36
    private const byte MY_NID = 0x0;
35
    private const byte ADDR0_INDEX = 0;
37
    private const byte ADDR0_INDEX = 0;
36
    private const byte ADDR1_INDEX = 1;
38
    private const byte ADDR1_INDEX = 1;
37
    private const byte ADDR2_INDEX = 2;
39
    private const byte ADDR2_INDEX = 2;
38
    private const byte ADDR3_INDEX = 3;
40
    private const byte ADDR3_INDEX = 3;
-
 
41
 
-
 
42
    private const byte HWID0_INDEX = 4;
-
 
43
    private const byte HWID1_INDEX = 5;
-
 
44
    private const byte HWID2_INDEX = 6;
-
 
45
    private const byte HWID3_INDEX = 7;
39
   
46
   
40
    private const int TIMEOUT_MS = 1000;
47
    private const int TIMEOUT_MS = 1000;
41
    private const int TIMEOUT_SHORT_MS = 200;
48
    private const int TIMEOUT_SHORT_MS = 200;
42
   
49
   
43
    private long timeStart = 0;
50
    private long timeStart = 0;
44
   
51
   
45
    public Downloader(HexFile hf, DaemonConnection dc, byte receiveID, bool isBiosUpdate) {
52
    public Downloader(HexFile hf, DaemonConnection dc, byte receiveID, bool isBiosUpdate, bool HWID_INUSE, uint hwid) {
46
        this.hf = hf;
53
        this.hf = hf;
47
        this.dc = dc;
54
        this.dc = dc;
48
        this.receiveID = receiveID;
55
        this.receiveID = receiveID;
49
        this.isBiosUpdate = isBiosUpdate;
56
        this.isBiosUpdate = isBiosUpdate;
-
 
57
        this.hwid = hwid;
-
 
58
        this.HWID_INUSE = HWID_INUSE;
50
    }
59
    }
51
   
60
   
52
    public int calcCRC(HexFile hf) {
61
    public int calcCRC(HexFile hf) {
53
        int crc=0;
62
        int crc=0;
54
        for (ulong i=hf.getAddrLower(); i <= hf.getAddrUpper(); i++) {
63
        for (ulong i=hf.getAddrLower(); i <= hf.getAddrUpper(); i++) {
Line 95... Line 104...
95
                dlOffset = hf.getAddrLower();
104
                dlOffset = hf.getAddrLower();
96
                //Console.WriteLine(dlOffset);
105
                //Console.WriteLine(dlOffset);
97
                //dlOffset = 200;
106
                //dlOffset = 200;
98
            }
107
            }
99
 
108
 
100
            CanNMT cpn = new CanNMT();
109
            CanNMT cpn = new CanNMT(HWID_INUSE);
101
            cpn.setReceiver(receiveID);
110
            cpn.setReceiver(receiveID);
102
            bool hasMessage = false;
111
            bool hasMessage = false;
103
           
112
           
104
            while (!done) {
113
            while (!done) {
105
                Thread.Sleep(1);
114
                Thread.Sleep(1);
Line 112... Line 121...
112
                        //data[RID_INDEX] = TARGET_ID;
121
                        //data[RID_INDEX] = TARGET_ID;
113
                        data[ADDR0_INDEX] = (byte)((currentAddress-dlOffset) & 0x0000FF);
122
                        data[ADDR0_INDEX] = (byte)((currentAddress-dlOffset) & 0x0000FF);
114
                        data[ADDR1_INDEX] = (byte)(((currentAddress-dlOffset) & 0x00FF00) >> 8);
123
                        data[ADDR1_INDEX] = (byte)(((currentAddress-dlOffset) & 0x00FF00) >> 8);
115
                        data[ADDR2_INDEX] = (byte)(((currentAddress-dlOffset) & 0xFF0000) >> 16);
124
                        data[ADDR2_INDEX] = (byte)(((currentAddress-dlOffset) & 0xFF0000) >> 16);
116
                        data[ADDR3_INDEX] = 0;
125
                        data[ADDR3_INDEX] = 0;
-
 
126
                        if (HWID_INUSE) {
-
 
127
                            data[HWID0_INDEX] = (byte)((hwid) & 0xFF);
-
 
128
                            data[HWID1_INDEX] = (byte)((hwid>>8) & 0xFF);
-
 
129
                            data[HWID2_INDEX] = (byte)((hwid>>16) & 0xFF);
-
 
130
                            data[HWID3_INDEX] = (byte)((hwid>>24) & 0xFF);
-
 
131
                        }
117
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
132
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
118
                        outCm = cpn.getPgmStartPacket(data);
133
                        outCm = cpn.getPgmStartPacket(data);
119
                        dc.sendCanPacket(outCm);
134
                        dc.sendCanPacket(outCm);
120
                        t = Environment.TickCount;
135
                        t = Environment.TickCount;
121
                        t2 = Environment.TickCount;
136
                        t2 = Environment.TickCount;
122
                        pgs = dState.WAIT_ACK_PRG;
137
                        pgs = dState.WAIT_ACK_PRG;
123
                        timeStart = Environment.TickCount;
138
                        timeStart = Environment.TickCount;
124
                        break;
139
                        break;
125
                   
140
                   
126
                   
141
                   
127
                    case dState.WAIT_ACK_PRG:
142
                    case dState.WAIT_ACK_PRG:
128
                        // Check for timeout, resend start packet in that case..
143
                        // Check for timeout, resend start packet in that case..
129
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
144
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
130
                            Console.WriteLine("Timeout while waiting for start prg ack.");
145
                            Console.WriteLine("Timeout while waiting for start prg ack.");
131
                            errorOccured = true;
146
                            errorOccured = true;
132
                            pgs = dState.SEND_RESET;
147
                            pgs = dState.SEND_RESET;
133
                        }
148
                        }
134
                        //Thread.Sleep(1);
149
                        //Thread.Sleep(1);
135
                        // If received ack.
150
                        // If received ack.
136
                        hasMessage = dc.getData(out cm);
151
                        hasMessage = dc.getData(out cm);
137
                        if (hasMessage) {
152
                        if (hasMessage) {
138
                            CanNMT cpnin = new CanNMT(cm);
153
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
-
 
154
                            if (cpnin.isNMTPacket()) {
139
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
155
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
140
                                // If no error
156
                                // If no error
141
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
157
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
142
                                    // Start sending program data..
158
                                    // Start sending program data..
143
                                    byteSent = 0;
159
                                    byteSent = 0;
144
                                    pgs = dState.SEND_PGM_DATA;
160
                                    pgs = dState.SEND_PGM_DATA;
Line 146... Line 162...
146
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
162
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
147
                                    // else ..
163
                                    // else ..
148
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
164
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
149
                                    errorOccured = true;
165
                                    errorOccured = true;
150
                                    pgs = dState.SEND_RESET;
166
                                    pgs = dState.SEND_RESET;
151
                                }
167
                                }
152
                               
-
 
153
                            }
168
                            }
154
                        }
169
                        }
155
                        break;
170
                        break;
156
                       
171
                       
157
                    case dState.SEND_PGM_DATA:
172
                    case dState.SEND_PGM_DATA:
158
                        //Console.WriteLine("byteSent = "+byteSent);
173
                        //Console.WriteLine("byteSent = "+byteSent);
Line 175... Line 190...
175
                       
190
                       
176
                        t = Environment.TickCount;
191
                        t = Environment.TickCount;
177
                        t2 = Environment.TickCount;
192
                        t2 = Environment.TickCount;
178
                        byteSent += 6;
193
                        byteSent += 6;
179
                        pgs = dState.WAIT_ACK_DATA;
194
                        pgs = dState.WAIT_ACK_DATA;
180
                        break;
195
                        break;
181
                       
196
                       
182
                       
197
                       
183
                    case dState.WAIT_ACK_DATA:
198
                    case dState.WAIT_ACK_DATA:
184
                        // Wait for pgm ack.
199
                        // Wait for pgm ack.
185
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
200
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
186
                            // Woops, error. 
201
                            // Woops, error. 
187
                            Console.WriteLine("Timeout while waiting for data ack.");
202
                            Console.WriteLine("Timeout while waiting for data ack.");
Line 192... Line 207...
192
                            // Woops, error. 
207
                            // Woops, error. 
193
                            Console.Write(":");
208
                            Console.Write(":");
194
                            byteSent -= 6;
209
                            byteSent -= 6;
195
                            pgs = dState.SEND_PGM_DATA;
210
                            pgs = dState.SEND_PGM_DATA;
196
                            break;
211
                            break;
197
                        }
212
                        }
198
                        //Thread.Sleep(1);
213
                        //Thread.Sleep(1);
199
                        // If received ack.
214
                        // If received ack.
200
                        hasMessage = dc.getData(out cm);
215
                        hasMessage = dc.getData(out cm);
201
                        if (hasMessage) {
216
                        if (hasMessage) {
202
                            CanNMT cpnin = new CanNMT(cm);
217
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
-
 
218
                            if (cpnin.isNMTPacket()) {
203
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
219
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
204
                                // If no error
220
                                // If no error
205
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
221
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
206
                                    //currentAddress += 2;
222
                                    //currentAddress += 2;
207
                                    // Check if end.
223
                                    // Check if end.
208
                                    if (currentAddress + byteSent > hf.getAddrUpper()) {
224
                                    if (currentAddress + byteSent > hf.getAddrUpper()) {
Line 219... Line 235...
219
                                    // else ..
235
                                    // else ..
220
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
236
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
221
                                    errorOccured = true;
237
                                    errorOccured = true;
222
                                    pgs = dState.SEND_RESET;
238
                                    pgs = dState.SEND_RESET;
223
                                }
239
                                }
224
                               
-
 
225
                            }
240
                            }
226
                        }
241
                        }
227
                        break;
242
                        break;
228
                       
243
                       
229
                    case dState.SEND_DONE:
244
                    case dState.SEND_DONE:
Line 246... Line 261...
246
                        }
261
                        }
247
                        //Thread.Sleep(1);
262
                        //Thread.Sleep(1);
248
                       
263
                       
249
                        hasMessage = dc.getData(out cm);
264
                        hasMessage = dc.getData(out cm);
250
                        if (hasMessage) {
265
                        if (hasMessage) {
251
                            CanNMT cpnin = new CanNMT(cm);
266
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
-
 
267
                            if (cpnin.isNMTPacket()) {
252
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
268
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
253
                                // If no error
269
                                // If no error
254
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
270
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
255
                                    Console.WriteLine("");
271
                                    Console.WriteLine("");
256
                                    //
272
                                    //
257
                                    int crc = calcCRC(hf);
273
                                    int crc = calcCRC(hf);
Line 270... Line 286...
270
                                            string nodecrc = String.Format("{0:x4}", (int)cmdata[0] + (int)(cmdata[1]<<8));
286
                                            string nodecrc = String.Format("{0:x4}", (int)cmdata[0] + (int)(cmdata[1]<<8));
271
                                            nodecrc = "0x"+nodecrc;
287
                                            nodecrc = "0x"+nodecrc;
272
                                            string realcrc = String.Format("{0:x4}", (int)(crc & 0xFF) + (int)(crc & 0xFF00));
288
                                            string realcrc = String.Format("{0:x4}", (int)(crc & 0xFF) + (int)(crc & 0xFF00));
273
                                            realcrc = "0x"+realcrc;
289
                                            realcrc = "0x"+realcrc;
274
                                            Console.WriteLine("CRC failed. Node sent CRC "+nodecrc+" but should be "+realcrc+".");
290
                                            Console.WriteLine("CRC failed. Node sent CRC "+nodecrc+" but should be "+realcrc+".");
275
                                            errorOccured = true;
291
                                            errorOccured = true;
276
                                            pgs = dState.SEND_RESET;
292
                                            pgs = dState.SEND_RESET;
277
                                        }
293
                                        }
278
                                       
294
                                       
279
                                        byteSent = 0;
295
                                        byteSent = 0;
280
                                    }
296
                                    }
281
                                    //Console.WriteLine("crc: " + crc + " " + (crc>>8) + " " + (crc & 0xFF));
297
                                    //Console.WriteLine("crc: " + crc + " " + (crc>>8) + " " + (crc & 0xFF));
282
                                    //Console.WriteLine("ACKpkg with CRC: " + cm.ToString());
298
                                    //Console.WriteLine("ACKpkg with CRC: " + cm.ToString());
283
                                    // 
299
                                    // 
284
                                }
300
                                }
Line 319... Line 335...
319
                        }
335
                        }
320
                        //Thread.Sleep(1);
336
                        //Thread.Sleep(1);
321
                        // If received boot msg.
337
                        // If received boot msg.
322
                        hasMessage = dc.getData(out cm);
338
                        hasMessage = dc.getData(out cm);
323
                        if (hasMessage) {
339
                        if (hasMessage) {
324
                            CanNMT cpnin = new CanNMT(cm);
340
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
-
 
341
                            if (cpnin.isNMTPacket()) {
325
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
342
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
326
                                // If no error
343
                                // If no error
327
                                if (cpnin.getType() == CAN_NMT_BIOS_START) {
344
                                if (cpnin.getType() == CAN_NMT_BIOS_START) {
328
                                    pgs = dState.SEND_EMPTY_START;
345
                                    pgs = dState.SEND_EMPTY_START;
329
                                }
346
                                }
330
                                else {
347
                                else {
Line 341... Line 358...
341
                        //data[RID_INDEX] = TARGET_ID;
358
                        //data[RID_INDEX] = TARGET_ID;
342
                        data[ADDR0_INDEX] = (byte)((0) & 0x0000FF);
359
                        data[ADDR0_INDEX] = (byte)((0) & 0x0000FF);
343
                        data[ADDR1_INDEX] = (byte)(((0) & 0x00FF00) >> 8);
360
                        data[ADDR1_INDEX] = (byte)(((0) & 0x00FF00) >> 8);
344
                        data[ADDR2_INDEX] = (byte)(((0) & 0xFF0000) >> 16);
361
                        data[ADDR2_INDEX] = (byte)(((0) & 0xFF0000) >> 16);
345
                        data[ADDR3_INDEX] = 0;
362
                        data[ADDR3_INDEX] = 0;
-
 
363
                        if (HWID_INUSE) {
-
 
364
                            data[HWID0_INDEX] = (byte)((hwid) & 0xFF);
-
 
365
                            data[HWID1_INDEX] = (byte)((hwid>>8) & 0xFF);
-
 
366
                            data[HWID2_INDEX] = (byte)((hwid>>16) & 0xFF);
-
 
367
                            data[HWID3_INDEX] = (byte)((hwid>>24) & 0xFF);
-
 
368
                        }
346
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
369
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
347
                        outCm = cpn.getPgmStartPacket(data);
370
                        outCm = cpn.getPgmStartPacket(data);
348
                        dc.sendCanPacket(outCm);
371
                        dc.sendCanPacket(outCm);
349
                        t = Environment.TickCount;
372
                        t = Environment.TickCount;
350
                        t2 = Environment.TickCount;
373
                        t2 = Environment.TickCount;
351
                        pgs = dState.WAIT_ACK_PRG_EMPTY;
374
                        pgs = dState.WAIT_ACK_PRG_EMPTY;
352
                        timeStart = Environment.TickCount;
-
 
353
                        break;
375
                        break;
354
                   
376
                   
355
                   
377
                   
356
                    case dState.WAIT_ACK_PRG_EMPTY:
378
                    case dState.WAIT_ACK_PRG_EMPTY:
357
                        // Check for timeout, resend start packet in that case..
379
                        // Check for timeout, resend start packet in that case..
358
                        if ((Environment.TickCount - t) > 3*TIMEOUT_MS) {
380
                        if ((Environment.TickCount - t) > 3*TIMEOUT_MS) {
359
                            Console.WriteLine("Timeout while waiting for start prg ack.");
381
                            Console.WriteLine("Timeout while waiting for start prg ack during empty-first-block-cycle.");
360
                            errorOccured = true;
382
                            errorOccured = true;
361
                            pgs = dState.SEND_RESET;
383
                            pgs = dState.SEND_RESET;
362
                        }
384
                        }
363
                        //Thread.Sleep(1);
385
                        //Thread.Sleep(1);
364
                        // If received ack.
386
                        // If received ack.
365
                        hasMessage = dc.getData(out cm);
387
                        hasMessage = dc.getData(out cm);
366
                        if (hasMessage) {
388
                        if (hasMessage) {
367
                            CanNMT cpnin = new CanNMT(cm);
389
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
-
 
390
                            if (cpnin.isNMTPacket()) {
368
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
391
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
369
                                // If no error
392
                                // If no error
370
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
393
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
371
                                    // Start sending program data..
394
                                    // Start sending program data..
372
                                    byteSent = 0;
395
                                    byteSent = 0;
373
                                    pgs = dState.SEND_EMPTY_DATA;
396
                                    pgs = dState.SEND_EMPTY_DATA;
Line 376... Line 399...
376
                                    // else ..
399
                                    // else ..
377
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
400
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
378
                                    errorOccured = true;
401
                                    errorOccured = true;
379
                                    pgs = dState.SEND_RESET;
402
                                    pgs = dState.SEND_RESET;
380
                                }
403
                                }
381
                               
-
 
382
                            }
404
                            }
383
                        }
405
                        }
384
                        break;
406
                        break;
385
                       
407
                       
386
                    case dState.SEND_EMPTY_DATA:
408
                    case dState.SEND_EMPTY_DATA:
387
                        // Send program data.
409
                        // Send program data.
388
                        data[0] = 0;
410
                        data[0] = 0;
389
                        data[1] = 0;
411
                        data[1] = 0;
390
                        data[2] = 0xff;
412
                        data[2] = 0xff;
391
                        data[3] = 0xff;
413
                        data[3] = 0xff;
392
 
414
 
393
                        outCm = cpn.getPgmDataPacket(data, 4);
415
                        outCm = cpn.getPgmDataPacket(data, 4);
394
                        dc.sendCanPacket(outCm);
416
                        dc.sendCanPacket(outCm);
395
                       
417
                       
396
                        t = Environment.TickCount;
418
                        t = Environment.TickCount;
397
                        t2 = Environment.TickCount;
419
                        t2 = Environment.TickCount;
Line 403... Line 425...
403
                    case dState.WAIT_ACK_EMPTY_DATA:
425
                    case dState.WAIT_ACK_EMPTY_DATA:
404
                        // Wait for pgm ack.
426
                        // Wait for pgm ack.
405
                        if ((Environment.TickCount - t) > 2*TIMEOUT_MS) {
427
                        if ((Environment.TickCount - t) > 2*TIMEOUT_MS) {
406
                            // Woops, error. 
428
                            // Woops, error. 
407
                            Console.WriteLine("Timeout while waiting for data ack.");
429
                            Console.WriteLine("Timeout while waiting for data ack.");
408
                            errorOccured = true;
430
                            errorOccured = true;
409
                            pgs = dState.SEND_RESET;
431
                            pgs = dState.SEND_RESET;
410
                        }
432
                        }
411
                        //Thread.Sleep(1);
433
                        //Thread.Sleep(1);
412
                        // If received ack.
434
                        // If received ack.
413
                        hasMessage = dc.getData(out cm);
435
                        hasMessage = dc.getData(out cm);
414
                        if (hasMessage) {
436
                        if (hasMessage) {
415
                            CanNMT cpnin = new CanNMT(cm);
437
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
-
 
438
                            if (cpnin.isNMTPacket()) {
416
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
439
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
417
                                // If no error
440
                                // If no error
418
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
441
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
419
                                    pgs = dState.SEND_DONE_EMPTY;
442
                                    pgs = dState.SEND_DONE_EMPTY;
420
                                }
443
                                }
421
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
444
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
422
                                    // else ..
445
                                    // else ..
423
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
446
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
424
                                    errorOccured = true;
447
                                    errorOccured = true;
425
                                    pgs = dState.SEND_RESET;
448
                                    pgs = dState.SEND_RESET;
426
                                }
449
                                }
427
                               
-
 
428
                            }
450
                            }
429
                        }
451
                        }
430
                        break;
452
                        break;
431
                       
453
                       
432
                    case dState.SEND_DONE_EMPTY:
454
                    case dState.SEND_DONE_EMPTY:
Line 449... Line 471...
449
                        }
471
                        }
450
                        //Thread.Sleep(1);
472
                        //Thread.Sleep(1);
451
                       
473
                       
452
                        hasMessage = dc.getData(out cm);
474
                        hasMessage = dc.getData(out cm);
453
                        if (hasMessage) {
475
                        if (hasMessage) {
454
                            CanNMT cpnin = new CanNMT(cm);
476
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
-
 
477
                            if (cpnin.isNMTPacket()) {
455
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
478
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
456
                                // If no error
479
                                // If no error
457
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
480
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
458
                                    Console.WriteLine("");
481
                                    Console.WriteLine("");
459
                                    //
482
                                    //
460
                                    Console.WriteLine("Done, successfully cleaned application flash.");
483
                                    Console.WriteLine("Done, successfully cleaned application flash.");
Line 469... Line 492...
469
                            }
492
                            }
470
                        }
493
                        }
471
                        break;                     
494
                        break;                     
472
                    case dState.SEND_RESET:
495
                    case dState.SEND_RESET:
473
                        // Send reset
496
                        // Send reset
474
                        cpn.doReset(dc, receiveID);
497
                        cpn.doReset(dc, receiveID, hwid);
475
                        t = Environment.TickCount;
498
                        t = Environment.TickCount;
476
                        t2 = Environment.TickCount;
499
                        t2 = Environment.TickCount;
477
                        pgs = dState.DONE;
500
                        pgs = dState.DONE;
478
                        break;
501
                        break;
479
                       
502