Subversion Repositories DashDisplay

Rev

Rev 59 | Rev 61 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 59 Rev 60
Line 50... Line 50...
50
 
50
 
51
TIM_HandleTypeDef htim2;
51
TIM_HandleTypeDef htim2;
52
TIM_HandleTypeDef htim3;
52
TIM_HandleTypeDef htim3;
53
TIM_HandleTypeDef htim9;
53
TIM_HandleTypeDef htim9;
54
 
54
 
-
 
55
UART_HandleTypeDef huart4;
55
UART_HandleTypeDef huart1;
56
UART_HandleTypeDef huart1;
56
UART_HandleTypeDef huart2;
57
UART_HandleTypeDef huart2;
57
UART_HandleTypeDef huart3;
58
UART_HandleTypeDef huart3;
58
 
59
 
59
/* USER CODE BEGIN PV */
60
/* USER CODE BEGIN PV */
Line 92... Line 93...
92
static void MX_USART2_UART_Init(void);
93
static void MX_USART2_UART_Init(void);
93
static void MX_USART3_UART_Init(void);
94
static void MX_USART3_UART_Init(void);
94
static void MX_TIM3_Init(void);
95
static void MX_TIM3_Init(void);
95
static void MX_TIM9_Init(void);
96
static void MX_TIM9_Init(void);
96
static void MX_TIM2_Init(void);
97
static void MX_TIM2_Init(void);
-
 
98
static void MX_UART4_Init(void);
97
/* USER CODE BEGIN PFP */
99
/* USER CODE BEGIN PFP */
98
 
100
 
99
// the dial is the switch number we are using.
101
// the dial is the switch number we are using.
100
// suppress is the ItemIndex we wish to suppress on this display
102
// suppress is the ItemIndex we wish to suppress on this display
101
int
-
 
102
DisplayCurrent (int dial, int suppress)
103
int DisplayCurrent(int dial, int suppress)
103
{
104
{
104
  if (contexts[dial].knobPos < 0)
105
  if (contexts[dial].knobPos < 0)
105
    return -1;
106
    return -1;
106
  return cc_display (dial, suppress);
107
  return cc_display(dial, suppress);
107
}
108
}
108
 
109
 
109
 
-
 
110
void
-
 
111
sendString (usart_ctl *ctl, char *string, int length)
110
void sendString(usart_ctl *ctl, char *string, int length)
112
{
111
{
113
  int i;
112
  int i;
114
  for (i = 0; i < length; i++)
113
  for (i = 0; i < length; i++)
115
    PutCharSerial (ctl, string[i]);
114
    PutCharSerial(ctl, string[i]);
116
 
-
 
117
}
115
}
118
 
116
 
119
/// \note this code doesnt work so it leaves speed as 9600.
117
/// \note this code doesnt work so it leaves speed as 9600.
120
/// \brief Setup Bluetooth module
118
/// \brief Setup Bluetooth module
121
void
-
 
122
initModule (usart_ctl *ctl, uint32_t baudRate)
119
void initModule(usart_ctl *ctl, uint32_t baudRate)
123
{
120
{
124
  char initBuf[30];
121
  char initBuf[30];
125
  // switch to command mode
122
  // switch to command mode
126
  HAL_GPIO_WritePin (BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, GPIO_PIN_RESET);
123
  HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, GPIO_PIN_RESET);
127
  HAL_Delay (500);
124
  HAL_Delay(500);
128
  int initLen = small_sprintf (initBuf, "AT+UART=%ul,1,2\n", baudRate);
125
  int initLen = small_sprintf(initBuf, "AT+UART=%ul,1,2\n", baudRate);
129
  setBaud (ctl, 38400);
126
  setBaud(ctl, 38400);
130
  sendString (ctl, initBuf, initLen);
127
  sendString(ctl, initBuf, initLen);
131
  TxWaitEmpty (ctl);
128
  TxWaitEmpty(ctl);
132
  // switch back to normal comms at new baud rate
129
  // switch back to normal comms at new baud rate
133
 
130
 
134
  HAL_GPIO_WritePin (BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, GPIO_PIN_SET);
131
  HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, GPIO_PIN_SET);
135
  setBaud (ctl, baudRate);
132
  setBaud(ctl, baudRate);
136
  HAL_Delay (100);
133
  HAL_Delay(100);
-
 
134
}
-
 
135
 
-
 
136
// workspace for RMC data read from GPS module.
-
 
137
uint8_t rmc_buff[80];
-
 
138
uint16_t rmc_length;
137
 
139
 
-
 
140
uint8_t rmc_callback(uint8_t *data, uint16_t length)
-
 
141
{
-
 
142
  rmc_length = length;
-
 
143
  memcpy(rmc_buff, data, length);
138
}
144
}
139
 
145
 
140
/* USER CODE END PFP */
146
/* USER CODE END PFP */
141
 
147
 
142
/* Private user code ---------------------------------------------------------*/
148
/* Private user code ---------------------------------------------------------*/
143
/* USER CODE BEGIN 0 */
149
/* USER CODE BEGIN 0 */
144
 
150
 
145
/* USER CODE END 0 */
151
/* USER CODE END 0 */
146
 
152
 
147
/**
153
/**
148
  * @brief  The application entry point.
154
 * @brief  The application entry point.
149
  * @retval int
155
 * @retval int
150
  */
156
 */
