Mercurial > public > ostc4
comparison Small_CPU/Src/externalInterface.c @ 981:c6c781a2e85b default
Merge into default
| author | heinrichsweikamp |
|---|---|
| date | Tue, 11 Feb 2025 18:12:00 +0100 |
| parents | 0b81ac558e89 |
| children | d9290c76b840 |
comparison
equal
deleted
inserted
replaced
| 871:f7318457df4d | 981:c6c781a2e85b |
|---|---|
| 32 #include "uart.h" | 32 #include "uart.h" |
| 33 #include "data_exchange.h" | 33 #include "data_exchange.h" |
| 34 #include "pressure.h" | 34 #include "pressure.h" |
| 35 #include "uartProtocol_O2.h" | 35 #include "uartProtocol_O2.h" |
| 36 #include "uartProtocol_Co2.h" | 36 #include "uartProtocol_Co2.h" |
| 37 #include "uartProtocol_Sentinel.h" | |
| 38 #include "uartProtocol_GNSS.h" | |
| 37 | 39 |
| 38 extern SGlobal global; | 40 extern SGlobal global; |
| 39 extern UART_HandleTypeDef huart1; | 41 extern UART_HandleTypeDef huart1; |
| 40 | 42 extern sUartComCtrl Uart1Ctrl; |
| 41 #define ADC_ANSWER_LENGTH (5u) /* 3424 will provide addr + 4 data bytes */ | 43 |
| 42 #define ADC_TIMEOUT (10u) /* conversion stuck for unknown reason => restart */ | 44 #define ADC_ANSWER_LENGTH (5u) /* 3424 will provide addr + 4 data bytes */ |
| 43 #define ADC_REF_VOLTAGE_MV (2048.0f) /* reference voltage of MPC3424*/ | 45 #define ADC_TIMEOUT (10u) /* conversion stuck for unknown reason => restart */ |
| 46 #define ADC_REF_VOLTAGE_MV (2048.0f) /* reference voltage of MPC3424*/ | |
| 47 #define ADC_CYCLE_INTERVAL_MS (1000u) /* start adc read out once per second*/ | |
| 44 | 48 |
| 45 #define ADC_START_CONVERSION (0x80) | 49 #define ADC_START_CONVERSION (0x80) |
| 46 #define ADC_GAIN_4 (0x02) | 50 #define ADC_GAIN_4 (0x02) |
| 47 #define ADC_GAIN_4_VALUE (4.0f) | 51 #define ADC_GAIN_4_VALUE (4.0f) |
| 48 #define ADC_GAIN_8 (0x03) | 52 #define ADC_GAIN_8 (0x03) |
| 65 | 69 |
| 66 static uint8_t activeChannel = 0; /* channel which is in request */ | 70 static uint8_t activeChannel = 0; /* channel which is in request */ |
| 67 static uint8_t recBuf[ADC_ANSWER_LENGTH]; | 71 static uint8_t recBuf[ADC_ANSWER_LENGTH]; |
| 68 static uint8_t timeoutCnt = 0; | 72 static uint8_t timeoutCnt = 0; |
| 69 static uint8_t externalInterfacePresent = 0; | 73 static uint8_t externalInterfacePresent = 0; |
| 74 static uint8_t delayAdcConversion = 0; | |
| 75 static uint32_t startTickADC = 0; | |
| 70 | 76 |
| 71 float externalChannel_mV[MAX_ADC_CHANNEL]; | 77 float externalChannel_mV[MAX_ADC_CHANNEL]; |
| 72 static uint8_t externalV33_On = 0; | 78 static uint8_t externalV33_On = 0; |
| 73 static uint8_t externalADC_On = 0; | 79 static uint8_t externalADC_On = 0; |
| 74 static uint8_t externalUART_Protocol = 0; | 80 static uint8_t externalUART_Protocol = 0; |
| 88 static uint8_t externalInterface_SensorState[EXT_INTERFACE_SENSOR_CNT]; | 94 static uint8_t externalInterface_SensorState[EXT_INTERFACE_SENSOR_CNT]; |
| 89 | 95 |
| 90 static float LookupCO2PressureCorrection[LOOKUP_CO2_CORR_TABLE_MAX / LOOKUP_CO2_CORR_TABLE_SCALE]; /* lookup table for pressure compensation values */ | 96 static float LookupCO2PressureCorrection[LOOKUP_CO2_CORR_TABLE_MAX / LOOKUP_CO2_CORR_TABLE_SCALE]; /* lookup table for pressure compensation values */ |
| 91 | 97 |
| 92 static uint16_t externalInterfaceMuxReqIntervall = 0xffff; /* delay between switching from one MUX channel to the next */ | 98 static uint16_t externalInterfaceMuxReqIntervall = 0xffff; /* delay between switching from one MUX channel to the next */ |
| 93 static uint8_t activeUartChannel = 0; /* Index of the sensor port which is selected by the mux or 0 if no mux is connected */ | 99 static uint8_t activeUartChannel = 0xff; |
| 94 | 100 |
| 95 | 101 |
| 96 static void externalInface_MapUartToLegacyADC(uint8_t* pMap); | 102 static void externalInface_MapUartToLegacyADC(uint8_t* pMap); |
| 97 static void externalInterface_CheckBaudrate(uint8_t sensorType); | 103 static void externalInterface_CheckBaudrate(uint8_t sensorType); |
| 98 | 104 |
| 100 { | 106 { |
| 101 uint16_t index; | 107 uint16_t index; |
| 102 uint16_t coeff; | 108 uint16_t coeff; |
| 103 activeChannel = 0; | 109 activeChannel = 0; |
| 104 timeoutCnt = 0; | 110 timeoutCnt = 0; |
| 105 externalInterfacePresent = 0; | 111 delayAdcConversion = 0; |
| 106 if(externalInterface_StartConversion(activeChannel) == HAL_OK) | 112 if(externalInterface_StartConversion(activeChannel) == HAL_OK) |
| 107 { | 113 { |
| 108 externalInterfacePresent = 1; | 114 externalInterfacePresent = 1; |
| 109 global.deviceDataSendToMaster.hw_Info.extADC = 1; | 115 global.deviceDataSendToMaster.hw_Info.extADC = 1; |
| 110 } | 116 } |
| 126 | 132 |
| 127 void externalInterface_InitDatastruct(void) | 133 void externalInterface_InitDatastruct(void) |
| 128 { | 134 { |
| 129 uint8_t index = 0; | 135 uint8_t index = 0; |
| 130 /* init data values */ | 136 /* init data values */ |
| 131 externalV33_On = 0; | |
| 132 externalADC_On = 0; | |
| 133 externalUART_Protocol = 0; | 137 externalUART_Protocol = 0; |
| 134 externalCO2Value = 0; | 138 externalCO2Value = 0; |
| 135 externalCO2SignalStrength = 0; | 139 externalCO2SignalStrength = 0; |
| 136 externalCO2Status = 0; | 140 externalCO2Status = 0; |
| 137 externalCO2Scale = 0.0; | 141 externalCO2Scale = 0.0; |
| 168 uint8_t nextChannel; | 172 uint8_t nextChannel; |
| 169 uint8_t* psensorMap = externalInterface_GetSensorMapPointer(0); | 173 uint8_t* psensorMap = externalInterface_GetSensorMapPointer(0); |
| 170 | 174 |
| 171 if(externalADC_On) | 175 if(externalADC_On) |
| 172 { | 176 { |
| 173 if(I2C_Master_Receive(DEVICE_EXTERNAL_ADC, recBuf, ADC_ANSWER_LENGTH) == HAL_OK) | 177 if(time_elapsed_ms(startTickADC, HAL_GetTick()) > ADC_CYCLE_INTERVAL_MS) |
| 174 { | 178 { |
| 175 if((recBuf[ANSWER_CONFBYTE_INDEX] & ADC_START_CONVERSION) == 0) /* !ready set => received data contains new value */ | 179 if(delayAdcConversion) |
| 176 { | 180 { |
| 177 retval = activeChannel; /* return channel number providing new data */ | 181 if(UART_isComActive(activeUartChannel) == 0) |
| 178 nextChannel = activeChannel + 1; | |
| 179 if(nextChannel == MAX_ADC_CHANNEL) | |
| 180 { | 182 { |
| 181 nextChannel = 0; | 183 externalInterface_StartConversion(activeChannel); |
| 184 delayAdcConversion = 0; | |
| 182 } | 185 } |
| 183 | 186 } |
| 184 while((psensorMap[nextChannel] != SENSOR_ANALOG) && (nextChannel != activeChannel)) | 187 else if(I2C_Master_Receive(DEVICE_EXTERNAL_ADC, recBuf, ADC_ANSWER_LENGTH) == HAL_OK) |
| 188 { | |
| 189 if((recBuf[ANSWER_CONFBYTE_INDEX] & ADC_START_CONVERSION) == 0) /* !ready set => received data contains new value */ | |
| 185 { | 190 { |
| 191 retval = activeChannel; /* return channel number providing new data */ | |
| 192 nextChannel = activeChannel + 1; | |
| 186 if(nextChannel == MAX_ADC_CHANNEL) | 193 if(nextChannel == MAX_ADC_CHANNEL) |
| 187 { | 194 { |
| 188 nextChannel = 0; | 195 nextChannel = 0; |
| 189 } | 196 } |
| 197 | |
| 198 while((psensorMap[nextChannel] != SENSOR_ANALOG) && (nextChannel != activeChannel)) | |
| 199 { | |
| 200 if(nextChannel == MAX_ADC_CHANNEL) | |
| 201 { | |
| 202 nextChannel = 0; | |
| 203 startTickADC = HAL_GetTick(); | |
| 204 } | |
| 205 else | |
| 206 { | |
| 207 nextChannel++; | |
| 208 } | |
| 209 } | |
| 210 | |
| 211 activeChannel = nextChannel; | |
| 212 if(activeChannel == 0) | |
| 213 { | |
| 214 delayAdcConversion = 1; /* wait for next cycle interval */ | |
| 215 } | |
| 190 else | 216 else |
| 191 { | 217 { |
| 192 nextChannel++; | 218 if(UART_isComActive(activeUartChannel) == 0) |
| 219 { | |
| 220 externalInterface_StartConversion(activeChannel); | |
| 221 } | |
| 222 else | |
| 223 { | |
| 224 delayAdcConversion = 1; | |
| 225 } | |
| 193 } | 226 } |
| 194 } | |
| 195 | |
| 196 activeChannel = nextChannel; | |
| 197 externalInterface_StartConversion(activeChannel); | |
| 198 timeoutCnt = 0; | |
| 199 } | |
| 200 else | |
| 201 { | |
| 202 if(timeoutCnt++ >= ADC_TIMEOUT) | |
| 203 { | |
| 204 externalInterface_StartConversion(activeChannel); | |
| 205 timeoutCnt = 0; | 227 timeoutCnt = 0; |
| 206 } | 228 } |
| 207 } | 229 } |
| 208 } | 230 |
| 209 else /* take also i2c bus disturb into account */ | 231 if(timeoutCnt++ >= ADC_TIMEOUT) |
| 210 { | 232 { |
| 211 if(timeoutCnt++ >= ADC_TIMEOUT) | 233 externalInterface_StartConversion(activeChannel); |
| 212 { | 234 delayAdcConversion = 0; |
| 213 externalInterface_StartConversion(activeChannel); | 235 timeoutCnt = 0; |
| 214 timeoutCnt = 0; | 236 } |
| 215 } | |
| 216 } | 237 } |
| 217 } | 238 } |
| 218 return retval; | 239 return retval; |
| 219 } | 240 } |
| 220 float externalInterface_CalculateADCValue(uint8_t channel) | 241 float externalInterface_CalculateADCValue(uint8_t channel) |
| 344 uint8_t loop = 0; | 365 uint8_t loop = 0; |
| 345 if((state) && (externalInterfacePresent)) | 366 if((state) && (externalInterfacePresent)) |
| 346 { | 367 { |
| 347 if(externalADC_On == 0) | 368 if(externalADC_On == 0) |
| 348 { | 369 { |
| 370 startTickADC = HAL_GetTick(); | |
| 349 activeChannel = 0; | 371 activeChannel = 0; |
| 350 externalInterface_StartConversion(activeChannel); | 372 externalInterface_StartConversion(activeChannel); |
| 351 externalADC_On = 1; | 373 externalADC_On = 1; |
| 352 } | 374 } |
| 353 } | 375 } |
| 366 | 388 |
| 367 void externalInterface_SwitchUART(uint8_t protocol) | 389 void externalInterface_SwitchUART(uint8_t protocol) |
| 368 { | 390 { |
| 369 switch(protocol) | 391 switch(protocol) |
| 370 { | 392 { |
| 371 case 0: | 393 case EXT_INTERFACE_UART_OFF: |
| 372 case (EXT_INTERFACE_UART_CO2 >> 8): | 394 case EXT_INTERFACE_UART_CO2: |
| 373 case (EXT_INTERFACE_UART_O2 >> 8): | 395 case EXT_INTERFACE_UART_O2: |
| 374 case (EXT_INTERFACE_UART_SENTINEL >> 8): | 396 case EXT_INTERFACE_UART_SENTINEL: |
| 397 case EXT_INTERFACE_UART_GNSS: | |
| 375 if((externalAutoDetect <= DETECTION_START) | 398 if((externalAutoDetect <= DETECTION_START) |
| 376 || ((protocol == EXT_INTERFACE_UART_O2 >> 8) && (externalAutoDetect >= DETECTION_UARTMUX) && (externalAutoDetect <= DETECTION_DIGO2_3)) | 399 || ((protocol == EXT_INTERFACE_UART_O2) && (externalAutoDetect >= DETECTION_UARTMUX) && (externalAutoDetect <= DETECTION_DIGO2_3)) |
| 377 | 400 |
| 378 #ifdef ENABLE_CO2_SUPPORT | 401 #ifdef ENABLE_CO2_SUPPORT |
| 379 || ((externalAutoDetect >= DETECTION_CO2_0) && (externalAutoDetect <= DETECTION_CO2_3)) | 402 || ((externalAutoDetect >= DETECTION_CO2_0) && (externalAutoDetect <= DETECTION_CO2_3)) |
| 380 #endif | 403 #endif |
| 404 #ifdef ENABLE_GNSS_SUPPORT | |
| 405 || ((externalAutoDetect >= DETECTION_GNSS_0) && (externalAutoDetect <= DETECTION_GNSS_3)) | |
| 406 #endif | |
| 407 | |
| 381 #ifdef ENABLE_SENTINEL_MODE | 408 #ifdef ENABLE_SENTINEL_MODE |
| 382 || ((protocol == EXT_INTERFACE_UART_SENTINEL >> 8) && (externalAutoDetect == DETECTION_SENTINEL)) | 409 || ((protocol == EXT_INTERFACE_UART_SENTINEL) && (externalAutoDetect == DETECTION_SENTINEL)) |
| 383 #endif | 410 #endif |
| 384 ) | 411 ) |
| 385 { | 412 { |
| 386 lastSensorDataId = 0; | 413 lastSensorDataId = 0; |
| 387 externalUART_Protocol = protocol; | 414 externalUART_Protocol = protocol; |
| 560 | 587 |
| 561 memset(Mux2ADCMap,0xFF, sizeof(Mux2ADCMap)); | 588 memset(Mux2ADCMap,0xFF, sizeof(Mux2ADCMap)); |
| 562 | 589 |
| 563 for(index2 = 0; index2 < MAX_ADC_CHANNEL; index2++) /* Unmap old mirror instances */ | 590 for(index2 = 0; index2 < MAX_ADC_CHANNEL; index2++) /* Unmap old mirror instances */ |
| 564 { | 591 { |
| 565 if((pMap[index2] == SENSOR_DIGO2M) || (pMap[index2] == SENSOR_CO2M)) | 592 if((pMap[index2] == SENSOR_DIGO2M) || (pMap[index2] == SENSOR_CO2M) || (pMap[index2] == SENSOR_GNSSM)) |
| 566 { | 593 { |
| 567 pMap[index2] = SENSOR_NONE; | 594 pMap[index2] = SENSOR_NONE; |
| 568 } | 595 } |
| 569 } | 596 } |
| 570 | 597 |
| 571 /* Map Mux O2 sensors to ADC Slot if ADC slot is not in use */ | 598 /* Map Mux O2 sensors to ADC Slot if ADC slot is not in use */ |
| 572 for(index = 0; index < EXT_INTERFACE_SENSOR_CNT-1; index++) | 599 for(index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_SENSOR_CNT-1; index++) |
| 573 { | 600 { |
| 574 if(pMap[index] == SENSOR_DIGO2) | 601 if(pMap[index] == SENSOR_DIGO2) |
| 575 { | 602 { |
| 576 for(index2 = 0; index2 < MAX_ADC_CHANNEL; index2++) | 603 for(index2 = 0; index2 < MAX_ADC_CHANNEL; index2++) |
| 577 { | 604 { |
| 582 break; | 609 break; |
| 583 } | 610 } |
| 584 } | 611 } |
| 585 } | 612 } |
| 586 } | 613 } |
| 587 for(index = 0; index < EXT_INTERFACE_SENSOR_CNT-1; index++) | 614 for(index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_SENSOR_CNT-1; index++) |
| 588 { | 615 { |
| 589 if(pMap[index] == SENSOR_CO2) | 616 if(pMap[index] == SENSOR_CO2) |
| 590 { | 617 { |
| 591 for(index2 = 0; index2 < MAX_ADC_CHANNEL; index2++) | 618 for(index2 = 0; index2 < MAX_ADC_CHANNEL; index2++) |
| 592 { | 619 { |
| 597 break; | 624 break; |
| 598 } | 625 } |
| 599 } | 626 } |
| 600 } | 627 } |
| 601 } | 628 } |
| 629 for(index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_SENSOR_CNT-1; index++) | |
| 630 { | |
| 631 if(pMap[index] == SENSOR_GNSS) | |
| 632 { | |
| 633 for(index2 = 0; index2 < MAX_ADC_CHANNEL; index2++) | |
| 634 { | |
| 635 if(pMap[index2] == SENSOR_NONE) | |
| 636 { | |
| 637 pMap[index2] = SENSOR_GNSSM; /* store a mirror instance needed for visualization */ | |
| 638 Mux2ADCMap[index2] = index; | |
| 639 break; | |
| 640 } | |
| 641 } | |
| 642 } | |
| 643 } | |
| 644 #ifdef ENABLE_SENTINEL_MODE | |
| 645 if(pMap[EXT_INTERFACE_MUX_OFFSET] == SENSOR_SENTINEL) | |
| 646 { | |
| 647 for(index2 = 0; index2 < MAX_ADC_CHANNEL; index2++) | |
| 648 { | |
| 649 pMap[index2] = SENSOR_SENTINELM; /* store a mirror instance needed for visualization */ | |
| 650 Mux2ADCMap[index2] = index2 + EXT_INTERFACE_MUX_OFFSET; | |
| 651 } | |
| 652 } | |
| 653 #endif | |
| 602 } | 654 } |
| 603 | 655 |
| 604 uint8_t* externalInterface_GetSensorMapPointer(uint8_t finalMap) | 656 uint8_t* externalInterface_GetSensorMapPointer(uint8_t finalMap) |
| 605 { | 657 { |
| 606 uint8_t* pret; | 658 uint8_t* pret; |
| 618 | 670 |
| 619 void externalInterface_AutodetectSensor() | 671 void externalInterface_AutodetectSensor() |
| 620 { | 672 { |
| 621 static uint8_t sensorIndex = 0; | 673 static uint8_t sensorIndex = 0; |
| 622 static uint8_t uartMuxChannel = 0; | 674 static uint8_t uartMuxChannel = 0; |
| 675 #ifdef ENABLE_GNSS_SUPPORT | |
| 676 static uint8_t detectionDelayCnt = 0; | |
| 677 #endif | |
| 623 uint8_t index = 0; | 678 uint8_t index = 0; |
| 679 | |
| 624 uint8_t cntSensor = 0; | 680 uint8_t cntSensor = 0; |
| 625 uint8_t cntUARTSensor = 0; | 681 uint8_t cntUARTSensor = 0; |
| 626 #ifdef ENABLE_CO2_SUPPORT | 682 #ifdef ENABLE_CO2_SUPPORT |
| 627 uint8_t cmdString[10]; | 683 uint8_t cmdString[10]; |
| 628 uint8_t cmdLength = 0; | 684 uint8_t cmdLength = 0; |
| 630 | 686 |
| 631 if(externalAutoDetect != DETECTION_OFF) | 687 if(externalAutoDetect != DETECTION_OFF) |
| 632 { | 688 { |
| 633 switch(externalAutoDetect) | 689 switch(externalAutoDetect) |
| 634 { | 690 { |
| 635 case DETECTION_INIT: externalInterfaceMuxReqIntervall = 0; | 691 case DETECTION_INIT: externalInterfaceMuxReqIntervall = 0xffff; |
| 636 sensorIndex = 0; | 692 sensorIndex = 0; |
| 637 uartMuxChannel = 0; | 693 uartMuxChannel = 0; |
| 638 tmpSensorMap[0] = SENSOR_OPTIC; | 694 tmpSensorMap[0] = SENSOR_OPTIC; |
| 639 tmpSensorMap[1] = SENSOR_OPTIC; | 695 tmpSensorMap[1] = SENSOR_OPTIC; |
| 640 tmpSensorMap[2] = SENSOR_OPTIC; | 696 tmpSensorMap[2] = SENSOR_OPTIC; |
| 649 memset(Mux2ADCMap,0, sizeof(Mux2ADCMap)); | 705 memset(Mux2ADCMap,0, sizeof(Mux2ADCMap)); |
| 650 | 706 |
| 651 if(externalInterfacePresent) | 707 if(externalInterfacePresent) |
| 652 { | 708 { |
| 653 externalInterface_SwitchPower33(0); | 709 externalInterface_SwitchPower33(0); |
| 654 externalInterface_SwitchUART(0); | 710 externalInterface_SwitchUART(EXT_INTERFACE_UART_OFF); |
| 655 for(index = 0; index < MAX_ADC_CHANNEL; index++) | 711 for(index = 0; index < MAX_ADC_CHANNEL; index++) |
| 656 { | 712 { |
| 657 externalChannel_mV[index] = 0; | 713 externalChannel_mV[index] = 0; |
| 658 } | 714 } |
| 659 externalAutoDetect = DETECTION_START; | 715 externalAutoDetect = DETECTION_START; |
| 684 tmpSensorMap[sensorIndex++] = SENSOR_NONE; | 740 tmpSensorMap[sensorIndex++] = SENSOR_NONE; |
| 685 } | 741 } |
| 686 } | 742 } |
| 687 externalInterfaceMuxReqIntervall = 1100; | 743 externalInterfaceMuxReqIntervall = 1100; |
| 688 externalAutoDetect = DETECTION_UARTMUX; | 744 externalAutoDetect = DETECTION_UARTMUX; |
| 689 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2 >> 8); | 745 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2); |
| 746 externalInterface_CheckBaudrate(SENSOR_DIGO2); | |
| 690 UART_MUX_SelectAddress(MAX_MUX_CHANNEL); | 747 UART_MUX_SelectAddress(MAX_MUX_CHANNEL); |
| 691 uartO2_SetChannel(MAX_MUX_CHANNEL); | 748 uartO2_SetChannel(MAX_MUX_CHANNEL); |
| 692 activeUartChannel = MAX_MUX_CHANNEL; | 749 activeUartChannel = MAX_MUX_CHANNEL; |
| 693 tmpSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_MUX; | 750 tmpSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_MUX; |
| 694 break; | 751 break; |
| 695 case DETECTION_UARTMUX: if(uartO2_isSensorConnected()) | 752 case DETECTION_UARTMUX: if(uartO2_isSensorConnected()) |
| 696 { | 753 { |
| 697 uartMuxChannel = 1; | 754 uartMuxChannel = 1; |
| 698 tmpSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_MUX; | 755 tmpSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_MUX; |
| 699 foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_MUX; | 756 foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_MUX; |
| 700 } | 757 } |
| 701 else | 758 else |
| 702 { | 759 { |
| 703 tmpSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_NONE; | 760 tmpSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_NONE; |
| 704 } | 761 } |
| 705 externalAutoDetect = DETECTION_DIGO2_0; | 762 externalAutoDetect = DETECTION_DIGO2_0; |
| 706 uartO2_SetChannel(0); | 763 uartO2_SetChannel(0); |
| 707 activeUartChannel = 0; | 764 activeUartChannel = 0; |
| 708 tmpSensorMap[EXT_INTERFACE_MUX_OFFSET] = SENSOR_DIGO2; | 765 tmpSensorMap[EXT_INTERFACE_MUX_OFFSET] = SENSOR_DIGO2; |
| 709 externalInterface_SensorState[EXT_INTERFACE_MUX_OFFSET] = UART_COMMON_INIT; | 766 externalInterface_SensorState[EXT_INTERFACE_MUX_OFFSET] = UART_COMMON_INIT; |
| 710 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2 >> 8); | 767 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2); |
| 711 if(foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) | 768 if(foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) |
| 712 { | 769 { |
| 713 UART_MUX_SelectAddress(0); | 770 UART_MUX_SelectAddress(0); |
| 714 } | 771 } |
| 715 break; | 772 break; |
| 716 case DETECTION_DIGO2_0: | 773 case DETECTION_DIGO2_0: |
| 717 case DETECTION_DIGO2_1: | 774 case DETECTION_DIGO2_1: |
| 718 case DETECTION_DIGO2_2: | 775 case DETECTION_DIGO2_2: |
| 719 case DETECTION_DIGO2_3: | 776 case DETECTION_DIGO2_3: |
| 722 foundSensorMap[externalAutoDetect - DETECTION_DIGO2_0 + EXT_INTERFACE_MUX_OFFSET] = SENSOR_DIGO2; | 779 foundSensorMap[externalAutoDetect - DETECTION_DIGO2_0 + EXT_INTERFACE_MUX_OFFSET] = SENSOR_DIGO2; |
| 723 } | 780 } |
| 724 tmpSensorMap[EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE; | 781 tmpSensorMap[EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE; |
| 725 if(uartMuxChannel) | 782 if(uartMuxChannel) |
| 726 { | 783 { |
| 727 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2 >> 8); | 784 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2); |
| 728 UART_MUX_SelectAddress(uartMuxChannel); | 785 UART_MUX_SelectAddress(uartMuxChannel); |
| 729 externalInterface_SensorState[uartMuxChannel + EXT_INTERFACE_MUX_OFFSET] = UART_COMMON_INIT; | 786 externalInterface_SensorState[uartMuxChannel + EXT_INTERFACE_MUX_OFFSET] = UART_COMMON_INIT; |
| 730 uartO2_SetChannel(uartMuxChannel); | 787 uartO2_SetChannel(uartMuxChannel); |
| 731 activeUartChannel = uartMuxChannel; | 788 activeUartChannel = uartMuxChannel; |
| 732 tmpSensorMap[uartMuxChannel - 1 + EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE; | 789 tmpSensorMap[uartMuxChannel - 1 + EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE; |
| 770 case DETECTION_CO2_1: | 827 case DETECTION_CO2_1: |
| 771 case DETECTION_CO2_2: | 828 case DETECTION_CO2_2: |
| 772 case DETECTION_CO2_3: if(uartCo2_isSensorConnected()) | 829 case DETECTION_CO2_3: if(uartCo2_isSensorConnected()) |
| 773 { | 830 { |
| 774 foundSensorMap[EXT_INTERFACE_MUX_OFFSET + activeUartChannel] = SENSOR_CO2; | 831 foundSensorMap[EXT_INTERFACE_MUX_OFFSET + activeUartChannel] = SENSOR_CO2; |
| 832 #ifdef ENABLE_GNSS_SUPPORT | |
| 833 externalAutoDetect = DETECTION_GNSS_0; /* only one CO2 sensor supported */ | |
| 834 #else | |
| 775 externalAutoDetect = DETECTION_DONE; /* only one CO2 sensor supported */ | 835 externalAutoDetect = DETECTION_DONE; /* only one CO2 sensor supported */ |
| 836 #endif | |
| 776 } | 837 } |
| 777 else if(foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) | 838 else if(foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) |
| 778 { | 839 { |
| 779 externalInterface_CheckBaudrate(SENSOR_DIGO2); | 840 externalInterface_CheckBaudrate(SENSOR_DIGO2); |
| 780 UART_MUX_SelectAddress(uartMuxChannel); | 841 UART_MUX_SelectAddress(uartMuxChannel); |
| 787 externalAutoDetect++; | 848 externalAutoDetect++; |
| 788 uartMuxChannel++; | 849 uartMuxChannel++; |
| 789 } | 850 } |
| 790 else | 851 else |
| 791 { | 852 { |
| 853 | |
| 854 | |
| 855 #if defined ENABLE_SENTINEL_MODE || defined ENABLE_GNSS_SUPPORT | |
| 856 #ifdef ENABLE_GNSS_SUPPORT | |
| 857 externalAutoDetect = DETECTION_GNSS_0; | |
| 858 externalInterface_SwitchUART(EXT_INTERFACE_UART_GNSS); | |
| 859 #else | |
| 860 #ifdef ENABLE_SENTINEL_MODE | |
| 861 externalAutoDetect = DETECTION_SENTINEL; | |
| 862 #endif | |
| 863 #endif | |
| 864 #else | |
| 792 externalAutoDetect = DETECTION_DONE; | 865 externalAutoDetect = DETECTION_DONE; |
| 793 } | 866 #endif |
| 794 #endif | 867 } |
| 868 #endif | |
| 869 | |
| 870 #ifdef ENABLE_GNSS_SUPPORT | |
| 871 if(externalAutoDetect == DETECTION_GNSS_0) | |
| 872 { | |
| 873 tmpSensorMap[uartMuxChannel + EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE; | |
| 874 if(foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) | |
| 875 { | |
| 876 externalInterface_CheckBaudrate(SENSOR_DIGO2); | |
| 877 UART_MUX_SelectAddress(0); | |
| 878 } | |
| 879 activeUartChannel = 0; | |
| 880 tmpSensorMap[uartMuxChannel - 1 + EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE; | |
| 881 uartMuxChannel = 1; | |
| 882 tmpSensorMap[EXT_INTERFACE_MUX_OFFSET] = SENSOR_GNSS; | |
| 883 externalInterface_SensorState[EXT_INTERFACE_MUX_OFFSET] = UART_COMMON_INIT; | |
| 884 externalInterface_CheckBaudrate(SENSOR_GNSS); | |
| 885 externalInterfaceMuxReqIntervall = 500; /* iterations needed for module config */ | |
| 886 detectionDelayCnt = 6; | |
| 887 } | |
| 888 break; | |
| 889 case DETECTION_GNSS_0: | |
| 890 case DETECTION_GNSS_1: | |
| 891 case DETECTION_GNSS_2: | |
| 892 case DETECTION_GNSS_3: if(detectionDelayCnt == 0) | |
| 893 { | |
| 894 if(uartGnss_isSensorConnected()) | |
| 895 { | |
| 896 foundSensorMap[EXT_INTERFACE_MUX_OFFSET + activeUartChannel] = SENSOR_GNSS; | |
| 897 #ifdef ENABLE_SENTINEL_MODE | |
| 898 externalAutoDetect = DETECTION_SENTINEL; /* only one GNSS sensor supported */ | |
| 899 #else | |
| 900 externalAutoDetect = DETECTION_DONE; /* only one GNSS sensor supported */ | |
| 901 #endif | |
| 902 } | |
| 903 else if(foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) | |
| 904 { | |
| 905 externalInterface_CheckBaudrate(SENSOR_DIGO2); | |
| 906 UART_MUX_SelectAddress(uartMuxChannel); | |
| 907 activeUartChannel = uartMuxChannel; | |
| 908 tmpSensorMap[uartMuxChannel - 1 + EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE; | |
| 909 tmpSensorMap[EXT_INTERFACE_MUX_OFFSET + uartMuxChannel] = SENSOR_CO2; | |
| 910 externalInterface_SensorState[EXT_INTERFACE_MUX_OFFSET + uartMuxChannel] = UART_COMMON_INIT; | |
| 911 externalInterface_CheckBaudrate(SENSOR_CO2); | |
| 912 // uartGnss_SendCmd(GNSSCMD_MODE_POLL, cmdString, &cmdLength); | |
| 913 externalAutoDetect++; | |
| 914 detectionDelayCnt = 3; | |
| 915 uartMuxChannel++; | |
| 916 } | |
| 917 else | |
| 918 { | |
| 919 #ifdef ENABLE_SENTINEL_MODE | |
| 920 externalAutoDetect = DETECTION_SENTINEL; | |
| 921 #else | |
| 922 externalAutoDetect = DETECTION_DONE; | |
| 923 #endif | |
| 924 } | |
| 925 } | |
| 926 else | |
| 927 { | |
| 928 detectionDelayCnt--; | |
| 929 } | |
| 930 #endif | |
| 795 #ifdef ENABLE_SENTINEL_MODE | 931 #ifdef ENABLE_SENTINEL_MODE |
| 796 if(externalAutoDetect == DETECTION_SENTINEL) | 932 if(externalAutoDetect == DETECTION_SENTINEL) |
| 797 { | 933 { |
| 798 externalInterface_SwitchUART(EXT_INTERFACE_UART_SENTINEL >> 8); | 934 externalInterface_SensorState[EXT_INTERFACE_MUX_OFFSET] = UART_COMMON_INIT; |
| 799 UART_StartDMA_Receiption(); | 935 uartO2_SetChannel(0); |
| 936 activeUartChannel = 0; | |
| 937 tmpSensorMap[EXT_INTERFACE_MUX_OFFSET] = SENSOR_SENTINEL; | |
| 938 externalInterface_SwitchUART(EXT_INTERFACE_UART_SENTINEL); | |
| 939 externalInterface_CheckBaudrate(SENSOR_SENTINEL); | |
| 940 UART_StartDMA_Receiption(&Uart1Ctrl); | |
| 800 } | 941 } |
| 801 break; | 942 break; |
| 802 | 943 |
| 803 case DETECTION_SENTINEL: | 944 case DETECTION_SENTINEL: |
| 804 case DETECTION_SENTINEL2: | 945 case DETECTION_SENTINEL2: |
| 805 if(UART_isSentinelConnected()) | 946 if(uartSentinel_isSensorConnected()) |
| 806 { | 947 { |
| 807 for(index = 0; index < 3; index++) /* Sentinel is occupiing all sensor slots */ | 948 for(index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_MUX_OFFSET+3; index++) |
| 808 { | 949 { |
| 809 tmpSensorMap[index] = SENSOR_SENTINEL; | 950 foundSensorMap[index] = SENSOR_SENTINEL; |
| 810 } | 951 } |
| 811 sensorIndex = 3; | |
| 812 } | 952 } |
| 813 externalAutoDetect++; | 953 externalAutoDetect++; |
| 814 #endif | 954 #endif |
| 815 break; | 955 break; |
| 816 case DETECTION_DONE: externalAutoDetect = DETECTION_OFF; | 956 case DETECTION_DONE: externalAutoDetect = DETECTION_OFF; |
| 817 externalInterface_SwitchUART(0); | 957 externalInterface_SwitchUART(EXT_INTERFACE_UART_OFF); |
| 818 activeUartChannel = 0xFF; | 958 activeUartChannel = 0xFF; |
| 819 cntSensor = 0; | 959 cntSensor = 0; |
| 820 cntUARTSensor = 0; | 960 cntUARTSensor = 0; |
| 821 for(index = 0; index < EXT_INTERFACE_SENSOR_CNT-1; index++) | 961 for(index = 0; index < EXT_INTERFACE_SENSOR_CNT-1; index++) |
| 822 { | 962 { |
| 823 if((foundSensorMap[index] >= SENSOR_ANALOG) && (foundSensorMap[index] < SENSOR_MUX)) | 963 if((foundSensorMap[index] >= SENSOR_ANALOG) && (foundSensorMap[index] < SENSOR_MUX)) |
| 824 { | 964 { |
| 825 cntSensor++; | 965 cntSensor++; |
| 826 } | 966 } |
| 827 | 967 |
| 828 if((foundSensorMap[index] == SENSOR_DIGO2) || (foundSensorMap[index] == SENSOR_CO2)) | 968 if((foundSensorMap[index] == SENSOR_DIGO2) || (foundSensorMap[index] == SENSOR_CO2) || (foundSensorMap[index] == SENSOR_GNSS)) |
| 829 { | 969 { |
| 830 cntUARTSensor++; | 970 cntUARTSensor++; |
| 831 } | 971 } |
| 972 #ifdef ENABLE_SENTINEL_MODE | |
| 973 if(foundSensorMap[index] == SENSOR_SENTINEL) /* The Sentinel has a fixed setup */ | |
| 974 { | |
| 975 cntSensor = 3; | |
| 976 cntUARTSensor = 1; | |
| 977 break; | |
| 978 } | |
| 979 #endif | |
| 832 } | 980 } |
| 833 externalInface_MapUartToLegacyADC(foundSensorMap); | 981 externalInface_MapUartToLegacyADC(foundSensorMap); |
| 834 externalInterfaceMuxReqIntervall = 0xFFFF; | 982 externalInterfaceMuxReqIntervall = 0xFFFF; |
| 835 if(cntSensor == 0) /* return default sensor map if no sensor at all has been detected */ | 983 if(cntSensor == 0) /* return default sensor map if no sensor at all has been detected */ |
| 836 { | 984 { |
| 866 { | 1014 { |
| 867 case EXT_INTERFACE_AUTODETECT: externalAutoDetect = DETECTION_INIT; | 1015 case EXT_INTERFACE_AUTODETECT: externalAutoDetect = DETECTION_INIT; |
| 868 for(index = 0; index < 3; index++) | 1016 for(index = 0; index < 3; index++) |
| 869 { | 1017 { |
| 870 SensorMap[index] = SENSOR_SEARCH; | 1018 SensorMap[index] = SENSOR_SEARCH; |
| 871 } | |
| 872 break; | |
| 873 case EXT_INTERFACE_CO2_CALIB: for(index = 0; index < EXT_INTERFACE_SENSOR_CNT; index++) | |
| 874 { | |
| 875 if(SensorMap[index] == SENSOR_CO2) | |
| 876 { | |
| 877 externalInterface_SensorState[index] = UART_CO2_CALIBRATE; | |
| 878 break; | |
| 879 } | |
| 880 } | 1019 } |
| 881 break; | 1020 break; |
| 882 case EXT_INTERFACE_COPY_SENSORMAP: if(externalAutoDetect == DETECTION_OFF) | 1021 case EXT_INTERFACE_COPY_SENSORMAP: if(externalAutoDetect == DETECTION_OFF) |
| 883 { | 1022 { |
| 884 memcpy(SensorMap, MasterSensorMap, sizeof(MasterSensorMap)); | 1023 memcpy(SensorMap, MasterSensorMap, sizeof(MasterSensorMap)); |
| 885 for(index = 0; index < EXT_INTERFACE_SENSOR_CNT; index++) | 1024 for(index = 0; index < EXT_INTERFACE_SENSOR_CNT; index++) |
| 886 { | 1025 { |
| 887 if((SensorMap[index] == SENSOR_DIGO2) || (SensorMap[index] == SENSOR_CO2)) | 1026 if((SensorMap[index] == SENSOR_DIGO2) || (SensorMap[index] == SENSOR_CO2) || (SensorMap[index] == SENSOR_GNSS)) |
| 888 { | 1027 { |
| 889 cntUARTSensor++; | 1028 cntUARTSensor++; |
| 890 } | 1029 } |
| 891 } | 1030 } |
| 892 externalInface_MapUartToLegacyADC(SensorMap); | 1031 externalInface_MapUartToLegacyADC(SensorMap); |
| 899 { | 1038 { |
| 900 externalInterfaceMuxReqIntervall = 0xFFFF; | 1039 externalInterfaceMuxReqIntervall = 0xFFFF; |
| 901 } | 1040 } |
| 902 } | 1041 } |
| 903 break; | 1042 break; |
| 1043 case EXT_INTERFACE_CO2_CALIB: index = (Cmd >> 8) & 0x000F; | |
| 1044 if(SensorMap[index] == SENSOR_CO2M) | |
| 1045 { | |
| 1046 index = Mux2ADCMap[index]; | |
| 1047 } | |
| 1048 if(SensorMap[index] == SENSOR_CO2) | |
| 1049 { | |
| 1050 externalInterface_SensorState[index] = UART_CO2_CALIBRATE; | |
| 1051 } | |
| 1052 break; | |
| 1053 case EXT_INTERFACE_O2_INDICATE: index = (Cmd >> 8) & 0x000F; | |
| 1054 if(SensorMap[index] == SENSOR_DIGO2M) | |
| 1055 { | |
| 1056 index = Mux2ADCMap[index]; | |
| 1057 } | |
| 1058 if(SensorMap[index] == SENSOR_DIGO2) | |
| 1059 { | |
| 1060 externalInterface_SensorState[index] = UART_O2_CHECK; | |
| 1061 } | |
| 1062 break; | |
| 1063 | |
| 904 default: | 1064 default: |
| 905 break; | 1065 break; |
| 906 } | 1066 } |
| 907 if(cmdLength != 0) | 1067 if(cmdLength != 0) |
| 908 { | 1068 { |
| 922 index++; | 1082 index++; |
| 923 if(index == MAX_MUX_CHANNEL) | 1083 if(index == MAX_MUX_CHANNEL) |
| 924 { | 1084 { |
| 925 index = 0; | 1085 index = 0; |
| 926 } | 1086 } |
| 927 if(((pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_DIGO2) || (pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_CO2)) | 1087 if(((pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_DIGO2) |
| 1088 || (pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_CO2) | |
| 1089 || (pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_GNSS)) | |
| 928 && (index != activeUartChannel)) | 1090 && (index != activeUartChannel)) |
| 929 { | 1091 { |
| 930 newChannel = index; | 1092 newChannel = index; |
| 931 break; | 1093 break; |
| 932 } | 1094 } |
| 939 { | 1101 { |
| 940 uint32_t newBaudrate = 0; | 1102 uint32_t newBaudrate = 0; |
| 941 | 1103 |
| 942 switch(sensorType) | 1104 switch(sensorType) |
| 943 { | 1105 { |
| 1106 case SENSOR_GNSS: | |
| 1107 case SENSOR_SENTINEL: | |
| 944 case SENSOR_CO2: newBaudrate = 9600; | 1108 case SENSOR_CO2: newBaudrate = 9600; |
| 945 break; | 1109 break; |
| 946 case SENSOR_DIGO2: | 1110 case SENSOR_DIGO2: |
| 947 default: newBaudrate = 19200; | 1111 default: newBaudrate = 19200; |
| 948 break; | 1112 break; |
| 960 static uint32_t TriggerTick = 0; | 1124 static uint32_t TriggerTick = 0; |
| 961 uint8_t index = 0; | 1125 uint8_t index = 0; |
| 962 static uint8_t timeToTrigger = 0; | 1126 static uint8_t timeToTrigger = 0; |
| 963 uint32_t tick = HAL_GetTick(); | 1127 uint32_t tick = HAL_GetTick(); |
| 964 uint8_t *pmap = externalInterface_GetSensorMapPointer(0); | 1128 uint8_t *pmap = externalInterface_GetSensorMapPointer(0); |
| 1129 uint8_t forceMuxChannel = 0; | |
| 965 | 1130 |
| 966 | 1131 |
| 967 if(externalInterfaceMuxReqIntervall != 0xFFFF) | 1132 if(externalInterfaceMuxReqIntervall != 0xFFFF) |
| 968 { | 1133 { |
| 969 UART_ReadData(pmap[activeSensorId]); | |
| 970 | |
| 971 if(activeUartChannel == 0xFF) | 1134 if(activeUartChannel == 0xFF) |
| 972 { | 1135 { |
| 973 MX_USART1_UART_Init(); | 1136 MX_USART1_UART_Init(); |
| 974 activeUartChannel = ExternalInterface_SelectUsedMuxChannel(0); | 1137 activeUartChannel = ExternalInterface_SelectUsedMuxChannel(0); |
| 975 uartO2_SetChannel(activeUartChannel); | 1138 uartO2_SetChannel(activeUartChannel); |
| 976 | 1139 |
| 977 switch(pmap[activeUartChannel + EXT_INTERFACE_MUX_OFFSET]) | 1140 switch(pmap[activeUartChannel + EXT_INTERFACE_MUX_OFFSET]) |
| 978 { | 1141 { |
| 979 case SENSOR_CO2: externalInterface_CheckBaudrate(SENSOR_CO2); | 1142 case SENSOR_DIGO2: |
| 1143 case SENSOR_GNSS: | |
| 1144 case SENSOR_CO2: | |
| 1145 case SENSOR_SENTINEL: externalInterface_CheckBaudrate(pmap[activeUartChannel + EXT_INTERFACE_MUX_OFFSET]); | |
| 980 break; | 1146 break; |
| 981 default: | 1147 default: externalInterface_CheckBaudrate(SENSOR_DIGO2); |
| 982 case SENSOR_DIGO2: externalInterface_CheckBaudrate(SENSOR_DIGO2); | |
| 983 break; | 1148 break; |
| 984 } | 1149 } |
| 985 if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) | 1150 if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) |
| 986 { | 1151 { |
| 1152 HAL_Delay(10); /* make sure MUX is available for reception after wakeup */ | |
| 987 UART_MUX_SelectAddress(activeUartChannel); | 1153 UART_MUX_SelectAddress(activeUartChannel); |
| 988 } | 1154 } |
| 989 } | 1155 } |
| 990 | 1156 |
| 1157 if(externalInterface_SensorState[activeSensorId] != UART_COMMON_INIT) | |
| 1158 { | |
| 1159 UART_ReadData(pmap[activeSensorId], 0); | |
| 1160 UART_WriteData(&Uart1Ctrl); | |
| 1161 } | |
| 991 if(externalInterface_SensorState[activeSensorId] == UART_COMMON_INIT) | 1162 if(externalInterface_SensorState[activeSensorId] == UART_COMMON_INIT) |
| 992 { | 1163 { |
| 993 lastRequestTick = tick; | 1164 lastRequestTick = tick; |
| 994 TriggerTick = tick - 10; /* just to make sure control is triggered */ | 1165 TriggerTick = tick - 10; /* just to make sure control is triggered */ |
| 995 timeToTrigger = 1; | 1166 timeToTrigger = 1; |
| 1004 | 1175 |
| 1005 TriggerTick = tick; | 1176 TriggerTick = tick; |
| 1006 timeToTrigger = COMMAND_TX_DELAY; | 1177 timeToTrigger = COMMAND_TX_DELAY; |
| 1007 retryRequest = 1; | 1178 retryRequest = 1; |
| 1008 } | 1179 } |
| 1009 | |
| 1010 else if(time_elapsed_ms(lastRequestTick,tick) > externalInterfaceMuxReqIntervall) /* switch sensor and / or trigger next request */ | 1180 else if(time_elapsed_ms(lastRequestTick,tick) > externalInterfaceMuxReqIntervall) /* switch sensor and / or trigger next request */ |
| 1011 { | 1181 { |
| 1012 lastRequestTick = tick; | 1182 if(timeToTrigger == 0) /* no pending action */ |
| 1013 TriggerTick = tick; | 1183 { |
| 1014 retryRequest = 0; | 1184 TriggerTick = tick; |
| 1015 timeToTrigger = 1; | 1185 retryRequest = 0; |
| 1016 | 1186 timeToTrigger = 1; |
| 1017 if((externalInterface_SensorState[activeSensorId] == UART_O2_REQ_O2) /* timeout */ | 1187 |
| 1018 || (externalInterface_SensorState[activeSensorId] == UART_O2_REQ_RAW) | 1188 if((externalInterface_SensorState[activeSensorId] == UART_O2_REQ_O2) /* timeout */ |
| 1019 || (externalInterface_SensorState[activeSensorId] == UART_CO2_OPERATING)) | 1189 || (externalInterface_SensorState[activeSensorId] == UART_O2_REQ_RAW) |
| 1020 { | 1190 || (externalInterface_SensorState[activeSensorId] == UART_CO2_OPERATING) |
| 1021 switch(pmap[activeSensorId]) | 1191 || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_PVT) |
| 1192 || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_SAT)) | |
| 1022 { | 1193 { |
| 1023 case SENSOR_DIGO2: setExternalInterfaceChannel(activeSensorId,0.0); | 1194 forceMuxChannel = 1; |
| 1024 break; | 1195 externalInterface_SensorState[activeSensorId] = UART_O2_IDLE; |
| 1025 case SENSOR_CO2: externalInterface_SetCO2Value(0.0); | 1196 switch(pmap[activeSensorId]) |
| 1026 externalInterface_SetCO2State(0); | 1197 { |
| 1027 break; | 1198 case SENSOR_DIGO2: setExternalInterfaceChannel(activeSensorId,0.0); |
| 1028 default: | 1199 break; |
| 1029 break; | 1200 case SENSOR_CO2: externalInterface_SetCO2Value(0.0); |
| 1201 externalInterface_SetCO2State(0); | |
| 1202 break; | |
| 1203 default: | |
| 1204 break; | |
| 1205 } | |
| 1030 } | 1206 } |
| 1031 } | 1207 if((externalInterface_SensorState[activeSensorId] == UART_CO2_SETUP) /* timeout while setting up sensors */ |
| 1032 | 1208 || (externalInterface_SensorState[activeSensorId] == UART_O2_CHECK)) |
| 1033 if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) /* select next sensor if mux is connected */ | |
| 1034 { | |
| 1035 if(activeUartChannel < MAX_MUX_CHANNEL) | |
| 1036 { | 1209 { |
| 1037 index = ExternalInterface_SelectUsedMuxChannel(activeUartChannel); | 1210 forceMuxChannel = 1; |
| 1038 if(index != activeUartChannel) | 1211 } |
| 1212 | |
| 1213 | |
| 1214 if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) /* select next sensor if mux is connected */ | |
| 1215 { | |
| 1216 if(activeUartChannel < MAX_MUX_CHANNEL) | |
| 1039 { | 1217 { |
| 1040 timeToTrigger = 100; | 1218 index = ExternalInterface_SelectUsedMuxChannel(activeUartChannel); |
| 1041 activeUartChannel = index; | 1219 if((index != activeUartChannel) || (forceMuxChannel)) |
| 1042 if((pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_DIGO2) | |
| 1043 || (pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_CO2)) | |
| 1044 { | 1220 { |
| 1045 uartO2_SetChannel(activeUartChannel); | 1221 forceMuxChannel = 0; |
| 1046 externalInterface_CheckBaudrate(SENSOR_MUX); | 1222 timeToTrigger = 100; |
| 1047 UART_MUX_SelectAddress(activeUartChannel); | 1223 activeUartChannel = index; |
| 1048 externalInterface_CheckBaudrate(pmap[activeUartChannel + EXT_INTERFACE_MUX_OFFSET]); | 1224 switch(pmap[index + EXT_INTERFACE_MUX_OFFSET]) |
| 1225 { | |
| 1226 case SENSOR_DIGO2: uartO2_SetChannel(activeUartChannel); | |
| 1227 /* no break */ | |
| 1228 case SENSOR_CO2: | |
| 1229 case SENSOR_GNSS: externalInterface_CheckBaudrate(SENSOR_MUX); | |
| 1230 UART_MUX_SelectAddress(activeUartChannel); | |
| 1231 externalInterface_CheckBaudrate(pmap[activeUartChannel + EXT_INTERFACE_MUX_OFFSET]); | |
| 1232 break; | |
| 1233 default: | |
| 1234 break; | |
| 1235 } | |
| 1049 } | 1236 } |
| 1050 } | 1237 } |
| 1051 } | 1238 } |
| 1052 } | 1239 } |
| 1053 else | |
| 1054 { | |
| 1055 timeToTrigger = 1; | |
| 1056 } | |
| 1057 } | 1240 } |
| 1058 if((timeToTrigger != 0) && (time_elapsed_ms(TriggerTick,tick) > timeToTrigger)) | 1241 if((timeToTrigger != 0) && (time_elapsed_ms(TriggerTick,tick) > timeToTrigger)) |
| 1059 { | 1242 { |
| 1243 lastRequestTick = tick; | |
| 1060 timeToTrigger = 0; | 1244 timeToTrigger = 0; |
| 1061 switch (pmap[activeSensorId]) | 1245 switch (pmap[activeSensorId]) |
| 1062 { | 1246 { |
| 1063 case SENSOR_MUX: | 1247 case SENSOR_MUX: |
| 1064 case SENSOR_DIGO2: uartO2_Control(); | 1248 case SENSOR_DIGO2: uartO2_Control(); |
| 1065 break; | 1249 break; |
| 1066 #ifdef ENABLE_CO2_SUPPORT | 1250 #ifdef ENABLE_CO2_SUPPORT |
| 1067 case SENSOR_CO2: uartCo2_Control(); | 1251 case SENSOR_CO2: uartCo2_Control(); |
| 1068 break; | 1252 break; |
| 1069 #endif | 1253 #endif |
| 1254 #ifdef ENABLE_GNSS_SUPPORT | |
| 1255 case SENSOR_GNSS: uartGnss_Control(); | |
| 1256 break; | |
| 1257 #endif | |
| 1258 #ifdef ENABLE_SENTINEL_MODE | |
| 1259 case SENSOR_SENTINEL: uartSentinel_Control(); | |
| 1260 break; | |
| 1261 #endif | |
| 1070 default: | 1262 default: |
| 1071 break; | 1263 break; |
| 1072 } | 1264 } |
| 1073 } | 1265 } |
| 1074 } | 1266 } |
| 1075 | 1267 |
| 1076 | |
| 1077 | |
| 1078 #if 0 | 1268 #if 0 |
| 1079 #ifdef ENABLE_SENTINEL_MODE | 1269 #ifdef ENABLE_SENTINEL_MODE |
| 1080 if(externalInterface_GetUARTProtocol() & (EXT_INTERFACE_UART_SENTINEL >> 8)) | 1270 if(externalInterface_GetUARTProtocol() & (EXT_INTERFACE_UART_SENTINEL)) |
| 1081 { | 1271 { |
| 1082 UART_HandleSentinelData(); | 1272 UART_HandleSentinelData(); |
| 1083 } | 1273 } |
| 1084 #endif | 1274 #endif |
| 1085 #endif | 1275 #endif |
| 1086 | 1276 } |
| 1087 | |
| 1088 } |
