diff --git a/src/dfu/dfu_manager.c b/src/dfu/dfu_manager.c index 305bf05..b2647b1 100644 --- a/src/dfu/dfu_manager.c +++ b/src/dfu/dfu_manager.c @@ -173,14 +173,20 @@ static enum mgmt_cb_return dfu_status_cb(uint32_t event, enum mgmt_cb_return pre case MGMT_EVT_OP_IMG_MGMT_DFU_STARTED: case MGMT_EVT_OP_IMG_MGMT_DFU_CHUNK: case MGMT_EVT_OP_IMG_MGMT_DFU_CHUNK_WRITE_COMPLETE: - dfu_led_active = true; - led_ble_solid(); + if (!dfu_led_active) + { + dfu_led_active = true; + led_dfu_progress(); + } k_work_reschedule(&dfu_watchdog_work, K_SECONDS(DFU_STALL_TIMEOUT_SEC)); break; case MGMT_EVT_OP_IMG_MGMT_DFU_PENDING: - dfu_led_active = true; - led_ble_solid(); + if (!dfu_led_active) + { + dfu_led_active = true; + led_dfu_progress(); + } k_work_cancel_delayable(&dfu_watchdog_work); #if NRF_POWER_HAS_GPREGRET diff --git a/src/drivers/led/led_control.c b/src/drivers/led/led_control.c index 1ce96a5..f774463 100644 --- a/src/drivers/led/led_control.c +++ b/src/drivers/led/led_control.c @@ -33,21 +33,23 @@ static const struct gpio_dt_spec function_led = GPIO_DT_SPEC_GET(FUNCTION_LED_NO typedef struct { uint32_t on_ms; uint32_t off_ms; - uint8_t color; + uint8_t on_color; + uint8_t off_color; bool repeat; } led_pattern_t; static const led_pattern_t m_patterns[LED_STATE_COUNT] = { - [LED_STATE_OFF] = { 0, 0, COLOR_NONE, false }, - [LED_STATE_POWER_ON] = { 2000, 0, COLOR_GREEN, false }, - [LED_STATE_POWER_OFF] = { 2000, 0, COLOR_GREEN, false }, - [LED_STATE_ADVERTISING] = { 500, 500, COLOR_GREEN, true }, - [LED_STATE_DETACH_WARNING] = { 1000, 3000, COLOR_GREEN, true }, - [LED_STATE_ALIGN_SEARCHING] = { 1000, 1000, COLOR_ORANGE, true }, - [LED_STATE_ALIGN_COMPLETE] = { 0, 0, COLOR_GREEN, false }, - [LED_STATE_ERROR] = { 0, 0, COLOR_ORANGE, true }, - [LED_STATE_BOND_DELETE] = { 1000, 0, COLOR_ORANGE, false }, - [LED_STATE_BOND_DELETE_PENDING] = { 500, 500, COLOR_ORANGE, true }, + [LED_STATE_OFF] = { 0, 0, COLOR_NONE, COLOR_NONE, false }, + [LED_STATE_POWER_ON] = { 2000, 0, COLOR_GREEN, COLOR_NONE, false }, + [LED_STATE_POWER_OFF] = { 2000, 0, COLOR_GREEN, COLOR_NONE, false }, + [LED_STATE_ADVERTISING] = { 500, 500, COLOR_GREEN, COLOR_NONE, true }, + [LED_STATE_DETACH_WARNING] = { 1000, 3000, COLOR_GREEN, COLOR_NONE, true }, + [LED_STATE_ALIGN_SEARCHING] = { 1000, 1000, COLOR_ORANGE, COLOR_NONE, true }, + [LED_STATE_ALIGN_COMPLETE] = { 0, 0, COLOR_GREEN, COLOR_NONE, false }, + [LED_STATE_ERROR] = { 0, 0, COLOR_ORANGE, COLOR_NONE, true }, + [LED_STATE_BOND_DELETE] = { 2000, 0, COLOR_ORANGE, COLOR_NONE, false }, + [LED_STATE_BOND_DELETE_PENDING] = { 500, 500, COLOR_ORANGE, COLOR_NONE, true }, + [LED_STATE_DFU_PROGRESS] = { 500, 500, COLOR_GREEN, COLOR_ORANGE, true }, }; /* Module variables */ @@ -141,8 +143,8 @@ static void led_timer_handler(struct k_timer *timer) if (m_phase_on) { - // ON -> OFF transition - led_all_off(); + // ON -> OFF/alternate transition + led_color_on(p->off_color); m_phase_on = false; if (p->off_ms > 0) @@ -163,7 +165,7 @@ static void led_timer_handler(struct k_timer *timer) // OFF -> ON transition if (p->repeat) { - led_color_on(p->color); + led_color_on(p->on_color); m_phase_on = true; timer_start_ms(p->on_ms); } @@ -202,7 +204,7 @@ void led_set_state(led_state_t state) error_pattern_start(); break; default: - led_color_on(p->color); + led_color_on(p->on_color); m_phase_on = true; if (p->on_ms > 0) @@ -226,3 +228,8 @@ void led_ble_solid(void) led_ble_on(); m_current_state = LED_STATE_OFF; // no pattern running } + +void led_dfu_progress(void) +{ + led_set_state(LED_STATE_DFU_PROGRESS); +} diff --git a/src/drivers/led/led_control.h b/src/drivers/led/led_control.h index 7dbe118..cea9f0f 100644 --- a/src/drivers/led/led_control.h +++ b/src/drivers/led/led_control.h @@ -25,6 +25,7 @@ typedef enum LED_STATE_ERROR, // 7: Orange 3Hz x3 / 1s off LED_STATE_BOND_DELETE, // Bond Delete: Orange on LED_STATE_BOND_DELETE_PENDING, // Bond Delete Pending: Orange blink 500ms/500ms + LED_STATE_DFU_PROGRESS, // DFU Progress: Green/Orange alternate 500ms/500ms LED_STATE_COUNT } led_state_t; @@ -32,5 +33,6 @@ void led_init(void); void led_set_state(led_state_t state); led_state_t led_get_state(void); void led_ble_solid(void); +void led_dfu_progress(void); #endif /* LED_CONTROL_H__ */