Skip to content

Commit 46e32f6

Browse files
committed
app: led: Add LED pattern for FOTA
Add pattern (purple blinking) when FOTA image is downloading. Signed-off-by: Jan Tore Guggedal <[email protected]>
1 parent b1e3958 commit 46e32f6

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

app/src/modules/led/led.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ ZBUS_CHAN_ADD_OBS(CONFIG_CHAN, led, 0);
2929
ZBUS_CHAN_ADD_OBS(NETWORK_CHAN, led, 0);
3030
ZBUS_CHAN_ADD_OBS(TRIGGER_MODE_CHAN, led, 0);
3131
ZBUS_CHAN_ADD_OBS(LOCATION_CHAN, led, 0);
32+
ZBUS_CHAN_ADD_OBS(FOTA_STATUS_CHAN, led, 0);
3233

3334
/* Zephyr SMF states */
3435
enum state {
@@ -41,6 +42,8 @@ enum state {
4142
STATE_POLL,
4243
/* Sub-state to STATE_LED_NOT_SET */
4344
STATE_NORMAL,
45+
/* Sub-state to STATE_LED_NOT_SET */
46+
STATE_FOTA,
4447
STATE_ERROR,
4548
};
4649

@@ -331,6 +334,15 @@ static void led_not_set_running(void *o)
331334
smf_set_state(SMF_CTX(user_object), &states[STATE_LED_SET]);
332335
return;
333336
}
337+
338+
if (&FOTA_STATUS_CHAN == user_object->chan) {
339+
const enum fota_status *status = zbus_chan_const_msg(user_object->chan);
340+
341+
if (*status == FOTA_STATUS_START) {
342+
smf_set_state(SMF_CTX(user_object), &states[STATE_FOTA]);
343+
return;
344+
}
345+
}
334346
}
335347

336348
/* STATE_POLL */
@@ -415,6 +427,43 @@ static void normal_running(void *o)
415427
}
416428
}
417429

430+
/* STATE_FOTA */
431+
432+
static void fota_entry(void *o)
433+
{
434+
ARG_UNUSED(o);
435+
436+
LOG_DBG("fota_entry");
437+
438+
transition_list_clear();
439+
transition_list_append(LED_FOTA, HOLD_FOREVER, 0, 0, 0);
440+
441+
k_work_reschedule(&led_pattern_update_work, K_NO_WAIT);
442+
}
443+
444+
static void fota_running(void *o)
445+
{
446+
struct s_object *user_object = o;
447+
448+
LOG_DBG("fota_running");
449+
450+
if (&FOTA_STATUS_CHAN == user_object->chan) {
451+
const enum fota_status *status = zbus_chan_const_msg(user_object->chan);
452+
453+
if (*status == FOTA_STATUS_STOP) {
454+
smf_set_state(SMF_CTX(user_object), &states[STATE_LED_NOT_SET]);
455+
return;
456+
}
457+
}
458+
459+
/* We do not want to change LED pattern while downloading FOTA image */
460+
if ((&TRIGGER_MODE_CHAN == user_object->chan) ||
461+
(&LOCATION_CHAN == user_object->chan)) {
462+
smf_set_handled(SMF_CTX(&user_object));
463+
return;
464+
}
465+
}
466+
418467
/* STATE_ERROR */
419468

420469
static void error_entry(void *o)
@@ -469,6 +518,13 @@ static const struct smf_state states[] = {
469518
&states[STATE_LED_NOT_SET],
470519
NULL
471520
),
521+
[STATE_FOTA] = SMF_CREATE_STATE(
522+
fota_entry,
523+
fota_running,
524+
NULL,
525+
&states[STATE_LED_NOT_SET],
526+
NULL
527+
),
472528
[STATE_ERROR] = SMF_CREATE_STATE(
473529
error_entry,
474530
NULL,

app/src/modules/led/led.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ extern "C" {
5656
#define LED_LTE_CONNECTING_COLOR LED_COLOR_YELLOW
5757
#define LED_LOCATION_SEARCHING_COLOR LED_COLOR_GREEN
5858
#define LED_POLL_MODE_COLOR LED_COLOR_BLUE
59+
#define LED_FOTA_COLOR LED_COLOR_PURPLE
5960
#define LED_ERROR_SYSTEM_FAULT_COLOR LED_COLOR_RED
6061
#define LED_OFF_COLOR LED_COLOR_OFF
6162

@@ -66,6 +67,7 @@ enum led_state {
6667
LED_LOCATION_SEARCHING,
6768
LED_ERROR_SYSTEM_FAULT,
6869
LED_ERROR_IRRECOVERABLE,
70+
LED_FOTA,
6971
LED_CONFIGURED,
7072
LED_OFF,
7173
LED_PATTERN_COUNT,

app/src/modules/led/led_pwm.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ static const struct led_effect effect[] = {
7070
LED_OFF_PERIOD_NORMAL,
7171
LED_LOCATION_SEARCHING_COLOR
7272
),
73+
[LED_FOTA] = LED_EFFECT_LED_BREATHE(
74+
LED_ON_PERIOD_NORMAL,
75+
LED_OFF_PERIOD_NORMAL,
76+
LED_FOTA_COLOR
77+
),
7378
[LED_ERROR_SYSTEM_FAULT] = LED_EFFECT_LED_BREATHE(
7479
LED_ON_PERIOD_ERROR,
7580
LED_OFF_PERIOD_ERROR,

docs/about.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ The following table describes the supported LED states:
2525
+----------------+------------+----------------------------------------------+-----------------------------------------------------+
2626
| Blinking slow | Blue | Device is actively polling cloud | 10 minutes after last config update or button press |
2727
+----------------+------------+----------------------------------------------+-----------------------------------------------------+
28+
| Blinking | Purple | Device is downloading FOTA image | Until the download has completed or failed |
29+
+----------------+------------+----------------------------------------------+-----------------------------------------------------+
2830
| Solid | Configured | Device has received an LED configuration | NA |
2931
+----------------+------------+----------------------------------------------+-----------------------------------------------------+
3032
| Blinking rapid | Red | Fatal error, the device will reboot | NA |

0 commit comments

Comments
 (0)