151
int main(void)
157
int main(void)
152
{
158
{
153
  /* USER CODE BEGIN 1 */
159
  /* USER CODE BEGIN 1 */
154
  __HAL_RCC_SPI1_CLK_ENABLE()
160
  __HAL_RCC_SPI1_CLK_ENABLE();
155
  ;
-
 
156
  __HAL_RCC_USART1_CLK_ENABLE()
161
  __HAL_RCC_USART1_CLK_ENABLE(); // PLX main port
157
  ; // PLX main port
-
 
158
  __HAL_RCC_USART2_CLK_ENABLE()
162
  __HAL_RCC_USART2_CLK_ENABLE(); // debug port
159
  ; // debug port
-
 
160
  __HAL_RCC_USART3_CLK_ENABLE ()
163
  __HAL_RCC_USART3_CLK_ENABLE(); // Bluetooth port
161
  ; // Bluetooth port
164
  __HAL_RCC_UART4_CLK_ENABLE(); // NMEA0183 port
162
 
165
 
163
  __HAL_RCC_TIM3_CLK_ENABLE();
166
  __HAL_RCC_TIM3_CLK_ENABLE();
164
 
167
 
165
  __HAL_RCC_TIM9_CLK_ENABLE();
168
  __HAL_RCC_TIM9_CLK_ENABLE();
166
 
169
 
Line 178... Line 181...
178
  /* Configure the system clock */
181
  /* Configure the system clock */
179
  SystemClock_Config();
182
  SystemClock_Config();
180
 
183
 
181
  /* USER CODE BEGIN SysInit */
184
  /* USER CODE BEGIN SysInit */
182
  // Switch handler called on sysTick interrupt.
185
  // Switch handler called on sysTick interrupt.
183
   InitSwitches ();
186
  InitSwitches();
184
 
187
 
185
  /* USER CODE END SysInit */
188
  /* USER CODE END SysInit */
186
 
189
 
187
  /* Initialize all configured peripherals */
190
  /* Initialize all configured peripherals */
188
  MX_GPIO_Init();
191
  MX_GPIO_Init();
Line 191... Line 194...
191
  MX_USART2_UART_Init();
194
  MX_USART2_UART_Init();
192
  MX_USART3_UART_Init();
195
  MX_USART3_UART_Init();
193
  MX_TIM3_Init();
196
  MX_TIM3_Init();
194
  MX_TIM9_Init();
197
  MX_TIM9_Init();
195
  MX_TIM2_Init();
198
  MX_TIM2_Init();
-
 
199
  MX_UART4_Init();
196
  /* USER CODE BEGIN 2 */
200
  /* USER CODE BEGIN 2 */
197
 
201
 
198
  /* Turn on USART1 IRQ */
202
  /* Turn on USART1 IRQ */
199
  HAL_NVIC_SetPriority (USART1_IRQn, 2, 0);
203
  HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);
200
  HAL_NVIC_EnableIRQ (USART1_IRQn);
204
  HAL_NVIC_EnableIRQ(USART1_IRQn);
201
 
205
 
202
  /* Turn on USART2 IRQ  */
206
  /* Turn on USART2 IRQ  */
203
  HAL_NVIC_SetPriority (USART2_IRQn, 4, 0);
207
  HAL_NVIC_SetPriority(USART2_IRQn, 4, 0);
204
  HAL_NVIC_EnableIRQ (USART2_IRQn);
208
  HAL_NVIC_EnableIRQ(USART2_IRQn);
205
 
209
 
206
  /* turn on USART3 IRQ */
210
  /* turn on USART3 IRQ */
207
  HAL_NVIC_SetPriority (USART3_IRQn, 4, 0);
211
  HAL_NVIC_SetPriority(USART3_IRQn, 4, 0);
208
  HAL_NVIC_EnableIRQ (USART3_IRQn);
212
  HAL_NVIC_EnableIRQ(USART3_IRQn);
209
 
213
 
210
  /* setup the USART control blocks */
214
  /* turn on UART4 IRQ */
211
  init_usart_ctl (&uc1, &huart1);
215
  HAL_NVIC_SetPriority(UART4_IRQn, 4, 0);
212
  init_usart_ctl (&uc2, &huart2);
-
 
213
  init_usart_ctl (&uc3, &huart3);
216
  HAL_NVIC_EnableIRQ(UART4_IRQn);
214
 
217
 
-
 
218
  /* setup the USART control blocks */
215
  EnableSerialRxInterrupt (&uc1);
219
  init_usart_ctl(&uc1, &huart1);
216
  EnableSerialRxInterrupt (&uc2);
220
  init_usart_ctl(&uc2, &huart2);
217
  EnableSerialRxInterrupt (&uc3);
221
  init_usart_ctl(&uc3, &huart3);
-
 
222
  init_usart_ctl(&uc4, &huart4);
218
 
223
 
-
 
224
  EnableSerialRxInterrupt(&uc1);
-
 
225
  EnableSerialRxInterrupt(&uc2);
-
 
226
  EnableSerialRxInterrupt(&uc3);
219
  HAL_TIM_Encoder_Start (&htim3, TIM_CHANNEL_ALL);
227
  EnableSerialRxInterrupt(&uc4);
220
 
228
 
221
  HAL_TIM_Encoder_Start (&htim9, TIM_CHANNEL_ALL);
229
  HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
222
 
230
 
-
 
231
  HAL_TIM_Encoder_Start(&htim9, TIM_CHANNEL_ALL);
223
 
232
 
224
  initModule (&uc3, 9600);
233
  initModule(&uc3, 9600);
225
 
234
 
226
  // Initialise UART for 4800 baud NMEA
235
  // Initialise UART for 4800 baud NMEA
227
  setBaud (&uc2, 4800);
236
  setBaud(&uc2, 4800);
-
 
237
 
-
 
238
  // Initialuse UART4 for 4800 baud NMEA.
-
 
239
  setBaud(&uc4, 4800);
228
 
240
 
229
  cc_init ();
241
  cc_init();
230
 
242
 
231
  int i;
243
  int i;
232
  for (i = 0; i < 2; i++)
244
  for (i = 0; i < 2; i++)
233
    {
245
  {
234
      dial_pos[i] = 0; // default to items 0 and 1
246
    dial_pos[i] = 0; // default to items 0 and 1
235
      contexts[i].knobPos = -1;
247
    contexts[i].knobPos = -1;
236
    }
248
  }
237
 
249
 
238
  /* reset the display timeout, latch on power from accessories */
250
  /* reset the display timeout, latch on power from accessories */
239
  Latch_Timer = IGNITION_OFF_TIMEOUT;
251
  Latch_Timer = IGNITION_OFF_TIMEOUT;
240
  HAL_GPIO_WritePin (POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, GPIO_PIN_RESET);
252
  HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, GPIO_PIN_RESET);
