Subversion Repositories HomeAutomation

Rev

Rev 467 | Rev 632 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 467 Rev 586
Line 11... Line 11...
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
   
15
   
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 };
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};
17
   
17
   
18
    private const byte CAN_NMT              = 0x00;
18
    private const byte CAN_NMT              = 0x00;
19
   
19
   
20
    private const byte CAN_NMT_RESET        = 0x04;
20
    private const byte CAN_NMT_RESET        = 0x04;
21
    private const byte CAN_NMT_BIOS_START   = 0x08;
21
    private const byte CAN_NMT_BIOS_START   = 0x08;
Line 290... Line 290...
290
                       
290
                       
291
                        outCm = cpn.getPgmCopyPacket(data);
291
                        outCm = cpn.getPgmCopyPacket(data);
292
                        Console.WriteLine("Now say a prayer, moving bios");
292
                        Console.WriteLine("Now say a prayer, moving bios");
293
                        dc.sendCanPacket(outCm);
293
                        dc.sendCanPacket(outCm);
294
                        t = Environment.TickCount;
294
                        t = Environment.TickCount;
-
 
295
                        pgs = dState.WAIT_BOOT;
295
                        pgs = dState.DONE;
296
                        //pgs = dState.DONE;
296
                        break;
297
                        break;
297
                       
298
 
-
 
299
                    case dState.WAIT_BOOT:
-
 
300
                        // Wait for node reset answer (boot msg).
-
 
301
                        if ((Environment.TickCount - t) > 2*TIMEOUT_MS) {
-
 
302
                            // Woops, error. 
-
 
303
                            Console.WriteLine("Timeout while waiting for node to boot.");
-
 
304
                            errorOccured = true;
-
 
305
                            pgs = dState.SEND_DONE;
-
 
306
                        }
-
 
307
                        //Thread.Sleep(1);
-
 
308
                        // If received boot msg.
-
 
309
                        hasMessage = dc.getData(out cm);
-
 
310
                        if (hasMessage) {
-
 
311
                            CanNMT cpnin = new CanNMT(cm);
-
 
312
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
-
 
313
                                // If no error
-
 
314
                                if (cpnin.getType() == CAN_NMT_BIOS_START) {
-
 
315
                                    pgs = dState.SEND_EMPTY_START;
-
 
316
                                }
-
 
317
                                else {
-
 
318
                                    // else ..
-
 
319
                                }
-
 
320
                            }
-
 
321
                        }
-
 
322
                        break;
-
 
323
                       
-
 
324
                    case dState.SEND_EMPTY_START:
-
 
325
                        // Send boot start packet to target.
-
 
326
                        // and wait for ack.
-
 
327
                       
-
 
328
                        //data[RID_INDEX] = TARGET_ID;
-
 
329
                        data[ADDR0_INDEX] = (byte)((0) & 0x0000FF);
-
 
330
                        data[ADDR1_INDEX] = (byte)(((0) & 0x00FF00) >> 8);
-
 
331
                        data[ADDR2_INDEX] = (byte)(((0) & 0xFF0000) >> 16);
-
 
332
                        data[ADDR3_INDEX] = 0;
-
 
333
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
-
 
334
                        outCm = cpn.getPgmStartPacket(data);
-
 
335
                        dc.sendCanPacket(outCm);
-
 
336
                        t = Environment.TickCount;
-
 
337
                        pgs = dState.WAIT_ACK_PRG_EMPTY;
-
 
338
                        timeStart = Environment.TickCount;
-
 
339
                        break;
-
 
340
                   
-
 
341
                   
-
 
342
                    case dState.WAIT_ACK_PRG_EMPTY:
-
 
343
                        // Check for timeout, resend start packet in that case..
-
 
344
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
-
 
345
                            Console.WriteLine("Timeout while waiting for start prg ack.");
-
 
346
                            errorOccured = true;
-
 
347
                            pgs = dState.SEND_RESET;
-
 
348
                        }
-
 
349
                        //Thread.Sleep(1);
-
 
350
                        // If received ack.
-
 
351
                        hasMessage = dc.getData(out cm);
-
 
352
                        if (hasMessage) {
-
 
353
                            CanNMT cpnin = new CanNMT(cm);
-
 
354
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
-
 
355
                                // If no error
-
 
356
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
-
 
357
                                    // Start sending program data..
-
 
358
                                    byteSent = 0;
-
 
359
                                    pgs = dState.SEND_EMPTY_DATA;
-
 
360
                                }
-
 
