# HG changeset patch # User heinrichsweikamp # Date 1561924366 0 # Node ID b43fa6a6c85a59d701800e4abb305f4b97f4c0b6 # Parent 117a7ec23385f20e259a654a63f90e2637f7f2af# Parent 31e471d607970beeba7d2b44257a73a472713bb7 Merged in Ideenmodellierer/ostc4/O2_SensorSync (pull request #28) O2 SensorSync diff -r 117a7ec23385 -r b43fa6a6c85a Discovery/Inc/ostc.h --- a/Discovery/Inc/ostc.h Wed Jun 19 13:12:25 2019 +0000 +++ b/Discovery/Inc/ostc.h Sun Jun 30 19:52:46 2019 +0000 @@ -69,7 +69,6 @@ #ifdef USART_IR_HUD extern UART_HandleTypeDef UartIR_HUD_Handle; #endif -extern __IO ITStatus UartReadyHUD; #ifdef USART_PIEZO extern UART_HandleTypeDef UartPiezoTxHandle; diff -r 117a7ec23385 -r b43fa6a6c85a Discovery/Inc/tCCR.h --- a/Discovery/Inc/tCCR.h Wed Jun 19 13:12:25 2019 +0000 +++ b/Discovery/Inc/tCCR.h Sun Jun 30 19:52:46 2019 +0000 @@ -38,6 +38,8 @@ void tCCR_restart(void); void tCCR_tick(void); +void tCCR_SetRXIndication(void); + float get_ppO2Sensor_bar(uint8_t sensor_id); float get_sensorVoltage_mV(uint8_t sensor_id); float get_HUD_battery_voltage_V(void); diff -r 117a7ec23385 -r b43fa6a6c85a Discovery/Src/ostc.c --- a/Discovery/Src/ostc.c Wed Jun 19 13:12:25 2019 +0000 +++ b/Discovery/Src/ostc.c Sun Jun 30 19:52:46 2019 +0000 @@ -46,7 +46,6 @@ UART_HandleTypeDef UartIR_HUD_Handle; __IO ITStatus UartReady = RESET; -__IO ITStatus UartReadyHUD = RESET; /* Private types -------------------------------------------------------------*/ @@ -304,7 +303,7 @@ UartReady = SET; } -//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) + void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart == &UartHandle) @@ -312,7 +311,7 @@ else if(huart == &UartIR_HUD_Handle) { - UartReadyHUD = SET; + tCCR_SetRXIndication(); } } diff -r 117a7ec23385 -r b43fa6a6c85a Discovery/Src/tCCR.c --- a/Discovery/Src/tCCR.c Wed Jun 19 13:12:25 2019 +0000 +++ b/Discovery/Src/tCCR.c Sun Jun 30 19:52:46 2019 +0000 @@ -46,15 +46,24 @@ uint16_t checksum; } SIrLink; -/* Private variables ---------------------------------------------------------*/ -SIrLink receiveHUD[2]; -uint8_t boolHUDdata = 0; -uint8_t data_old__lost_connection_to_HUD = 1; +#define HUD_BABBLING_IDIOT (30u) /* 30 Bytes received without break */ +#define HUD_RX_FRAME_LENGTH (15u) /* Length of a HUD data frame */ +#define HUD_RX_FRAME_BREAK_MS (100u) /* Time used to detect a gap between two byte receptions => frame start */ +#define HUD_RX_START_DELAY_MS (500u) /* Delay for start of RX function to avoid start of reception while a transmission is ongoing. */ + /* Based on an assumed cycle time by the sensor of 1 second. Started at time of last RX */ -uint8_t receiveHUDraw[16]; +/* Private variables ---------------------------------------------------------*/ +static SIrLink receiveHUD[2]; +static uint8_t boolHUDdata = 0; +static uint8_t data_old__lost_connection_to_HUD = 1; -uint8_t StartListeningToUART_HUD = 0; -uint16_t count = 0; +static uint8_t receiveHUDraw[16]; + +static uint8_t StartListeningToUART_HUD = 0; +static uint16_t HUDTimeoutCount = 0; + +static __IO ITStatus UartReadyHUD = RESET; +static uint32_t LastReceivedTick_HUD = 0; /* Private variables with external access via get_xxx() function -------------*/ @@ -289,36 +298,69 @@ */ void tCCR_tick(void) { - if(count < 3 * 10) - count++; + if(HUDTimeoutCount < 3 * 10) + HUDTimeoutCount++; else { data_old__lost_connection_to_HUD = 1; - if(count < 20 * 10) - count++; + if(HUDTimeoutCount < 20 * 10) + HUDTimeoutCount++; else tCCR_fallbackToFixedSetpoint(); } } +void tCCR_SetRXIndication(void) +{ + static uint8_t floatingRXCount = 0; + + if((UartIR_HUD_Handle.RxXferSize == HUD_RX_FRAME_LENGTH) || (UartIR_HUD_Handle.RxXferSize == HUD_RX_FRAME_LENGTH - 1)) /* we expected a complete frame */ + { + UartReadyHUD = SET; + LastReceivedTick_HUD = HAL_GetTick(); + floatingRXCount = 0; + } + else /* follow up of error handling */ + { + if(time_elapsed_ms(LastReceivedTick_HUD, HAL_GetTick()) > HUD_RX_FRAME_BREAK_MS) /* Reception took a while => frame start detected */ + { + HAL_UART_Receive_IT(&UartIR_HUD_Handle, &receiveHUDraw[1], 14); /* We have already the first byte => get the missing 14 */ + } + else + { + if(floatingRXCount++ < HUD_BABBLING_IDIOT) + { + HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 1); /* Start polling of incoming bytes */ + } + else /* Significant amount of data comming in without break => disable input */ + { /* by not reactivation HUD RX, no recovery fromthis state */ + stateUsedWrite->diveSettings.ppo2sensors_deactivated = 0x07; /* Display deactivation */ + } + } + } + +} void tCCR_restart(void) { - HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 15);/* 15*/ + HAL_UART_AbortReceive_IT(&UartIR_HUD_Handle); /* Called by the error handler. RX will be restarted by control function */ + StartListeningToUART_HUD = 1; } void tCCR_control(void) { - if((UartReadyHUD == RESET) && StartListeningToUART_HUD) - { - StartListeningToUART_HUD = 0; - HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 15);/* 15*/ - } + + if((UartReadyHUD == RESET) && StartListeningToUART_HUD && (time_elapsed_ms(LastReceivedTick_HUD, HAL_GetTick()) > HUD_RX_START_DELAY_MS)) + { + StartListeningToUART_HUD = 0; + HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, HUD_RX_FRAME_LENGTH); + } if(UartReadyHUD == SET) { UartReadyHUD = RESET; + StartListeningToUART_HUD = 1; memcpy(&receiveHUD[!boolHUDdata], receiveHUDraw, 11); receiveHUD[!boolHUDdata].battery_voltage_mV = receiveHUDraw[11] + (256 * receiveHUDraw[12]); @@ -333,10 +375,18 @@ if(checksum == receiveHUD[!boolHUDdata].checksum) { boolHUDdata = !boolHUDdata; - count = 0; + HUDTimeoutCount = 0; data_old__lost_connection_to_HUD = 0; } - StartListeningToUART_HUD = 1; + else + { + if(data_old__lost_connection_to_HUD) /* we lost connection, maybe due to RX shift => start single byte read to resynchronize */ + { + HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 1); + StartListeningToUART_HUD = 0; + } + } + memset(receiveHUDraw,0,sizeof(receiveHUDraw)); } }