-
 
253
 
-
 
254
  setRmcCallback(&rmc_callback);
241
 
255
 
242
  /* USER CODE END 2 */
256
  /* USER CODE END 2 */
243
 
257
 
244
  /* Infinite loop */
258
  /* Infinite loop */
245
  /* USER CODE BEGIN WHILE */
259
  /* USER CODE BEGIN WHILE */
246
  while (1)
260
  while (1)
-
 
261
  {
-
 
262
 
-
 
263
    /* while ignition is on, keep resetting power latch timer */
-
 
264
    if (HAL_GPIO_ReadPin(IGNITION_GPIO_Port, IGNITION_Pin) == GPIO_PIN_RESET)
247
    {
265
    {
-
 
266
      Latch_Timer = HAL_GetTick() + IGNITION_OFF_TIMEOUT;
-
 
267
    }
-
 
268
    else
-
 
269
    {
-
 
270
      /* if the ignition has been off for a while, then turn off power */
-
 
271
      if (HAL_GetTick() > Latch_Timer)
-
 
272
      {
-
 
273
        HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin,
-
 
274
                          GPIO_PIN_RESET);
-
 
275
      }
-
 
276
    }
-
 
277
 
-
 
278
    uint32_t timeout = 0; //
-
 
279
 
-
 
280
    uint32_t nextTick = HAL_GetTick() + LOGGER_INTERVAL;
-
 
281
    uint8_t log = 0;
-
 
282
    // PLX decoder protocols
-
 
283
    char PLXPacket = 0;
-
 
284
    for (i = 0; i < MAXRDG; i++)
-
 
285
    {
-
 
286
      Info[i].Max = 0;
-
 
287
      Info[i].Min = 0xFFF; // 12 bit max value
-
 
288
    }
248
 
289
 
-
 
290
    int PLXPtr = 0;
249
 
291
 
-
 
292
    while (1)
-
 
293
    {
250
 
294
 
-
 
295
      // poll GPS Position/time on UART4
251
      bool stat = updateLocation (&loc, &uc2);
296
      bool stat = updateLocation(&loc, &uc4);
252
      if (loc.good)
297
      if (loc.good)
253
        {
298
      {
254
 
299
 
255
          loc.good = false;
300
        loc.good = false;
256
        }
301
      }
257
      if (loc.valid == 'V')
302
      if (loc.valid == 'V')
258
        memset (loc.time, '-', 6);
303
        memset(loc.time, '-', 6);
259
 
304
 
-
 
305
      // Handle the bluetooth pairing / reset function by pressing both buttons.
-
 
306
      if ((push_pos[0] == 1) && (push_pos[1] == 1))
-
 
307
      {
-
 
308
        HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin,
-
 
309
                          GPIO_PIN_RESET);
-
 
310
      }
-
 
311
      else
-
 
312
      {
-
 
313
        HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin,
-
 
314
                          GPIO_PIN_SET);
-
 
315
      }
-
 
316
 
-
 
317
      uint16_t cc = SerialCharsReceived(&uc1);
-
 
318
      int chr;
-
 
319
      if (cc == 0)
-
 
320
      {
-
 
321
        timeout++;
-
 
322
        if (timeout % 1000 == 0)
-
 
323
        {
-
 
324
          const char msg[] = "Timeout\r\n";
-
 
325
          sendString(&uc3, msg, sizeof(msg));
-
 
326
        }
260
 
327
 
-
 
328
        if (timeout > 60000)
-
 
329
        {
261
 
330
 
-
 
331
          // do turn off screen
-
 
332
        }
-
 
333
      }
-
 
334
      for (chr = 0; chr < cc; chr++)
-
 
