Rev 72 | Rev 74 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 72 | Rev 73 | ||
---|---|---|---|
Line 67... | Line 67... | ||
67 | 67 | ||
68 | ///@brief timeout when the ignition is switched off |
68 | ///@brief timeout when the ignition is switched off |
69 | #define IGNITION_OFF_TIMEOUT 30000UL |
69 | #define IGNITION_OFF_TIMEOUT 30000UL |
70 | 70 | ||
71 | /// @brief 1000mS per logger period, print average per period |
71 | /// @brief 1000mS per logger period, print average per period |
72 | #define LOGGER_INTERVAL 1000UL |
72 | #define LOGGER_INTERVAL 500UL |
73 | 73 | ||
74 | /// @brief about 10 seconds after twiddle, save the dial position. |
74 | /// @brief about 10 seconds after twiddle, save the dial position. |
75 | const int DialTimeout = 100; |
75 | const int DialTimeout = 100; |
76 | 76 | ||
77 | /// @brief Data storage for readings |
77 | /// @brief Data storage for readings |
Line 120... | Line 120... | ||
120 | 120 | ||
121 | /// \note HC-05 only accepts : 9600,19200,38400,57600,115200,230400,460800 baud |
121 | /// \note HC-05 only accepts : 9600,19200,38400,57600,115200,230400,460800 baud |
122 | /// \brief Setup Bluetooth module |
122 | /// \brief Setup Bluetooth module |
123 | void initModule(usart_ctl *ctl, uint32_t baudRate) |
123 | void initModule(usart_ctl *ctl, uint32_t baudRate) |
124 | { |
124 | { |
125 | char initBuf[30]; |
125 | char initBuf[60]; |
126 | // switch to command mode |
126 | // switch to command mode |
- | 127 | HAL_GPIO_WritePin(BT_RESET_GPIO_Port, BT_RESET_Pin, GPIO_PIN_SET); |
|
- | 128 | HAL_Delay(500); |
|
- | 129 | // clear the button press |
|
127 | HAL_GPIO_WritePin(BT_RESET_GPIO_Port, BT_RESET_Pin, GPIO_PIN_RESET); |
130 | HAL_GPIO_WritePin(BT_RESET_GPIO_Port, BT_RESET_Pin, GPIO_PIN_RESET); |
128 | HAL_Delay(500); |
131 | HAL_Delay(500); |
129 | setBaud(ctl, 38400); |
132 | setBaud(ctl, 38400); |
130 | int initLen = small_sprintf(initBuf, "AT+UART=%lu,0,0\n", baudRate); |
133 | int initLen = small_sprintf(initBuf, "AT\nAT+UART?\nAT+UART=%ld,0,0\n", baudRate); |
131 | const char buf[] = "AT+RESET\n"; |
134 | const char buf[] = "AT+RESET\n"; |
132 | sendString(ctl, initBuf, initLen); |
135 | sendString(ctl, initBuf, initLen); |
133 | HAL_Delay(500); |
136 | HAL_Delay(500); |
134 | initLen = small_sprintf(initBuf, buf); |
137 | initLen = small_sprintf(initBuf, buf); |
135 | sendString(ctl, initBuf, initLen); |
138 | sendString(ctl, initBuf, initLen); |
136 | 139 | ||
137 | TxWaitEmpty(ctl); |
140 | TxWaitEmpty(ctl); |
138 | 141 | ||
139 | // clear the button press |
- | |
140 | HAL_GPIO_WritePin(BT_RESET_GPIO_Port, BT_RESET_Pin, GPIO_PIN_SET); |
- | |
141 | - | ||
142 | // switch back to normal comms at new baud rate |
142 | // switch back to normal comms at new baud rate |
143 | setBaud(ctl, baudRate); |
143 | setBaud(ctl, baudRate); |
144 | HAL_Delay(100); |
144 | HAL_Delay(100); |
145 | } |
145 | } |
146 | 146 | ||
Line 288... | Line 288... | ||
288 | cc_init(); |
288 | cc_init(); |
289 | 289 | ||
290 | int i; |
290 | int i; |
291 | for (i = 0; i < 2; i++) |
291 | for (i = 0; i < 2; i++) |
292 | { |
292 | { |
293 | contexts[i].knobPos = -1; // set the knob position |
293 | contexts[i].knobPos = -1; // set the knob position |
294 | } |
294 | } |
295 | 295 | ||
296 | /* reset the display timeout, latch on power from accessories */ |
296 | /* reset the display timeout, latch on power from accessories */ |
297 | Latch_Timer = IGNITION_OFF_TIMEOUT; |
297 | Latch_Timer = IGNITION_OFF_TIMEOUT; |
298 | HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, GPIO_PIN_RESET); |
298 | HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, GPIO_PIN_RESET); |
Line 300... | Line 300... | ||
300 | setRmcCallback(&rmc_callback); |
300 | setRmcCallback(&rmc_callback); |
301 | 301 | ||
302 | // data timeout |
302 | // data timeout |
303 | uint32_t timeout = 0; // |
303 | uint32_t timeout = 0; // |
304 | 304 | ||
- | 305 | // used in NMEA style logging |
|
305 | uint32_t nextTick = 0; |
306 | uint32_t nextTick = 0; ///< time to send next |
- | 307 | uint32_t offsetTicks = 0; ///< time to print as offset in mS for each loop |
|
- | 308 | // |
|
306 | uint8_t log = 0; |
309 | uint8_t log = 0; |
307 | // PLX decoder protocols |
310 | // PLX decoder protocols |
308 | char PLXPacket = 0; |
311 | char PLXPacket = 0; |
309 | 312 | ||
310 | for (i = 0; i < MAXRDG; i++) |
313 | for (i = 0; i < MAXRDG; i++) |
311 | { |
314 | { |
312 | Info[i] = nullInfo; |
315 | Info[i] = nullInfo; |
313 | } |
316 | } |
314 | 317 | ||
315 | int PLXPtr = 0; |
318 | int PLXPtr = 0; |
316 | int logCount = 0; |
- | |
317 | 319 | ||
318 | uint32_t resetCounter = 0 ; // record time at which both reset buttons were first pressed. |
320 | uint32_t resetCounter = 0; // record time at which both reset buttons were first pressed. |
319 | 321 | ||
320 | /* USER CODE END 2 */ |
322 | /* USER CODE END 2 */ |
321 | 323 | ||
322 | /* Infinite loop */ |
324 | /* Infinite loop */ |
323 | /* USER CODE BEGIN WHILE */ |
325 | /* USER CODE BEGIN WHILE */ |
Line 379... | Line 381... | ||
379 | // Any RMC data, send it, reset the logger timeout |
381 | // Any RMC data, send it, reset the logger timeout |
380 | if (rmc_length) |
382 | if (rmc_length) |
381 | { |
383 | { |
382 | sendString(&uc3, (const char *)rmc_buff, rmc_length); |
384 | sendString(&uc3, (const char *)rmc_buff, rmc_length); |
383 | rmc_length = 0; |
385 | rmc_length = 0; |
- | 386 | offsetTicks = 0; |
|
384 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
387 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
385 | log = 1; // send out associated data over Bluetooth because triggered by recieving RMC |
- | |
386 | logCount = 0; // first sample set this second numbered 0 |
388 | log = 1; |
387 | } |
389 | } |
388 | 390 | ||
389 | // Timeout for data logging regularly |
391 | // Timeout for data logging regularly |
390 | if (HAL_GetTick() > nextTick) |
392 | if (HAL_GetTick() > nextTick) |
391 | { |
393 | { |
- | 394 | offsetTicks += LOGGER_INTERVAL; |
|
392 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
395 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
393 | logCount++; |
- | |
394 | if (logCount > (1000 / LOGGER_INTERVAL)) |
- | |
395 | logCount = 0; |
396 | if (offsetTicks < (1000)) |
396 | log = 1; |
397 | log = 1; |
397 | } |
398 | } |
398 | 399 | ||
399 | if (log) |
400 | if (log) |
400 | { |
401 | { |
401 | log = 0; |
402 | log = 0; |
402 | // Send items to BT if it is in connected state |
403 | // Send items to BT if it is in connected state |
- | 404 | ||
- | 405 | char linebuff[20]; |
|
- | 406 | strftime(linebuff, sizeof(linebuff), "%H%M%S", &loc.tv); |
|
403 | for (int i = 0; i < MAXRDG; ++i) |
407 | for (int i = 0; i < MAXRDG; ++i) |
404 | { |
408 | { |
405 | if (!isValid(i)) |
409 | if (!isValid(i)) |
406 | continue; |
410 | continue; |
407 | char outbuff[100]; |
411 | char outbuff[100]; |
408 | 412 | ||
409 | int cnt = small_sprintf(outbuff, |
413 | int cnt = small_sprintf(outbuff, |
410 | "$PLLOG,%d,%d,%d,%ld", |
414 | "$PLLOG,%s.%03lu,%d,%d,%ld", |
411 | logCount, |
415 | linebuff, |
- | 416 | offsetTicks, |
|
412 | Info[i].observation, |
417 | Info[i].observation, |
413 | Info[i].instance, |
418 | Info[i].instance, |
414 | Info[i].count == 0 ? 0 : Info[i].sum / Info[i].count); |
419 | Info[i].count == 0 ? 0 : Info[i].sum / Info[i].count); |
415 | 420 | ||
416 | // NMEA style checksum |
421 | // NMEA style checksum |
Line 558... | Line 563... | ||
558 | // handle switch rotation |
563 | // handle switch rotation |
559 | for (i = 0; i < MAX_DIALS; ++i) |
564 | for (i = 0; i < MAX_DIALS; ++i) |
560 | { |
565 | { |
561 | int delta = get_dial_diff(i); |
566 | int delta = get_dial_diff(i); |
562 | int pos = contexts[i].knobPos; |
567 | int pos = contexts[i].knobPos; |
563 | if(pos < 0) |
568 | if (pos < 0) |
564 | break; // dont process until we have read NVRAM for the first time . |
569 | break; // dont process until we have read NVRAM for the first time . |
565 | int start = pos; |
570 | int start = pos; |
566 | // move in positive direction |
571 | // move in positive direction |
567 | while (delta > 0) |
572 | while (delta > 0) |
568 | { |
573 | { |
569 | // skip invalid items, dont count |
574 | // skip invalid items, dont count |
570 | if(pos<MAXRDG-1) |
575 | if (pos < MAXRDG - 1) |
571 | pos++; |
576 | pos++; |
572 | else |
577 | else |
573 | pos=0; |
578 | pos = 0; |
574 | 579 | ||
575 | if (isValid(pos)) |
580 | if (isValid(pos)) |
576 | delta--; // count a valid item |
581 | delta--; // count a valid item |
577 | 582 | ||
578 | // wrap |
583 | // wrap |
579 | if (pos == start) |
584 | if (pos == start) |
580 | break; |
585 | break; |
581 | } |
586 | } |
582 | 587 | ||
583 | // move in negative direction |
588 | // move in negative direction |
584 | while (delta < 0) |
589 | while (delta < 0) |
585 | 590 | ||
586 | { |
591 | { |
587 | // skip invalid items, dont count |
592 | // skip invalid items, dont count |
588 | if(pos>0) |
593 | if (pos > 0) |
589 | pos--; |
594 | pos--; |
590 | else |
595 | else |
591 | pos=MAXRDG-1; |
596 | pos = MAXRDG - 1; |
592 | 597 | ||
593 | if (isValid(pos)) |
598 | if (isValid(pos)) |
594 | delta++; // count a valid item |
599 | delta++; // count a valid item |
595 | 600 | ||
596 | // wrap |
601 | // wrap |
597 | if (pos == start) |
602 | if (pos == start) |
598 | break; |
603 | break; |
599 | } |
604 | } |
600 | 605 | ||
601 | contexts[i].knobPos = pos; |
606 | contexts[i].knobPos = pos; |
602 | if (pos != start) |
607 | if (pos != start) |
603 | contexts[i].dial_timer = DialTimeout; |
608 | contexts[i].dial_timer = DialTimeout; |
604 | } |
609 | } |
605 | 610 | ||
Line 608... | Line 613... | ||
608 | { // now to display the information |
613 | { // now to display the information |
609 | suppress = DisplayCurrent(i, suppress); |
614 | suppress = DisplayCurrent(i, suppress); |
610 | 615 | ||
611 | cc_check_nvram(i); |
616 | cc_check_nvram(i); |
612 | } |
617 | } |
- | 618 | /* USER CODE END WHILE */ |
|
613 | } |
619 | } |
614 | } |
- | |
615 | /* USER CODE END WHILE */ |
620 | /* USER CODE BEGIN 3 */ |
616 | 621 | ||
617 | /* USER CODE BEGIN 3 */ |
622 | /* USER CODE END 3 */ |
618 | 623 | } |
|
619 | /* USER CODE END 3 */ |
- | |
620 | 624 | ||
621 | /** |
625 | /** |
622 | * @brief System Clock Configuration |
626 | * @brief System Clock Configuration |
623 | * @retval None |
627 | * @retval None |
624 | */ |
628 | */ |
Line 1011... | Line 1015... | ||
1011 | __HAL_RCC_GPIOA_CLK_ENABLE(); |
1015 | __HAL_RCC_GPIOA_CLK_ENABLE(); |
1012 | __HAL_RCC_GPIOC_CLK_ENABLE(); |
1016 | __HAL_RCC_GPIOC_CLK_ENABLE(); |
1013 | __HAL_RCC_GPIOB_CLK_ENABLE(); |
1017 | __HAL_RCC_GPIOB_CLK_ENABLE(); |
1014 | 1018 | ||
1015 | /*Configure GPIO pin Output Level */ |
1019 | /*Configure GPIO pin Output Level */ |
1016 | HAL_GPIO_WritePin(GPIOA, SPI_NSS1_Pin | BT_RESET_Pin, GPIO_PIN_SET); |
1020 | HAL_GPIO_WritePin(GPIOA, SPI_NSS1_Pin | BT_BUTTON_Pin | BT_RESET_Pin, GPIO_PIN_SET); |
1017 | 1021 | ||
1018 | /*Configure GPIO pin Output Level */ |
1022 | /*Configure GPIO pin Output Level */ |
1019 | HAL_GPIO_WritePin(GPIOA, SPI_CD_Pin | BT_BUTTON_Pin, GPIO_PIN_RESET); |
1023 | HAL_GPIO_WritePin(SPI_CD_GPIO_Port, SPI_CD_Pin, GPIO_PIN_RESET); |
1020 | 1024 | ||
1021 | /*Configure GPIO pin Output Level */ |
1025 | /*Configure GPIO pin Output Level */ |
1022 | HAL_GPIO_WritePin(GPIOC, SPI_RESET_Pin | POWER_LATCH_Pin | USB_PWR_Pin, GPIO_PIN_RESET); |
1026 | HAL_GPIO_WritePin(GPIOC, SPI_RESET_Pin | POWER_LATCH_Pin | USB_PWR_Pin, GPIO_PIN_RESET); |
1023 | 1027 | ||
1024 | /*Configure GPIO pin Output Level */ |
1028 | /*Configure GPIO pin Output Level */ |
Line 1048... | Line 1052... | ||
1048 | GPIO_InitStruct.Pin = IGNITION_Pin; |
1052 | GPIO_InitStruct.Pin = IGNITION_Pin; |
1049 | GPIO_InitStruct.Mode = GPIO_MODE_INPUT; |
1053 | GPIO_InitStruct.Mode = GPIO_MODE_INPUT; |
1050 | GPIO_InitStruct.Pull = GPIO_NOPULL; |
1054 | GPIO_InitStruct.Pull = GPIO_NOPULL; |
1051 | HAL_GPIO_Init(IGNITION_GPIO_Port, &GPIO_InitStruct); |
1055 | HAL_GPIO_Init(IGNITION_GPIO_Port, &GPIO_InitStruct); |
1052 | 1056 | ||
1053 | /*Configure GPIO pins : BT_BUTTON_Pin BT_RESET_Pin */ |
1057 | /*Configure GPIO pin : BT_BUTTON_Pin */ |
1054 | GPIO_InitStruct.Pin = BT_BUTTON_Pin | BT_RESET_Pin; |
1058 | GPIO_InitStruct.Pin = BT_BUTTON_Pin; |
1055 | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; |
1059 | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; |
1056 | GPIO_InitStruct.Pull = GPIO_NOPULL; |
1060 | GPIO_InitStruct.Pull = GPIO_PULLUP; |
1057 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
1061 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
- | 1062 | HAL_GPIO_Init(BT_BUTTON_GPIO_Port, &GPIO_InitStruct); |
|
- | 1063 | ||
- | 1064 | /*Configure GPIO pin : BT_RESET_Pin */ |
|
- | 1065 | GPIO_InitStruct.Pin = BT_RESET_Pin; |
|
- | 1066 | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
|
- | 1067 | GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
- | 1068 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; |
|
1058 | HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
1069 | HAL_GPIO_Init(BT_RESET_GPIO_Port, &GPIO_InitStruct); |
1059 | } |
1070 | } |
1060 | 1071 | ||
1061 | /* USER CODE BEGIN 4 */ |
1072 | /* USER CODE BEGIN 4 */ |
1062 | 1073 | ||
1063 | /* USER CODE END 4 */ |
1074 | /* USER CODE END 4 */ |