Mercurial > public > ostc4
annotate Small_CPU/Src/uartProtocol_GNSS.c @ 919:c0553dd70608 Evo_2_23
GNSS support for external UART interface:
An ubox gps module may now be connected to the external UART. Per default the functionality is disabled using the compile switch ENABLE_GNSS_SUPPORT
author | Ideenmodellierer |
---|---|
date | Sun, 03 Nov 2024 15:43:04 +0100 |
parents | 2225c467f1e9 |
children | 7c996354b8ac |
rev | line source |
---|---|
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
1 /** |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
2 ****************************************************************************** |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
3 * @file uartProtocol_GNSS.c |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
4 * @author heinrichs weikamp gmbh |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
5 * @version V0.0.1 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
6 * @date 30-Sep-2024 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
7 * @brief Interface functionality operation of GNSS devices |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
8 * |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
9 @verbatim |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
10 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
11 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
12 @endverbatim |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
13 ****************************************************************************** |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
14 * @attention |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
15 * |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
16 * <h2><center>© COPYRIGHT(c) 2024 heinrichs weikamp</center></h2> |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
17 * |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
18 ****************************************************************************** |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
19 */ |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
20 /* Includes ------------------------------------------------------------------*/ |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
21 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
22 #include <string.h> |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
23 #include "scheduler.h" |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
24 #include <uartProtocol_GNSS.h> |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
25 #include "uart.h" |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
26 #include "GNSS.h" |
919 | 27 #include "configuration.h" |
28 #include "externalInterface.h" | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
29 |
919 | 30 #if defined ENABLE_GNSS || defined ENABLE_GNSS_SUPPORT |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
31 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
32 static receiveStateGnss_t rxState = GNSSRX_READY; |
919 | 33 static uint8_t GnssConnected = 0; /* Binary indicator if a sensor is connected or not */ |
34 | |
35 static uint8_t writeIndex = 0; | |
36 | |
37 static uint8_t dataToRead = 0; | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
38 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
39 void ConvertByteToHexString(uint8_t byte, char* str) |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
40 { |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
41 uint8_t worker = 0; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
42 uint8_t digit = 0; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
43 uint8_t digitCnt = 1; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
44 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
45 worker = byte; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
46 while((worker!=0) && (digitCnt != 255)) |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
47 { |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
48 digit = worker % 16; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
49 if( digit < 10) |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
50 { |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
51 digit += '0'; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
52 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
53 else |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
54 { |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
55 digit += 'A' - 10; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
56 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
57 str[digitCnt--]= digit; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
58 worker = worker / 16; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
59 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
60 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
61 |
919 | 62 |
63 void uartGnss_SendCmd(uint8_t GnssCmd) | |
64 { | |
65 uint8_t* pData; | |
66 uint8_t txLength = 0; | |
67 | |
68 switch (GnssCmd) | |
69 { | |
70 case GNSSCMD_LOADCONF_0: pData = configUBX; | |
71 txLength = sizeof(configUBX) / sizeof(uint8_t); | |
72 break; | |
73 case GNSSCMD_LOADCONF_1: pData = setNMEA410; | |
74 txLength = sizeof(setNMEA410) / sizeof(uint8_t); | |
75 break; | |
76 case GNSSCMD_LOADCONF_2: pData = setGNSS; | |
77 txLength = sizeof(setGNSS) / sizeof(uint8_t); | |
78 break; | |
79 case GNSSCMD_GET_PVT_DATA: pData = getPVTData; | |
80 txLength = sizeof(getPVTData) / sizeof(uint8_t); | |
81 break; | |
82 case GNSSCMD_GET_NAV_DATA: pData = getNavigatorData; | |
83 txLength = sizeof(getNavigatorData) / sizeof(uint8_t); | |
84 break; | |
85 | |
86 default: | |
87 break; | |
88 } | |
89 if(txLength != 0) | |
90 { | |
91 UART_SendCmdUbx(pData, txLength); | |
92 } | |
93 } | |
94 | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
95 void uartGnss_Control(void) |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
96 { |
919 | 97 static uint32_t warmupTick = 0; |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
98 |
919 | 99 uint8_t activeSensor = externalInterface_GetActiveUartSensor(); |
100 uartGnssStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
101 |
919 | 102 switch (localComState) |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
103 { |
919 | 104 case UART_GNSS_INIT: localComState = UART_GNSS_WARMUP; |
105 warmupTick = HAL_GetTick(); | |
106 UART_clearRxBuffer(); | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
107 break; |
919 | 108 case UART_GNSS_WARMUP: if(time_elapsed_ms(warmupTick,HAL_GetTick()) > 1000) |
109 { | |
110 localComState = UART_GNSS_LOADCONF_0; | |
111 } | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
112 break; |
919 | 113 case UART_GNSS_LOADCONF_0: uartGnss_SendCmd(GNSSCMD_LOADCONF_0); |
114 localComState = UART_GNSS_LOADCONF_1; | |
115 rxState = GNSSRX_DETECT_ACK_0; | |
116 break; | |
117 case UART_GNSS_LOADCONF_1: uartGnss_SendCmd(GNSSCMD_LOADCONF_1); | |
118 localComState = UART_GNSS_LOADCONF_2; | |
119 rxState = GNSSRX_DETECT_ACK_0; | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
120 break; |
919 | 121 case UART_GNSS_LOADCONF_2: uartGnss_SendCmd(GNSSCMD_LOADCONF_2); |
122 localComState = UART_GNSS_IDLE; | |
123 rxState = GNSSRX_DETECT_ACK_0; | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
124 break; |
919 | 125 case UART_GNSS_IDLE: uartGnss_SendCmd(GNSSCMD_GET_PVT_DATA); |
126 localComState = UART_GNSS_GET_PVT; | |
127 rxState = GNSSRX_DETECT_HEADER_0; | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
128 break; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
129 default: |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
130 break; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
131 } |
919 | 132 |
133 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState); | |
134 | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
135 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
136 |
919 | 137 void uartGnss_ProcessData(uint8_t data) |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
138 { |
919 | 139 uint8_t activeSensor = externalInterface_GetActiveUartSensor(); |
140 GNSS_Handle.uartWorkingBuffer[writeIndex++] = data; | |
141 switch(rxState) | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
142 { |
919 | 143 case GNSSRX_DETECT_ACK_0: |
144 case GNSSRX_DETECT_HEADER_0: if(data == 0xB5) | |
145 { | |
146 writeIndex = 0; | |
147 memset(GNSS_Handle.uartWorkingBuffer,0, sizeof(GNSS_Handle.uartWorkingBuffer)); | |
148 GNSS_Handle.uartWorkingBuffer[writeIndex++] = data; | |
149 rxState++; | |
150 } | |
151 break; | |
152 case GNSSRX_DETECT_ACK_1: | |
153 case GNSSRX_DETECT_HEADER_1: if(data == 0x62) | |
154 { | |
155 rxState++; | |
156 } | |
157 else | |
158 { | |
159 rxState = GNSSRX_DETECT_HEADER_0; | |
160 } | |
161 break; | |
162 case GNSSRX_DETECT_ACK_2: if(data == 0x05) | |
163 { | |
164 rxState++; | |
165 } | |
166 else | |
167 { | |
168 rxState = GNSSRX_DETECT_HEADER_0; | |
169 } | |
170 break; | |
171 case GNSSRX_DETECT_ACK_3: if((data == 0x01) || (data == 0x00)) | |
172 { | |
173 GnssConnected = 1; | |
174 rxState = GNSSRX_READY; | |
175 } | |
176 else | |
177 { | |
178 rxState = GNSSRX_DETECT_HEADER_0; | |
179 } | |
180 break; | |
181 case GNSSRX_DETECT_HEADER_2: if(data == 0x01) | |
182 { | |
183 rxState++; | |
184 } | |
185 else | |
186 { | |
187 rxState = GNSSRX_DETECT_HEADER_0; | |
188 } | |
189 break; | |
190 case GNSSRX_DETECT_HEADER_3: | |
191 switch(data) | |
192 { | |
193 case 0x21: rxState = GNSSRX_READ_NAV_DATA; | |
194 dataToRead = 20; | |
195 break; | |
196 case 0x07: rxState = GNSSRX_READ_PVT_DATA; | |
197 dataToRead = 92; | |
198 break; | |
199 case 0x02: rxState = GNSSRX_READ_POSLLH_DATA; | |
200 break; | |
201 default: rxState = GNSSRX_DETECT_HEADER_0; | |
202 break; | |
203 } | |
204 break; | |
205 case GNSSRX_READ_NAV_DATA: | |
206 case GNSSRX_READ_PVT_DATA: | |
207 case GNSSRX_READ_POSLLH_DATA: if(dataToRead > 0) | |
208 { | |
209 dataToRead--; | |
210 } | |
211 else | |
212 { | |
213 switch(rxState) | |
214 { | |
215 case GNSSRX_READ_NAV_DATA: GNSS_ParseNavigatorData(&GNSS_Handle); | |
216 break; | |
217 case GNSSRX_READ_PVT_DATA: GNSS_ParsePVTData(&GNSS_Handle); | |
218 break; | |
219 case GNSSRX_READ_POSLLH_DATA: GNSS_ParsePOSLLHData(&GNSS_Handle); | |
220 break; | |
221 default: rxState = GNSSRX_DETECT_HEADER_0; | |
222 break; | |
223 } | |
224 rxState = GNSSRX_DETECT_HEADER_0; | |
225 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,UART_GNSS_IDLE); | |
226 } | |
227 break; | |
228 default: rxState = GNSSRX_READY; | |
229 break; | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
230 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
231 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
232 |
919 | 233 uint8_t uartGnss_isSensorConnected() |
234 { | |
235 return GnssConnected; | |
236 } | |
237 | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
238 #endif |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
239 |