335
      {
-
 
336
        char c = GetCharSerial(&uc1);
262
 
337
 
-
 
338
        if (c == PLX_Start) // at any time if the start byte appears, reset the pointers
-
 
339
        {
-
 
340
          PLXPtr = 0; // reset the pointer
-
 
341
          PLXPacket = 1;
-
 
342
          timeout = 0; // Reset the timer
-
 
343
          if (HAL_GetTick() > nextTick)
-
 
344
          {
-
 
345
            nextTick = HAL_GetTick() + LOGGER_INTERVAL;
-
 
346
            log = 1;
-
 
347
          }
-
 
348
          else
-
 
349
            log = 0;
-
 
350
        }
-
 
351
        else if (c == PLX_Stop)
-
 
352
        {
-
 
353
          if (PLXPacket)
-
 
354
          {
-
 
355
            // we can now decode the selected parameter
-
 
356
            PLXItems = PLXPtr / sizeof(PLX_SensorInfo); // total
-
 
357
            // saturate the rotary switch position
-
 
358
 
-
 
359
            // process min/max
-
 
360
            for (i = 0; i < PLXItems; i++)
-
 
361
            {
-
 
362
              Info[i].observation = ConvPLX(Data.Sensor[i].AddrH,
-
 
363
                                            Data.Sensor[i].AddrL);
-
 
364
              Info[i].instance = Data.Sensor[i].Instance;
-
 
365
              Info[i].data = ConvPLX(Data.Sensor[i].ReadingH,
-
 
366
                                     Data.Sensor[i].ReadingL);
-
 
367
              if (Info[i].data > Info[i].Max)
-
 
368
              {
-
 
369
                Info[i].Max = Info[i].data;
-
 
370
              }
-
 
371
              if (Info[i].data < Info[i].Min)
-
 
372
              {
-
 
373
                Info[i].Min = Info[i].data;
-
 
374
              }
-
 
375
 
-
 
376
              // Send item to BT
-
 
377
              if (rmc_length)
-
 
378
              {
-
 
379
                sendString(&uc3, rmc_buff, rmc_length);
-
 
380
                rmc_length = 0;
-
 
381
              }
-
 
382
 
-
 
383
              if (log)
-
 
384
              {
-
 
385
 
-
 
386
                char outbuff[100];
-
 
387
 
-
 
388
                int cnt = small_sprintf(outbuff,
-
 
389
                                        "$PLLOG,%d,%d,%d",
-
 
390
                                        Info[i].observation,
-
 
391
                                        Info[i].instance,
-
 
392
                                        Info[i].data);
-
 
393
 
-
 
394
                // NMEA style checksum
-
 
395
                int ck;
-
 
396
                int sum = 0;
-
 
397
                for (ck = 1; ck < cnt; ck++)
-
 
398
                  sum += outbuff[ck];
-
 
399
                cnt += small_sprintf(outbuff + cnt, "*%02X\n",
-
 
400
                                     sum & 0xFF);
-
 
401
                sendString(&uc3, outbuff, cnt);
-
 
402
              }
-
 
403
            }
-
 
404
 
-
 
405
            // now to display the information
-
 
406
            int suppress = DisplayCurrent(0, -1);
-
 
407
            DisplayCurrent(1, suppress);
-
 
408
          }
-
 
409
          PLXPtr = 0;
-
 
410
          PLXPacket = 0;
-
 
411
        }
-
 
412
        else if (c > PLX_Stop) // illegal char, restart reading
-
 
413
        {
-
 
414
          PLXPacket = 0;
-
 
415
          PLXPtr = 0;
-
 
416
        }
-
 
417
        else if (PLXPacket && PLXPtr < sizeof(Data.Bytes))
-
 
418
        {
-
 
419
          Data.Bytes[PLXPtr++] = c;
-
 
420
        }
-
 
421
      }
263
 
422
 
264
      /* while ignition is on, keep resetting power latch timer */
-
 
265
      if (HAL_GPIO_ReadPin (IGNITION_GPIO_Port, IGNITION_Pin) == GPIO_PIN_RESET)
-
 
266
        {
-
 
267
          Latch_Timer = HAL_GetTick () + IGNITION_OFF_TIMEOUT;
-
 
268
        }
-
 
269
      else
-
 
270
        {
-
 
271
          /* if the ignition has been off for a while, then turn off power */
-
 
272
          if (HAL_GetTick () > Latch_Timer)
-
 
273
            {
-
 
274
              HAL_GPIO_WritePin (POWER_LATCH_GPIO_Port, POWER_LATCH_Pin,
-
 
275
                                 GPIO_PIN_RESET);
-
 
276
            }
-
 
277
        }
-
 
278
 
-
 
279
      uint32_t timeout = 0;  //
-
 
280
 
-
 
281
      uint32_t nextTick = HAL_GetTick () + LOGGER_INTERVAL;
-
 
282
      uint8_t log = 0;
-
 
283
      // PLX decoder protocols
-
 
284
      char PLXPacket = 0;
-
 
285
      for (i = 0; i < MAXRDG; i++)
-
 
286
        {
-
 
287
          Info[i].Max = 0;
-
 
288
          Info[i].Min = 0xFFF; // 12 bit max value
-
 
289
        }
-
 
290
 
-
 
291
      int PLXPtr = 0;
-
 
292
 
-
 
293
      while (1)
-
 
