Mercurial > public > ostc4
comparison Small_CPU/Src/scheduler.c @ 135:5df4f1a315cb FlipDisplay
Restore old data copy locations
Do first calculation based on ambient bar to avoid desaturation shift
Added error handling for lost communication
| author | Ideenmodellierer |
|---|---|
| date | Tue, 19 Feb 2019 18:18:37 +0100 |
| parents | 6347a86caa18 |
| children | 69f4b8067daa |
comparison
equal
deleted
inserted
replaced
| 134:0586ae83a243 | 135:5df4f1a315cb |
|---|---|
| 42 #include "decom.h" | 42 #include "decom.h" |
| 43 #include "wireless.h" | 43 #include "wireless.h" |
| 44 #include "tm_stm32f4_otp.h" | 44 #include "tm_stm32f4_otp.h" |
| 45 | 45 |
| 46 | 46 |
| 47 #define INVALID_PREASURE_VALUE (100.0F) | |
| 48 | |
| 47 /* Private types -------------------------------------------------------------*/ | 49 /* Private types -------------------------------------------------------------*/ |
| 48 const SGas Air = {79,0,0,0,0}; | 50 const SGas Air = {79,0,0,0,0}; |
| 49 | 51 |
| 50 uint8_t testarrayindex = 0; | 52 uint8_t testarrayindex = 0; |
| 51 uint32_t testarray[256]; | 53 uint32_t testarray[256]; |
| 121 global.ButtonPICdata[2] = 0xFF; | 123 global.ButtonPICdata[2] = 0xFF; |
| 122 global.ButtonPICdata[3] = 0xFF; | 124 global.ButtonPICdata[3] = 0xFF; |
| 123 | 125 |
| 124 global.I2C_SystemStatus = 0xFF; // 0x00 would be everything working | 126 global.I2C_SystemStatus = 0xFF; // 0x00 would be everything working |
| 125 | 127 |
| 126 global.lifeData.pressure_ambient_bar = 1.0f; | 128 global.lifeData.pressure_ambient_bar = INVALID_PREASURE_VALUE; |
| 127 global.lifeData.pressure_surface_bar = 1.0f; | 129 global.lifeData.pressure_surface_bar = INVALID_PREASURE_VALUE; |
| 128 decom_reset_with_1000mbar(&global.lifeData); | 130 decom_reset_with_1000mbar(&global.lifeData); |
| 129 | 131 |
| 130 global.demo_mode = 0; | 132 global.demo_mode = 0; |
| 131 | 133 |
| 132 for(int i = 0; i < MAX_SENSORS; i++) | 134 for(int i = 0; i < MAX_SENSORS; i++) |
| 285 MX_I2C1_Init(); | 287 MX_I2C1_Init(); |
| 286 // init_pressure(); | 288 // init_pressure(); |
| 287 // compass_init(0, 7); | 289 // compass_init(0, 7); |
| 288 // accelerator_init(); | 290 // accelerator_init(); |
| 289 } | 291 } |
| 290 //Collect and copy sensor data just in one place. | |
| 291 //TODO: compass_calib_common needs big refactor. | |
| 292 compass_read(); | |
| 293 acceleration_read(); | |
| 294 compass_calc(); | |
| 295 pressure_update(); | |
| 296 copyPressureData(); | |
| 297 battery_gas_gauge_get_data(); | |
| 298 copyCompassData(); | |
| 299 // copyCnsAndOtuData(); //TODO: move here. | |
| 300 copyTimeData(); | |
| 301 // copyBatteryData(); // TODO: move here. | |
| 302 copyDeviceData(); | |
| 303 copyVpmCrushingData(); | |
| 304 // | |
| 305 scheduleUpdateDeviceData(); | |
| 306 | |
| 307 | |
| 308 } | 292 } |
| 309 | 293 |
| 310 | 294 |
| 311 /** | 295 /** |
| 312 ****************************************************************************** | 296 ****************************************************************************** |
| 437 * @author heinrichs weikamp gmbh | 421 * @author heinrichs weikamp gmbh |
| 438 * @version V0.0.2 | 422 * @version V0.0.2 |
| 439 * @date 18-June-2015 | 423 * @date 18-June-2015 |
| 440 ****************************************************************************** | 424 ****************************************************************************** |
| 441 */ | 425 */ |
| 426 | |
| 442 void schedule_check_resync(void) | 427 void schedule_check_resync(void) |
| 443 { | 428 { |
| 444 //TODO: REMOVE | 429 //TODO: REMOVE |
| 445 if((global.check_sync_not_running >= 2)) | 430 if((global.check_sync_not_running >= 3)) |
| 446 { | 431 { |
| 447 // global.dataSendToSlaveIsNotValidCount = 0; | 432 // global.dataSendToSlaveIsNotValidCount = 0; |
| 448 // global.check_sync_not_running = 0; | 433 global.check_sync_not_running = 0; |
| 449 // global.sync_error_count++; | 434 global.sync_error_count++; |
| 450 // MX_SPI_DeInit(); | 435 |
| 451 // HAL_Delay(30); /* could be closer to length of data transmission 23.Feb.2015 hw */ | 436 /* Try to start communication again. If exchange is stuck during execution for some reason the TX will be aborted by the |
| 452 // MX_DMA_Init(); | 437 * function error handler |
| 453 // MX_SPI1_Init(); | 438 */ |
| 454 // SPI_Start_single_TxRx_with_Master(); | 439 SPI_Start_single_TxRx_with_Master(); |
| 455 } | 440 } |
| 456 } | 441 } |
| 457 | 442 |
| 458 | 443 |
| 459 /** | 444 /** |
| 510 | 495 |
| 511 //Evaluate pressure at 20 ms, 120 ms, 220 ms,.... | 496 //Evaluate pressure at 20 ms, 120 ms, 220 ms,.... |
| 512 if(ticksdiff >= counterPressure100msec * 100 + 20) | 497 if(ticksdiff >= counterPressure100msec * 100 + 20) |
| 513 { | 498 { |
| 514 global.check_sync_not_running++; | 499 global.check_sync_not_running++; |
| 515 // pressure_update(); | 500 pressure_update(); |
| 516 // scheduleUpdateDeviceData(); | 501 scheduleUpdateDeviceData(); |
| 517 if(global.demo_mode) | 502 if(global.demo_mode) |
| 518 { | 503 { |
| 519 turbo_seconds = demo_modify_temperature_and_pressure(global.lifeData.dive_time_seconds, counterPressure100msec, global.ceiling_from_main_CPU_mbar); | 504 turbo_seconds = demo_modify_temperature_and_pressure(global.lifeData.dive_time_seconds, counterPressure100msec, global.ceiling_from_main_CPU_mbar); |
| 520 if(turbo_seconds) | 505 if(turbo_seconds) |
| 521 { | 506 { |
| 542 counterAscentRate = 0; | 527 counterAscentRate = 0; |
| 543 | 528 |
| 544 // if(global.demo_mode) | 529 // if(global.demo_mode) |
| 545 // global.lifeData.ascent_rate_meter_per_min /= 4; | 530 // global.lifeData.ascent_rate_meter_per_min /= 4; |
| 546 } | 531 } |
| 547 // copyPressureData(); | 532 copyPressureData(); |
| 548 counterPressure100msec++; | 533 counterPressure100msec++; |
| 549 } | 534 } |
| 550 //evaluate compass data at 50 ms, 150 ms, 250 ms,.... | 535 //evaluate compass data at 50 ms, 150 ms, 250 ms,.... |
| 551 // if(ticksdiff >= counterCompass100msec * 100 + 50) | 536 if(ticksdiff >= counterCompass100msec * 100 + 50) |
| 552 // { | 537 { |
| 553 // compass_read(); | 538 compass_read(); |
| 554 // acceleration_read(); | 539 acceleration_read(); |
| 555 // compass_calc(); | 540 compass_calc(); |
| 556 // copyCompassData(); | 541 copyCompassData(); |
| 557 // counterCompass100msec++; | 542 counterCompass100msec++; |
| 558 // } | 543 } |
| 559 | 544 |
| 560 if(ticksdiff >= counterAmbientLight100msec * 100 + 70) | 545 if(ticksdiff >= counterAmbientLight100msec * 100 + 70) |
| 561 { | 546 { |
| 562 adc_ambient_light_sensor_get_data(); | 547 adc_ambient_light_sensor_get_data(); |
| 563 copyAmbientLightData(); | 548 copyAmbientLightData(); |
| 720 //Evaluate pressure at 20 ms, 120 ms, 220 ms,... | 705 //Evaluate pressure at 20 ms, 120 ms, 220 ms,... |
| 721 if(ticksdiff >= counterPressure100msec * 100 + 20) | 706 if(ticksdiff >= counterPressure100msec * 100 + 20) |
| 722 { | 707 { |
| 723 global.check_sync_not_running++; | 708 global.check_sync_not_running++; |
| 724 | 709 |
| 725 //pressure_update(); | 710 pressure_update(); |
| 726 //scheduleUpdateDeviceData(); | 711 scheduleUpdateDeviceData(); |
| 727 global.lifeData.ascent_rate_meter_per_min = 0; | 712 global.lifeData.ascent_rate_meter_per_min = 0; |
| 728 //copyPressureData(); | 713 copyPressureData(); |
| 729 | 714 |
| 730 if(temperature_carousel > 20.0f) | 715 if(temperature_carousel > 20.0f) |
| 731 { | 716 { |
| 732 temperature_carousel = 20.0f; | 717 temperature_carousel = 20.0f; |
| 733 temperature_changer = -0.1f; | 718 temperature_changer = -0.1f; |
| 802 | 787 |
| 803 //Evaluate pressure at 20 ms, 120 ms, 220 ms,... | 788 //Evaluate pressure at 20 ms, 120 ms, 220 ms,... |
| 804 if(ticksdiff >= counterPressure100msec * 100 + 20) | 789 if(ticksdiff >= counterPressure100msec * 100 + 20) |
| 805 { | 790 { |
| 806 global.check_sync_not_running++; | 791 global.check_sync_not_running++; |
| 807 // pressure_update(); | 792 pressure_update(); |
| 808 // scheduleUpdateDeviceData(); | 793 scheduleUpdateDeviceData(); |
| 809 global.lifeData.ascent_rate_meter_per_min = 0; | 794 global.lifeData.ascent_rate_meter_per_min = 0; |
| 810 // copyPressureData(); | 795 copyPressureData(); |
| 811 counterPressure100msec++; | 796 counterPressure100msec++; |
| 812 | 797 |
| 813 if(scheduleCheck_pressure_reached_dive_mode_level()) | 798 if(scheduleCheck_pressure_reached_dive_mode_level()) |
| 814 global.mode = MODE_DIVE; | 799 global.mode = MODE_DIVE; |
| 815 } | 800 } |
| 816 | 801 |
| 817 //evaluate compass data at 50 ms, 150 ms, 250 ms,... | 802 //evaluate compass data at 50 ms, 150 ms, 250 ms,... |
| 818 | 803 |
| 819 // if(ticksdiff >= counterCompass100msec * 100 + 50) | 804 if(ticksdiff >= counterCompass100msec * 100 + 50) |
| 820 // { | 805 { |
| 821 //// compass_read(); | 806 compass_read(); |
| 822 //// acceleration_read(); | 807 acceleration_read(); |
| 823 // compass_calc(); | 808 compass_calc(); |
| 824 // copyCompassData(); | 809 copyCompassData(); |
| 825 // counterCompass100msec++; | 810 counterCompass100msec++; |
| 826 // } | 811 } |
| 827 | 812 |
| 828 //evaluate compass data at 70 ms, 170 ms, 270 ms,... | 813 //evaluate compass data at 70 ms, 170 ms, 270 ms,... |
| 829 if(ticksdiff >= counterAmbientLight100msec * 100 + 70) | 814 if(ticksdiff >= counterAmbientLight100msec * 100 + 70) |
| 830 { | 815 { |
| 831 adc_ambient_light_sensor_get_data(); | 816 adc_ambient_light_sensor_get_data(); |
| 845 global.accidentFlag = 0; | 830 global.accidentFlag = 0; |
| 846 global.accidentRemainingSeconds = 0; | 831 global.accidentRemainingSeconds = 0; |
| 847 vpm_init(&global.vpm, global.conservatism, global.repetitive_dive, global.seconds_since_last_dive); | 832 vpm_init(&global.vpm, global.conservatism, global.repetitive_dive, global.seconds_since_last_dive); |
| 848 clearDecoNow = 0; | 833 clearDecoNow = 0; |
| 849 } | 834 } |
| 850 | 835 |
| 851 //Set back tick counter | 836 //Set back tick counter |
| 852 tickstart = HAL_GetTick(); | 837 tickstart = HAL_GetTick(); |
| 853 | 838 |
| 854 | 839 |
| 855 if(global.seconds_since_last_dive) | 840 if(global.seconds_since_last_dive) |
| 870 | 855 |
| 871 update_surface_pressure(1); | 856 update_surface_pressure(1); |
| 872 scheduleUpdateLifeData(0); | 857 scheduleUpdateLifeData(0); |
| 873 decom_oxygen_calculate_otu_degrade(&global.lifeData.otu, global.seconds_since_last_dive); | 858 decom_oxygen_calculate_otu_degrade(&global.lifeData.otu, global.seconds_since_last_dive); |
| 874 decom_oxygen_calculate_cns_degrade(&global.lifeData.cns, global.seconds_since_last_dive); | 859 decom_oxygen_calculate_cns_degrade(&global.lifeData.cns, global.seconds_since_last_dive); |
| 875 global.lifeData.desaturation_time_minutes = decom_calc_desaturation_time(global.lifeData.tissue_nitrogen_bar,global.lifeData.tissue_helium_bar,global.lifeData.pressure_surface_bar); | 860 |
| 861 /* start desaturation calculation after first valid measurement has been done */ | |
| 862 if(global.lifeData.pressure_surface_bar != INVALID_PREASURE_VALUE) | |
| 863 { | |
| 864 global.lifeData.desaturation_time_minutes = decom_calc_desaturation_time(global.lifeData.tissue_nitrogen_bar,global.lifeData.tissue_helium_bar,global.lifeData.pressure_surface_bar); | |
| 865 } | |
| 866 else | |
| 867 { | |
| 868 global.lifeData.desaturation_time_minutes = 0; | |
| 869 } | |
| 876 battery_charger_get_status_and_contral_battery_gas_gauge(0); | 870 battery_charger_get_status_and_contral_battery_gas_gauge(0); |
| 877 battery_gas_gauge_get_data(); | 871 battery_gas_gauge_get_data(); |
| 878 | 872 |
| 879 copyCnsAndOtuData(); | 873 copyCnsAndOtuData(); |
| 880 copyTimeData(); | 874 copyTimeData(); |
| 889 if(!is_init_pressure_done()) | 883 if(!is_init_pressure_done()) |
| 890 { | 884 { |
| 891 init_pressure(); | 885 init_pressure(); |
| 892 } | 886 } |
| 893 } | 887 } |
| 894 | 888 |
| 895 counterCompass100msec = 0; | 889 counterCompass100msec = 0; |
| 896 counterPressure100msec = 0; | 890 counterPressure100msec = 0; |
| 897 counterAmbientLight100msec = 0; | 891 counterAmbientLight100msec = 0; |
| 898 counterWireless1msec = 0; | 892 counterWireless1msec = 0; |
| 899 } | 893 } |
| 1058 uint32_t ticksdiff = 0; | 1052 uint32_t ticksdiff = 0; |
| 1059 uint32_t ticksnow = 0; | 1053 uint32_t ticksnow = 0; |
| 1060 uint32_t time_seconds = 0; | 1054 uint32_t time_seconds = 0; |
| 1061 uint8_t whichGasTmp = 0; | 1055 uint8_t whichGasTmp = 0; |
| 1062 | 1056 |
| 1057 uint8_t updateTissueData = 0; | |
| 1058 | |
| 1059 | |
| 1060 if(global.lifeData.pressure_surface_bar == INVALID_PREASURE_VALUE) | |
| 1061 { | |
| 1062 updateTissueData = 1; | |
| 1063 } | |
| 1064 | |
| 1063 if(asynchron_milliseconds_since_last < 0) | 1065 if(asynchron_milliseconds_since_last < 0) |
| 1064 { | 1066 { |
| 1065 first = 1; | 1067 first = 1; |
| 1066 tickstart = 0; | 1068 tickstart = 0; |
| 1067 ticksrest = 0; | 1069 ticksrest = 0; |
| 1077 | 1079 |
| 1078 whichGasTmp = global.whichGas; | 1080 whichGasTmp = global.whichGas; |
| 1079 global.lifeData.actualGas = global.aktualGas[whichGasTmp]; | 1081 global.lifeData.actualGas = global.aktualGas[whichGasTmp]; |
| 1080 global.lifeData.pressure_ambient_bar = get_pressure_mbar() / 1000.0f; | 1082 global.lifeData.pressure_ambient_bar = get_pressure_mbar() / 1000.0f; |
| 1081 global.lifeData.pressure_surface_bar = get_surface_mbar() / 1000.0f; | 1083 global.lifeData.pressure_surface_bar = get_surface_mbar() / 1000.0f; |
| 1084 | |
| 1085 if(updateTissueData) | |
| 1086 { | |
| 1087 decom_reset_with_ambientmbar(global.lifeData.pressure_surface_bar,&global.lifeData); | |
| 1088 } | |
| 1082 | 1089 |
| 1083 if(!asynchron_milliseconds_since_last) | 1090 if(!asynchron_milliseconds_since_last) |
| 1084 { | 1091 { |
| 1085 ticksnow = HAL_GetTick(); | 1092 ticksnow = HAL_GetTick(); |
| 1086 ticksdiff = time_elapsed_ms(tickstart,ticksnow); | 1093 ticksdiff = time_elapsed_ms(tickstart,ticksnow); |
