Mercurial > public > ostc4
diff Small_CPU/Src/uartProtocol_GNSS.c @ 981:c6c781a2e85b default
Merge into default
| author | heinrichsweikamp |
|---|---|
| date | Tue, 11 Feb 2025 18:12:00 +0100 |
| parents | 9b29995d6619 |
| children | d9290c76b840 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Small_CPU/Src/uartProtocol_GNSS.c Tue Feb 11 18:12:00 2025 +0100 @@ -0,0 +1,375 @@ +/** + ****************************************************************************** + * @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>© COPYRIGHT(c) 2024 heinrichs weikamp</center></h2> + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ + +#include <string.h> +#include "scheduler.h" +#include <uartProtocol_GNSS.h> +#include "uart.h" +#include "GNSS.h" +#include "configuration.h" +#include "externalInterface.h" + + +#if defined ENABLE_GNSS || defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2 + +static uartGnssStatus_t gnssState = UART_GNSS_INIT; +static gnssRequest_s activeRequest = {0,0}; + +static receiveStateGnss_t rxState = GNSSRX_READY; +static uint8_t GnssConnected = 0; /* Binary indicator if a sensor is connected or not */ +static uint8_t writeIndex = 0; +static uint8_t dataToRead = 0; +static uint8_t ReqPowerDown = 0; + +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_ReqPowerDown(uint8_t request) +{ + if(GnssConnected) + { + ReqPowerDown = request; + } +} + +uint8_t uartGnss_isPowerDownRequested() +{ + return ReqPowerDown; +} + +uartGnssStatus_t uartGnss_GetState() +{ + return gnssState; +} +void uartGnss_SetState(uartGnssStatus_t newState) +{ + gnssState = newState; +} + +void UART_Gnss_SendCmd(uint8_t GnssCmd) +{ + const uint8_t* pData; + uint8_t txLength = 0; + + switch (GnssCmd) + { + case GNSSCMD_LOADCONF_0: pData = configUBX; + txLength = sizeof(configUBX) / sizeof(uint8_t); + break; + case GNSSCMD_LOADCONF_1: pData = setNMEA410; + txLength = sizeof(setNMEA410) / sizeof(uint8_t); + break; + case GNSSCMD_LOADCONF_2: pData = setGNSS; + txLength = sizeof(setGNSS) / sizeof(uint8_t); + break; + case GNSSCMD_SETMOBILE: pData = setPortableMode; + txLength = sizeof(setPortableMode) / sizeof(uint8_t); + break; + case GNSSCMD_GET_PVT_DATA: pData = getPVTData; + txLength = sizeof(getPVTData) / sizeof(uint8_t); + break; + case GNSSCMD_GET_NAV_DATA: pData = getNavigatorData; + txLength = sizeof(getNavigatorData) / sizeof(uint8_t); + break; + case GNSSCMD_GET_NAVSAT_DATA: pData = getNavSat; + txLength = sizeof(getNavSat) / sizeof(uint8_t); + break; + case GNSSCMD_MODE_PWS: pData = setPowerLow; + txLength = sizeof(setPowerLow) / sizeof(uint8_t); + break; + case GNSSCMD_MODE_NORMAL: pData = setPowerNormal; + txLength = sizeof(setPowerNormal) / sizeof(uint8_t); + break; + case GNSSCMD_SET_CONFIG: pData = setConfig; + txLength = sizeof(setConfig) / sizeof(uint8_t); + break; + default: + break; + } + if(txLength != 0) + { + activeRequest.class = pData[2]; + activeRequest.id = pData[3]; + UART_SendCmdUbx(pData, txLength); + } +} + +void uartGnss_Control(void) +{ + static uint32_t warmupTick = 0; + static uint8_t dataToggle = 0; + uint8_t activeSensor = 0; + sUartComCtrl* pUartCtrl = UART_GetGnssCtrl(); + + if(pUartCtrl == &Uart1Ctrl) + { + activeSensor = externalInterface_GetActiveUartSensor(); + gnssState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); + } + + switch (gnssState) + { + case UART_GNSS_INIT: gnssState = UART_GNSS_WARMUP; + warmupTick = HAL_GetTick(); + UART_clearRxBuffer(pUartCtrl); + break; + case UART_GNSS_WARMUP: if(time_elapsed_ms(warmupTick,HAL_GetTick()) > 1000) + { + gnssState = UART_GNSS_LOADCONF_0; + } + break; + case UART_GNSS_LOADCONF_0: UART_Gnss_SendCmd(GNSSCMD_LOADCONF_0); + rxState = GNSSRX_DETECT_ACK_0; + break; + case UART_GNSS_LOADCONF_1: UART_Gnss_SendCmd(GNSSCMD_LOADCONF_1); + rxState = GNSSRX_DETECT_ACK_0; + break; + case UART_GNSS_LOADCONF_2: UART_Gnss_SendCmd(GNSSCMD_LOADCONF_2); + rxState = GNSSRX_DETECT_ACK_0; + break; + case UART_GNSS_SETMODE_MOBILE: UART_Gnss_SendCmd(GNSSCMD_LOADCONF_2); + rxState = GNSSRX_DETECT_ACK_0; + break; + case UART_GNSS_PWRDOWN: UART_Gnss_SendCmd(GNSSCMD_MODE_PWS); + rxState = GNSSRX_DETECT_ACK_0; + break; + + case UART_GNSS_PWRUP: UART_Gnss_SendCmd(GNSSCMD_MODE_NORMAL); + rxState = GNSSRX_DETECT_ACK_0; + gnssState = UART_GNSS_PWRUP; + break; + case UART_GNSS_SETCONF: UART_Gnss_SendCmd(GNSSCMD_SET_CONFIG); + rxState = GNSSRX_DETECT_ACK_0; + break; + + case UART_GNSS_IDLE: if(ReqPowerDown) + { + UART_Gnss_SendCmd(GNSSCMD_MODE_PWS); + gnssState = UART_GNSS_PWRDOWN; + rxState = GNSSRX_DETECT_ACK_0; + } + else + { + if(dataToggle) + { + UART_Gnss_SendCmd(GNSSCMD_GET_PVT_DATA); + gnssState = UART_GNSS_GET_PVT; + rxState = GNSSRX_DETECT_HEADER_0; + dataToggle = 0; + } + else + { + UART_Gnss_SendCmd(GNSSCMD_GET_NAVSAT_DATA); + gnssState = UART_GNSS_GET_SAT; + rxState = GNSSRX_DETECT_HEADER_0; + dataToggle = 1; + } + } + break; + default: + break; + } + if(pUartCtrl == &Uart1Ctrl) + { + externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,gnssState); + } + +} + + +void uartGnss_ProcessData(uint8_t data) +{ + static uint16_t rxLength = 0; + static uint8_t ck_A = 0; + static uint8_t ck_B = 0; + static uint8_t ck_A_Ref = 0; + static uint8_t ck_B_Ref = 0; + uint8_t activeSensor = 0; + + sUartComCtrl* pUartCtrl = UART_GetGnssCtrl(); + + if(pUartCtrl == &Uart1Ctrl) + { + activeSensor = externalInterface_GetActiveUartSensor(); + gnssState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); + } + + GNSS_Handle.uartWorkingBuffer[writeIndex++] = data; + if((rxState >= GNSSRX_DETECT_HEADER_2) && (rxState < GNSSRX_READ_CK_A)) + { + ck_A += data; + ck_B += ck_A; + } + + switch(rxState) + { + case GNSSRX_DETECT_ACK_0: + case GNSSRX_DETECT_HEADER_0: if(data == 0xB5) + { + writeIndex = 0; + memset(GNSS_Handle.uartWorkingBuffer,0xff, sizeof(GNSS_Handle.uartWorkingBuffer)); + GNSS_Handle.uartWorkingBuffer[writeIndex++] = data; + rxState++; + ck_A = 0; + ck_B = 0; + } + break; + case GNSSRX_DETECT_ACK_1: + case GNSSRX_DETECT_HEADER_1: if(data == 0x62) + { + rxState++; + } + else + { + rxState = GNSSRX_DETECT_HEADER_0; + } + break; + case GNSSRX_DETECT_ACK_2: if(data == 0x05) + { + rxState++; + } + else + { + rxState = GNSSRX_DETECT_HEADER_0; + } + break; + case GNSSRX_DETECT_ACK_3: if((data == 0x01)) + { + rxState = GNSSRX_READY; + switch(gnssState) + { + case UART_GNSS_PWRUP: gnssState = UART_GNSS_IDLE; + break; + case UART_GNSS_PWRDOWN: rxState = GNSSRX_DETECT_ACK_0; + UART_Gnss_SendCmd(GNSSCMD_SET_CONFIG); + gnssState = UART_GNSS_SETCONF; + break; + case UART_GNSS_SETCONF: gnssState = UART_GNSS_INACTIVE; + break; + case UART_GNSS_LOADCONF_0: + case UART_GNSS_LOADCONF_1: gnssState++; + break; + case UART_GNSS_LOADCONF_2: gnssState = UART_GNSS_SETMODE_MOBILE; + break; + case UART_GNSS_SETMODE_MOBILE: rxState = GNSSRX_DETECT_ACK_0; + UART_Gnss_SendCmd(GNSSCMD_MODE_NORMAL); + gnssState = UART_GNSS_PWRUP; + break; + default: + break; + } + GnssConnected = 1; + } + else + { + rxState = GNSSRX_DETECT_HEADER_0; + } + break; + case GNSSRX_DETECT_HEADER_2: if(data == activeRequest.class) + { + rxState++; + } + else + { + rxState = GNSSRX_DETECT_HEADER_0; + } + break; + case GNSSRX_DETECT_HEADER_3: if(data == activeRequest.id) + { + rxState = GNSSRX_DETECT_LENGTH_0; + } + else + { + rxState = GNSSRX_DETECT_HEADER_0; + } + break; + case GNSSRX_DETECT_LENGTH_0: rxLength = GNSS_Handle.uartWorkingBuffer[4]; + rxState = GNSSRX_DETECT_LENGTH_1; + break; + case GNSSRX_DETECT_LENGTH_1: rxLength += (GNSS_Handle.uartWorkingBuffer[5] << 8); + rxState = GNSSRX_READ_DATA; + dataToRead = rxLength; + break; + case GNSSRX_READ_DATA: if(dataToRead > 0) + { + dataToRead--; + } + if(dataToRead == 0) + { + rxState = GNSSRX_READ_CK_A; + } + break; + case GNSSRX_READ_CK_A: ck_A_Ref = data; + rxState++; + break; + case GNSSRX_READ_CK_B: ck_B_Ref = data; + if((ck_A_Ref == ck_A) && (ck_B_Ref == ck_B)) + { + switch(gnssState) + { + case UART_GNSS_GET_PVT:GNSS_ParsePVTData(&GNSS_Handle); + break; + case UART_GNSS_GET_SAT: GNSS_ParseNavSatData(&GNSS_Handle); + break; + default: + break; + } + } + rxState = GNSSRX_DETECT_HEADER_0; + gnssState = UART_GNSS_IDLE; + break; + + default: rxState = GNSSRX_READY; + break; + } + if(pUartCtrl == &Uart1Ctrl) + { + externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,gnssState); + } +} + +uint8_t uartGnss_isSensorConnected() +{ + return GnssConnected; +} + +#endif +