294
        {
-
 
295
          // Handle the bluetooth pairing / reset function by pressing both buttons.
-
 
296
          if ((push_pos[0] == 1) && (push_pos[1] == 1))
-
 
297
            {
-
 
298
              HAL_GPIO_WritePin (BT_BUTTON_GPIO_Port, BT_BUTTON_Pin,
-
 
299
                                 GPIO_PIN_RESET);
-
 
300
            }
-
 
301
          else
-
 
302
            {
-
 
303
              HAL_GPIO_WritePin (BT_BUTTON_GPIO_Port, BT_BUTTON_Pin,
-
 
304
                                 GPIO_PIN_SET);
-
 
305
            }
-
 
306
 
-
 
307
          uint16_t cc = SerialCharsReceived (&uc1);
-
 
308
          int chr;
-
 
309
          if (cc == 0)
-
 
310
            {
-
 
311
              timeout++;
-
 
312
              if (timeout % 1000 == 0)
-
 
313
                {
-
 
314
                  const char msg[] = "Timeout\r\n";
-
 
315
                  sendString (&uc3, msg, sizeof(msg));
-
 
316
 
-
 
317
                }
-
 
318
 
-
 
319
              if (timeout > 60000)
-
 
320
                {
-
 
321
 
-
 
322
                  // do turn off screen
-
 
323
                }
-
 
324
 
-
 
325
            }
-
 
326
          for (chr = 0; chr < cc; chr++)
-
 
327
            {
-
 
328
              char c = GetCharSerial (&uc1);
-
 
329
 
-
 
330
              if (c == PLX_Start) // at any time if the start byte appears, reset the pointers
-
 
331
                {
-
 
332
                  PLXPtr = 0;    // reset the pointer
-
 
333
                  PLXPacket = 1;
-
 
334
                  timeout = 0;    // Reset the timer
-
 
335
                  if (HAL_GetTick () > nextTick)
-
 
336
                    {
-
 
337
                      nextTick = HAL_GetTick () + LOGGER_INTERVAL;
-
 
338
                      log = 1;
-
 
339
                    }
-
 
340
                  else
-
 
341
                    log = 0;
-
 
342
                }
-
 
343
              else if (c == PLX_Stop)
-
 
344
                {
-
 
345
                  if (PLXPacket)
-
 
346
                    {
-
 
347
                      // we can now decode the selected parameter
-
 
348
                      PLXItems = PLXPtr / sizeof(PLX_SensorInfo); // total
-
 
349
                      // saturate the rotary switch position
-
 
350
 
-
 
351
                      // process min/max
-
 
352
                      for (i = 0; i < PLXItems; i++)
-
 
353
                        {
-
 
354
                          Info[i].observation = ConvPLX (Data.Sensor[i].AddrH,
-
 
355
                                                         Data.Sensor[i].AddrL);
-
 
356
                          Info[i].instance = Data.Sensor[i].Instance;
-
 
357
                          Info[i].data = ConvPLX (Data.Sensor[i].ReadingH,
-
 
358
                                                  Data.Sensor[i].ReadingL);
-
 
359
                          if (Info[i].data > Info[i].Max)
-
 
360
                            {
-
 
361
                              Info[i].Max = Info[i].data;
-
 
362
                            }
-
 
363
                          if (Info[i].data < Info[i].Min)
-
 
364
                            {
-
 
365
                              Info[i].Min = Info[i].data;
-
 
366
                            }
-
 
367
 
-
 
368
                          // Send item to BT
-
 
369
 
-
 
370
                          if (log)
-
 
371
                            {
-
 
372
 
-
 
373
                              char outbuff[100];
-
 
374
 
-
 
375
                              int cnt = small_sprintf (outbuff,
-
 
376
                                                       "$PLLOG,%d,%d,%d",
-
 
377
                                                       Info[i].observation,
-
 
378
                                                       Info[i].instance,
-
 
379
                                                       Info[i].data);
-
 
380
 
-
 
381
                              //checksum
-
 
382
                              int ck;
-
 
383
                              int sum = 0;
-
 
384
                              for (ck = 1; ck < cnt; ck++)
-
 
385
                                sum += outbuff[ck];
-
 
386
                              cnt += small_sprintf (outbuff + cnt, "*%02X\n",
-
 
387
                                                    sum & 0xFF);
-
 
388
                              sendString (&uc3, outbuff, cnt);
-
 
389
 
-
 
390
                            }
-
 
391
                        }
-
 
392
 
-
 
393
                      // now to display the information
-
 
394
                      int suppress = DisplayCurrent (0, -1);
-
 
395
                      DisplayCurrent (1, suppress);
-
 
396
                    }
-
 
397
                  PLXPtr = 0;
-
 
398
                  PLXPacket = 0;
-
 
399
                }
-
 
400
              else if (c > PLX_Stop) // illegal char, restart reading
-
 
401
                {
-
 
402
                  PLXPacket = 0;
-
 
403
                  PLXPtr = 0;
-
 
404
                }
-
 
405
              else if (PLXPacket && PLXPtr < sizeof(Data.Bytes))
-
 
406
                {
-
 
407
                  Data.Bytes[PLXPtr++] = c;
-
 
408
                }
-
 
409
 
-
 
410
            }
-
 
411
 
-
 
412
          HAL_Delay (1);
423
      HAL_Delay(1);
413
 
424
 
414
          for (i = 0; i < MAX_DISPLAYS; i++)
425
      for (i = 0; i < MAX_DISPLAYS; i++)
415
            {
426
      {
416
              if (dial_pos[i] < 0)
427
        if (dial_pos[i] < 0)
417
                dial_pos[i] = PLXItems - 1;
428
          dial_pos[i] = PLXItems - 1;
418
              if (dial_pos[i] >= PLXItems)
429
        if (dial_pos[i] >= PLXItems)
419
                dial_pos[i] = 0;
430
          dial_pos[i] = 0;
420
 
431
 
421
              int prevPos = contexts[i].knobPos;
432
        int prevPos = contexts[i].knobPos;
422
              if (contexts[i].knobPos >= 0)
433
        if (contexts[i].knobPos >= 0)
423
                contexts[i].knobPos = dial_pos[i];
434
          contexts[i].knobPos = dial_pos[i];
424
              // if the dial position was changed then reset timer
435
        // if the dial position was changed then reset timer
425
              if (prevPos != contexts[i].knobPos)
436
        if (prevPos != contexts[i].knobPos)
426
                contexts[i].dial_timer = DialTimeout;
437
          contexts[i].dial_timer = DialTimeout;
427
 
438
 
428
              cc_check_nvram (i);
439
        cc_check_nvram(i);
429
              if (contexts[i].knobPos >= 0)
440
        if (contexts[i].knobPos >= 0)
430
                dial_pos[i] = contexts[i].knobPos;
441
          dial_pos[i] = contexts[i].knobPos;
431
            }
442
      }
432
        }
443
    }
433
    /* USER CODE END WHILE */
444
    /* USER CODE END WHILE */
434
 
445
 
435
    /* USER CODE BEGIN 3 */
446
    /* USER CODE BEGIN 3 */
436
    }
447
  }
