30
30
#include "rp2040_sys.h"
31
31
#include "trace.h"
32
32
33
+ #define INVALID_MODE_ATOM globalcontext_make_atom(ctx->global, ATOM_STR("\xC", "invalid_mode"))
34
+ #define INVALID_LEVEL_ATOM globalcontext_make_atom(ctx->global, ATOM_STR("\xD", "invalid_level"))
35
+ #define INVALID_PIN_ATOM globalcontext_make_atom(ctx->global, ATOM_STR("\xB", "invalid_pin"))
36
+
33
37
static const struct Nif * gpio_nif_get_nif (const char * nifname );
34
38
35
39
static const AtomStringIntPair pin_mode_table [] = {
@@ -105,7 +109,11 @@ static term nif_gpio_set_pin_mode(Context *ctx, int argc, term argv[])
105
109
int gpio_num = term_to_int (argv [0 ]);
106
110
int mode = interop_atom_term_select_int (pin_mode_table , argv [1 ], ctx -> global );
107
111
if (UNLIKELY (mode < 0 )) {
108
- return ERROR_ATOM ;
112
+ BEGIN_WITH_STACK_HEAP (TUPLE_SIZE (2 ), heap );
113
+ term ret = term_alloc_tuple (2 , & heap );
114
+ term_put_tuple_element (ret , 0 , ERROR_ATOM );
115
+ term_put_tuple_element (ret , 1 , INVALID_MODE_ATOM );
116
+ return ret ;
109
117
}
110
118
gpio_set_dir (gpio_num , mode );
111
119
return OK_ATOM ;
@@ -133,12 +141,20 @@ static term nif_gpio_digital_write(Context *ctx, int argc, term argv[])
133
141
if (term_is_integer (level_term )) {
134
142
level = term_to_int32 (level_term );
135
143
if (UNLIKELY ((level != 0 ) && (level != 1 ))) {
136
- return ERROR_ATOM ;
144
+ BEGIN_WITH_STACK_HEAP (TUPLE_SIZE (2 ), heap );
145
+ term ret = term_alloc_tuple (2 , & heap );
146
+ term_put_tuple_element (ret , 0 , ERROR_ATOM );
147
+ term_put_tuple_element (ret , 1 , INVALID_LEVEL_ATOM );
148
+ return ret ;
137
149
}
138
150
} else {
139
151
level = interop_atom_term_select_int (pin_level_table , level_term , ctx -> global );
140
152
if (UNLIKELY (level < 0 )) {
141
- return ERROR_ATOM ;
153
+ BEGIN_WITH_STACK_HEAP (TUPLE_SIZE (2 ), heap );
154
+ term ret = term_alloc_tuple (2 , & heap );
155
+ term_put_tuple_element (ret , 0 , ERROR_ATOM );
156
+ term_put_tuple_element (ret , 1 , INVALID_LEVEL_ATOM );
157
+ return ret ;
142
158
}
143
159
}
144
160
@@ -150,12 +166,20 @@ static term nif_gpio_digital_write(Context *ctx, int argc, term argv[])
150
166
} else if (term_is_atom (gpio_pin )) {
151
167
gpio_num = interop_atom_term_select_int (wl_pin_table , gpio_pin , ctx -> global );
152
168
if (UNLIKELY ((gpio_num == -1 ) || (gpio_num > 1 ))) {
153
- return ERROR_ATOM ;
169
+ BEGIN_WITH_STACK_HEAP (TUPLE_SIZE (2 ), heap );
170
+ term ret = term_alloc_tuple (2 , & heap );
171
+ term_put_tuple_element (ret , 0 , ERROR_ATOM );
172
+ term_put_tuple_element (ret , 1 , INVALID_PIN_ATOM );
173
+ return ret ;
154
174
}
155
175
cyw43_arch_gpio_put (gpio_num , level );
156
176
#endif
157
177
} else {
158
- return ERROR_ATOM ;
178
+ BEGIN_WITH_STACK_HEAP (TUPLE_SIZE (2 ), heap );
179
+ term ret = term_alloc_tuple (2 , & heap );
180
+ term_put_tuple_element (ret , 0 , ERROR_ATOM )
181
+ term_put_tuple_element (ret , 1 , INVALID_PIN_ATOM );
182
+ return ret ;
159
183
}
160
184
161
185
return OK_ATOM ;
@@ -176,12 +200,20 @@ static term nif_gpio_digital_read(Context *ctx, int argc, term argv[])
176
200
} else if (term_is_atom (gpio_pin )) {
177
201
gpio_num = interop_atom_term_select_int (wl_pin_table , gpio_pin , ctx -> global );
178
202
if (UNLIKELY ((gpio_num != 2 ))) {
179
- return ERROR_ATOM ;
203
+ BEGIN_WITH_STACK_HEAP (TUPLE_SIZE (2 ), heap );
204
+ term ret = term_alloc_tuple (2 , & heap );
205
+ term_put_tuple_element (ret , 0 , ERROR_ATOM );
206
+ term_put_tuple_element (ret , 1 , INVALID_PIN_ATOM );
207
+ return ret ;
180
208
}
181
209
level = cyw43_arch_gpio_get (gpio_num );
182
210
#endif
183
211
} else {
184
- return ERROR_ATOM ;
212
+ BEGIN_WITH_STACK_HEAP (TUPLE_SIZE (2 ), heap );
213
+ term ret = term_alloc_tuple (2 , & heap );
214
+ term_put_tuple_element (ret , 0 , ERROR_ATOM )
215
+ term_put_tuple_element (ret , 1 , INVALID_PIN_ATOM );
216
+ return ret ;
185
217
}
186
218
187
219
return level ? globalcontext_make_atom (ctx -> global , ATOM_STR ("\x4" , "high" )) : globalcontext_make_atom (ctx -> global , ATOM_STR ("\x3" , "low" ));
0 commit comments