Mercurial > public > ostc4
diff Small_CPU/Src/uartProtocol_HUD.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 | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Small_CPU/Src/uartProtocol_HUD.c Mon Mar 02 17:22:25 2026 +0100 @@ -0,0 +1,186 @@ +/** + ****************************************************************************** + * @file uartProtocol_HUD.c + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 24-Feb-2026 + * @brief Interface functionality to external, UART based HUD + * + @verbatim + + + @endverbatim + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2023 heinrichs weikamp</center></h2> + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ + +#include <string.h> +#include <uartProtocol_HUD.h> +#include "uart.h" +#include "externalInterface.h" + +#ifdef ENABLE_HUD_SUPPORT +static uint8_t HUDConnected = 0; /* Binary indicator if a sensor is connected or not */ +static receiveStateHUD_t rxState = HUDRX_Ready; + + + +void uartHUD_SendCmd(uint8_t HUDCmd) +{ + uint8_t cmdLength = 0; + uint8_t cmdBuf[HUD_MAX_CMD_LENGTH]; + uint8_t index = 0; + uint16_t checkSum = 0; + + cmdBuf[0] = HUD_CMD_BYTE_START; + switch (HUDCmd) + { + case HUDCMD_GETINFO: cmdBuf[1] = HUD_CMD_BYTE_INFO; + cmdLength = 1; + break; + case HUDCMD_UPDATE: cmdBuf[1] = HUD_CMD_BYTE_UPDATE; + externalInterface_GetHUDSequence(&cmdBuf[3],&cmdBuf[2]); + cmdLength = 19; + break; + case HUDCMD_ABORTSEQ: cmdBuf[1] = HUD_CMD_BYTE_STOP; + cmdLength = 1; + break; + default: cmdLength = 0; + break; + } + if(cmdLength != 0) + { + cmdLength++; /* add Startbyte */ + for(index = 0; index < cmdLength; index++) + { + if(index > 2) /* hard coded number of pulses = 2 */ + { + cmdBuf[index] |= 0x10; + } + checkSum += cmdBuf[index]; + } + cmdBuf[cmdLength++] = (checkSum & 0x00FF); /* low byte */ + cmdBuf[cmdLength++] = (checkSum >> 8); /* high byte */ + UART_SendCmdRaw(cmdBuf,cmdLength); + } +} + + +void uartHUD_Control(void) +{ + static uint8_t cmdString[20]; + static uint8_t cmdLength = 0; + static uint8_t lastComState = UART_HUD_INIT; + + uint8_t activeSensor = externalInterface_GetActiveUartSensor(); + uartHUDStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); + + if(localComState == UART_HUD_ERROR) + { + localComState = lastComState; + } + + switch(localComState) + { + case UART_HUD_INIT: HUDConnected = 0; + UART_ReadData(SENSOR_HUD, 1); /* flush buffer */ + UART_StartDMA_Receiption(&Uart1Ctrl); + localComState = UART_HUD_SETUP; + uartHUD_SendCmd(HUDCMD_GETINFO); + break; + case UART_HUD_SETUP: uartHUD_SendCmd(HUDCMD_GETINFO); + rxState = HUDRX_DetectStart; + break; + case UART_HUD_UPDATE: uartHUD_SendCmd(HUDCMD_UPDATE); + rxState = HUDRX_Ready; + break; + case UART_HUD_ABORT: uartHUD_SendCmd(HUDCMD_ABORTSEQ); + rxState = HUDRX_Ready; + break; + default: if(cmdLength != 0) + { + UART_SendCmdString(cmdString); /* resend last command */ + cmdLength = 0; + } + break; + } + lastComState = localComState; + externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState); +} + +void uartHUD_ProcessData(uint8_t data) +{ + static uint8_t dataValue[HUD_INFO_DATA_LENGTH]; + static uint8_t dataIndex = 0; + static uint16_t checkSum = 0; + static uint16_t rxCheckSum = 0; + uint8_t activeSensor = externalInterface_GetActiveUartSensor(); + uartHUDStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); + + if((localComState == UART_HUD_SETUP) && (rxState == HUDRX_Ready)) + { + rxState = HUDRX_DetectStart; + } + switch(rxState) + { + case HUDRX_DetectStart: if(data == 0xAA) + { + dataIndex = 0; + memset(dataValue,0,HUD_INFO_DATA_LENGTH); + dataValue[dataIndex++] = data; + checkSum = data; + rxState = HUDRX_RXData; + } + break; + case HUDRX_RXData: dataValue[dataIndex++] = data; + checkSum += data; + if(dataIndex == HUD_INFO_DATA_LENGTH) + { + rxState = HUDRX_CheckSum_L; + } + break; + case HUDRX_CheckSum_L: rxCheckSum = data; + rxState++; + break; + case HUDRX_CheckSum_H: rxCheckSum |= (data << 8); + if(checkSum == rxCheckSum) + { + HUDConnected = 1; + if(localComState == UART_HUD_SETUP) + { + externalInterface_SetSensorData(activeSensor + EXT_INTERFACE_MUX_OFFSET, &dataValue[1]); + localComState = UART_HUD_ABORT; /* reset default sequence */ + } + } + rxState = HUDRX_DetectStart; + break; + default: if(data == 'K') /* OK respond from HUD */ + { + localComState = UART_HUD_IDLE; + } + if(data == 'N') /* NOK respond from HUD */ + { + localComState = UART_HUD_ERROR; + } + if(data == 0xff) + { + localComState = UART_HUD_IDLE; + } + break; + } + + externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState); +} + +uint8_t uartHUD_isSensorConnected() +{ + return HUDConnected; +} + +#endif +
