@@ -42,8 +42,8 @@ extern "C"
42
42
{
43
43
void braccio_disp_flush (lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
44
44
void braccio_read_keypad (lv_indev_drv_t * indev, lv_indev_data_t * data);
45
- void braccio_unlock_pd_semaphore_irq ();
46
- void braccio_unlock_pd_semaphore ();
45
+ void braccio_onPowerIrqEvent ();
46
+ void braccio_onPowerTimerEvent ();
47
47
};
48
48
49
49
/* *************************************************************************************
@@ -77,7 +77,6 @@ BraccioClass::BraccioClass()
77
77
, _display_thd{}
78
78
, _pd_events{}
79
79
, _pd_timer{}
80
- , _start_pd_burst{0xFFFFFFFF }
81
80
, _pd_thd{osPriorityHigh}
82
81
{
83
82
@@ -96,12 +95,13 @@ bool BraccioClass::begin(voidFuncPtr custom_menu)
96
95
Serial.begin (115200 );
97
96
98
97
pinMode (PIN_FUSB302_INT, INPUT_PULLUP);
98
+ attachInterrupt (PIN_FUSB302_INT, braccio_onPowerIrqEvent, FALLING);
99
99
pinMode (RS485_RX_PIN, INPUT_PULLUP);
100
100
101
- _pd_thd.start (mbed::callback (this , &BraccioClass::pd_thread_func));
102
- attachInterrupt (PIN_FUSB302_INT, braccio_unlock_pd_semaphore_irq, FALLING);
103
- _pd_timer.attach (braccio_unlock_pd_semaphore, 10ms);
104
101
_PD_UFP.init_PPS (_i2c_mtx, PPS_V (7.2 ), PPS_A (2.0 ));
102
+ _pd_timer.attach (braccio_onPowerTimerEvent, 10ms);
103
+ braccio_onPowerIrqEvent (); /* Start power burst. */
104
+ _pd_thd.start (mbed::callback (this , &BraccioClass::pd_thread_func));
105
105
106
106
button_init ();
107
107
@@ -112,26 +112,14 @@ bool BraccioClass::begin(voidFuncPtr custom_menu)
112
112
lvgl_init ();
113
113
_display_thd.start (mbed::callback (this , &BraccioClass::display_thread_func));
114
114
115
-
116
- auto check_power_func = [this ]()
117
- {
118
- if (!_PD_UFP.is_PPS_ready ())
119
- {
120
- _PD_UFP.print_status (Serial);
121
- _PD_UFP.set_PPS (PPS_V (7.2 ), PPS_A (2.0 ));
122
- delay (10 );
123
- }
124
- };
125
-
126
- lvgl_splashScreen (2000 , check_power_func);
115
+ lvgl_splashScreen (2000 );
127
116
lv_obj_clean (lv_scr_act ());
128
117
129
118
if (!_PD_UFP.is_PPS_ready ())
130
119
lvgl_pleaseConnectPower ();
131
120
132
121
/* Loop forever, if no power is attached. */
133
- while (!_PD_UFP.is_PPS_ready ())
134
- check_power_func ();
122
+ while (!_PD_UFP.is_PPS_ready ()) { delay (10 ); }
135
123
lv_obj_clean (lv_scr_act ());
136
124
137
125
if (custom_menu)
@@ -248,15 +236,14 @@ void BraccioClass::lvgl_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, l
248
236
lv_disp_flush_ready (disp);
249
237
}
250
238
251
- void BraccioClass::unlock_pd_semaphore_irq ()
239
+ void BraccioClass::onPowerIrqEvent ()
252
240
{
253
- _start_pd_burst = millis ();
254
- _pd_events.set (2 );
241
+ _pd_events.set (PD_IRQ_EVENT_FLAG);
255
242
}
256
243
257
- void BraccioClass::unlock_pd_semaphore ()
244
+ void BraccioClass::onPowerTimerEvent ()
258
245
{
259
- _pd_events.set (1 );
246
+ _pd_events.set (PD_TIMER_EVENT_FLAG );
260
247
}
261
248
262
249
/* *************************************************************************************
@@ -411,7 +398,7 @@ void BraccioClass::display_thread_func()
411
398
}
412
399
}
413
400
414
- void BraccioClass::lvgl_splashScreen (unsigned long const duration_ms, std::function< void ()> check_power_func )
401
+ void BraccioClass::lvgl_splashScreen (unsigned long const duration_ms)
415
402
{
416
403
extern const lv_img_dsc_t img_bulb_gif;
417
404
@@ -420,14 +407,8 @@ void BraccioClass::lvgl_splashScreen(unsigned long const duration_ms, std::funct
420
407
lv_gif_set_src (img, &img_bulb_gif);
421
408
lv_obj_align (img, LV_ALIGN_CENTER, 0 , 0 );
422
409
423
- /* Wait until the splash screen duration is over.
424
- * Meanwhile use the wait time for checking the
425
- * power.
426
- */
427
- for (unsigned long const start = millis (); millis () - start < duration_ms;)
428
- {
429
- check_power_func ();
430
- }
410
+ /* Wait until the splash screen duration is over. */
411
+ for (unsigned long const start = millis (); millis () - start < duration_ms; delay (10 )) { }
431
412
432
413
lv_obj_del (img);
433
414
}
@@ -457,27 +438,40 @@ void BraccioClass::lvgl_defaultMenu()
457
438
458
439
void BraccioClass::pd_thread_func ()
459
440
{
460
- _start_pd_burst = millis ();
461
441
size_t last_time_ask_pps = 0 ;
442
+ unsigned long start_pd_burst = 0 ;
443
+ static unsigned long const START_PD_BURST_TIMEOUT_ms = 1000 ;
462
444
463
445
for (;;)
464
446
{
465
- auto ret = _pd_events.wait_any (0xFF );
466
- if ((ret & 1 ) && (millis () - _start_pd_burst > 1000 )) {
467
- _pd_timer.detach ();
468
- _pd_timer.attach (braccio_unlock_pd_semaphore, 5s);
469
- }
470
- if (ret & 2 ) {
471
- _pd_timer.detach ();
472
- _pd_timer.attach (braccio_unlock_pd_semaphore, 50ms);
473
- }
474
- if (millis () - last_time_ask_pps > 5000 ) {
447
+ /* Wait for either a timer or a IRQ event. */
448
+ uint32_t const flags = _pd_events.wait_any (0xFF );
449
+
450
+ /* The actual calls to the PD library. */
451
+ if ((millis () - last_time_ask_pps) > 5000 )
452
+ {
453
+ start_pd_burst = millis ();
475
454
_PD_UFP.set_PPS (PPS_V (7.2 ), PPS_A (2.0 ));
476
455
last_time_ask_pps = millis ();
477
456
}
478
457
_PD_UFP.run ();
479
- if ( _PD_UFP.is_power_ready () && _PD_UFP. is_PPS_ready ()) {
458
+ _PD_UFP.print_status (Serial);
480
459
460
+ /* Set up the next time this loop is called. */
461
+ if (flags & PD_IRQ_EVENT_FLAG)
462
+ {
463
+ start_pd_burst = millis ();
464
+ _pd_timer.detach ();
465
+ _pd_timer.attach (braccio_onPowerTimerEvent, 10ms);
466
+ }
467
+
468
+ if (flags & PD_TIMER_EVENT_FLAG)
469
+ {
470
+ _pd_timer.detach ();
471
+ if ((millis () - start_pd_burst) < START_PD_BURST_TIMEOUT_ms)
472
+ _pd_timer.attach (braccio_onPowerTimerEvent, 10ms);
473
+ else
474
+ _pd_timer.attach (braccio_onPowerTimerEvent, 1000ms);
481
475
}
482
476
}
483
477
}
@@ -539,12 +533,12 @@ extern "C" void braccio_read_keypad(lv_indev_drv_t * drv, lv_indev_data_t* data)
539
533
data->key = last_key;
540
534
}
541
535
542
- void braccio_unlock_pd_semaphore_irq ()
536
+ void braccio_onPowerIrqEvent ()
543
537
{
544
- Braccio.unlock_pd_semaphore_irq ();
538
+ Braccio.onPowerIrqEvent ();
545
539
}
546
540
547
- void braccio_unlock_pd_semaphore ()
541
+ void braccio_onPowerTimerEvent ()
548
542
{
549
- Braccio.unlock_pd_semaphore ();
543
+ Braccio.onPowerTimerEvent ();
550
544
}
0 commit comments