DFU 진행 중 LED 변경
- 이미지 업로드 중 초록/주황 LED 0.5초 교대 점멸
This commit is contained in:
@@ -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_STARTED:
|
||||||
case MGMT_EVT_OP_IMG_MGMT_DFU_CHUNK:
|
case MGMT_EVT_OP_IMG_MGMT_DFU_CHUNK:
|
||||||
case MGMT_EVT_OP_IMG_MGMT_DFU_CHUNK_WRITE_COMPLETE:
|
case MGMT_EVT_OP_IMG_MGMT_DFU_CHUNK_WRITE_COMPLETE:
|
||||||
|
if (!dfu_led_active)
|
||||||
|
{
|
||||||
dfu_led_active = true;
|
dfu_led_active = true;
|
||||||
led_ble_solid();
|
led_dfu_progress();
|
||||||
|
}
|
||||||
k_work_reschedule(&dfu_watchdog_work, K_SECONDS(DFU_STALL_TIMEOUT_SEC));
|
k_work_reschedule(&dfu_watchdog_work, K_SECONDS(DFU_STALL_TIMEOUT_SEC));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MGMT_EVT_OP_IMG_MGMT_DFU_PENDING:
|
case MGMT_EVT_OP_IMG_MGMT_DFU_PENDING:
|
||||||
|
if (!dfu_led_active)
|
||||||
|
{
|
||||||
dfu_led_active = true;
|
dfu_led_active = true;
|
||||||
led_ble_solid();
|
led_dfu_progress();
|
||||||
|
}
|
||||||
k_work_cancel_delayable(&dfu_watchdog_work);
|
k_work_cancel_delayable(&dfu_watchdog_work);
|
||||||
|
|
||||||
#if NRF_POWER_HAS_GPREGRET
|
#if NRF_POWER_HAS_GPREGRET
|
||||||
|
|||||||
@@ -33,21 +33,23 @@ static const struct gpio_dt_spec function_led = GPIO_DT_SPEC_GET(FUNCTION_LED_NO
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t on_ms;
|
uint32_t on_ms;
|
||||||
uint32_t off_ms;
|
uint32_t off_ms;
|
||||||
uint8_t color;
|
uint8_t on_color;
|
||||||
|
uint8_t off_color;
|
||||||
bool repeat;
|
bool repeat;
|
||||||
} led_pattern_t;
|
} led_pattern_t;
|
||||||
|
|
||||||
static const led_pattern_t m_patterns[LED_STATE_COUNT] = {
|
static const led_pattern_t m_patterns[LED_STATE_COUNT] = {
|
||||||
[LED_STATE_OFF] = { 0, 0, COLOR_NONE, false },
|
[LED_STATE_OFF] = { 0, 0, COLOR_NONE, COLOR_NONE, false },
|
||||||
[LED_STATE_POWER_ON] = { 2000, 0, COLOR_GREEN, false },
|
[LED_STATE_POWER_ON] = { 2000, 0, COLOR_GREEN, COLOR_NONE, false },
|
||||||
[LED_STATE_POWER_OFF] = { 2000, 0, COLOR_GREEN, false },
|
[LED_STATE_POWER_OFF] = { 2000, 0, COLOR_GREEN, COLOR_NONE, false },
|
||||||
[LED_STATE_ADVERTISING] = { 500, 500, COLOR_GREEN, true },
|
[LED_STATE_ADVERTISING] = { 500, 500, COLOR_GREEN, COLOR_NONE, true },
|
||||||
[LED_STATE_DETACH_WARNING] = { 1000, 3000, COLOR_GREEN, true },
|
[LED_STATE_DETACH_WARNING] = { 1000, 3000, COLOR_GREEN, COLOR_NONE, true },
|
||||||
[LED_STATE_ALIGN_SEARCHING] = { 1000, 1000, COLOR_ORANGE, true },
|
[LED_STATE_ALIGN_SEARCHING] = { 1000, 1000, COLOR_ORANGE, COLOR_NONE, true },
|
||||||
[LED_STATE_ALIGN_COMPLETE] = { 0, 0, COLOR_GREEN, false },
|
[LED_STATE_ALIGN_COMPLETE] = { 0, 0, COLOR_GREEN, COLOR_NONE, false },
|
||||||
[LED_STATE_ERROR] = { 0, 0, COLOR_ORANGE, true },
|
[LED_STATE_ERROR] = { 0, 0, COLOR_ORANGE, COLOR_NONE, true },
|
||||||
[LED_STATE_BOND_DELETE] = { 1000, 0, COLOR_ORANGE, false },
|
[LED_STATE_BOND_DELETE] = { 2000, 0, COLOR_ORANGE, COLOR_NONE, false },
|
||||||
[LED_STATE_BOND_DELETE_PENDING] = { 500, 500, COLOR_ORANGE, true },
|
[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 */
|
/* Module variables */
|
||||||
@@ -141,8 +143,8 @@ static void led_timer_handler(struct k_timer *timer)
|
|||||||
|
|
||||||
if (m_phase_on)
|
if (m_phase_on)
|
||||||
{
|
{
|
||||||
// ON -> OFF transition
|
// ON -> OFF/alternate transition
|
||||||
led_all_off();
|
led_color_on(p->off_color);
|
||||||
m_phase_on = false;
|
m_phase_on = false;
|
||||||
|
|
||||||
if (p->off_ms > 0)
|
if (p->off_ms > 0)
|
||||||
@@ -163,7 +165,7 @@ static void led_timer_handler(struct k_timer *timer)
|
|||||||
// OFF -> ON transition
|
// OFF -> ON transition
|
||||||
if (p->repeat)
|
if (p->repeat)
|
||||||
{
|
{
|
||||||
led_color_on(p->color);
|
led_color_on(p->on_color);
|
||||||
m_phase_on = true;
|
m_phase_on = true;
|
||||||
timer_start_ms(p->on_ms);
|
timer_start_ms(p->on_ms);
|
||||||
}
|
}
|
||||||
@@ -202,7 +204,7 @@ void led_set_state(led_state_t state)
|
|||||||
error_pattern_start();
|
error_pattern_start();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
led_color_on(p->color);
|
led_color_on(p->on_color);
|
||||||
m_phase_on = true;
|
m_phase_on = true;
|
||||||
|
|
||||||
if (p->on_ms > 0)
|
if (p->on_ms > 0)
|
||||||
@@ -226,3 +228,8 @@ void led_ble_solid(void)
|
|||||||
led_ble_on();
|
led_ble_on();
|
||||||
m_current_state = LED_STATE_OFF; // no pattern running
|
m_current_state = LED_STATE_OFF; // no pattern running
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void led_dfu_progress(void)
|
||||||
|
{
|
||||||
|
led_set_state(LED_STATE_DFU_PROGRESS);
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ typedef enum
|
|||||||
LED_STATE_ERROR, // 7: Orange 3Hz x3 / 1s off
|
LED_STATE_ERROR, // 7: Orange 3Hz x3 / 1s off
|
||||||
LED_STATE_BOND_DELETE, // Bond Delete: Orange on
|
LED_STATE_BOND_DELETE, // Bond Delete: Orange on
|
||||||
LED_STATE_BOND_DELETE_PENDING, // Bond Delete Pending: Orange blink 500ms/500ms
|
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_COUNT
|
||||||
} led_state_t;
|
} led_state_t;
|
||||||
|
|
||||||
@@ -32,5 +33,6 @@ void led_init(void);
|
|||||||
void led_set_state(led_state_t state);
|
void led_set_state(led_state_t state);
|
||||||
led_state_t led_get_state(void);
|
led_state_t led_get_state(void);
|
||||||
void led_ble_solid(void);
|
void led_ble_solid(void);
|
||||||
|
void led_dfu_progress(void);
|
||||||
|
|
||||||
#endif /* LED_CONTROL_H__ */
|
#endif /* LED_CONTROL_H__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user