437
  /* USER CODE END 3 */
448
  /* USER CODE END 3 */
438
}
449
}
439
 
450
 
440
/**
451
/**
441
  * @brief System Clock Configuration
452
 * @brief System Clock Configuration
442
  * @retval None
453
 * @retval None
443
  */
454
 */
444
void SystemClock_Config(void)
455
void SystemClock_Config(void)
445
{
456
{
446
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
457
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
447
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
458
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
448
 
459
 
449
  /** Configure the main internal regulator output voltage
460
  /** Configure the main internal regulator output voltage
450
  */
461
   */
451
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
462
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
452
  /** Initializes the RCC Oscillators according to the specified parameters
463
  /** Initializes the RCC Oscillators according to the specified parameters
453
  * in the RCC_OscInitTypeDef structure.
464
   * in the RCC_OscInitTypeDef structure.
454
  */
465
   */
455
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
466
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
456
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
467
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
457
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
468
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
458
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
469
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
459
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
470
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
Line 461... Line 472...
461
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
472
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
462
  {
473
  {
463
    Error_Handler();
474
    Error_Handler();
464
  }
475
  }
465
  /** Initializes the CPU, AHB and APB buses clocks
476
  /** Initializes the CPU, AHB and APB buses clocks
466
  */
477
   */
467
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
478
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
468
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
-
 
469
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
479
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
470
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
480
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
471
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
481
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
472
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
482
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
473
 
483
 
Line 476... Line 486...
476
    Error_Handler();
486
    Error_Handler();
477
  }
487
  }
478
}
488
}
479
 
489
 
480
/**
490
/**
481
  * @brief SPI1 Initialization Function
491
 * @brief SPI1 Initialization Function
482
  * @param None
492
 * @param None
483
  * @retval None
493
 * @retval None
484
  */
494
 */
485
static void MX_SPI1_Init(void)
495
static void MX_SPI1_Init(void)
486
{
496
{
487
 
497
 
488
  /* USER CODE BEGIN SPI1_Init 0 */
498
  /* USER CODE BEGIN SPI1_Init 0 */
489
 
499
 
Line 510... Line 520...
510
    Error_Handler();
520
    Error_Handler();
511
  }
521
  }
512
  /* USER CODE BEGIN SPI1_Init 2 */
522
  /* USER CODE BEGIN SPI1_Init 2 */
513
 
523
 
514
  /* USER CODE END SPI1_Init 2 */
524
  /* USER CODE END SPI1_Init 2 */
515
 
-
 
516
}
525
}
517
 
526
 
518
/**
527
/**
519
  * @brief TIM2 Initialization Function
528
 * @brief TIM2 Initialization Function
520
  * @param None
529
 * @param None
521
  * @retval None
530
 * @retval None
522
  */
531
 */
523
static void MX_TIM2_Init(void)
532
static void MX_TIM2_Init(void)
524
{
533
{
525
 
534
 
526
  /* USER CODE BEGIN TIM2_Init 0 */
535
  /* USER CODE BEGIN TIM2_Init 0 */
527
 
536
 
Line 555... Line 564...
555
    Error_Handler();
564
    Error_Handler();
556
  }
565
  }
557
  /* USER CODE BEGIN TIM2_Init 2 */
566
  /* USER CODE BEGIN TIM2_Init 2 */
558
 
567
 
559
  /* USER CODE END TIM2_Init 2 */
568
  /* USER CODE END TIM2_Init 2 */
560
 
-
 
561
}
569
}
562
 
570
 
563
/**
571
/**
564
  * @brief TIM3 Initialization Function
572
 * @brief TIM3 Initialization Function
565
  * @param None
573
 * @param None
566
  * @retval None
574
 * @retval None
567
  */
575
 */
568
static void MX_TIM3_Init(void)
576
static void MX_TIM3_Init(void)
569
{
577
{
570
 
578
 
571
  /* USER CODE BEGIN TIM3_Init 0 */
579
  /* USER CODE BEGIN TIM3_Init 0 */
572
 
580
 
Line 604... Line 612...
604
    Error_Handler();
612
    Error_Handler();
605
  }
613
  }
606
  /* USER CODE BEGIN TIM3_Init 2 */
614
  /* USER CODE BEGIN TIM3_Init 2 */
607
 
615
 
608
  /* USER CODE END TIM3_Init 2 */
616
  /* USER CODE END TIM3_Init 2 */
609
 
-
 
610
}
617
}
611
 
618
 
612
/**
619
/**
613
  * @brief TIM9 Initialization Function
620
 * @brief TIM9 Initialization Function
614
  * @param None
621
 * @param None
615
  * @retval None
622
 * @retval None
616
  */
623
 */
617
static void MX_TIM9_Init(void)
624
static void MX_TIM9_Init(void)
618
{
625
{
619
 
626
 
620
  /* USER CODE BEGIN TIM9_Init 0 */
627
  /* USER CODE BEGIN TIM9_Init 0 */
621
 
628
 
Line 653... Line 660...
653
    Error_Handler();
660
    Error_Handler();
654
  }
661
  }
655
  /* USER CODE BEGIN TIM9_Init 2 */
662
  /* USER CODE BEGIN TIM9_Init 2 */
656
 
663
 
657
  /* USER CODE END TIM9_Init 2 */
664
  /* USER CODE END TIM9_Init 2 */
-
 
665
}
-
 
666
 
-
 
667
/**
-
 
668
 * @brief UART4 Initialization Function
-
 
669
 * @param None
-
 
670
 * @retval None
-
 
671
 */
-
 
672
static void MX_UART4_Init(void)
-
 
