Mercurial > public > ostc4
annotate Small_CPU/Src/uartProtocol_GNSS.c @ 939:f41974734268 Evo_2_23 tip
Resume UART com with gnss after sleep:
Some changes were needed to get the communication up and running again after the gnns modul was set into power mode. The config needs to be safed at shutdown and the receiver needs to be wake up using dummy bytes before real communication may be resumed
author | Ideenmodellierer |
---|---|
date | Tue, 10 Dec 2024 21:03:04 +0100 |
parents | 3029f0332f4f |
children |
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 |
932 | 30 |
31 #if defined ENABLE_GNSS || defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2 | |
32 | |
33 static uartGnssStatus_t gnssState = UART_GNSS_INIT; | |
34 static gnssRequest_s activeRequest = {0,0}; | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
35 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
36 static receiveStateGnss_t rxState = GNSSRX_READY; |
919 | 37 static uint8_t GnssConnected = 0; /* Binary indicator if a sensor is connected or not */ |
38 static uint8_t writeIndex = 0; | |
39 static uint8_t dataToRead = 0; | |
936 | 40 static uint8_t ReqPowerDown = 0; |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
41 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
42 void ConvertByteToHexString(uint8_t byte, char* str) |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
43 { |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
44 uint8_t worker = 0; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
45 uint8_t digit = 0; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
46 uint8_t digitCnt = 1; |
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 worker = byte; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
49 while((worker!=0) && (digitCnt != 255)) |
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 = worker % 16; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
52 if( digit < 10) |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
53 { |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
54 digit += '0'; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
55 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
56 else |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
57 { |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
58 digit += 'A' - 10; |
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 str[digitCnt--]= digit; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
61 worker = worker / 16; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
62 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
63 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
64 |
936 | 65 void uartGnss_ReqPowerDown(uint8_t request) |
66 { | |
67 if(GnssConnected) | |
68 { | |
939 | 69 ReqPowerDown = request; |
936 | 70 } |
71 } | |
919 | 72 |
939 | 73 uint8_t uartGnss_isPowerDownRequested() |
74 { | |
75 return ReqPowerDown; | |
76 } | |
77 | |
932 | 78 uartGnssStatus_t uartGnss_GetState() |
79 { | |
80 return gnssState; | |
81 } | |
82 void uartGnss_SetState(uartGnssStatus_t newState) | |
83 { | |
84 gnssState = newState; | |
85 } | |
86 | |
87 void UART_Gnss_SendCmd(uint8_t GnssCmd) | |
919 | 88 { |
922 | 89 const uint8_t* pData; |
919 | 90 uint8_t txLength = 0; |
91 | |
92 switch (GnssCmd) | |
93 { | |
94 case GNSSCMD_LOADCONF_0: pData = configUBX; | |
95 txLength = sizeof(configUBX) / sizeof(uint8_t); | |
96 break; | |
97 case GNSSCMD_LOADCONF_1: pData = setNMEA410; | |
98 txLength = sizeof(setNMEA410) / sizeof(uint8_t); | |
99 break; | |
100 case GNSSCMD_LOADCONF_2: pData = setGNSS; | |
101 txLength = sizeof(setGNSS) / sizeof(uint8_t); | |
102 break; | |
939 | 103 case GNSSCMD_SETMOBILE: pData = setPortableMode; |
104 txLength = sizeof(setPortableMode) / sizeof(uint8_t); | |
105 break; | |
919 | 106 case GNSSCMD_GET_PVT_DATA: pData = getPVTData; |
107 txLength = sizeof(getPVTData) / sizeof(uint8_t); | |
108 break; | |
109 case GNSSCMD_GET_NAV_DATA: pData = getNavigatorData; | |
110 txLength = sizeof(getNavigatorData) / sizeof(uint8_t); | |
111 break; | |
932 | 112 case GNSSCMD_GET_NAVSAT_DATA: pData = getNavSat; |
113 txLength = sizeof(getNavSat) / sizeof(uint8_t); | |
114 break; | |
936 | 115 case GNSSCMD_MODE_PWS: pData = setPowerLow; |
116 txLength = sizeof(setPowerLow) / sizeof(uint8_t); | |
117 break; | |
118 case GNSSCMD_MODE_NORMAL: pData = setPowerNormal; | |
119 txLength = sizeof(setPowerNormal) / sizeof(uint8_t); | |
120 break; | |
121 case GNSSCMD_SET_CONFIG: pData = setConfig; | |
122 txLength = sizeof(setConfig) / sizeof(uint8_t); | |
123 break; | |
919 | 124 default: |
125 break; | |
126 } | |
127 if(txLength != 0) | |
128 { | |
932 | 129 activeRequest.class = pData[2]; |
130 activeRequest.id = pData[3]; | |
919 | 131 UART_SendCmdUbx(pData, txLength); |
132 } | |
133 } | |
134 | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
135 void uartGnss_Control(void) |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
136 { |
919 | 137 static uint32_t warmupTick = 0; |
932 | 138 static uint8_t dataToggle = 0; |
139 uint8_t activeSensor = 0; | |
140 sUartComCtrl* pUartCtrl = UART_GetGnssCtrl(); | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
141 |
932 | 142 if(pUartCtrl == &Uart1Ctrl) |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
143 { |
932 | 144 activeSensor = externalInterface_GetActiveUartSensor(); |
145 gnssState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); | |
146 } | |
147 | |
148 switch (gnssState) | |
149 { | |
150 case UART_GNSS_INIT: gnssState = UART_GNSS_WARMUP; | |
919 | 151 warmupTick = HAL_GetTick(); |
932 | 152 UART_clearRxBuffer(pUartCtrl); |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
153 break; |
919 | 154 case UART_GNSS_WARMUP: if(time_elapsed_ms(warmupTick,HAL_GetTick()) > 1000) |
155 { | |
932 | 156 gnssState = UART_GNSS_LOADCONF_0; |
919 | 157 } |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
158 break; |
932 | 159 case UART_GNSS_LOADCONF_0: UART_Gnss_SendCmd(GNSSCMD_LOADCONF_0); |
160 rxState = GNSSRX_DETECT_ACK_0; | |
161 break; | |
162 case UART_GNSS_LOADCONF_1: UART_Gnss_SendCmd(GNSSCMD_LOADCONF_1); | |
163 rxState = GNSSRX_DETECT_ACK_0; | |
164 break; | |
165 case UART_GNSS_LOADCONF_2: UART_Gnss_SendCmd(GNSSCMD_LOADCONF_2); | |
919 | 166 rxState = GNSSRX_DETECT_ACK_0; |
167 break; | |
939 | 168 case UART_GNSS_SETMODE_MOBILE: UART_Gnss_SendCmd(GNSSCMD_LOADCONF_2); |
169 rxState = GNSSRX_DETECT_ACK_0; | |
170 break; | |
936 | 171 case UART_GNSS_PWRDOWN: UART_Gnss_SendCmd(GNSSCMD_MODE_PWS); |
172 rxState = GNSSRX_DETECT_ACK_0; | |
173 break; | |
174 | |
939 | 175 case UART_GNSS_PWRUP: UART_Gnss_SendCmd(GNSSCMD_MODE_NORMAL); |
936 | 176 rxState = GNSSRX_DETECT_ACK_0; |
177 gnssState = UART_GNSS_PWRUP; | |
178 break; | |
179 case UART_GNSS_SETCONF: UART_Gnss_SendCmd(GNSSCMD_SET_CONFIG); | |
180 rxState = GNSSRX_DETECT_ACK_0; | |
181 break; | |
182 | |
183 case UART_GNSS_IDLE: if(ReqPowerDown) | |
932 | 184 { |
936 | 185 UART_Gnss_SendCmd(GNSSCMD_MODE_PWS); |
186 gnssState = UART_GNSS_PWRDOWN; | |
187 rxState = GNSSRX_DETECT_ACK_0; | |
932 | 188 } |
189 else | |
190 { | |
936 | 191 if(dataToggle) |
192 { | |
193 UART_Gnss_SendCmd(GNSSCMD_GET_PVT_DATA); | |
194 gnssState = UART_GNSS_GET_PVT; | |
195 rxState = GNSSRX_DETECT_HEADER_0; | |
196 dataToggle = 0; | |
197 } | |
198 else | |
199 { | |
200 UART_Gnss_SendCmd(GNSSCMD_GET_NAVSAT_DATA); | |
201 gnssState = UART_GNSS_GET_SAT; | |
202 rxState = GNSSRX_DETECT_HEADER_0; | |
203 dataToggle = 1; | |
204 } | |
932 | 205 } |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
206 break; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
207 default: |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
208 break; |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
209 } |
932 | 210 if(pUartCtrl == &Uart1Ctrl) |
211 { | |
212 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,gnssState); | |
213 } | |
919 | 214 |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
215 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
216 |
936 | 217 |
919 | 218 void uartGnss_ProcessData(uint8_t data) |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
219 { |
932 | 220 static uint16_t rxLength = 0; |
221 static uint8_t ck_A = 0; | |
222 static uint8_t ck_B = 0; | |
223 static uint8_t ck_A_Ref = 0; | |
224 static uint8_t ck_B_Ref = 0; | |
936 | 225 uint8_t activeSensor = 0; |
226 | |
227 sUartComCtrl* pUartCtrl = UART_GetGnssCtrl(); | |
228 | |
229 if(pUartCtrl == &Uart1Ctrl) | |
230 { | |
231 activeSensor = externalInterface_GetActiveUartSensor(); | |
232 gnssState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); | |
233 } | |
932 | 234 |
919 | 235 GNSS_Handle.uartWorkingBuffer[writeIndex++] = data; |
932 | 236 if((rxState >= GNSSRX_DETECT_HEADER_2) && (rxState < GNSSRX_READ_CK_A)) |
237 { | |
238 ck_A += data; | |
239 ck_B += ck_A; | |
240 } | |
241 | |
919 | 242 switch(rxState) |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
243 { |
919 | 244 case GNSSRX_DETECT_ACK_0: |
245 case GNSSRX_DETECT_HEADER_0: if(data == 0xB5) | |
246 { | |
247 writeIndex = 0; | |
932 | 248 memset(GNSS_Handle.uartWorkingBuffer,0xff, sizeof(GNSS_Handle.uartWorkingBuffer)); |
919 | 249 GNSS_Handle.uartWorkingBuffer[writeIndex++] = data; |
250 rxState++; | |
932 | 251 ck_A = 0; |
252 ck_B = 0; | |
919 | 253 } |
254 break; | |
255 case GNSSRX_DETECT_ACK_1: | |
256 case GNSSRX_DETECT_HEADER_1: if(data == 0x62) | |
257 { | |
258 rxState++; | |
259 } | |
260 else | |
261 { | |
262 rxState = GNSSRX_DETECT_HEADER_0; | |
263 } | |
264 break; | |
265 case GNSSRX_DETECT_ACK_2: if(data == 0x05) | |
266 { | |
267 rxState++; | |
268 } | |
269 else | |
270 { | |
271 rxState = GNSSRX_DETECT_HEADER_0; | |
272 } | |
273 break; | |
932 | 274 case GNSSRX_DETECT_ACK_3: if((data == 0x01)) |
919 | 275 { |
936 | 276 rxState = GNSSRX_READY; |
939 | 277 switch(gnssState) |
936 | 278 { |
939 | 279 case UART_GNSS_PWRUP: gnssState = UART_GNSS_IDLE; |
280 break; | |
281 case UART_GNSS_PWRDOWN: rxState = GNSSRX_DETECT_ACK_0; | |
282 UART_Gnss_SendCmd(GNSSCMD_SET_CONFIG); | |
283 gnssState = UART_GNSS_SETCONF; | |
284 break; | |
285 case UART_GNSS_SETCONF: gnssState = UART_GNSS_INACTIVE; | |
286 break; | |
287 case UART_GNSS_LOADCONF_0: | |
288 case UART_GNSS_LOADCONF_1: gnssState++; | |
289 break; | |
290 case UART_GNSS_LOADCONF_2: gnssState = UART_GNSS_SETMODE_MOBILE; | |
291 break; | |
292 case UART_GNSS_SETMODE_MOBILE: gnssState = UART_GNSS_IDLE; | |
293 break; | |
294 default: | |
295 break; | |
932 | 296 } |
919 | 297 GnssConnected = 1; |
298 } | |
299 else | |
300 { | |
301 rxState = GNSSRX_DETECT_HEADER_0; | |
302 } | |
303 break; | |
932 | 304 case GNSSRX_DETECT_HEADER_2: if(data == activeRequest.class) |
919 | 305 { |
306 rxState++; | |
307 } | |
308 else | |
309 { | |
310 rxState = GNSSRX_DETECT_HEADER_0; | |
311 } | |
312 break; | |
932 | 313 case GNSSRX_DETECT_HEADER_3: if(data == activeRequest.id) |
314 { | |
315 rxState = GNSSRX_DETECT_LENGTH_0; | |
316 } | |
317 else | |
919 | 318 { |
932 | 319 rxState = GNSSRX_DETECT_HEADER_0; |
919 | 320 } |
932 | 321 break; |
322 case GNSSRX_DETECT_LENGTH_0: rxLength = GNSS_Handle.uartWorkingBuffer[4]; | |
323 rxState = GNSSRX_DETECT_LENGTH_1; | |
324 break; | |
325 case GNSSRX_DETECT_LENGTH_1: rxLength += (GNSS_Handle.uartWorkingBuffer[5] << 8); | |
326 rxState = GNSSRX_READ_DATA; | |
327 dataToRead = rxLength; | |
328 break; | |
329 case GNSSRX_READ_DATA: if(dataToRead > 0) | |
919 | 330 { |
331 dataToRead--; | |
332 } | |
932 | 333 if(dataToRead == 0) |
919 | 334 { |
932 | 335 rxState = GNSSRX_READ_CK_A; |
919 | 336 } |
337 break; | |
932 | 338 case GNSSRX_READ_CK_A: ck_A_Ref = data; |
339 rxState++; | |
340 break; | |
341 case GNSSRX_READ_CK_B: ck_B_Ref = data; | |
342 if((ck_A_Ref == ck_A) && (ck_B_Ref == ck_B)) | |
343 { | |
344 switch(gnssState) | |
345 { | |
346 case UART_GNSS_GET_PVT:GNSS_ParsePVTData(&GNSS_Handle); | |
347 break; | |
348 case UART_GNSS_GET_SAT: GNSS_ParseNavSatData(&GNSS_Handle); | |
349 break; | |
350 default: | |
351 break; | |
352 } | |
353 } | |
354 rxState = GNSSRX_DETECT_HEADER_0; | |
355 gnssState = UART_GNSS_IDLE; | |
356 break; | |
357 | |
919 | 358 default: rxState = GNSSRX_READY; |
359 break; | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
360 } |
936 | 361 if(pUartCtrl == &Uart1Ctrl) |
362 { | |
363 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,gnssState); | |
364 } | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
365 } |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
366 |
919 | 367 uint8_t uartGnss_isSensorConnected() |
368 { | |
369 return GnssConnected; | |
370 } | |
371 | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
372 #endif |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
diff
changeset
|
373 |