view 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 source

/**
  ******************************************************************************
  * @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>&copy; 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