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;