view Small_CPU/Src/uartProtocol_GNSS.c @ 918:f72613a152dd Evo_2_23

Switch external interface tx communication to DMA: In the previous version the transmitting of data was done in polling mode. With the introduction of new sensors the length of commands send to the sensor may increase and have a impact to the runtim behavior of the SW. To avoid this the DMA transfers for TX has been activated.
author Ideenmodellierer
date Sun, 03 Nov 2024 15:40:55 +0100
parents 2225c467f1e9
children c0553dd70608
line wrap: on
line source

/**
  ******************************************************************************
  * @file    uartProtocol_GNSS.c
  * @author  heinrichs weikamp gmbh
  * @version V0.0.1
  * @date    30-Sep-2024
  * @brief   Interface functionality operation of GNSS devices
  *
  @verbatim


  @endverbatim
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT(c) 2024 heinrichs weikamp</center></h2>
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/

#include <string.h>
#include "scheduler.h"
#include <uartProtocol_GNSS.h>
#include "uart.h"
#include "GNSS.h"

#ifdef ENABLE_GNSS

static uartGnssStatus_t gnssOpState = UART_GNSS_INIT;
static receiveStateGnss_t rxState = GNSSRX_READY;

void ConvertByteToHexString(uint8_t byte, char* str)
{
	uint8_t worker = 0;
	uint8_t digit = 0;
	uint8_t digitCnt = 1;

	worker = byte;
	while((worker!=0) && (digitCnt != 255))
	{
		digit = worker % 16;
		if( digit < 10)
		{
			digit += '0';
		}
		else
		{
			digit += 'A' - 10;
		}
		str[digitCnt--]= digit;
		worker = worker / 16;
	}
}

void uartGnss_Control(void)
{
	static uint32_t delayStartTick = 0;

	uint32_t tick = HAL_GetTick();

	switch (gnssOpState)
	{
		case UART_GNSS_INIT:	delayStartTick = tick;
								gnssOpState = UART_GNSS_LOAD;
				break;
		case UART_GNSS_LOAD:	if(time_elapsed_ms(delayStartTick,HAL_GetTick()) > 1000)
								{
									GNSS_LoadConfig(&GNSS_Handle);
									gnssOpState = UART_GNSS_GET_ID;
									delayStartTick = tick;
								}
				break;
		case UART_GNSS_GET_ID:	if(time_elapsed_ms(delayStartTick,HAL_GetTick()) > 250)
								{
									GNSS_GetUniqID(&GNSS_Handle);
									gnssOpState = UART_GNSS_IDLE;
									rxState = GNSSRX_RECEIVING;
									delayStartTick = tick;
								}
				break;
		case UART_GNSS_IDLE:	if(time_elapsed_ms(delayStartTick,HAL_GetTick()) > 1000)
								{
									GNSS_GetPVTData(&GNSS_Handle);
									gnssOpState = UART_GNSS_OPERATING;
									rxState = GNSSRX_RECEIVING;
									delayStartTick = tick;
								}
				break;
		case UART_GNSS_OPERATING: if(time_elapsed_ms(delayStartTick,HAL_GetTick()) > 1000)
								{
									gnssOpState = UART_GNSS_IDLE;	/* simple error handling => start next request */
									rxState = GNSSRX_READY;
								}
				break;
		default:
				break;
	}
}

void uartGnss_ProcessData(void)
{
	if(rxState == GNSSRX_RECEIVING)
	{
		if(GNSS_ParseBuffer(&GNSS_Handle))
		{
			gnssOpState = UART_GNSS_IDLE;
		}
	}
}

#endif