Morse Micro IoT SDK  2.13.1
relay_mode_led.c
1/*
2 * Copyright 2026 Morse Micro
3 *
4 * This file is licensed under terms that can be found in the LICENSE.md file in the root
5 * directory of the Morse Micro IoT SDK software package.
6 */
7
8#include "relay_mode_led.h"
9
10#include "mmhal_app.h"
11#include "mmosal.h"
12#include "mmutils.h"
13#include "mmwlan.h"
14
16#define CONNECTING_BLINK_PERIOD_MS 1000
17
19#define DEPTH_PULSE_MS 150
20
22#define DEPTH_PULSE_PAUSE_MS 4000
23
25#define LED_TASK_IDLE_POLL_MS 200
26
28enum relay_led_mode
29{
31 RELAY_LED_MODE_CONNECTING,
33 RELAY_LED_MODE_CONNECTED,
35 RELAY_LED_MODE_FAILED,
36};
37
38static struct mmosal_task *led_task;
39
41static enum relay_led_mode led_mode = RELAY_LED_MODE_CONNECTING;
42
44static uint8_t led_depth = MMWLAN_RELAY_DEPTH_UNKNOWN;
45
50static void led_task_main(void *arg)
51{
52 MM_UNUSED(arg);
53
54 while (true)
55 {
56 /* Clear LED for ease of state management */
57 mmhal_set_led(LED_RED, LED_OFF);
58 mmhal_set_led(LED_GREEN, LED_OFF);
59 mmhal_set_led(LED_BLUE, LED_OFF);
60
61 switch (led_mode)
62 {
63 case RELAY_LED_MODE_CONNECTING:
64 mmhal_set_led(LED_BLUE, LED_ON);
65 mmosal_task_sleep(CONNECTING_BLINK_PERIOD_MS);
66 mmhal_set_led(LED_BLUE, LED_OFF);
67 mmosal_task_sleep(CONNECTING_BLINK_PERIOD_MS);
68 break;
69
70 case RELAY_LED_MODE_CONNECTED:
71 if (led_depth == MMWLAN_RELAY_DEPTH_UNKNOWN)
72 {
73 if (mmwlan_get_sta_state() != MMWLAN_STA_CONNECTED)
74 {
76 break;
77 }
78 mmhal_set_led(LED_BLUE, LED_ON);
79 mmosal_task_sleep(LED_TASK_IDLE_POLL_MS);
80 }
81 else if (led_depth == 0)
82 {
83 mmhal_set_led(LED_GREEN, LED_ON);
84 mmosal_task_sleep(LED_TASK_IDLE_POLL_MS);
85 }
86 else
87 {
88 uint8_t depth = led_depth;
89
90 for (size_t i = 0; i < depth && led_mode == RELAY_LED_MODE_CONNECTED; i++)
91 {
92 mmhal_set_led(LED_GREEN, LED_ON);
93 mmosal_task_sleep(DEPTH_PULSE_MS);
94 mmhal_set_led(LED_GREEN, LED_OFF);
95 mmosal_task_sleep(DEPTH_PULSE_MS);
96 }
97 mmosal_task_sleep(DEPTH_PULSE_PAUSE_MS);
98 }
99 break;
100
101 case RELAY_LED_MODE_FAILED:
102 default:
103 mmhal_set_led(LED_RED, LED_ON);
104 mmosal_task_sleep(LED_TASK_IDLE_POLL_MS);
105 break;
106 }
107 }
108}
109
111{
112 MMOSAL_ASSERT(led_task == NULL);
113 led_task = mmosal_task_create(led_task_main, NULL, MMOSAL_TASK_PRI_LOW, 128, "relay_led");
114 MMOSAL_ASSERT(led_task != NULL);
115}
116
118{
119 led_mode = RELAY_LED_MODE_CONNECTING;
120}
121
123{
124 led_mode = RELAY_LED_MODE_CONNECTED;
125}
126
128{
129 led_mode = RELAY_LED_MODE_FAILED;
130}
131
132void relay_led_set_depth(uint8_t depth)
133{
134 led_depth = depth;
136}
#define LED_OFF
A value of 0 turns OFF an LED.
Definition: mmhal_app.h:44
void mmhal_set_led(uint8_t led, uint8_t level)
Set the specified LED to the requested level.
#define LED_ON
A value of 255 turns an LED ON fully.
Definition: mmhal_app.h:53
#define MMOSAL_ASSERT(expr)
Assert that the given expression evaluates to true and abort execution if not.
Definition: mmosal.h:1006
struct mmosal_task * mmosal_task_create(mmosal_task_fn_t task_fn, void *argument, enum mmosal_task_priority priority, unsigned stack_size_u32, const char *name)
Create a new task.
void mmosal_task_sleep(uint32_t duration_ms)
Sleep for a period of time, yielding during that time.
@ MMOSAL_TASK_PRI_LOW
Low priority.
Definition: mmosal.h:256
#define MM_UNUSED(_x)
Casts the given expression to void to avoid "unused" warnings from the compiler.
Definition: mmutils.h:70
#define MMWLAN_RELAY_DEPTH_UNKNOWN
Relay depth value returned when the depth is unknown.
Definition: mmwlan.h:2406
enum mmwlan_sta_state mmwlan_get_sta_state(void)
Gets the current WLAN STA state.
Optional LED status indication for the Relay Mode Example Application.
void relay_led_set_connected(void)
Indicates that the app has connected to Wi-Fi.
void relay_led_set_failed(void)
Indicates that the app has failed to connect.
void relay_led_set_depth(uint8_t depth)
Indicates the current relay depth by pulsing the green LED depth times.
void relay_led_init(void)
Initializes the LED status module and starts its background task.
void relay_led_set_connecting(void)
Indicates that the app is attempting to connect to Wi-Fi.