Mercurial > public > ostc4
changeset 1062:785772303f9c Icon_Integration
Added pressure sensors in Sentnel mode:
The Red Head/Provide pressure and tempstick information on a uart channel together with the O2 data. The support for receiving pressure data has been added to the Sentinel protocol function.
| author | Ideenmodellierer |
|---|---|
| date | Tue, 10 Feb 2026 19:36:05 +0100 |
| parents | f501d7c35c8f |
| children | a3f42192da0f |
| files | Small_CPU/Inc/externalInterface.h Small_CPU/Inc/uartProtocol_Sentinel.h Small_CPU/Src/baseCPU2.c Small_CPU/Src/externalInterface.c Small_CPU/Src/scheduler.c Small_CPU/Src/uartProtocol_Sentinel.c |
| diffstat | 6 files changed, 117 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/Small_CPU/Inc/externalInterface.h Sat Feb 07 21:39:40 2026 +0100 +++ b/Small_CPU/Inc/externalInterface.h Tue Feb 10 19:36:05 2026 +0100 @@ -111,6 +111,8 @@ uint16_t externalInterface_GetCO2SignalStrength(void); void externalInterface_SetCO2State(uint16_t state); uint16_t externalInterface_GetCO2State(void); +void externalInterface_SetBottlePressure(uint8_t bottle, uint8_t bar); +uint8_t externalInterface_GetBottlePressure(uint8_t bottle); uint8_t externalInterface_GetSensorData(uint8_t sensorId, uint8_t* pDataStruct); void externalInterface_SetSensorData(uint8_t sensorId, uint8_t* pDataStruct); void externalInface_SetSensorMap(uint8_t* pMap);
--- a/Small_CPU/Inc/uartProtocol_Sentinel.h Sat Feb 07 21:39:40 2026 +0100 +++ b/Small_CPU/Inc/uartProtocol_Sentinel.h Tue Feb 10 19:36:05 2026 +0100 @@ -31,6 +31,21 @@ #include "configuration.h" #include "stm32f4xx_hal.h" +/* Bit flags for different sensor types provided by Sentinel or Red Head/Bare */ + +#define SENTINEL_O2 0x01 +#define SENTINEL_CO2 0x02 +#define SENTINEL_PRESSURE 0x04 +#define SENTINEL_TEMPSTICK 0x08 + + + +#define UART_SENTINEL_O2_P 'T' /* Primary O2 sensor */ +#define UART_SENTINEL_O2_S 'S' /* Secondary O2 sensor */ +#define UART_SENTINEL_PRESSURE_O2 'I' /* O2 pressure */ +#define UART_SENTINEL_PRESSURE_D 'J' /* Diluent pressure */ +#define UART_SENTINEL_TEMPSTICK 'Y' /* Sector value of the tempstick */ + typedef enum { UART_SENTINEL_INIT = 0, /* Default Status for every sensor type */ @@ -55,8 +70,7 @@ SENTRX_Data8, SENTRX_Data9, SENTRX_Data10, - SENTRX_Data11, - SENTRX_Data12, + SENTRX_CheckSum, SENTRX_DataComplete } receiveStateSentinel_t;
--- a/Small_CPU/Src/baseCPU2.c Sat Feb 07 21:39:40 2026 +0100 +++ b/Small_CPU/Src/baseCPU2.c Tue Feb 10 19:36:05 2026 +0100 @@ -172,7 +172,7 @@ // See CPU2-RTE.ld const SFirmwareData cpu2_FirmwareData __attribute__(( section(".firmware_data") ))= { .versionFirst = 3, - .versionSecond = 7, + .versionSecond = 8, .versionThird = 0, .versionBeta = 0,
--- a/Small_CPU/Src/externalInterface.c Sat Feb 07 21:39:40 2026 +0100 +++ b/Small_CPU/Src/externalInterface.c Tue Feb 10 19:36:05 2026 +0100 @@ -83,6 +83,8 @@ static uint16_t externalCO2Status = 0; static float externalCO2Scale = 0.0; +static uint8_t externalBottleBar[PRESSURE_BOTTLE_CNT] = {0,0}; + static uint8_t lastSensorDataId = 0; static SSensorDataDiveO2 sensorDataDiveO2[EXT_INTERFACE_SENSOR_CNT]; static externalInterfaceAutoDetect_t externalAutoDetect = DETECTION_OFF; @@ -139,6 +141,8 @@ externalCO2SignalStrength = 0; externalCO2Status = 0; externalCO2Scale = 0.0; + externalBottleBar[0] = 0; + externalBottleBar[1] = 0; externalAutoDetect = DETECTION_OFF; for(index = 0; index < MAX_ADC_CHANNEL; index++) @@ -509,6 +513,25 @@ return externalCO2Status; } +void externalInterface_SetBottlePressure(uint8_t bottle, uint8_t bar) +{ + if(bottle < PRESSURE_BOTTLE_CNT) + { + externalBottleBar[bottle] = bar; + } +} + +uint8_t externalInterface_GetBottlePressure(uint8_t bottle) +{ + uint8_t ret = 0; + + if(bottle < PRESSURE_BOTTLE_CNT) + { + ret = externalBottleBar[bottle]; + } + return ret; +} + uint8_t externalInterface_GetSensorData(uint8_t sensorId, uint8_t* pDataStruct) { @@ -991,6 +1014,10 @@ if(cntUARTSensor != 0) { externalInterfaceMuxReqIntervall = REQUEST_INT_SENSOR_MS / cntUARTSensor; + if(foundSensorMap[0] == SENSOR_SENTINELM) /* special case: Sentinel sends combined data */ + { + externalInterfaceMuxReqIntervall = 4000; + } } } memcpy(SensorMap, foundSensorMap, sizeof(foundSensorMap)); @@ -1023,7 +1050,7 @@ memcpy(SensorMap, MasterSensorMap, sizeof(MasterSensorMap)); for(index = 0; index < EXT_INTERFACE_SENSOR_CNT; index++) { - if((SensorMap[index] == SENSOR_DIGO2) || (SensorMap[index] == SENSOR_CO2) || (SensorMap[index] == SENSOR_GNSS)) + if((SensorMap[index] == SENSOR_DIGO2) || (SensorMap[index] == SENSOR_CO2) || (SensorMap[index] == SENSOR_GNSS) || (SensorMap[index] == SENSOR_SENTINEL)) { cntUARTSensor++; } @@ -1033,6 +1060,11 @@ { externalInterfaceMuxReqIntervall = REQUEST_INT_SENSOR_MS / cntUARTSensor; activeUartChannel = 0xFF; + + if(SensorMap[0] == SENSOR_SENTINELM) /* special case: Sentinel sends compined data */ + { + externalInterfaceMuxReqIntervall = 4000; + } } else { @@ -1166,7 +1198,7 @@ timeToTrigger = 1; retryRequest = 0; } - else if(((retryRequest == 0) /* timeout or error */ + else if(((retryRequest == 0) && (pmap[activeUartChannel + EXT_INTERFACE_MUX_OFFSET] != SENSOR_SENTINEL) /* timeout or error */ && (((time_elapsed_ms(lastRequestTick,tick) > (TIMEOUT_SENSOR_ANSWER)) && (externalInterface_SensorState[activeSensorId] != UART_O2_IDLE)) /* retry if no answer after half request interval */ || (externalInterface_SensorState[activeSensorId] == UART_O2_ERROR)))) { @@ -1189,7 +1221,8 @@ || (externalInterface_SensorState[activeSensorId] == UART_O2_REQ_RAW) || (externalInterface_SensorState[activeSensorId] == UART_CO2_OPERATING) || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_PVT) - || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_SAT)) + || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_SAT) + || (externalInterface_SensorState[activeSensorId] == UART_SENTINEL_OPERATING)) { forceMuxChannel = 1; externalInterface_SensorState[activeSensorId] = UART_O2_IDLE; @@ -1200,6 +1233,12 @@ case SENSOR_CO2: externalInterface_SetCO2Value(0.0); externalInterface_SetCO2State(0); break; + case SENSOR_SENTINEL: setExternalInterfaceChannel(0,0.0); + setExternalInterfaceChannel(1,0.0); + setExternalInterfaceChannel(2,0.0); + externalInterface_SetBottlePressure(0,0); + externalInterface_SetBottlePressure(1,0); + break; default: break; } @@ -1264,13 +1303,4 @@ } } } - -#if 0 -#ifdef ENABLE_SENTINEL_MODE - if(externalInterface_GetUARTProtocol() & (EXT_INTERFACE_UART_SENTINEL)) - { - UART_HandleSentinelData(); - } -#endif -#endif }
--- a/Small_CPU/Src/scheduler.c Sat Feb 07 21:39:40 2026 +0100 +++ b/Small_CPU/Src/scheduler.c Tue Feb 10 19:36:05 2026 +0100 @@ -1612,6 +1612,10 @@ global.dataSendToMaster.data[boolPressureData].surface_mbar = get_surface_mbar(); global.dataSendToMaster.data[boolPressureData].ascent_rate_meter_per_min = global.lifeData.ascent_rate_meter_per_min; global.dataSendToMaster.data[boolPressureData].pressure_uTick = HAL_GetTick(); +#ifdef ENABLE_SENTINEL_MODE + global.dataSendToMaster.data[boolPressureData].pressure_bottle[0] = externalInterface_GetBottlePressure(0); + global.dataSendToMaster.data[boolPressureData].pressure_bottle[1] = externalInterface_GetBottlePressure(1); +#endif global.dataSendToMaster.boolPressureData = boolPressureData; global.dataSendToMaster.data[boolPressureData].SPARE1 = is_surface_pressure_stable(); }
--- a/Small_CPU/Src/uartProtocol_Sentinel.c Sat Feb 07 21:39:40 2026 +0100 +++ b/Small_CPU/Src/uartProtocol_Sentinel.c Tue Feb 10 19:36:05 2026 +0100 @@ -26,7 +26,7 @@ #ifdef ENABLE_SENTINEL_MODE -static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor is connected or not */ +static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor (and what type of subsensor) is connected or not */ static receiveStateSentinel_t rxState = SENTRX_Ready; extern sUartComCtrl Uart1Ctrl; @@ -65,6 +65,10 @@ UART_StartDMA_Receiption(&Uart1Ctrl); localComState = UART_SENTINEL_IDLE; } + if(localComState == UART_SENTINEL_IDLE) + { + localComState = UART_SENTINEL_OPERATING; /* state is only used for timeout detection */ + } externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState); } @@ -82,14 +86,14 @@ switch(rxState) { - case SENTRX_Ready: if((data >= 'a') && (data <= 'z')) + case SENTRX_Ready: if((data >= 'a') && (data <= 'z')) /* Alive byte */ { rxState = SENTRX_DetectStart; checksum = 0; } break; - case SENTRX_DetectStart: checksum += data; + case SENTRX_DetectStart: checksum += data; /* data available */ if(data == '1') { rxState = SENTRX_SelectData; @@ -102,11 +106,20 @@ } break; - case SENTRX_SelectData: checksum += data; + case SENTRX_SelectData: checksum += data; /* data type */ switch(data) { - case 'T': dataType = data; + case UART_SENTINEL_PRESSURE_O2: /* no '0' spacing for pressure sensors */ + case UART_SENTINEL_PRESSURE_D: dataType = data; + rxState = SENTRX_Data0; + dataValueIdx = 0; + dataValue[0] = 0; break; + case UART_SENTINEL_O2_P: + case UART_SENTINEL_O2_S: + case UART_SENTINEL_TEMPSTICK: dataType = data; + break; + case '0': if(dataType != 0xff) { rxState = SENTRX_Data0; @@ -135,7 +148,14 @@ if((data >= '0') && (data <= '9')) { dataValue[dataValueIdx] = dataValue[dataValueIdx] * 10 + (data - '0'); - rxState++; + if((rxState == SENTRX_Data2) && ((dataType == UART_SENTINEL_PRESSURE_O2) || (dataType == UART_SENTINEL_PRESSURE_D))) + { + rxState = SENTRX_CheckSum; + } + else + { + rxState++; + } } else { @@ -147,35 +167,45 @@ case SENTRX_Data7: checksum += data; if(data == '0') { - rxState++; dataValueIdx++; dataValue[dataValueIdx] = 0; + rxState++; } else { rxState = SENTRX_Ready; } break; - case SENTRX_Data11: rxState = SENTRX_DataComplete; - ConvertByteToHexString(checksum,checksum_str); - if(data == checksum_str[0]) - { - rxState = SENTRX_DataComplete; - } - else - { - rxState = SENTRX_Ready; - } + case SENTRX_CheckSum: ConvertByteToHexString(checksum,checksum_str); + if(data == checksum_str[0]) + { + rxState = SENTRX_DataComplete; + } + else + { + rxState = SENTRX_Ready; + } break; case SENTRX_DataComplete: if(data == checksum_str[1]) { - setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0)); - setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0)); - setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0)); - SentinelConnected = 1; - localComState = UART_SENTINEL_OPERATING; + switch(dataType) + { + case UART_SENTINEL_O2_P: setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0)); + setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0)); + setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0)); + SentinelConnected |= SENTINEL_O2; + break; + case UART_SENTINEL_PRESSURE_O2: externalInterface_SetBottlePressure(0,dataValue[0]); + SentinelConnected |= SENTINEL_PRESSURE; + break; + case UART_SENTINEL_PRESSURE_D: externalInterface_SetBottlePressure(1,dataValue[0]); + SentinelConnected |= SENTINEL_PRESSURE; + break; + case UART_SENTINEL_TEMPSTICK: SentinelConnected |= SENTINEL_TEMPSTICK; + } + localComState = UART_SENTINEL_IDLE; } rxState = SENTRX_Ready; break;
