Rev 63 | Rev 66 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 63 | Rev 65 | ||
|---|---|---|---|
| Line 26... | Line 26... | ||
| 26 | #include "libPLX/plx.h" |
26 | #include "libPLX/plx.h" |
| 27 | #include "libSerial/serial.H" |
27 | #include "libSerial/serial.H" |
| 28 | #include "libSmallPrintf/small_printf.h" |
28 | #include "libSmallPrintf/small_printf.h" |
| 29 | #include "libNMEA/nmea.h" |
29 | #include "libNMEA/nmea.h" |
| 30 | #include "switches.h" |
30 | #include "switches.h" |
| 31 | #include<string.h> |
31 | #include <string.h> |
| 32 | 32 | ||
| 33 | /* USER CODE END Includes */ |
33 | /* USER CODE END Includes */ |
| 34 | 34 | ||
| 35 | /* Private typedef -----------------------------------------------------------*/ |
35 | /* Private typedef -----------------------------------------------------------*/ |
| 36 | /* USER CODE BEGIN PTD */ |
36 | /* USER CODE BEGIN PTD */ |
| Line 45... | Line 45... | ||
| 45 | /* USER CODE BEGIN PM */ |
45 | /* USER CODE BEGIN PM */ |
| 46 | 46 | ||
| 47 | /* USER CODE END PM */ |
47 | /* USER CODE END PM */ |
| 48 | 48 | ||
| 49 | /* Private variables ---------------------------------------------------------*/ |
49 | /* Private variables ---------------------------------------------------------*/ |
| - | 50 | I2C_HandleTypeDef hi2c1; |
|
| - | 51 | ||
| 50 | SPI_HandleTypeDef hspi1; |
52 | SPI_HandleTypeDef hspi1; |
| 51 | 53 | ||
| 52 | TIM_HandleTypeDef htim2; |
54 | TIM_HandleTypeDef htim2; |
| 53 | TIM_HandleTypeDef htim3; |
55 | TIM_HandleTypeDef htim3; |
| 54 | TIM_HandleTypeDef htim9; |
56 | TIM_HandleTypeDef htim9; |
| Line 64... | Line 66... | ||
| 64 | context_t contexts[MAX_DISPLAYS]; |
66 | context_t contexts[MAX_DISPLAYS]; |
| 65 | 67 | ||
| 66 | /* timeout when the ignition is switched off */ |
68 | /* timeout when the ignition is switched off */ |
| 67 | #define IGNITION_OFF_TIMEOUT 30000UL |
69 | #define IGNITION_OFF_TIMEOUT 30000UL |
| 68 | 70 | ||
| 69 | // 500mS per logger period. |
71 | // 500mS per logger period. |
| 70 | #define LOGGER_INTERVAL 500UL |
72 | #define LOGGER_INTERVAL 500UL |
| 71 | 73 | ||
| 72 | const int DialTimeout = 10000; // about 10 seconds after twiddle, save the dial position. |
74 | const int DialTimeout = 10000; // about 10 seconds after twiddle, save the dial position. |
| 73 | 75 | ||
| 74 | nvram_info_t dial_nvram[MAX_DISPLAYS] __attribute__((section(".NVRAM_Data"))); |
76 | nvram_info_t dial_nvram[MAX_DISPLAYS] __attribute__((section(".NVRAM_Data"))); |
| Line 96... | Line 98... | ||
| 96 | static void MX_USART3_UART_Init(void); |
98 | static void MX_USART3_UART_Init(void); |
| 97 | static void MX_TIM3_Init(void); |
99 | static void MX_TIM3_Init(void); |
| 98 | static void MX_TIM9_Init(void); |
100 | static void MX_TIM9_Init(void); |
| 99 | static void MX_TIM2_Init(void); |
101 | static void MX_TIM2_Init(void); |
| 100 | static void MX_UART4_Init(void); |
102 | static void MX_UART4_Init(void); |
| - | 103 | static void MX_I2C1_Init(void); |
|
| 101 | /* USER CODE BEGIN PFP */ |
104 | /* USER CODE BEGIN PFP */ |
| 102 | 105 | ||
| 103 | // the dial is the switch number we are using. |
106 | // the dial is the switch number we are using. |
| 104 | // suppress is the ItemIndex we wish to suppress on this display |
107 | // suppress is the ItemIndex we wish to suppress on this display |
| 105 | int DisplayCurrent(int dial, int suppress) |
108 | int DisplayCurrent(int dial, int suppress) |
| Line 137... | Line 140... | ||
| 137 | rmc_length = length < sizeof(rmc_buff) ? length : sizeof(rmc_buff); |
140 | rmc_length = length < sizeof(rmc_buff) ? length : sizeof(rmc_buff); |
| 138 | memcpy(rmc_buff, data, length); |
141 | memcpy(rmc_buff, data, length); |
| 139 | return 0; |
142 | return 0; |
| 140 | } |
143 | } |
| 141 | 144 | ||
| 142 | - | ||
| 143 | // check if bluetooth connected |
145 | // check if bluetooth connected |
| 144 | uint8_t btConnected() |
146 | uint8_t btConnected() |
| 145 | { |
147 | { |
| 146 | return HAL_GPIO_ReadPin(BT_STATE_GPIO_Port, BT_STATE_Pin) == GPIO_PIN_SET; |
148 | return HAL_GPIO_ReadPin(BT_STATE_GPIO_Port, BT_STATE_Pin) == GPIO_PIN_SET; |
| 147 | } |
149 | } |
| 148 | 150 | ||
| 149 | /* USER CODE END PFP */ |
151 | /* USER CODE END PFP */ |
| 150 | 152 | ||
| 151 | /* Private user code ---------------------------------------------------------*/ |
153 | /* Private user code ---------------------------------------------------------*/ |
| Line 198... | Line 200... | ||
| 198 | MX_USART3_UART_Init(); |
200 | MX_USART3_UART_Init(); |
| 199 | MX_TIM3_Init(); |
201 | MX_TIM3_Init(); |
| 200 | MX_TIM9_Init(); |
202 | MX_TIM9_Init(); |
| 201 | MX_TIM2_Init(); |
203 | MX_TIM2_Init(); |
| 202 | MX_UART4_Init(); |
204 | MX_UART4_Init(); |
| - | 205 | MX_I2C1_Init(); |
|
| 203 | /* USER CODE BEGIN 2 */ |
206 | /* USER CODE BEGIN 2 */ |
| 204 | 207 | ||
| 205 | /* Turn on USART1 IRQ */ |
208 | /* Turn on USART1 IRQ */ |
| 206 | HAL_NVIC_SetPriority(USART1_IRQn, 2, 0); |
209 | HAL_NVIC_SetPriority(USART1_IRQn, 2, 0); |
| 207 | HAL_NVIC_EnableIRQ(USART1_IRQn); |
210 | HAL_NVIC_EnableIRQ(USART1_IRQn); |
| Line 244... | Line 247... | ||
| 244 | cc_init(); |
247 | cc_init(); |
| 245 | 248 | ||
| 246 | int i; |
249 | int i; |
| 247 | for (i = 0; i < 2; i++) |
250 | for (i = 0; i < 2; i++) |
| 248 | { |
251 | { |
| 249 | dial_pos[i] = 0; // default to items 0 and 1 |
252 | dial_pos[i] = 0; // default to items 0 and 1 |
| 250 | contexts[i].knobPos = -1; |
253 | contexts[i].knobPos = -1; // set the knob position |
| - | 254 | contexts[i].dial_timer = 1; // timeout immediately |
|
| 251 | } |
255 | } |
| 252 | 256 | ||
| 253 | /* reset the display timeout, latch on power from accessories */ |
257 | /* reset the display timeout, latch on power from accessories */ |
| 254 | Latch_Timer = IGNITION_OFF_TIMEOUT; |
258 | Latch_Timer = IGNITION_OFF_TIMEOUT; |
| 255 | 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); |
| Line 287... | Line 291... | ||
| 287 | char PLXPacket = 0; |
291 | char PLXPacket = 0; |
| 288 | for (i = 0; i < MAXRDG; i++) |
292 | for (i = 0; i < MAXRDG; i++) |
| 289 | { |
293 | { |
| 290 | Info[i].Max = 0; |
294 | Info[i].Max = 0; |
| 291 | Info[i].Min = 0xFFF; // 12 bit max value |
295 | Info[i].Min = 0xFFF; // 12 bit max value |
| 292 | Info[i].sum = 0; // |
296 | Info[i].sum = 0; // |
| 293 | Info[i].count=0; |
297 | Info[i].count = 0; |
| 294 | } |
298 | } |
| 295 | 299 | ||
| 296 | int PLXPtr = 0; |
300 | int PLXPtr = 0; |
| 297 | 301 | ||
| 298 | while (1) |
302 | while (1) |
| Line 310... | Line 314... | ||
| 310 | rmc_length = 0; |
314 | rmc_length = 0; |
| 311 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
315 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
| 312 | logCount = 0; |
316 | logCount = 0; |
| 313 | log = 1; |
317 | log = 1; |
| 314 | } |
318 | } |
| 315 | 319 | ||
| 316 | // time several counted logger intervals after RMC recieved, enable logger each timeout. |
320 | // time several counted logger intervals after RMC recieved, enable logger each timeout. |
| 317 | if (logCount < ((1000 / LOGGER_INTERVAL)-1) && HAL_GetTick() > nextTick) |
321 | if (logCount < ((1000 / LOGGER_INTERVAL) - 1) && HAL_GetTick() > nextTick) |
| 318 | { |
322 | { |
| 319 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
323 | nextTick = HAL_GetTick() + LOGGER_INTERVAL; |
| 320 | ++logCount; |
324 | ++logCount; |
| 321 | log = 1; |
325 | log = 1; |
| 322 | } |
326 | } |
| Line 349... | Line 353... | ||
| 349 | 353 | ||
| 350 | // do turn off screen |
354 | // do turn off screen |
| 351 | } |
355 | } |
| 352 | } |
356 | } |
| 353 | 357 | ||
| 354 | - | ||
| 355 | for (chr = 0; chr < cc; chr++) |
358 | for (chr = 0; chr < cc; chr++) |
| 356 | { |
359 | { |
| 357 | char c = GetCharSerial(&uc1); |
360 | char c = GetCharSerial(&uc1); |
| 358 | 361 | ||
| 359 | if (c == PLX_Start) // at any time if the start byte appears, reset the pointers |
362 | if (c == PLX_Start) // at any time if the start byte appears, reset the pointers |
| Line 384... | Line 387... | ||
| 384 | } |
387 | } |
| 385 | if (Info[i].data < Info[i].Min) |
388 | if (Info[i].data < Info[i].Min) |
| 386 | { |
389 | { |
| 387 | Info[i].Min = Info[i].data; |
390 | Info[i].Min = Info[i].data; |
| 388 | } |
391 | } |
| 389 | // take an avarage |
392 | // take an avarage |
| 390 | Info[i].sum += Info[i].data; |
393 | Info[i].sum += Info[i].data; |
| 391 | Info[i].count ++; |
394 | Info[i].count++; |
| 392 | 395 | ||
| 393 | // Send items to BT if it is in connected state |
396 | // Send items to BT if it is in connected state |
| 394 | if (log && btConnected()) |
397 | if (log && btConnected()) |
| 395 | { |
398 | { |
| 396 | 399 | ||
| Line 399... | Line 402... | ||
| 399 | int cnt = small_sprintf(outbuff, |
402 | int cnt = small_sprintf(outbuff, |
| 400 | "$PLLOG,%d,%d,%d,%ld", |
403 | "$PLLOG,%d,%d,%d,%ld", |
| 401 | logCount, |
404 | logCount, |
| 402 | Info[i].observation, |
405 | Info[i].observation, |
| 403 | Info[i].instance, |
406 | Info[i].instance, |
| 404 | Info[i].count==0? 0: Info[i].sum/Info[i].count); |
407 | Info[i].count == 0 ? 0 : Info[i].sum / Info[i].count); |
| 405 | 408 | ||
| 406 | // NMEA style checksum |
409 | // NMEA style checksum |
| 407 | int ck; |
410 | int ck; |
| 408 | int sum = 0; |
411 | int sum = 0; |
| 409 | for (ck = 1; ck < cnt; ck++) |
412 | for (ck = 1; ck < cnt; ck++) |
| Line 411... | Line 414... | ||
| 411 | cnt += small_sprintf(outbuff + cnt, "*%02X\n", |
414 | cnt += small_sprintf(outbuff + cnt, "*%02X\n", |
| 412 | sum & 0xFF); |
415 | sum & 0xFF); |
| 413 | sendString(&uc3, outbuff, cnt); |
416 | sendString(&uc3, outbuff, cnt); |
| 414 | } |
417 | } |
| 415 | } |
418 | } |
| 416 | log = 0; |
419 | log = 0; |
| 417 | // now to display the information |
420 | // now to display the information |
| 418 | int suppress = DisplayCurrent(0, -1); |
421 | int suppress = DisplayCurrent(0, -1); |
| 419 | DisplayCurrent(1, suppress); |
422 | DisplayCurrent(1, suppress); |
| 420 | } |
423 | } |
| 421 | PLXPtr = 0; |
424 | PLXPtr = 0; |
| 422 | PLXPacket = 0; |
425 | PLXPacket = 0; |
| Line 500... | Line 503... | ||
| 500 | Error_Handler(); |
503 | Error_Handler(); |
| 501 | } |
504 | } |
| 502 | } |
505 | } |
| 503 | 506 | ||
| 504 | /** |
507 | /** |
| - | 508 | * @brief I2C1 Initialization Function |
|
| - | 509 | * @param None |
|
| - | 510 | * @retval None |
|
| - | 511 | */ |
|
| - | 512 | static void MX_I2C1_Init(void) |
|
| - | 513 | { |
|
| - | 514 | ||
| - | 515 | /* USER CODE BEGIN I2C1_Init 0 */ |
|
| - | 516 | ||
| - | 517 | /* USER CODE END I2C1_Init 0 */ |
|
| - | 518 | ||
| - | 519 | /* USER CODE BEGIN I2C1_Init 1 */ |
|
| - | 520 | ||
| - | 521 | /* USER CODE END I2C1_Init 1 */ |
|
| - | 522 | hi2c1.Instance = I2C1; |
|
| - | 523 | hi2c1.Init.ClockSpeed = 100000; |
|
| - | 524 | hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; |
|
| - | 525 | hi2c1.Init.OwnAddress1 = 0; |
|
| - | 526 | hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; |
|
| - | 527 | hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; |
|
| - | 528 | hi2c1.Init.OwnAddress2 = 0; |
|
| - | 529 | hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; |
|
| - | 530 | hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; |
|
| - | 531 | if (HAL_I2C_Init(&hi2c1) != HAL_OK) |
|
| - | 532 | { |
|
| - | 533 | Error_Handler(); |
|
| - | 534 | } |
|
| - | 535 | /* USER CODE BEGIN I2C1_Init 2 */ |
|
| - | 536 | ||
| - | 537 | /* USER CODE END I2C1_Init 2 */ |
|
| - | 538 | } |
|
| - | 539 | ||
| - | 540 | /** |
|
| 505 | * @brief SPI1 Initialization Function |
541 | * @brief SPI1 Initialization Function |
| 506 | * @param None |
542 | * @param None |
| 507 | * @retval None |
543 | * @retval None |
| 508 | */ |
544 | */ |
| 509 | static void MX_SPI1_Init(void) |
545 | static void MX_SPI1_Init(void) |