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
812static void relay_clear_handler (void * arg )
913{
@@ -30,14 +34,29 @@ static void relay_clear_handler(void *arg)
3034
3135void 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
3954void 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
7493void 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
112136void 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