Rev 73 | Rev 75 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 73 | Rev 74 | ||
---|---|---|---|
Line 82... | Line 82... | ||
82 | .Min = 0xFFF, |
82 | .Min = 0xFFF, |
83 | .sum = 0, |
83 | .sum = 0, |
84 | .count = 0, |
84 | .count = 0, |
85 | .updated = 0, |
85 | .updated = 0, |
86 | .lastUpdated = 0, |
86 | .lastUpdated = 0, |
87 | .observation = PLX_MAX_OBS, |
87 | .observation.Obs = PLX_MAX_OBS, |
88 | .instance = PLX_MAX_INST}; |
88 | .observation.Instance = PLX_MAX_INST}; |
89 | 89 | ||
90 | /// \brief storage for incoming data |
90 | /// \brief storage for incoming data |
91 | data_t Data; |
91 | data_t Data; |
92 | 92 | ||
93 | uint32_t Latch_Timer = IGNITION_OFF_TIMEOUT; |
93 | uint32_t Latch_Timer = IGNITION_OFF_TIMEOUT; |
94 | 94 | ||
95 | // location for GPS data |
95 | // location for GPS data |
96 | Location loc; |
96 | Location loc; |
97 | 97 | ||
- | 98 | /// @brief Time when the logged data will be sent |
|
- | 99 | uint32_t nextTickReload = 0; |
|
- | 100 | ||
98 | /* USER CODE END PV */ |
101 | /* USER CODE END PV */ |
99 | 102 | ||
100 | /* Private function prototypes -----------------------------------------------*/ |
103 | /* Private function prototypes -----------------------------------------------*/ |
101 | void SystemClock_Config(void); |
104 | void SystemClock_Config(void); |
102 | static void MX_GPIO_Init(void); |
105 | static void MX_GPIO_Init(void); |
Line 143... | Line 146... | ||
143 | setBaud(ctl, baudRate); |
146 | setBaud(ctl, baudRate); |
144 | HAL_Delay(100); |
147 | HAL_Delay(100); |
145 | } |
148 | } |
146 | 149 | ||
147 | // workspace for RMC data read from GPS module. |
150 | // workspace for RMC data read from GPS module. |
148 | uint8_t rmc_buff[80]; |
- | |
149 | volatile uint16_t rmc_length; |
151 | volatile uint16_t rmc_length; |
150 | 152 | ||
151 | uint8_t rmc_callback(uint8_t *data, uint16_t length) |
153 | uint8_t rmc_callback(uint8_t *data, uint16_t length) |
152 | { |
154 | { |
- | 155 | // send it back out |
|
153 | rmc_length = length < sizeof(rmc_buff) ? length : sizeof(rmc_buff); |
156 | rmc_length = length; |
- | 157 | ||
154 | memcpy(rmc_buff, data, length); |
158 | sendString(&uc3, (const char *)data, length); |
- | 159 | ||
- | 160 | nextTickReload = HAL_GetTick() + LOGGER_INTERVAL; |
|
- | 161 | ||
155 | return 0; |
162 | return 0; |
156 | } |
163 | } |
157 | 164 | ||
158 | // check if bluetooth connected |
165 | // check if bluetooth connected |
159 | uint8_t btConnected() |
166 | uint8_t btConnected() |
Line 166... | Line 173... | ||
166 | uint8_t isUnused(int index) |
173 | uint8_t isUnused(int index) |
167 | { |
174 | { |
168 | if (index < 0 || index > MAXRDG) |
175 | if (index < 0 || index > MAXRDG) |
169 | return false; |
176 | return false; |
170 | 177 | ||
171 | return Info[index].instance == PLX_MAX_INST && Info[index].observation == PLX_MAX_OBS; |
178 | return Info[index].observation.Instance == PLX_MAX_INST && Info[index].observation.Obs == PLX_MAX_OBS; |
172 | } |
179 | } |
173 | 180 | ||
174 | /// @brief Determine if an entry is currently valid |
181 | /// @brief Determine if an entry is currently valid |
175 | /// @param index the number of the array entry to display |
182 | /// @param index the number of the array entry to display |
176 | /// @return true if the entry contains data which is fresh |
183 | /// @return true if the entry contains data which is fresh |
Line 303... | Line 310... | ||
303 | uint32_t timeout = 0; // |
310 | uint32_t timeout = 0; // |
304 | 311 | ||
305 | // used in NMEA style logging |
312 | // used in NMEA style logging |
306 | uint32_t nextTick = 0; ///< time to send next |
313 | uint32_t nextTick = 0; ///< time to send next |
307 | uint32_t offsetTicks = 0; ///< time to print as offset in mS for each loop |
314 | uint32_t offsetTicks = 0; ///< time to print as offset in mS for each loop |
308 | // |
315 | |
309 | uint8_t log = 0; |
- | |
310 | // PLX decoder protocols |
316 | // PLX decoder protocols |
311 | char PLXPacket = 0; |
317 | char PLXPacket = 0; |
312 | 318 | ||
313 | for (i = 0; i < MAXRDG; i++) |
319 | for (i = 0; i < MAXRDG; i++) |
314 | { |
320 | { |
Line 377... | Line 383... | ||
377 | 383 | ||
378 | // if permitted, log data from RMC packet |
384 | // if permitted, log data from RMC packet |
379 | if (btConnected()) |
385 | if (btConnected()) |
380 | { |
386 | { |
381 | // Any RMC data, send it, reset the logger timeout |
387 | // Any RMC data, send it, reset the logger timeout |
382 | if (rmc_length) |
- | |
383 | { |
- | |
384 | sendString(&uc3, (const char *)rmc_buff, rmc_length); |
- | |
385 | rmc_length = 0; |
- | |
386 | offsetTicks = 0; |
- | |
387 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
- | |
388 | log = 1; |
- | |
389 | } |
- | |
390 | 388 | ||
391 | // Timeout for data logging regularly |
389 | // Timeout for data logging regularly |
392 | if (HAL_GetTick() > nextTick) |
390 | if (HAL_GetTick() > nextTick) |
393 | { |
391 | { |
394 | offsetTicks += LOGGER_INTERVAL; |
392 | nextTick = nextTickReload; |
395 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
393 | nextTickReload += LOGGER_INTERVAL; |
396 | if (offsetTicks < (1000)) |
- | |
397 | log = 1; |
- | |
398 | } |
- | |
399 | - | ||
400 | if (log) |
- | |
401 | { |
394 | |
402 | log = 0; |
- | |
403 | // Send items to BT if it is in connected state |
395 | // Send items to BT if it is in connected state |
404 | - | ||
- | 396 | // print timestamp as a $PLTIM record. |
|
405 | char linebuff[20]; |
397 | char linebuff[20]; |
406 | strftime(linebuff, sizeof(linebuff), "%H%M%S", &loc.tv); |
398 | strftime(linebuff, sizeof(linebuff), "%H%M%S", &loc.tv); |
- | 399 | ||
- | 400 | char outbuff[100]; |
|
- | 401 | int cnt = small_sprintf(outbuff, "$PLTIM,%s.%03lu\n", linebuff, offsetTicks); |
|
- | 402 | sendString(&uc3, outbuff, cnt); |
|
- | 403 | offsetTicks += LOGGER_INTERVAL; |
|
- | 404 | ||
- | 405 | if (offsetTicks >= (1000)) |
|
- | 406 | { |
|
- | 407 | offsetTicks = 0; |
|
- | 408 | loc.tv.tm_sec++; |
|
- | 409 | if (loc.tv.tm_sec >= 60) |
|
- | 410 | { |
|
- | 411 | loc.tv.tm_sec = 0; |
|
- | 412 | loc.tv.tm_min++; |
|
- | 413 | if (loc.tv.tm_min >= 60) |
|
- | 414 | { |
|
- | 415 | loc.tv.tm_hour++; |
|
- | 416 | if (loc.tv.tm_hour >= 24) |
|
- | 417 | loc.tv.tm_hour = 0; |
|
- | 418 | } |
|
- | 419 | } |
|
- | 420 | } |
|
- | 421 | ||
- | 422 | ||
- | 423 | ||
- | 424 | ||
- | 425 | ||
- | 426 | ||
407 | for (int i = 0; i < MAXRDG; ++i) |
427 | for (int i = 0; i < MAXRDG; ++i) |
408 | { |
428 | { |
409 | if (!isValid(i)) |
429 | if (!isValid(i)) |
410 | continue; |
430 | continue; |
411 | char outbuff[100]; |
431 | // print logger items as $PLLOG record |
412 | - | ||
413 | int cnt = small_sprintf(outbuff, |
432 | int cnt = small_sprintf(outbuff, |
414 | "$PLLOG,%s.%03lu,%d,%d,%ld", |
433 | "$PLLOG,%d,%d,%ld", |
415 | linebuff, |
- | |
416 | offsetTicks, |
- | |
417 | Info[i].observation, |
434 | Info[i].observation.Obs, |
418 | Info[i].instance, |
435 | Info[i].observation.Instance, |
419 | Info[i].count == 0 ? 0 : Info[i].sum / Info[i].count); |
436 | Info[i].count == 0 ? 0 : Info[i].sum / Info[i].count); |
- | 437 | Info[i].count = 0; |
|
- | 438 | Info[i].sum = 0; |
|
420 | 439 | ||
421 | // NMEA style checksum |
440 | // NMEA style checksum |
422 | int ck; |
441 | int ck; |
423 | int sum = 0; |
442 | int sum = 0; |
424 | for (ck = 1; ck < cnt; ck++) |
443 | for (ck = 1; ck < cnt; ck++) |
Line 446... | Line 465... | ||
446 | { |
465 | { |
447 | 466 | ||
448 | // do turn off screen |
467 | // do turn off screen |
449 | } |
468 | } |
450 | // wait for a bit if nothing came in. |
469 | // wait for a bit if nothing came in. |
451 | HAL_Delay(10); |
470 | HAL_Delay(1); |
452 | } |
471 | } |
453 | 472 | ||
454 | /// process the observation list |
473 | /// process the observation list |
455 | for (chr = 0; chr < cc; chr++) |
474 | for (chr = 0; chr < cc; chr++) |
456 | { |
475 | { |
Line 487... | Line 506... | ||
487 | 506 | ||
488 | // search for the item in the list |
507 | // search for the item in the list |
489 | int j; |
508 | int j; |
490 | for (j = 0; j < MAXRDG; ++j) |
509 | for (j = 0; j < MAXRDG; ++j) |
491 | { |
510 | { |
492 | if ((Info[j].observation == observation) && (Info[j].instance == instance)) |
511 | if ((Info[j].observation.Obs == observation) && (Info[j].observation.Instance == instance)) |
493 | break; |
512 | break; |
494 | } |
513 | } |
495 | // fallen off the end of the list of existing items without a match, so j points at next new item |
514 | // fallen off the end of the list of existing items without a match, so j points at next new item |
496 | // |
515 | // |
497 | // Find an unused slot |
516 | // Find an unused slot |
Line 513... | Line 532... | ||
513 | 532 | ||
514 | // give up if we are going to fall off the end of the array |
533 | // give up if we are going to fall off the end of the array |
515 | if (j > MAXRDG) |
534 | if (j > MAXRDG) |
516 | break; |
535 | break; |
517 | 536 | ||
518 | Info[j].observation = observation; |
537 | Info[j].observation.Obs = observation; |
519 | 538 | ||
520 | Info[j].instance = instance; |
539 | Info[j].observation.Instance = instance; |
521 | Info[j].data = ConvPLX(Data.Sensor[j].ReadingH, |
540 | Info[j].data = ConvPLX(Data.Sensor[j].ReadingH, |
522 | Data.Sensor[j].ReadingL); |
541 | Data.Sensor[j].ReadingL); |
523 | if (Info[j].data > Info[j].Max) |
542 | if (Info[j].data > Info[j].Max) |
524 | { |
543 | { |
525 | Info[j].Max = Info[j].data; |
544 | Info[j].Max = Info[j].data; |