Skip to content

Commit e37a1d2

Browse files
committed
Initialize the hal task once in relay_init instead of re-initializing every time
Added defensive NULL checks for relay. Introduced RELAY_PULSE_MS macro for easier tuning.
1 parent fd53b95 commit e37a1d2

File tree

1 file changed

+40
-11
lines changed

1 file changed

+40
-11
lines changed

src/base_components/relay.c

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
#include "hal/printf_selector.h"
55
#include <stddef.h>
66

7+
#ifndef RELAY_PULSE_MS
8+
#define RELAY_PULSE_MS 125
9+
#endif
10+
711
// Handler to clear both pins after pulse
812
static void relay_clear_handler(void *arg)
913
{
@@ -30,14 +34,29 @@ static void relay_clear_handler(void *arg)
3034

3135
void relay_init(relay_t *relay)
3236
{
37+
if (relay == NULL)
38+
{
39+
return;
40+
}
41+
3342
// Mark that no task is active
3443
relay->clear_task_active = 0;
44+
45+
// Prepare the task structure once
46+
relay->clear_task.handler = relay_clear_handler;
47+
relay->clear_task.arg = relay;
48+
hal_tasks_init(&relay->clear_task);
49+
3550
//switch off relay
3651
relay_off(relay);
3752
}
3853

3954
void relay_on(relay_t *relay)
4055
{
56+
if (relay == NULL)
57+
{
58+
return;
59+
}
4160
printf("relay_on\r\n");
4261

4362
// Invalidate any pending task by clearing the flag
@@ -48,19 +67,19 @@ void relay_on(relay_t *relay)
4867
// Normal relay: drive continuously
4968
hal_gpio_write(relay->pin, relay->on_high);
5069
} else {
51-
//Bi-stable relay:
52-
// clear both pins first
70+
//Bi-stable relay:
71+
// - clear both pins first to ensure mutual exclusion
5372
hal_gpio_write(relay->pin, !relay->on_high);
5473
hal_gpio_write(relay->off_pin, !relay->on_high);
55-
// then pulse ON pin
74+
// then set ON pin
5675
hal_gpio_write(relay->pin, relay->on_high);
5776

58-
// Schedule task to clear both pins after 125ms
77+
// and schedule task to clear both pins after RELAY_PULSE_MS
5978
relay->clear_task.handler = relay_clear_handler;
6079
relay->clear_task.arg = relay;
6180
hal_tasks_init(&relay->clear_task);
6281
relay->clear_task_active = 1;
63-
hal_tasks_schedule(&relay->clear_task, 125);
82+
hal_tasks_schedule(&relay->clear_task, RELAY_PULSE_MS);
6483
}
6584

6685
relay->on = 1;
@@ -73,6 +92,10 @@ void relay_on(relay_t *relay)
7392

7493
void relay_off(relay_t *relay)
7594
{
95+
if (relay == NULL)
96+
{
97+
return;
98+
}
7699
printf("relay_off\r\n");
77100

78101
// Invalidate any pending task by clearing the flag
@@ -81,24 +104,25 @@ void relay_off(relay_t *relay)
81104
// Clear both pins first to ensure mutual exclusion
82105
hal_gpio_write(relay->pin, !relay->on_high);
83106

84-
if (!relay->off_pin)
107+
if (relay->off_pin)
85108
{
86109
// Normal relay: turn OFF
87110
hal_gpio_write(relay->pin, !relay->on_high);
88111
} else {
89-
//Bi-stable relay:
90-
// clear both pins first
112+
//Bi-stable relay:
113+
// - clear both pins first
91114
hal_gpio_write(relay->pin, !relay->on_high);
92115
hal_gpio_write(relay->off_pin, !relay->on_high);
93-
// then pulse OFF pin
116+
117+
// then set OFF pin
94118
hal_gpio_write(relay->off_pin, relay->on_high);
95119

96-
// Schedule task to clear both pins after 125ms
120+
// and schedule task to clear both pins after RELAY_PULSE_MS
97121
relay->clear_task.handler = relay_clear_handler;
98122
relay->clear_task.arg = relay;
99123
hal_tasks_init(&relay->clear_task);
100124
relay->clear_task_active = 1;
101-
hal_tasks_schedule(&relay->clear_task, 125);
125+
hal_tasks_schedule(&relay->clear_task, RELAY_PULSE_MS);
102126
}
103127

104128
relay->on = 0;
@@ -111,7 +135,12 @@ void relay_off(relay_t *relay)
111135

112136
void relay_toggle(relay_t *relay)
113137
{
138+
if (relay == NULL)
139+
{
140+
return;
141+
}
114142
printf("relay_toggle\r\n");
143+
115144
if (relay->on)
116145
{
117146
relay_off(relay);

0 commit comments

Comments
 (0)