673
{
658
 
674
 
-
 
675
  /* USER CODE BEGIN UART4_Init 0 */
-
 
676
 
-
 
677
  /* USER CODE END UART4_Init 0 */
-
 
678
 
-
 
679
  /* USER CODE BEGIN UART4_Init 1 */
-
 
680
 
-
 
681
  /* USER CODE END UART4_Init 1 */
-
 
682
  huart4.Instance = UART4;
-
 
683
  huart4.Init.BaudRate = 4800;
-
 
684
  huart4.Init.WordLength = UART_WORDLENGTH_8B;
-
 
685
  huart4.Init.StopBits = UART_STOPBITS_1;
-
 
686
  huart4.Init.Parity = UART_PARITY_NONE;
-
 
687
  huart4.Init.Mode = UART_MODE_TX_RX;
-
 
688
  huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
-
 
689
  huart4.Init.OverSampling = UART_OVERSAMPLING_16;
-
 
690
  if (HAL_UART_Init(&huart4) != HAL_OK)
-
 
691
  {
-
 
692
    Error_Handler();
-
 
693
  }
-
 
694
  /* USER CODE BEGIN UART4_Init 2 */
-
 
695
 
-
 
696
  /* USER CODE END UART4_Init 2 */
659
}
697
}
660
 
698
 
661
/**
699
/**
662
  * @brief USART1 Initialization Function
700
 * @brief USART1 Initialization Function
663
  * @param None
701
 * @param None
664
  * @retval None
702
 * @retval None
665
  */
703
 */
666
static void MX_USART1_UART_Init(void)
704
static void MX_USART1_UART_Init(void)
667
{
705
{
668
 
706
 
669
  /* USER CODE BEGIN USART1_Init 0 */
707
  /* USER CODE BEGIN USART1_Init 0 */
670
 
708
 
Line 686... Line 724...
686
    Error_Handler();
724
    Error_Handler();
687
  }
725
  }
688
  /* USER CODE BEGIN USART1_Init 2 */
726
  /* USER CODE BEGIN USART1_Init 2 */
689
 
727
 
690
  /* USER CODE END USART1_Init 2 */
728
  /* USER CODE END USART1_Init 2 */
691
 
-
 
692
}
729
}
693
 
730
 
694
/**
731
/**
695
  * @brief USART2 Initialization Function
732
 * @brief USART2 Initialization Function
696
  * @param None
733
 * @param None
697
  * @retval None
734
 * @retval None
698
  */
735
 */
699
static void MX_USART2_UART_Init(void)
736
static void MX_USART2_UART_Init(void)
700
{
737
{
701
 
738
 
702
  /* USER CODE BEGIN USART2_Init 0 */
739
  /* USER CODE BEGIN USART2_Init 0 */
703
 
740
 
Line 719... Line 756...
719
    Error_Handler();
756
    Error_Handler();
720
  }
757
  }
721
  /* USER CODE BEGIN USART2_Init 2 */
758
  /* USER CODE BEGIN USART2_Init 2 */
722
 
759
 
723
  /* USER CODE END USART2_Init 2 */
760
  /* USER CODE END USART2_Init 2 */
724
 
-
 
725
}
761
}
726
 
762
 
727
/**
763
/**
728
  * @brief USART3 Initialization Function
764
 * @brief USART3 Initialization Function
729
  * @param None
765
 * @param None
730
  * @retval None
766
 * @retval None
731
  */
767
 */
732
static void MX_USART3_UART_Init(void)
768
static void MX_USART3_UART_Init(void)
733
{
769
{
734
 
770
 
735
  /* USER CODE BEGIN USART3_Init 0 */
771
  /* USER CODE BEGIN USART3_Init 0 */
736
 
772
 
Line 752... Line 788...
752
    Error_Handler();
788
    Error_Handler();
753
  }
789
  }
754
  /* USER CODE BEGIN USART3_Init 2 */
790
  /* USER CODE BEGIN USART3_Init 2 */
755
 
791
 
756
  /* USER CODE END USART3_Init 2 */
792
  /* USER CODE END USART3_Init 2 */
757
 
-
 
758
}
793
}
759
 
794
 
760
/**
795
/**
761
  * @brief GPIO Initialization Function
796
 * @brief GPIO Initialization Function
762
  * @param None
797
 * @param None
763
  * @retval None
798
 * @retval None
764
  */
799
 */
