comparison Discovery/Src/tCCR.c @ 322:31e471d60797 O2_SensorSync

Added start of frame detection for HUD data In the previous impmenentation the reception and evaluation of 15 byte were used without start detection. As a result sensor data could be stuck in case the frame sequence does not match the structure (e.g. cause by an framing error). To resolve this in case of an invalid checksumme in combination with a data lost detection a byte based reception is startet to detect the start of a frame using the break between two transmissions. In addition a babbling idiot protecting has been added because a faulty hardware could have an impact on the OSTC operation (high interrupt load)
author ideenmodellierer
date Sun, 30 Jun 2019 21:25:58 +0200
parents 74a8296a2318
children f1257a32f2d4
comparison
equal deleted inserted replaced
321:37ee61f93124 322:31e471d60797
44 uint8_t temp1; 44 uint8_t temp1;
45 uint16_t battery_voltage_mV; 45 uint16_t battery_voltage_mV;
46 uint16_t checksum; 46 uint16_t checksum;
47 } SIrLink; 47 } SIrLink;
48 48
49 #define HUD_BABBLING_IDIOT (30u) /* 30 Bytes received without break */
50 #define HUD_RX_FRAME_LENGTH (15u) /* Length of a HUD data frame */
51 #define HUD_RX_FRAME_BREAK_MS (100u) /* Time used to detect a gap between two byte receptions => frame start */
52 #define HUD_RX_START_DELAY_MS (500u) /* Delay for start of RX function to avoid start of reception while a transmission is ongoing. */
53 /* Based on an assumed cycle time by the sensor of 1 second. Started at time of last RX */
54
49 /* Private variables ---------------------------------------------------------*/ 55 /* Private variables ---------------------------------------------------------*/
50 SIrLink receiveHUD[2]; 56 static SIrLink receiveHUD[2];
51 uint8_t boolHUDdata = 0; 57 static uint8_t boolHUDdata = 0;
52 uint8_t data_old__lost_connection_to_HUD = 1; 58 static uint8_t data_old__lost_connection_to_HUD = 1;
53 59
54 uint8_t receiveHUDraw[16]; 60 static uint8_t receiveHUDraw[16];
55 61
56 uint8_t StartListeningToUART_HUD = 0; 62 static uint8_t StartListeningToUART_HUD = 0;
57 uint16_t count = 0; 63 static uint16_t HUDTimeoutCount = 0;
64
65 static __IO ITStatus UartReadyHUD = RESET;
66 static uint32_t LastReceivedTick_HUD = 0;
58 67
59 /* Private variables with external access via get_xxx() function -------------*/ 68 /* Private variables with external access via get_xxx() function -------------*/
60 69
61 /* Private function prototypes -----------------------------------------------*/ 70 /* Private function prototypes -----------------------------------------------*/
62 static void tCCR_fallbackToFixedSetpoint(void); 71 static void tCCR_fallbackToFixedSetpoint(void);
287 /* after 3 seconds without update from HUD 296 /* after 3 seconds without update from HUD
288 * data is considered old 297 * data is considered old
289 */ 298 */
290 void tCCR_tick(void) 299 void tCCR_tick(void)
291 { 300 {
292 if(count < 3 * 10) 301 if(HUDTimeoutCount < 3 * 10)
293 count++; 302 HUDTimeoutCount++;
294 else 303 else
295 { 304 {
296 data_old__lost_connection_to_HUD = 1; 305 data_old__lost_connection_to_HUD = 1;
297 if(count < 20 * 10) 306 if(HUDTimeoutCount < 20 * 10)
298 count++; 307 HUDTimeoutCount++;
299 else 308 else
300 tCCR_fallbackToFixedSetpoint(); 309 tCCR_fallbackToFixedSetpoint();
301 } 310 }
302 } 311 }
303 312
313 void tCCR_SetRXIndication(void)
314 {
315 static uint8_t floatingRXCount = 0;
316
317 if((UartIR_HUD_Handle.RxXferSize == HUD_RX_FRAME_LENGTH) || (UartIR_HUD_Handle.RxXferSize == HUD_RX_FRAME_LENGTH - 1)) /* we expected a complete frame */
318 {
319 UartReadyHUD = SET;
320 LastReceivedTick_HUD = HAL_GetTick();
321 floatingRXCount = 0;
322 }
323 else /* follow up of error handling */
324 {
325 if(time_elapsed_ms(LastReceivedTick_HUD, HAL_GetTick()) > HUD_RX_FRAME_BREAK_MS) /* Reception took a while => frame start detected */
326 {
327 HAL_UART_Receive_IT(&UartIR_HUD_Handle, &receiveHUDraw[1], 14); /* We have already the first byte => get the missing 14 */
328 }
329 else
330 {
331 if(floatingRXCount++ < HUD_BABBLING_IDIOT)
332 {
333 HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 1); /* Start polling of incoming bytes */
334 }
335 else /* Significant amount of data comming in without break => disable input */
336 { /* by not reactivation HUD RX, no recovery fromthis state */
337 stateUsedWrite->diveSettings.ppo2sensors_deactivated = 0x07; /* Display deactivation */
338 }
339 }
340 }
341
342 }
304 343
305 void tCCR_restart(void) 344 void tCCR_restart(void)
306 { 345 {
307 HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 15);/* 15*/ 346 HAL_UART_AbortReceive_IT(&UartIR_HUD_Handle); /* Called by the error handler. RX will be restarted by control function */
347 StartListeningToUART_HUD = 1;
308 } 348 }
309 349
310 350
311 void tCCR_control(void) 351 void tCCR_control(void)
312 { 352 {
313 if((UartReadyHUD == RESET) && StartListeningToUART_HUD) 353
314 { 354 if((UartReadyHUD == RESET) && StartListeningToUART_HUD && (time_elapsed_ms(LastReceivedTick_HUD, HAL_GetTick()) > HUD_RX_START_DELAY_MS))
315 StartListeningToUART_HUD = 0; 355 {
316 HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 15);/* 15*/ 356 StartListeningToUART_HUD = 0;
317 } 357 HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, HUD_RX_FRAME_LENGTH);
358 }
318 359
319 if(UartReadyHUD == SET) 360 if(UartReadyHUD == SET)
320 { 361 {
321 UartReadyHUD = RESET; 362 UartReadyHUD = RESET;
363 StartListeningToUART_HUD = 1;
322 364
323 memcpy(&receiveHUD[!boolHUDdata], receiveHUDraw, 11); 365 memcpy(&receiveHUD[!boolHUDdata], receiveHUDraw, 11);
324 receiveHUD[!boolHUDdata].battery_voltage_mV = receiveHUDraw[11] + (256 * receiveHUDraw[12]); 366 receiveHUD[!boolHUDdata].battery_voltage_mV = receiveHUDraw[11] + (256 * receiveHUDraw[12]);
325 receiveHUD[!boolHUDdata].checksum = receiveHUDraw[13] + (256 * receiveHUDraw[14]); 367 receiveHUD[!boolHUDdata].checksum = receiveHUDraw[13] + (256 * receiveHUDraw[14]);
326 368
331 checksum += receiveHUDraw[i]; 373 checksum += receiveHUDraw[i];
332 } 374 }
333 if(checksum == receiveHUD[!boolHUDdata].checksum) 375 if(checksum == receiveHUD[!boolHUDdata].checksum)
334 { 376 {
335 boolHUDdata = !boolHUDdata; 377 boolHUDdata = !boolHUDdata;
336 count = 0; 378 HUDTimeoutCount = 0;
337 data_old__lost_connection_to_HUD = 0; 379 data_old__lost_connection_to_HUD = 0;
338 } 380 }
339 StartListeningToUART_HUD = 1; 381 else
382 {
383 if(data_old__lost_connection_to_HUD) /* we lost connection, maybe due to RX shift => start single byte read to resynchronize */
384 {
385 HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 1);
386 StartListeningToUART_HUD = 0;
387 }
388 }
389 memset(receiveHUDraw,0,sizeof(receiveHUDraw));
340 } 390 }
341 } 391 }
342 392
343 #endif 393 #endif
344 /* Private functions ---------------------------------------------------------*/ 394 /* Private functions ---------------------------------------------------------*/