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, |
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 |
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; |