765
static void MX_GPIO_Init(void)
800
static void MX_GPIO_Init(void)
766
{
801
{
767
  GPIO_InitTypeDef GPIO_InitStruct = {0};
802
  GPIO_InitTypeDef GPIO_InitStruct = {0};
768
 
803
 
769
  /* GPIO Ports Clock Enable */
804
  /* GPIO Ports Clock Enable */
Line 774... Line 809...
774
 
809
 
775
  /*Configure GPIO pin Output Level */
810
  /*Configure GPIO pin Output Level */
776
  HAL_GPIO_WritePin(SPI_NSS1_GPIO_Port, SPI_NSS1_Pin, GPIO_PIN_SET);
811
  HAL_GPIO_WritePin(SPI_NSS1_GPIO_Port, SPI_NSS1_Pin, GPIO_PIN_SET);
777
 
812
 
778
  /*Configure GPIO pin Output Level */
813
  /*Configure GPIO pin Output Level */
779
  HAL_GPIO_WritePin(GPIOA, SPI_CD_Pin|BT_BUTTON_Pin, GPIO_PIN_RESET);
814
  HAL_GPIO_WritePin(GPIOA, SPI_CD_Pin | BT_BUTTON_Pin, GPIO_PIN_RESET);
780
 
815
 
781
  /*Configure GPIO pin Output Level */
816
  /*Configure GPIO pin Output Level */
782
  HAL_GPIO_WritePin(GPIOC, SPI_RESET_Pin|POWER_LATCH_Pin|USB_PWR_Pin, GPIO_PIN_RESET);
817
  HAL_GPIO_WritePin(GPIOC, SPI_RESET_Pin | POWER_LATCH_Pin | USB_PWR_Pin, GPIO_PIN_RESET);
783
 
818
 
784
  /*Configure GPIO pin Output Level */
819
  /*Configure GPIO pin Output Level */
785
  HAL_GPIO_WritePin(SPI_NSS2_GPIO_Port, SPI_NSS2_Pin, GPIO_PIN_SET);
820
  HAL_GPIO_WritePin(SPI_NSS2_GPIO_Port, SPI_NSS2_Pin, GPIO_PIN_SET);
786
 
821
 
787
  /*Configure GPIO pins : SPI_NSS1_Pin SPI_CD_Pin */
822
  /*Configure GPIO pins : SPI_NSS1_Pin SPI_CD_Pin */
788
  GPIO_InitStruct.Pin = SPI_NSS1_Pin|SPI_CD_Pin;
823
  GPIO_InitStruct.Pin = SPI_NSS1_Pin | SPI_CD_Pin;
789
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
824
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
790
  GPIO_InitStruct.Pull = GPIO_NOPULL;
825
  GPIO_InitStruct.Pull = GPIO_NOPULL;
791
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
826
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
792
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
827
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
793
 
828
 
794
  /*Configure GPIO pins : SPI_RESET_Pin SPI_NSS2_Pin POWER_LATCH_Pin USB_PWR_Pin */
829
  /*Configure GPIO pins : SPI_RESET_Pin SPI_NSS2_Pin POWER_LATCH_Pin USB_PWR_Pin */
795
  GPIO_InitStruct.Pin = SPI_RESET_Pin|SPI_NSS2_Pin|POWER_LATCH_Pin|USB_PWR_Pin;
830
  GPIO_InitStruct.Pin = SPI_RESET_Pin | SPI_NSS2_Pin | POWER_LATCH_Pin | USB_PWR_Pin;
796
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
831
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
797
  GPIO_InitStruct.Pull = GPIO_NOPULL;
832
  GPIO_InitStruct.Pull = GPIO_NOPULL;
798
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
833
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
799
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
834
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
800
 
835
 
801
  /*Configure GPIO pins : SW1_PUSH_Pin SW2_PUSH_Pin */
836
  /*Configure GPIO pins : SW1_PUSH_Pin SW2_PUSH_Pin */
802
  GPIO_InitStruct.Pin = SW1_PUSH_Pin|SW2_PUSH_Pin;
837
  GPIO_InitStruct.Pin = SW1_PUSH_Pin | SW2_PUSH_Pin;
803
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
838
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
804
  GPIO_InitStruct.Pull = GPIO_PULLUP;
839
  GPIO_InitStruct.Pull = GPIO_PULLUP;
805
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
840
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
806
 
841
 
807
  /*Configure GPIO pin : IGNITION_Pin */
842
  /*Configure GPIO pin : IGNITION_Pin */
Line 814... Line 849...
814
  GPIO_InitStruct.Pin = BT_BUTTON_Pin;
849
  GPIO_InitStruct.Pin = BT_BUTTON_Pin;
815
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
850
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
816
  GPIO_InitStruct.Pull = GPIO_NOPULL;
851
  GPIO_InitStruct.Pull = GPIO_NOPULL;
817
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
852
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
818
  HAL_GPIO_Init(BT_BUTTON_GPIO_Port, &GPIO_InitStruct);
853
  HAL_GPIO_Init(BT_BUTTON_GPIO_Port, &GPIO_InitStruct);
819
 
-
 
820
}
854
}
821
 
855
 
822
/* USER CODE BEGIN 4 */
856
/* USER CODE BEGIN 4 */
823
 
857
 
824
/* USER CODE END 4 */
858
/* USER CODE END 4 */
825
 
859
 
826
/**
860
/**
827
  * @brief  This function is executed in case of error occurrence.
861
 * @brief  This function is executed in case of error occurrence.
828
  * @retval None
862
 * @retval None
829
  */
863
 */
830
void Error_Handler(void)
864
void Error_Handler(void)
831
{
865
{
832
  /* USER CODE BEGIN Error_Handler_Debug */
866
  /* USER CODE BEGIN Error_Handler_Debug */
833
  /* User can add his own implementation to report the HAL error return state */
867
  /* User can add his own implementation to report the HAL error return state */
834
 
868
 
835
  /* USER CODE END Error_Handler_Debug */
869
  /* USER CODE END Error_Handler_Debug */
836
}
870
}
837
 
871
 
838
#ifdef  USE_FULL_ASSERT
872
#ifdef USE_FULL_ASSERT
839
/**
873
/**
840
  * @brief  Reports the name of the source file and the source line number
874
 * @brief  Reports the name of the source file and the source line number
841
  *         where the assert_param error has occurred.
875
 *         where the assert_param error has occurred.
842
  * @param  file: pointer to the source file name
876
 * @param  file: pointer to the source file name
843
  * @param  line: assert_param error line source number
877
 * @param  line: assert_param error line source number
844
  * @retval None
878
 * @retval None
845
  */
879
 */
846
void assert_failed(uint8_t *file, uint32_t line)
880
void assert_failed(uint8_t *file, uint32_t line)
847
{
881
{
848
  /* USER CODE BEGIN 6 */
882
  /* USER CODE BEGIN 6 */
849
  /* User can add his own implementation to report the file name and line number,
883
  /* User can add his own implementation to report the file name and line number,
850
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
884
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */