comparison Small_CPU/Src/uart_Internal.c @ 931:5a9bc2e6112d Evo_2_23

Added Sat Status Overview: In addition to the navigation data now information regarding the satelliete and signal status are visualized. To enable the a new command has been added to the communication protocol and the position view has been extended.
author Ideenmodellierer
date Tue, 03 Dec 2024 20:32:51 +0100
parents 908d9a8e8c84
children effadaa3a1f7
comparison
equal deleted inserted replaced
930:25948e805406 931:5a9bc2e6112d
27 #include "data_exchange.h" 27 #include "data_exchange.h"
28 #include <string.h> /* memset */ 28 #include <string.h> /* memset */
29 29
30 30
31 static uint8_t isEndIndication6(uint8_t index); 31 static uint8_t isEndIndication6(uint8_t index);
32 static uint8_t gnssState = UART_GNSS_INIT; 32 static uartGnssStatus_t gnssState = UART_GNSS_INIT;
33 static gnssRequest_s activeRequest = {0,0};
33 34
34 /* Private variables ---------------------------------------------------------*/ 35 /* Private variables ---------------------------------------------------------*/
35 36
36 37
37 #define TX_BUF_SIZE (40u) /* max length for commands */ 38 #define TX_BUF_SIZE (40u) /* max length for commands */
38 #define CHUNK_SIZE (25u) /* the DMA will handle chunk size transfers */ 39 #define CHUNK_SIZE (50u) /* the DMA will handle chunk size transfers */
39 #define CHUNKS_PER_BUFFER (6u) 40 #define CHUNKS_PER_BUFFER (3u)
40 41
41 #define REQUEST_INT_SENSOR_MS (1500) /* Minimum time interval for cyclic sensor data requests per sensor (UART mux) */ 42 #define REQUEST_INT_SENSOR_MS (1500) /* Minimum time interval for cyclic sensor data requests per sensor (UART mux) */
42 #define COMMAND_TX_DELAY (30u) /* The time the sensor needs to recover from a invalid command request */ 43 #define COMMAND_TX_DELAY (30u) /* The time the sensor needs to recover from a invalid command request */
43 #define TIMEOUT_SENSOR_ANSWER (300) /* Time till a request is repeated if no answer was received */ 44 #define TIMEOUT_SENSOR_ANSWER (300) /* Time till a request is repeated if no answer was received */
44 45
46 static receiveStateGnss_t rxState = GNSSRX_READY; 47 static receiveStateGnss_t rxState = GNSSRX_READY;
47 static uint8_t GnssConnected = 0; /* Binary indicator if a sensor is connected or not */ 48 static uint8_t GnssConnected = 0; /* Binary indicator if a sensor is connected or not */
48 49
49 static uint8_t writeIndex = 0; 50 static uint8_t writeIndex = 0;
50 51
51 static uint8_t dataToRead = 0; 52 static uint16_t dataToRead = 0;
52 53
53 DMA_HandleTypeDef hdma_usart6_rx, hdma_usart6_tx; 54 DMA_HandleTypeDef hdma_usart6_rx, hdma_usart6_tx;
54 55
55 uint8_t tx6Buffer[CHUNK_SIZE]; /* tx uses less bytes */ 56 uint8_t tx6Buffer[CHUNK_SIZE]; /* tx uses less bytes */
56 uint8_t tx6BufferQue[TX_BUF_SIZE]; /* In MUX mode command may be send shortly after each other => allow q 1 entry que */ 57 uint8_t tx6BufferQue[TX_BUF_SIZE]; /* In MUX mode command may be send shortly after each other => allow q 1 entry que */
274 if(futureIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) 275 if(futureIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER)
275 { 276 {
276 futureIndex = 0; 277 futureIndex = 0;
277 } 278 }
278 279
279 if((!isEndIndication6(localRX)) || (!isEndIndication6(futureIndex))) do 280 if(!isEndIndication6(futureIndex))
281 {
282 moreData = 1;
283 }
284
285 if((!isEndIndication6(localRX)) || (moreData))
286 do
280 { 287 {
281 while((!isEndIndication6(localRX)) || (moreData)) 288 while((!isEndIndication6(localRX)) || (moreData))
282 { 289 {
283 moreData = 0; 290 moreData = 0;
284 UART6_Gnss_ProcessData(rxBufferUart6[localRX]); 291 UART6_Gnss_ProcessData(rxBufferUart6[localRX]);
346 txLength = sizeof(getPVTData) / sizeof(uint8_t); 353 txLength = sizeof(getPVTData) / sizeof(uint8_t);
347 break; 354 break;
348 case GNSSCMD_GET_NAV_DATA: pData = getNavigatorData; 355 case GNSSCMD_GET_NAV_DATA: pData = getNavigatorData;
349 txLength = sizeof(getNavigatorData) / sizeof(uint8_t); 356 txLength = sizeof(getNavigatorData) / sizeof(uint8_t);
350 break; 357 break;
351 358 case GNSSCMD_GET_NAVSAT_DATA: pData = getNavSat;
359 txLength = sizeof(getNavSat) / sizeof(uint8_t);
360 break;
352 default: 361 default:
353 break; 362 break;
354 } 363 }
355 if(txLength != 0) 364 if(txLength != 0)
356 { 365 {
366 activeRequest.class = pData[2];
367 activeRequest.id = pData[3];
357 UART6_SendCmdUbx(pData, txLength); 368 UART6_SendCmdUbx(pData, txLength);
358 } 369 }
359 } 370 }
360 371
361 void UART6_Gnss_Control(void) 372 void UART6_Gnss_Control(void)
362 { 373 {
363 static uint32_t warmupTick = 0; 374 static uint32_t warmupTick = 0;
375 static uint8_t dataToggle = 0;
364 376
365 switch (gnssState) 377 switch (gnssState)
366 { 378 {
367 case UART_GNSS_INIT: gnssState = UART_GNSS_WARMUP; 379 case UART_GNSS_INIT: gnssState = UART_GNSS_WARMUP;
368 warmupTick = HAL_GetTick(); 380 warmupTick = HAL_GetTick();
383 break; 395 break;
384 case UART_GNSS_LOADCONF_2: UART6_Gnss_SendCmd(GNSSCMD_LOADCONF_2); 396 case UART_GNSS_LOADCONF_2: UART6_Gnss_SendCmd(GNSSCMD_LOADCONF_2);
385 gnssState = UART_GNSS_IDLE; 397 gnssState = UART_GNSS_IDLE;
386 rxState = GNSSRX_DETECT_ACK_0; 398 rxState = GNSSRX_DETECT_ACK_0;
387 break; 399 break;
388 case UART_GNSS_IDLE: UART6_Gnss_SendCmd(GNSSCMD_GET_PVT_DATA); 400 case UART_GNSS_IDLE: if(dataToggle)
389 gnssState = UART_GNSS_GET_PVT; 401 {
390 rxState = GNSSRX_DETECT_HEADER_0; 402 UART6_Gnss_SendCmd(GNSSCMD_GET_PVT_DATA);
403 gnssState = UART_GNSS_GET_PVT;
404 rxState = GNSSRX_DETECT_HEADER_0;
405 dataToggle = 0;
406 }
407 else
408 {
409 UART6_Gnss_SendCmd(GNSSCMD_GET_NAVSAT_DATA);
410 gnssState = UART_GNSS_GET_SAT;
411 rxState = GNSSRX_DETECT_HEADER_0;
412 dataToggle = 1;
413 }
391 break; 414 break;
392 default: 415 default:
393 break; 416 break;
394 } 417 }
395 } 418 }
396 419
397 void UART6_Gnss_ProcessData(uint8_t data) 420 void UART6_Gnss_ProcessData(uint8_t data)
398 { 421 {
422 static uint16_t rxLength = 0;
423 static uint8_t ck_A = 0;
424 static uint8_t ck_B = 0;
425 static uint8_t ck_A_Ref = 0;
426 static uint8_t ck_B_Ref = 0;
427
399 GNSS_Handle.uartWorkingBuffer[writeIndex++] = data; 428 GNSS_Handle.uartWorkingBuffer[writeIndex++] = data;
429 if((rxState >= GNSSRX_DETECT_HEADER_2) && (rxState < GNSSRX_READ_CK_A))
430 {
431 ck_A += data;
432 ck_B += ck_A;
433 }
434
400 switch(rxState) 435 switch(rxState)
401 { 436 {
402 case GNSSRX_DETECT_ACK_0: 437 case GNSSRX_DETECT_ACK_0:
403 case GNSSRX_DETECT_HEADER_0: if(data == 0xB5) 438 case GNSSRX_DETECT_HEADER_0: if(data == 0xB5)
404 { 439 {
405 writeIndex = 0; 440 writeIndex = 0;
406 memset(GNSS_Handle.uartWorkingBuffer,0, sizeof(GNSS_Handle.uartWorkingBuffer)); 441 memset(GNSS_Handle.uartWorkingBuffer,0xff, sizeof(GNSS_Handle.uartWorkingBuffer));
407 GNSS_Handle.uartWorkingBuffer[writeIndex++] = data; 442 GNSS_Handle.uartWorkingBuffer[writeIndex++] = data;
408 rxState++; 443 rxState++;
444 ck_A = 0;
445 ck_B = 0;
409 } 446 }
410 break; 447 break;
411 case GNSSRX_DETECT_ACK_1: 448 case GNSSRX_DETECT_ACK_1:
412 case GNSSRX_DETECT_HEADER_1: if(data == 0x62) 449 case GNSSRX_DETECT_HEADER_1: if(data == 0x62)
413 { 450 {
435 else 472 else
436 { 473 {
437 rxState = GNSSRX_DETECT_HEADER_0; 474 rxState = GNSSRX_DETECT_HEADER_0;
438 } 475 }
439 break; 476 break;
440 case GNSSRX_DETECT_HEADER_2: if(data == 0x01) 477 case GNSSRX_DETECT_HEADER_2: if(data == activeRequest.class)
441 { 478 {
442 rxState++; 479 rxState++;
443 } 480 }
444 else 481 else
445 { 482 {
446 rxState = GNSSRX_DETECT_HEADER_0; 483 rxState = GNSSRX_DETECT_HEADER_0;
447 } 484 }
448 break; 485 break;
449 case GNSSRX_DETECT_HEADER_3: 486 case GNSSRX_DETECT_HEADER_3: if(data == activeRequest.id)
450 switch(data) 487 {
451 { 488 rxState = GNSSRX_DETECT_LENGTH_0;
452 case 0x21: rxState = GNSSRX_READ_NAV_DATA; 489 }
453 dataToRead = 20; 490 else
454 break; 491 {
455 case 0x07: rxState = GNSSRX_READ_PVT_DATA; 492 rxState = GNSSRX_DETECT_HEADER_0;
456 dataToRead = 92; 493 }
457 break; 494 break;
458 case 0x02: rxState = GNSSRX_READ_POSLLH_DATA; 495 case GNSSRX_DETECT_LENGTH_0: rxLength = GNSS_Handle.uartWorkingBuffer[4];
459 break; 496 rxState = GNSSRX_DETECT_LENGTH_1;
460 default: rxState = GNSSRX_DETECT_HEADER_0; 497 break;
461 break; 498 case GNSSRX_DETECT_LENGTH_1: rxLength += (GNSS_Handle.uartWorkingBuffer[5] << 8);
462 } 499 rxState = GNSSRX_READ_DATA;
463 break; 500 dataToRead = rxLength;
464 case GNSSRX_READ_NAV_DATA: 501 break;
465 case GNSSRX_READ_PVT_DATA: 502 case GNSSRX_READ_DATA: if(dataToRead > 0)
466 case GNSSRX_READ_POSLLH_DATA: if(dataToRead > 0)
467 { 503 {
468 dataToRead--; 504 dataToRead--;
469 } 505 }
470 else 506 if(dataToRead == 0)
471 { 507 {
472 switch(rxState) 508 rxState = GNSSRX_READ_CK_A;
473 {
474 case GNSSRX_READ_NAV_DATA: GNSS_ParseNavigatorData(&GNSS_Handle);
475 break;
476 case GNSSRX_READ_PVT_DATA: GNSS_ParsePVTData(&GNSS_Handle);
477 break;
478 case GNSSRX_READ_POSLLH_DATA: GNSS_ParsePOSLLHData(&GNSS_Handle);
479 break;
480 default: rxState = GNSSRX_DETECT_HEADER_0;
481 break;
482 }
483 rxState = GNSSRX_DETECT_HEADER_0;
484 gnssState = UART_GNSS_IDLE;
485 } 509 }
486 break; 510 break;
511 case GNSSRX_READ_CK_A: ck_A_Ref = data;
512 rxState++;
513 break;
514 case GNSSRX_READ_CK_B: ck_B_Ref = data;
515 if((ck_A_Ref == ck_A) && (ck_B_Ref == ck_B))
516 {
517 switch(gnssState)
518 {
519 case UART_GNSS_GET_PVT:GNSS_ParsePVTData(&GNSS_Handle);
520 break;
521 case UART_GNSS_GET_SAT: GNSS_ParseNavSatData(&GNSS_Handle);
522 break;
523 default:
524 break;
525 }
526 }
527 rxState = GNSSRX_DETECT_HEADER_0;
528 gnssState = UART_GNSS_IDLE;
529 break;
530
487 default: rxState = GNSSRX_READY; 531 default: rxState = GNSSRX_READY;
488 break; 532 break;
489 } 533 }
490 } 534 }
491 535
527 lastRequestTick = tick; 571 lastRequestTick = tick;
528 TriggerTick = tick; 572 TriggerTick = tick;
529 retryRequest = 0; 573 retryRequest = 0;
530 timeToTrigger = 1; 574 timeToTrigger = 1;
531 575
532 if((gnssState == UART_GNSS_GET_PVT)) /* timeout */ 576 if((gnssState == UART_GNSS_GET_SAT) || (gnssState == UART_GNSS_GET_PVT)) /* timeout */
533 { 577 {
534 gnssState = UART_GNSS_IDLE; 578 gnssState = UART_GNSS_IDLE;
535 } 579 }
536 timeToTrigger = 1; 580 timeToTrigger = 1;
537 } 581 }