Mercurial > public > ostc4
comparison Small_CPU/Src/scheduler.c @ 277:580822b5d3d1 IPC_Sync_Improvment_3
Rework SPI error handling.
SPI_Start_single_TxRx_with_Master evaluated the incoming data for a condition to send device instead of life data. In case of invalid input data this may cause unintended transmission of device data => now lifedata is send if incoming data is expected to be invalid
The SPI timeout monitoring was done at the beginning of the mode loop. A timeout may have been detected even if meanwhile valid data was received (this is evaluated at x20ms) => Moved the timeout monitoring after the handling of incoming data
| author | ideenmodellierer |
|---|---|
| date | Sun, 28 Apr 2019 10:16:38 +0200 |
| parents | a91d99265884 |
| children | a09b1855d656 |
comparison
equal
deleted
inserted
replaced
| 276:8e9c502c0b06 | 277:580822b5d3d1 |
|---|---|
| 419 global.sync_error_count++; | 419 global.sync_error_count++; |
| 420 | 420 |
| 421 /* Try to start communication again. If exchange is stuck during execution for some reason the TX will be aborted by the | 421 /* Try to start communication again. If exchange is stuck during execution for some reason the TX will be aborted by the |
| 422 * function error handler | 422 * function error handler |
| 423 */ | 423 */ |
| 424 SPI_Start_single_TxRx_with_Master(); | 424 HAL_SPI_TransmitReceive_DMA(&hspi1,(uint8_t*) &(global.dataSendToMaster),(uint8_t*) &(global.dataSendToSlave), EXCHANGE_BUFFERSIZE); |
| 425 Scheduler.communicationTimeout = SPI_COM_TIMEOUT_COMMON; /* Reduce error detection time */ | 425 Scheduler.communicationTimeout = SPI_COM_TIMEOUT_COMMON; /* Reduce error detection time */ |
| 426 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD); | 426 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD); |
| 427 } | 427 } |
| 428 } | 428 } |
| 429 | 429 |
| 457 global.lifeData.counterSecondsShallowDepth = 0; | 457 global.lifeData.counterSecondsShallowDepth = 0; |
| 458 | 458 |
| 459 Scheduler.tickstart = HAL_GetTick(); | 459 Scheduler.tickstart = HAL_GetTick(); |
| 460 while(global.mode == MODE_DIVE) | 460 while(global.mode == MODE_DIVE) |
| 461 { | 461 { |
| 462 schedule_check_resync(); | |
| 463 lasttick = HAL_GetTick(); | 462 lasttick = HAL_GetTick(); |
| 464 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); | 463 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
| 465 | 464 |
| 466 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) | 465 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) |
| 467 { | 466 { |
| 468 SPI_Evaluate_RX_Data(); | 467 if(SPI_Evaluate_RX_Data()!=0) /* did we receive something ? */ |
| 469 Scheduler.counterSPIdata100msec++; | 468 { |
| 469 Scheduler.counterSPIdata100msec++; | |
| 470 } | |
| 471 schedule_check_resync(); | |
| 470 } | 472 } |
| 471 | 473 |
| 472 //Evaluate pressure at 20 ms, 120 ms, 220 ms,.... | 474 //Evaluate pressure at 20 ms, 120 ms, 220 ms,.... |
| 473 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) | 475 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) |
| 474 { | 476 { |
| 475 global.check_sync_not_running++; | 477 global.check_sync_not_running++; |
| 476 pressure_update(); | 478 pressure_update_alternating(); |
| 477 scheduleUpdateDeviceData(); | 479 scheduleUpdateDeviceData(); |
| 478 #ifdef DEMOMODE | 480 #ifdef DEMOMODE |
| 479 if(global.demo_mode) | 481 if(global.demo_mode) |
| 480 { | 482 { |
| 481 int turbo_seconds = demo_modify_temperature_and_pressure(global.lifeData.dive_time_seconds, Scheduler.counterPressure100msec, global.ceiling_from_main_CPU_mbar); | 483 int turbo_seconds = demo_modify_temperature_and_pressure(global.lifeData.dive_time_seconds, Scheduler.counterPressure100msec, global.ceiling_from_main_CPU_mbar); |
| 661 float temperature_carousel = 0.0f; | 663 float temperature_carousel = 0.0f; |
| 662 float temperature_changer = 0.1f; | 664 float temperature_changer = 0.1f; |
| 663 | 665 |
| 664 while(global.mode == MODE_TEST) | 666 while(global.mode == MODE_TEST) |
| 665 { | 667 { |
| 666 schedule_check_resync(); | |
| 667 lasttick = HAL_GetTick(); | 668 lasttick = HAL_GetTick(); |
| 668 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); | 669 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
| 669 | 670 |
| 670 //Evaluate received data at 10 ms, 110 ms, 210 ms,... | 671 //Evaluate received data at 10 ms, 110 ms, 210 ms,... |
| 671 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) | 672 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) |
| 672 { | 673 { |
| 673 SPI_Evaluate_RX_Data(); | 674 if(SPI_Evaluate_RX_Data()!=0) /* did we receive something ? */ |
| 674 Scheduler.counterSPIdata100msec++; | 675 { |
| 676 Scheduler.counterSPIdata100msec++; | |
| 677 } | |
| 678 schedule_check_resync(); | |
| 675 } | 679 } |
| 676 | 680 |
| 677 //Evaluate pressure at 20 ms, 120 ms, 220 ms,... | 681 //Evaluate pressure at 20 ms, 120 ms, 220 ms,... |
| 678 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) | 682 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) |
| 679 { | 683 { |
| 680 global.check_sync_not_running++; | 684 global.check_sync_not_running++; |
| 681 | 685 |
| 682 pressure_update(); | 686 pressure_update_alternating(); |
| 683 scheduleUpdateDeviceData(); | 687 scheduleUpdateDeviceData(); |
| 684 global.lifeData.ascent_rate_meter_per_min = 0; | 688 global.lifeData.ascent_rate_meter_per_min = 0; |
| 685 copyPressureData(); | 689 copyPressureData(); |
| 686 | 690 |
| 687 if(temperature_carousel > 20.0f) | 691 if(temperature_carousel > 20.0f) |
| 735 global.dataSendToMaster.mode = MODE_SURFACE; | 739 global.dataSendToMaster.mode = MODE_SURFACE; |
| 736 global.deviceDataSendToMaster.mode = MODE_SURFACE; | 740 global.deviceDataSendToMaster.mode = MODE_SURFACE; |
| 737 | 741 |
| 738 while(global.mode == MODE_SURFACE) | 742 while(global.mode == MODE_SURFACE) |
| 739 { | 743 { |
| 740 schedule_check_resync(); | 744 |
| 741 lasttick = HAL_GetTick(); | 745 lasttick = HAL_GetTick(); |
| 742 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); | 746 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
| 743 | 747 |
| 744 if(setButtonsNow == 1) | 748 if(setButtonsNow == 1) |
| 745 { | 749 { |
| 752 { | 756 { |
| 753 if(SPI_Evaluate_RX_Data()!=0) /* did we receive something ? */ | 757 if(SPI_Evaluate_RX_Data()!=0) /* did we receive something ? */ |
| 754 { | 758 { |
| 755 Scheduler.counterSPIdata100msec++; | 759 Scheduler.counterSPIdata100msec++; |
| 756 } | 760 } |
| 761 schedule_check_resync(); | |
| 757 } | 762 } |
| 758 | 763 |
| 759 /* Evaluate pressure at 20 ms, 120 ms, 220 ms,... duration ~22ms] */ | 764 /* Evaluate pressure at 20 ms, 120 ms, 220 ms,... duration ~22ms] */ |
| 760 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) | 765 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) |
| 761 { | 766 { |
| 762 global.check_sync_not_running++; | 767 global.check_sync_not_running++; |
| 763 pressure_update(); | 768 pressure_update_alternating(); |
| 764 scheduleUpdateDeviceData(); | 769 scheduleUpdateDeviceData(); |
| 765 global.lifeData.ascent_rate_meter_per_min = 0; | 770 global.lifeData.ascent_rate_meter_per_min = 0; |
| 766 copyPressureData(); | 771 copyPressureData(); |
| 767 Scheduler.counterPressure100msec++; | 772 Scheduler.counterPressure100msec++; |
| 768 | 773 |
