diff Small_CPU/Src/externalInterface.c @ 1077:bd8ab302ef4a Icon_Integration

Added uart support for HUD: the protocol implementation for the HUD has been added. It may be activated by the compile switch ENABLE_HUD_SUPPORT. Because the HUD will not mapped to the three classic o2 value display slots, the sensor data structure has been increased to the max number of devices => all devices may now raise device specific data.
author Ideenmodellierer
date Mon, 02 Mar 2026 17:22:25 +0100
parents 8b97003dbb60
children
line wrap: on
line diff
--- a/Small_CPU/Src/externalInterface.c	Sun Feb 22 21:23:57 2026 +0100
+++ b/Small_CPU/Src/externalInterface.c	Mon Mar 02 17:22:25 2026 +0100
@@ -36,6 +36,7 @@
 #include "uartProtocol_Co2.h"
 #include "uartProtocol_Sentinel.h"
 #include "uartProtocol_GNSS.h"
+#include "uartProtocol_HUD.h"
 
 extern SGlobal global;
 extern UART_HandleTypeDef huart1;
@@ -85,9 +86,12 @@
 static float 	externalCO2Scale = 0.0;
 
 static uint8_t externalBottleBar[PRESSURE_BOTTLE_CNT] = {0,0};
+static uint8_t externalHUDBrightness = 0;
+static uint8_t externalHUDSequence[EXT_INTERFACE_HUD_LED_MAX];
+
 
 static uint8_t lastSensorDataId = 0;
-static SSensorDataDiveO2 sensorDataDiveO2[EXT_INTERFACE_SENSOR_CNT];
+static uint8_t sensorData[EXT_INTERFACE_SENSOR_CNT][EXTIF_SENSOR_INFO_SIZE];
 static externalInterfaceAutoDetect_t externalAutoDetect = DETECTION_OFF;
 static externalInterfaceSensorType SensorMap[EXT_INTERFACE_SENSOR_CNT] ={ SENSOR_OPTIC, SENSOR_OPTIC, SENSOR_OPTIC, SENSOR_NONE, SENSOR_NONE};
 static externalInterfaceSensorType tmpSensorMap[EXT_INTERFACE_SENSOR_CNT];
@@ -399,39 +403,12 @@
 
 void externalInterface_SwitchUART(uint8_t protocol)
 {
-	switch(protocol)
+	lastSensorDataId = 0;
+	externalUART_Protocol = protocol;
+	MX_USART1_UART_DeInit();
+	if( protocol != EXT_INTERFACE_UART_OFF)
 	{
-		case EXT_INTERFACE_UART_OFF:
-		case EXT_INTERFACE_UART_CO2:
-		case EXT_INTERFACE_UART_O2:
-		case EXT_INTERFACE_UART_SENTINEL:
-		case EXT_INTERFACE_UART_GNSS:
-				if((externalAutoDetect <= DETECTION_START)
-					|| ((protocol == EXT_INTERFACE_UART_O2) && (externalAutoDetect >= DETECTION_UARTMUX) && (externalAutoDetect <= DETECTION_DIGO2_3))
-
-#ifdef ENABLE_CO2_SUPPORT
-					|| ((externalAutoDetect >= DETECTION_CO2_0) && (externalAutoDetect <= DETECTION_CO2_3))
-#endif
-#ifdef ENABLE_GNSS_EXTERN
-					|| ((externalAutoDetect >= DETECTION_GNSS_0) && (externalAutoDetect <= DETECTION_GNSS_3))
-#endif
-
-#ifdef ENABLE_SENTINEL_MODE
-														   || ((protocol == EXT_INTERFACE_UART_SENTINEL) && (externalAutoDetect == DETECTION_SENTINEL))
-#endif
-					)
-				{
-					lastSensorDataId = 0;
-					externalUART_Protocol = protocol;
-					MX_USART1_UART_DeInit();
-					if( protocol != 0)
-					{
-						MX_USART1_UART_Init();
-					}
-				}
-			break;
-		default:
-			break;
+		MX_USART1_UART_Init();
 	}
 }
 
@@ -509,12 +486,17 @@
 	return externalCO2SignalStrength;
 }
 
-void externalInterface_SetBottlePressure(uint8_t bottle, uint8_t bar)
+
+void externalInterface_GetHUDSequence(uint8_t* pSequence, uint8_t* brightness)
 {
-	if(bottle < PRESSURE_BOTTLE_CNT)
-	{
-		externalBottleBar[bottle] = bar;
-	}
+	memcpy(pSequence, externalHUDSequence, EXT_INTERFACE_HUD_LED_MAX);
+	*brightness = externalHUDBrightness;
+}
+
+void externalInterface_SetHUDSequence(uint8_t* pSequence, uint8_t brightness)
+{
+	memcpy(externalHUDSequence, pSequence, EXT_INTERFACE_HUD_LED_MAX);
+	externalHUDBrightness = brightness;
 }
 
 uint8_t externalInterface_GetBottlePressure(uint8_t bottle)
@@ -528,6 +510,30 @@
 	return ret;
 }
 