361
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
-
 
362
                                    // else ..
-
 
363
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
-
 
364
                                    errorOccured = true;
-
 
365
                                    pgs = dState.SEND_RESET;
-
 
366
                                }
-
 
367
                               
-
 
368
                            }
-
 
369
                        }
-
 
370
                        break;
-
 
371
                       
-
 
372
                    case dState.SEND_EMPTY_DATA:
-
 
373
                        // Send program data.
-
 
374
                        data[0] = 0;
-
 
375
                        data[1] = 0;
-
 
376
                        data[2] = 0xff;
-
 
377
                        data[3] = 0xff;
-
 
378
 
-
 
379
                        outCm = cpn.getPgmDataPacket(data, 4);
-
 
380
                        dc.sendCanPacket(outCm);
-
 
381
                       
-
 
382
                        t = Environment.TickCount;
-
 
383
                        byteSent += 6;
-
 
384
                        pgs = dState.WAIT_ACK_EMPTY_DATA;
-
 
385
                        break;
-
 
386
                       
-
 
387
                       
-
 
388
                    case dState.WAIT_ACK_EMPTY_DATA:
-
 
389
                        // Wait for pgm ack.
-
 
390
                        if ((Environment.TickCount - t) > 2*TIMEOUT_MS) {
-
 
391
                            // Woops, error. 
-
 
392
                            Console.WriteLine("Timeout while waiting for data ack.");
-
 
393
                            errorOccured = true;
-
 
394
                            pgs = dState.SEND_RESET;
-
 
395
                        }
-
 
396
                        //Thread.Sleep(1);
-
 
397
                        // If received ack.
-
 
398
                        hasMessage = dc.getData(out cm);
-
 
399
                        if (hasMessage) {
-
 
400
                            CanNMT cpnin = new CanNMT(cm);
-
 
401
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
-
 
402
                                // If no error
-
 
403
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
-
 
404
                                    pgs = dState.SEND_DONE_EMPTY;
-
 
405
                                }
-
 
406
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
-
 
407
                                    // else ..
-
 
408
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
-
 
409
                                    errorOccured = true;
-
 
410
                                    pgs = dState.SEND_RESET;
-
 
411
                                }
-
 
412
                               
-
 
413
                            }
-
 
414
                        }
-
 
415
                        break;
-
 
416
                       
-
 
417
                    case dState.SEND_DONE_EMPTY:
-
 
418
                        // Send done
-
 
419
                        outCm = cpn.getPgmEndPacket();
-
 
420
                        dc.sendCanPacket(outCm);
-
 
421
 
-
 
422
                        t = Environment.TickCount;
-
 
423
                        pgs = dState.WAIT_DONE_EMPTY;
-
 
424
                        break;
-
 
425
                       
-
 
426
                       
-
 
427
                    case dState.WAIT_DONE_EMPTY:
-
 
428
                        // Check for timeout, resend done packet in that case..
-
 
429
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
-
 
430
                            Console.WriteLine("Timeout while waiting for end prg ack.");
-
 
431
                            errorOccured = true;
-
 
432
                            pgs = dState.SEND_RESET;
-
 
433
                        }
-
 
434
                        //Thread.Sleep(1);
-
 
435
                       
-
 
436
                        hasMessage = dc.getData(out cm);
-
 
437
                        if (hasMessage) {
-
 
438
                            CanNMT cpnin = new CanNMT(cm);
-
 
439
                            if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
-
 
440
                                // If no error
-
 
441
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
-
 
442
                                    Console.WriteLine("");
-
 
443
                                    //
-
 
444
                                    Console.WriteLine("Done, successfully cleaned application flash.");
-
 
445
                                    pgs = dState.SEND_RESET;
-
 
446
                                }
-
 
447
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK) {
-
 
448
                                    // else resend addr..
-
 
449
                                    Console.WriteLine("Nack on CAN_NMT_PGM_END.");
-
 
450
                                    errorOccured = true;
-
 
451
                                    pgs = dState.SEND_RESET;
-
 
452
                                }
-
 
453
                            }
-
 
454
                        }
-
 
455
                        break;                     
298
                    case dState.SEND_RESET:
456
                    case dState.SEND_RESET:
299
                        // Send reset
457
                        // Send reset
300
                        cpn.doReset(dc, receiveID);
458
                        cpn.doReset(dc, receiveID);
301
                        t = Environment.TickCount;
459
                        t = Environment.TickCount;
302
                        pgs = dState.DONE;
460
                        pgs = dState.DONE;