Rev 65 | Rev 67 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 65 | Rev 66 | ||
---|---|---|---|
Line 258... | Line 258... | ||
258 | Latch_Timer = IGNITION_OFF_TIMEOUT; |
258 | Latch_Timer = IGNITION_OFF_TIMEOUT; |
259 | HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, GPIO_PIN_RESET); |
259 | HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, GPIO_PIN_RESET); |
260 | 260 | ||
261 | setRmcCallback(&rmc_callback); |
261 | setRmcCallback(&rmc_callback); |
262 | 262 | ||
- | 263 | // data timeout |
|
- | 264 | uint32_t timeout = 0; // |
|
- | 265 | ||
- | 266 | uint32_t nextTick = 0; |
|
- | 267 | uint8_t log = 0; |
|
- | 268 | // PLX decoder protocols |
|
- | 269 | char PLXPacket = 0; |
|
- | 270 | for (i = 0; i < MAXRDG; i++) |
|
- | 271 | { |
|
- | 272 | Info[i].Max = 0; |
|
- | 273 | Info[i].Min = 0xFFF; |
|
- | 274 | Info[i].sum = 0; |
|
- | 275 | Info[i].count = 0; |
|
- | 276 | Info[i].updated = 0; |
|
- | 277 | Info[i].lastUpdated = 0; |
|
- | 278 | } |
|
- | 279 | ||
- | 280 | int PLXPtr = 0; |
|
- | 281 | int logCount = 0; |
|
- | 282 | ||
263 | /* USER CODE END 2 */ |
283 | /* USER CODE END 2 */ |
264 | 284 | ||
265 | /* Infinite loop */ |
285 | /* Infinite loop */ |
266 | /* USER CODE BEGIN WHILE */ |
286 | /* USER CODE BEGIN WHILE */ |
267 | while (1) |
287 | while (1) |
Line 280... | Line 300... | ||
280 | HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, |
300 | HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, |
281 | GPIO_PIN_RESET); |
301 | GPIO_PIN_RESET); |
282 | } |
302 | } |
283 | } |
303 | } |
284 | 304 | ||
285 | uint32_t timeout = 0; // |
- | |
286 | - | ||
287 | uint32_t nextTick = 0; |
- | |
288 | uint8_t log = 0; |
- | |
289 | uint8_t logCount = 1000 / LOGGER_INTERVAL; |
305 | // Handle the bluetooth pairing / reset function by pressing both buttons. |
290 | // PLX decoder protocols |
- | |
291 | char PLXPacket = 0; |
- | |
292 | for (i = 0; i < MAXRDG; i++) |
306 | if ((push_pos[0] == 1) && (push_pos[1] == 1)) |
293 | { |
307 | { |
294 | Info[i].Max = 0; |
- | |
295 | Info[i].Min = 0xFFF; // 12 bit max value |
308 | HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, |
296 | Info[i].sum = 0; // |
309 | GPIO_PIN_RESET); |
297 | Info[i].count = 0; |
- | |
298 | } |
310 | } |
299 | - | ||
300 | int PLXPtr = 0; |
- | |
301 | - | ||
302 | while (1) |
311 | else |
303 | { |
312 | { |
- | 313 | HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, |
|
- | 314 | GPIO_PIN_SET); |
|
- | 315 | } |
|
304 | 316 | ||
305 | // poll GPS Position/time on UART4 |
317 | // poll GPS Position/time on UART4 |
306 | (void)updateLocation(&loc, &uc4); |
318 | (void)updateLocation(&loc, &uc4); |
307 | if (loc.valid == 'V') |
319 | if (loc.valid == 'V') |
308 | memset(loc.time, '-', 6); |
320 | memset(loc.time, '-', 6); |
309 | 321 | ||
310 | // if permitted, log data from RMC packet |
322 | // if permitted, log data from RMC packet |
311 | if (rmc_length && btConnected()) |
323 | if (btConnected()) |
- | 324 | { |
|
- | 325 | // Any RMC data, send it, reset the logger timeout |
|
- | 326 | if (rmc_length) |
|
312 | { |
327 | { |
313 | sendString(&uc3, rmc_buff, rmc_length); |
328 | sendString(&uc3, (const char *)rmc_buff, rmc_length); |
314 | rmc_length = 0; |
329 | rmc_length = 0; |
315 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
330 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
316 | logCount = 0; |
331 | log = 1; // send out associated data over Bluetooth because triggered by recieving RMC |
317 | log = 1; |
332 | logCount = 0; // first sample set this second numbered 0 |
318 | } |
333 | } |
319 | 334 | ||
320 | // time several counted logger intervals after RMC recieved, enable logger each timeout. |
335 | // Timeout for data logging regularly |
321 | if (logCount < ((1000 / LOGGER_INTERVAL) - 1) && HAL_GetTick() > nextTick) |
336 | if (HAL_GetTick() > nextTick) |
322 | { |
337 | { |
323 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
338 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
324 | ++logCount; |
339 | logCount++; |
- | 340 | if (logCount > (1000 / LOGGER_INTERVAL)) |
|
- | 341 | logCount = 0; |
|
325 | log = 1; |
342 | log = 1; |
326 | } |
343 | } |
327 | 344 | ||
328 | // Handle the bluetooth pairing / reset function by pressing both buttons. |
- | |
329 | if ((push_pos[0] == 1) && (push_pos[1] == 1)) |
345 | if (log) |
330 | { |
346 | { |
- | 347 | log = 0; |
|
331 | HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, |
348 | // Send items to BT if it is in connected state |
- | 349 | for (int i = 0; i < PLXItems; ++i) |
|
- | 350 | { |
|
- | 351 | char outbuff[100]; |
|
- | 352 | ||
- | 353 | int cnt = small_sprintf(outbuff, |
|
- | 354 | "$PLLOG,%d,%d,%d,%ld", |
|
- | 355 | logCount, |
|
- | 356 | Info[i].observation, |
|
- | 357 | Info[i].instance, |
|
- | 358 | Info[i].count == 0 ? 0 : Info[i].sum / Info[i].count); |
|
- | 359 | ||
- | 360 | // NMEA style checksum |
|
- | 361 | int ck; |
|
- | 362 | int sum = 0; |
|
- | 363 | for (ck = 1; ck < cnt; ck++) |
|
- | 364 | sum += outbuff[ck]; |
|
- | 365 | cnt += small_sprintf(outbuff + cnt, "*%02X\n", |
|
332 | GPIO_PIN_RESET); |
366 | sum & 0xFF); |
- | 367 | sendString(&uc3, outbuff, cnt); |
|
- | 368 | } |
|
333 | } |
369 | } |
- | 370 | } |
|
- | 371 | ||
- | 372 | // determine if we are getting any data from the interface |
|
- | 373 | uint16_t cc = SerialCharsReceived(&uc1); |
|
334 | else |
374 | int chr; |
- | 375 | if (cc == 0) |
|
- | 376 | { |
|
- | 377 | timeout++; |
|
- | 378 | if (btConnected() && (timeout % 1000 == 0)) |
|
335 | { |
379 | { |
336 | HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, |
380 | const char msg[] = "Timeout\r\n"; |
337 | GPIO_PIN_SET); |
381 | sendString(&uc3, msg, sizeof(msg)); |
338 | } |
382 | } |
339 | 383 | ||
340 | uint16_t cc = SerialCharsReceived(&uc1); |
- | |
341 | int chr; |
- | |
342 | if (cc == 0) |
384 | if (timeout > 60000) |
343 | { |
385 | { |
344 | timeout++; |
- | |
345 | if (timeout % 1000 == 0) |
- | |
346 | { |
- | |
347 | const char msg[] = "Timeout\r\n"; |
- | |
348 | sendString(&uc3, msg, sizeof(msg)); |
- | |
349 | } |
- | |
350 | - | ||
351 | if (timeout > 60000) |
- | |
352 | { |
- | |
353 | 386 | ||
354 | // do turn off screen |
387 | // do turn off screen |
355 | } |
- | |
356 | } |
388 | } |
- | 389 | // wait for a bit if nothing came in. |
|
- | 390 | HAL_Delay(10); |
|
- | 391 | } |
|
357 | 392 | ||
- | 393 | /// process the observation list |
|
358 | for (chr = 0; chr < cc; chr++) |
394 | for (chr = 0; chr < cc; chr++) |
359 | { |
395 | { |
360 | char c = GetCharSerial(&uc1); |
396 | char c = GetCharSerial(&uc1); |
361 | 397 | ||
362 | if (c == PLX_Start) // at any time if the start byte appears, reset the pointers |
398 | if (c == PLX_Start) // at any time if the start byte appears, reset the pointers |
363 | { |
399 | { |
364 | PLXPtr = 0; // reset the pointer |
400 | PLXPtr = 0; // reset the pointer |
365 | PLXPacket = 1; |
401 | PLXPacket = 1; |
366 | timeout = 0; // Reset the timer |
402 | timeout = 0; // Reset the timer |
367 | } |
403 | } |
368 | else if (c == PLX_Stop) |
404 | else if (c == PLX_Stop) |
- | 405 | { |
|
- | 406 | if (PLXPacket) |
|
369 | { |
407 | { |
- | 408 | // we can now decode the selected parameter |
|
- | 409 | PLXItems = PLXPtr / sizeof(PLX_SensorInfo); // total |
|
- | 410 | // saturate the rotary switch position |
|
- | 411 | ||
370 | if (PLXPacket) |
412 | // process min/max |
- | 413 | for (i = 0; i < PLXItems; i++) |
|
371 | { |
414 | { |
372 | // we can now decode the selected parameter |
- | |
373 | PLXItems = PLXPtr / sizeof(PLX_SensorInfo); // total |
415 | Info[i].observation = ConvPLX(Data.Sensor[i].AddrH, |
374 | // saturate the rotary switch position |
416 | Data.Sensor[i].AddrL); |
375 | 417 | ||
- | 418 | Info[i].instance = Data.Sensor[i].Instance; |
|
- | 419 | Info[i].data = ConvPLX(Data.Sensor[i].ReadingH, |
|
- | 420 | Data.Sensor[i].ReadingL); |
|
376 | // process min/max |
421 | if (Info[i].data > Info[i].Max) |
- | 422 | { |
|
- | 423 | Info[i].Max = Info[i].data; |
|
- | 424 | } |
|
377 | for (i = 0; i < PLXItems; i++) |
425 | if (Info[i].data < Info[i].Min) |
378 | { |
426 | { |
379 | Info[i].observation = ConvPLX(Data.Sensor[i].AddrH, |
- | |
380 | Data.Sensor[i].AddrL); |
- | |
381 | Info[i].instance = Data.Sensor[i].Instance; |
- | |
382 | Info[i].data = ConvPLX(Data.Sensor[i].ReadingH, |
- | |
383 | Data.Sensor[i].ReadingL); |
- | |
384 | if (Info[i].data > Info[i].Max) |
- | |
385 | { |
- | |
386 | Info[i].Max = Info[i].data; |
- | |
387 | } |
- | |
388 | if (Info[i].data < Info[i].Min) |
- | |
389 | { |
- | |
390 | Info[i].Min = Info[i].data; |
427 | Info[i].Min = Info[i].data; |
391 | } |
- | |
392 | // take an avarage |
- | |
393 | Info[i].sum += Info[i].data; |
- | |
394 | Info[i].count++; |
- | |
395 | - | ||
396 | // Send items to BT if it is in connected state |
- | |
397 | if (log && btConnected()) |
- | |
398 | { |
- | |
399 | - | ||
400 | char outbuff[100]; |
- | |
401 | - | ||
402 | int cnt = small_sprintf(outbuff, |
- | |
403 | "$PLLOG,%d,%d,%d,%ld", |
- | |
404 | logCount, |
- | |
405 | Info[i].observation, |
- | |
406 | Info[i].instance, |
- | |
407 | Info[i].count == 0 ? 0 : Info[i].sum / Info[i].count); |
- | |
408 | - | ||
409 | // NMEA style checksum |
- | |
410 | int ck; |
- | |
411 | int sum = 0; |
- | |
412 | for (ck = 1; ck < cnt; ck++) |
- | |
413 | sum += outbuff[ck]; |
- | |
414 | cnt += small_sprintf(outbuff + cnt, "*%02X\n", |
- | |
415 | sum & 0xFF); |
- | |
416 | sendString(&uc3, outbuff, cnt); |
- | |
417 | } |
- | |
418 | } |
428 | } |
- | 429 | // take an average |
|
- | 430 | Info[i].sum += Info[i].data; |
|
419 | log = 0; |
431 | Info[i].count++; |
420 | // now to display the information |
432 | // note the last update time |
421 | int suppress = DisplayCurrent(0, -1); |
433 | Info[i].lastUpdated = HAL_GetTick(); |
422 | DisplayCurrent(1, suppress); |
434 | Info[i].updated = 1; // it has been updated |
423 | } |
435 | } |
424 | PLXPtr = 0; |
436 | PLXPtr = 0; |
425 | PLXPacket = 0; |
437 | PLXPacket = 0; |
426 | } |
438 | } |
427 | else if (c > PLX_Stop) // illegal char, restart reading |
439 | else if (c > PLX_Stop) // illegal char, restart reading |
Line 433... | Line 445... | ||
433 | { |
445 | { |
434 | Data.Bytes[PLXPtr++] = c; |
446 | Data.Bytes[PLXPtr++] = c; |
435 | } |
447 | } |
436 | } |
448 | } |
437 | 449 | ||
438 | HAL_Delay(1); |
450 | int suppress = -1; |
439 | - | ||
440 | for (i = 0; i < MAX_DISPLAYS; i++) |
451 | for (i = 0; i < MAX_DISPLAYS; i++) |
- | 452 | { // now to display the information |
|
- | 453 | DisplayCurrent(i, suppress); |
|
441 | { |
454 | |
442 | if (dial_pos[i] < 0) |
455 | if (dial_pos[i] < 0) |
443 | dial_pos[i] = PLXItems - 1; |
456 | dial_pos[i] = PLXItems - 1; |
444 | if (dial_pos[i] >= PLXItems) |
457 | if (dial_pos[i] >= PLXItems) |
445 | dial_pos[i] = 0; |
458 | dial_pos[i] = 0; |
446 | 459 | ||
Line 454... | Line 467... | ||
454 | cc_check_nvram(i); |
467 | cc_check_nvram(i); |
455 | if (contexts[i].knobPos >= 0) |
468 | if (contexts[i].knobPos >= 0) |
456 | dial_pos[i] = contexts[i].knobPos; |
469 | dial_pos[i] = contexts[i].knobPos; |
457 | } |
470 | } |
458 | } |
471 | } |
459 | /* USER CODE END WHILE */ |
- | |
460 | - | ||
461 | /* USER CODE BEGIN 3 */ |
- | |
462 | } |
472 | } |
- | 473 | /* USER CODE END WHILE */ |
|
- | 474 | ||
- | 475 | /* USER CODE BEGIN 3 */ |
|
- | 476 | ||
463 | /* USER CODE END 3 */ |
477 | /* USER CODE END 3 */ |
464 | } |
478 | } |
465 | - | ||
466 | /** |
479 | /** |
467 | * @brief System Clock Configuration |
480 | * @brief System Clock Configuration |
468 | * @retval None |
481 | * @retval None |
469 | */ |
482 | */ |
470 | void SystemClock_Config(void) |
483 | void SystemClock_Config(void) |