+void externalInterface_SetBottlePressure(uint8_t bottle, uint8_t bar)
+{
+	if(bottle < PRESSURE_BOTTLE_CNT)
+	{
+		externalBottleBar[bottle] = bar;
+	}
+}
+
+void externalInterface_CopySensorData(uint8_t sensorId, uint8_t* target, uint8_t* source)
+{
+	if(sensorId < EXT_INTERFACE_SENSOR_CNT)
+	{
+		switch(SensorMap[sensorId])
+		{
+			case SENSOR_DIGO2M:
+			case SENSOR_DIGO2:	memcpy(target, source, sizeof(SSensorDataDiveO2));
+				break;
+			case SENSOR_HUD:	memcpy(target, source, HUD_INFO_DATA_LENGTH);
+				break;
+			default:
+			break;
+		}
+	}
+}
 
 uint8_t externalInterface_GetSensorData(uint8_t sensorId, uint8_t* pDataStruct)
 {
@@ -540,7 +546,7 @@
 
 	if((pDataStruct != NULL) && (localId <= EXT_INTERFACE_SENSOR_CNT))
 	{
-		memcpy(pDataStruct, &sensorDataDiveO2[localId], sizeof(SSensorDataDiveO2));
+		externalInterface_CopySensorData(localId, pDataStruct, &sensorData[localId][0]);
 	}
 	else
 	{
@@ -568,7 +574,7 @@
 	{
 		if((sensorId != 0xFF) && (sensorId < EXT_INTERFACE_SENSOR_CNT))
 		{
-			memcpy(&sensorDataDiveO2[sensorId], pDataStruct, sizeof(SSensorDataDiveO2));
+			externalInterface_CopySensorData(sensorId, &sensorData[sensorId][0], pDataStruct);
 			lastSensorDataId = sensorId;
 			if(sensorId >= MAX_ADC_CHANNEL)
 			{
@@ -576,7 +582,7 @@
 				{
 					if(Mux2ADCMap[index] == sensorId)
 					{
-						memcpy(&sensorDataDiveO2[index], pDataStruct, sizeof(SSensorDataDiveO2));
+						externalInterface_CopySensorData(index, &sensorData[index][0], pDataStruct);
 						lastSensorDataId = index;
 						break;
 					}
@@ -585,7 +591,7 @@
 		}
 		else
 		{
-			memset(&sensorDataDiveO2,0,sizeof(sensorDataDiveO2));
+			memset(&sensorData,0,EXTIF_SENSOR_INFO_SIZE * EXT_INTERFACE_SENSOR_CNT);
 			lastSensorDataId = 0xFF;
 		}
 	}
@@ -858,13 +864,17 @@
 									{
 
 
-#if defined ENABLE_SENTINEL_MODE || defined ENABLE_GNSS_EXTERN
+#if defined ENABLE_SENTINEL_MODE || defined ENABLE_GNSS_EXTERN || defined ENABLE_HUD_SUPPORT
 #ifdef ENABLE_GNSS_EXTERN
 										externalAutoDetect = DETECTION_GNSS_0;
 										externalInterface_SwitchUART(EXT_INTERFACE_UART_GNSS);
 #else
 #ifdef ENABLE_SENTINEL_MODE
 										externalAutoDetect = DETECTION_SENTINEL;
+#else
+#ifdef ENABLE_HUD_SUPPORT
+										externalAutoDetect = DETECTION_HUD_0;
+#endif
 #endif
 #endif
 #else
@@ -958,6 +968,51 @@
 									}
 									externalAutoDetect++;
 #endif
+
+#ifdef ENABLE_HUD_SUPPORT
+									if(externalAutoDetect == DETECTION_HUD_0)
+									{
+										tmpSensorMap[uartMuxChannel + EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE;
+										if(foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX)
+										{
+											externalInterface_CheckBaudrate(SENSOR_DIGO2);
+											UART_MUX_SelectAddress(0);
+										}
+										activeUartChannel = 0;
+										tmpSensorMap[uartMuxChannel - 1 + EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE;
+										uartMuxChannel = 1;
+										tmpSensorMap[EXT_INTERFACE_MUX_OFFSET] = SENSOR_HUD;
+										externalInterface_SensorState[EXT_INTERFACE_MUX_OFFSET] = UART_COMMON_INIT;
+										externalInterface_CheckBaudrate(SENSOR_HUD);
+										externalInterfaceMuxReqIntervall = 500;	/* iterations needed for module config */
+									}
+							break;
+			case DETECTION_HUD_0:
+			case DETECTION_HUD_1:
+			case DETECTION_HUD_2:
+			case DETECTION_HUD_3:
+										if(uartHUD_isSensorConnected())
+										{
+											foundSensorMap[EXT_INTERFACE_MUX_OFFSET + activeUartChannel] = SENSOR_HUD;
+											externalAutoDetect = DETECTION_DONE;		/* only one HUD sensor supported */
+										}
+										else if(foundSensorMap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX)
+										{
+											externalInterface_CheckBaudrate(SENSOR_DIGO2);
+											UART_MUX_SelectAddress(uartMuxChannel);
+											activeUartChannel = uartMuxChannel;
+											tmpSensorMap[uartMuxChannel - 1 + EXT_INTERFACE_MUX_OFFSET] = SENSOR_NONE;
+											tmpSensorMap[EXT_INTERFACE_MUX_OFFSET + uartMuxChannel] = SENSOR_CO2;
+											externalInterface_SensorState[EXT_INTERFACE_MUX_OFFSET + uartMuxChannel] = UART_COMMON_INIT;
+											externalInterface_CheckBaudrate(SENSOR_HUD);
+											externalAutoDetect++;
+											uartMuxChannel++;
+										}
+										else
+										{
+											externalAutoDetect = DETECTION_DONE;
+										}
+#endif
 				break;
 			case DETECTION_DONE:	externalAutoDetect = DETECTION_OFF;
 									externalInterface_SwitchUART(EXT_INTERFACE_UART_OFF);
@@ -971,7 +1026,7 @@
 											cntSensor++;
 										}
 
-										if((foundSensorMap[index] == SENSOR_DIGO2) || (foundSensorMap[index] == SENSOR_CO2) || (foundSensorMap[index] == SENSOR_GNSS))
+										if((foundSensorMap[index] == SENSOR_DIGO2) || (foundSensorMap[index] == SENSOR_CO2) || (foundSensorMap[index] == SENSOR_GNSS) || (foundSensorMap[index] == SENSOR_HUD))
 										{
 											cntUARTSensor++;
 										}
@@ -986,23 +1041,22 @@
 									}
 									externalInface_MapUartToLegacyADC(foundSensorMap);
 									externalInterfaceMuxReqIntervall = 0xFFFF;
-									if(cntSensor == 0)		/* return default sensor map if no sensor at all has been detected */
+									if((cntSensor == 0)		/* return default sensor map if no sensor at all has been detected */
+										|| ((foundSensorMap[0] == SENSOR_NONE) && (foundSensorMap[1] == SENSOR_NONE) && (foundSensorMap[2] == SENSOR_NONE)))
 									{
 										foundSensorMap[0] = SENSOR_OPTIC;
 										foundSensorMap[1] = SENSOR_OPTIC;
 										foundSensorMap[2] = SENSOR_OPTIC;
 									}
-									else
+									if(cntUARTSensor != 0)
 									{
-										if(cntUARTSensor != 0)
+										externalInterfaceMuxReqIntervall = REQUEST_INT_SENSOR_MS / cntUARTSensor;
+										if(foundSensorMap[0] == SENSOR_SENTINELM)	/* special case: Sentinel sends combined data */
 										{
-											externalInterfaceMuxReqIntervall = REQUEST_INT_SENSOR_MS / cntUARTSensor;
-											if(foundSensorMap[0] == SENSOR_SENTINELM)	/* special case: Sentinel sends combined data */
-											{
-												externalInterfaceMuxReqIntervall = 4000;
-											}
+											externalInterfaceMuxReqIntervall = 4000;
 										}
 									}
+
 									memcpy(SensorMap, foundSensorMap, sizeof(foundSensorMap));
 									memset(externalInterface_SensorState, UART_COMMON_INIT, sizeof(externalInterface_SensorState));
 				break;
@@ -1075,7 +1129,20 @@
 											externalInterface_SensorState[index] = UART_O2_CHECK;
 										}
 			break;
-
+#ifdef ENABLE_HUD_SUPPORT
+		case EXT_INTERFACE_HUD_UPDATE:	index = (Cmd >> 8) & 0x000F;
+										if(SensorMap[index] == SENSOR_HUD)
+										{
+											externalInterface_SensorState[index] = UART_HUD_UPDATE;
+										}
+					break;
+		case EXT_INTERFACE_HUD_ABORT:	index = (Cmd >> 8) & 0x000F;
+										if(SensorMap[index] == SENSOR_HUD)
+										{
+											externalInterface_SensorState[index] = UART_HUD_ABORT;
+										}
+					break;
+#endif
 		default:
 			break;
 	}
@@ -1101,7 +1168,8 @@
 		}
 		if(((pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_DIGO2)
 				|| (pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_CO2)
-				|| (pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_GNSS))
+				|| (pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_GNSS)
+				|| (pmap[index + EXT_INTERFACE_MUX_OFFSET] == SENSOR_HUD))
 				&& (index != activeUartChannel))
 		{
 			newChannel = index;
@@ -1122,6 +1190,7 @@
 			case SENSOR_SENTINEL:
 			case SENSOR_CO2:		newBaudrate = 9600;
 				break;
+			case SENSOR_HUD:
 			case SENSOR_DIGO2:
 		default:	newBaudrate = 19200;
 			break;
@@ -1286,6 +1355,10 @@
 				case SENSOR_SENTINEL: uartSentinel_Control();
 				break;
 #endif
+#ifdef ENABLE_HUD_SUPPORT
+				case SENSOR_HUD: uartHUD_Control();
+				break;
+#endif
 				default:
 					break;
 			}