agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
gpio.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_GPIO_H
8 #define ZRTOS_GPIO_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <stdarg.h>
15 
16 
17 #include <zrtos/error.h>
18 #include <zrtos/types.h>
19 #include <zrtos/arch.h>
20 #include <zrtos/assert.h>
21 
23 
24 typedef enum{
29 
32 
33 ZRTOS_ASSERT__STATIC(sizeof(zrtos_gpio_value_digital_t) <= sizeof(unsigned int));
34 ZRTOS_ASSERT__STATIC(sizeof(zrtos_gpio_mode_t) <= sizeof(unsigned int));
35 ZRTOS_ASSERT__STATIC(sizeof(zrtos_gpio_pin_t) <= sizeof(unsigned int));
36 
37 #define ZRTOS_GPIO__VA_ARG_MODE(args)\
38  ((zrtos_gpio_mode_t)va_arg(args,unsigned int))
39 #define ZRTOS_GPIO__VA_ARG_PIN(args)\
40  ((zrtos_gpio_pin_t)va_arg(args,unsigned int))
41 #define ZRTOS_GPIO__VA_ARG_VALUE_DIGITAL(args)\
42  ((zrtos_gpio_value_digital_t)va_arg(args,unsigned int))
43 #define ZRTOS_GPIO__VA_ARG_VALUE_ANALOG(args)\
44  ((zrtos_gpio_value_analog_t)va_arg(args,unsigned int))
45 
46 typedef struct _zrtos_gpio_t{
48  struct _zrtos_gpio_t *thiz
49  ,zrtos_gpio_pin_t pin
50  ,zrtos_gpio_mode_t mode
51  );
52 
54  struct _zrtos_gpio_t *thiz
55  ,zrtos_gpio_pin_t pin
56  ,zrtos_gpio_value_digital_t *val
57  );
59  struct _zrtos_gpio_t *thiz
60  ,zrtos_gpio_pin_t pin
61  ,zrtos_gpio_value_digital_t val
62  );
63 
65  struct _zrtos_gpio_t *thiz
66  ,zrtos_gpio_pin_t pin
67  ,zrtos_gpio_value_analog_t *val
68  );
70  struct _zrtos_gpio_t *thiz
71  ,zrtos_gpio_pin_t pin
72  ,zrtos_gpio_value_analog_t val
73  );
74 
75  //void *private_data;
77 
78 #define ZRTOS_GPIO__INIT(\
79  set_mode_\
80  ,digital_read_\
81  ,digital_write_\
82  ,analog_read_\
83  ,analog_write_\
84 )\
85  {\
86  .set_mode = set_mode_\
87  ,.digital_read = digital_read_\
88  ,.digital_write = digital_write_\
89  ,.analog_read = analog_read_\
90  ,.analog_write = analog_write_\
91  }
92 
94  zrtos_gpio_t *thiz
96  struct _zrtos_gpio_t *thiz
97  ,zrtos_gpio_pin_t pin
98  ,zrtos_gpio_mode_t mode
99  )
101  struct _zrtos_gpio_t *thiz
102  ,zrtos_gpio_pin_t pin
103  ,zrtos_gpio_value_digital_t *val
104  )
106  struct _zrtos_gpio_t *thiz
107  ,zrtos_gpio_pin_t pin
108  ,zrtos_gpio_value_digital_t val
109  )
111  struct _zrtos_gpio_t *thiz
112  ,zrtos_gpio_pin_t pin
113  ,zrtos_gpio_value_analog_t *val
114  )
116  struct _zrtos_gpio_t *thiz
117  ,zrtos_gpio_pin_t pin
118  ,zrtos_gpio_value_analog_t val
119  )
120 ){
121  thiz->set_mode = set_mode;
122  thiz->digital_read = digital_read;
124  thiz->analog_read = analog_read;
125  thiz->analog_write = analog_write;
126 
127  return true;
128 }
129 
131  zrtos_gpio_t *thiz
132  ,zrtos_gpio_pin_t pin
133  ,zrtos_gpio_mode_t mode
134 ){
135  return thiz->set_mode(thiz,pin,mode);
136 }
137 
139  zrtos_gpio_t *thiz
140  ,va_list args
141 ){
143  zrtos_gpio_pin_t pin;
144  zrtos_gpio_mode_t val;
145  size_t len = va_arg(args,size_t);
146 
147  while(len-- && zrtos_error__is_success(ret)){
148  pin = ZRTOS_GPIO__VA_ARG_PIN(args);
149  val = ZRTOS_GPIO__VA_ARG_MODE(args);
150  ret = zrtos_gpio__set_mode(
151  thiz
152  ,pin
153  ,val
154  );
155  }
156 
157  return ret;
158 }
159 
161  zrtos_gpio_t *thiz
162  ,...
163 ){
164  zrtos_error_t ret;
165  va_list args;
166 
167  va_start(args,thiz);
169  thiz
170  ,args
171  );
172  va_end(args);
173 
174  return ret;
175 }
176 
178  zrtos_gpio_t *thiz
179  ,zrtos_gpio_pin_t pin
180  ,zrtos_gpio_value_digital_t *val
181 ){
182  return thiz->digital_read(thiz,pin,val);
183 }
184 
186  zrtos_gpio_t *thiz
187  ,va_list args
188 ){
190  zrtos_gpio_pin_t pin;
191  zrtos_gpio_value_digital_t *val;
192  size_t len = va_arg(args,size_t);
193 
194  while(len-- && zrtos_error__is_success(ret)){
195  pin = ZRTOS_GPIO__VA_ARG_PIN(args);
196  val = va_arg(args,zrtos_gpio_value_digital_t*);
198  thiz
199  ,pin
200  ,val
201  );
202  }
203 
204  return ret;
205 }
206 
208  zrtos_gpio_t *thiz
209  ,...
210 ){
211  zrtos_error_t ret;
212  va_list args;
213 
214  va_start(args,thiz);
216  thiz
217  ,args
218  );
219  va_end(args);
220 
221  return ret;
222 }
223 
225  zrtos_gpio_t *thiz
226  ,zrtos_gpio_pin_t pin
227  ,zrtos_gpio_value_digital_t val
228 ){
229  return thiz->digital_write(thiz,pin,val);
230 }
231 
233  zrtos_gpio_t *thiz
234  ,va_list args
235 ){
237  zrtos_gpio_pin_t pin;
238  zrtos_gpio_value_digital_t val;
239  size_t len = va_arg(args,size_t);
240 
241  while(len-- && zrtos_error__is_success(ret)){
242  pin = ZRTOS_GPIO__VA_ARG_PIN(args);
245  thiz
246  ,pin
247  ,val
248  );
249  }
250 
251  return ret;
252 }
253 
255  zrtos_gpio_t *thiz
256  ,...
257 ){
258  zrtos_error_t ret;
259  va_list args;
260 
261  va_start(args,thiz);
263  thiz
264  ,args
265  );
266  va_end(args);
267 
268  return ret;
269 }
270 
272  zrtos_gpio_t *thiz
273  ,zrtos_gpio_pin_t pin
274 ){
276  thiz
277  ,pin
278  ,true
279  );
280 }
281 
283  zrtos_gpio_t *thiz
284  ,va_list args
285 ){
287  zrtos_gpio_pin_t pin;
288  size_t len = va_arg(args,size_t);
289 
290  while(len-- && zrtos_error__is_success(ret)){
291  pin = ZRTOS_GPIO__VA_ARG_PIN(args);
292  ret = zrtos_gpio__set_high(
293  thiz
294  ,pin
295  );
296  }
297 
298  return ret;
299 }
300 
302  zrtos_gpio_t *thiz
303  ,...
304 ){
305  zrtos_error_t ret;
306  va_list args;
307 
308  va_start(args,thiz);
310  thiz
311  ,args
312  );
313  va_end(args);
314 
315  return ret;
316 }
317 
319  zrtos_gpio_t *thiz
320  ,zrtos_gpio_pin_t pin
321 ){
322  return thiz->digital_write(
323  thiz
324  ,pin
325  ,false
326  );
327 }
328 
330  zrtos_gpio_t *thiz
331  ,va_list args
332 ){
334  zrtos_gpio_pin_t pin;
335  size_t len = va_arg(args,size_t);
336 
337  while(len-- && zrtos_error__is_success(ret)){
338  pin = ZRTOS_GPIO__VA_ARG_PIN(args);
339  ret = zrtos_gpio__set_low(
340  thiz
341  ,pin
342  );
343  }
344 
345  return ret;
346 }
347 
349  zrtos_gpio_t *thiz
350  ,...
351 ){
352  zrtos_error_t ret;
353  va_list args;
354 
355  va_start(args,thiz);
357  thiz
358  ,args
359  );
360  va_end(args);
361 
362  return ret;
363 }
364 
366  zrtos_gpio_t *thiz
367  ,zrtos_gpio_pin_t pin
368  ,zrtos_gpio_value_analog_t *val
369 ){
370  return thiz->analog_read(thiz,pin,val);
371 }
372 
374  zrtos_gpio_t *thiz
375  ,va_list args
376 ){
378  zrtos_gpio_pin_t pin;
379  zrtos_gpio_value_analog_t *val;
380  size_t len = va_arg(args,size_t);
381 
382  while(len-- && zrtos_error__is_success(ret)){
383  pin = ZRTOS_GPIO__VA_ARG_PIN(args);
384  val = va_arg(args,zrtos_gpio_value_analog_t*);
386  thiz
387  ,pin
388  ,val
389  );
390  }
391 
392  return ret;
393 }
394 
396  zrtos_gpio_t *thiz
397  ,...
398 ){
399  zrtos_error_t ret;
400  va_list args;
401 
402  va_start(args,thiz);
404  thiz
405  ,args
406  );
407  va_end(args);
408 
409  return ret;
410 }
411 
413  zrtos_gpio_t *thiz
414  ,zrtos_gpio_pin_t pin
415  ,zrtos_gpio_value_analog_t val
416 ){
417  return thiz->analog_write(thiz,pin,val);
418 }
419 
421  zrtos_gpio_t *thiz
422  ,va_list args
423 ){
425  zrtos_gpio_pin_t pin;
426  zrtos_gpio_value_analog_t val;
427  size_t len = va_arg(args,size_t);
428 
429  while(len-- && zrtos_error__is_success(ret)){
430  pin = ZRTOS_GPIO__VA_ARG_PIN(args);
433  thiz
434  ,pin
435  ,val
436  );
437  }
438 
439  return ret;
440 }
441 
443  zrtos_gpio_t *thiz
444  ,...
445 ){
446  zrtos_error_t ret;
447  va_list args;
448 
449  va_start(args,thiz);
451  thiz
452  ,args
453  );
454  va_end(args);
455 
456  return ret;
457 }
458 
460  zrtos_gpio_t *thiz
461  ,zrtos_gpio_pin_t dataPin
462  ,zrtos_gpio_pin_t clockPin
463  ,bool is_lsb
464 ){
465  uint8_t value = 0;
466  size_t i;
467  zrtos_gpio_value_digital_t val;
468 
469  for (i = 0; i < 8; ++i) {
470  zrtos_gpio__set_high(thiz,clockPin);
471  zrtos_gpio__digital_read(thiz,dataPin,&val);
472  if(is_lsb){
473  value |= val << i;
474  }else{
475  value |= val << (7 - i);
476  }
477  zrtos_gpio__set_low(thiz,clockPin);
478  }
479  return value;
480 }
481 
483  zrtos_gpio_t *thiz
484  ,zrtos_gpio_pin_t dataPin
485  ,zrtos_gpio_pin_t clockPin
486  ,bool is_lsb
487  ,uint8_t value
488 ){
489  size_t i;
490  zrtos_gpio_value_digital_t val;
491 
492  for(i = 0; i < 8; i++){
493  if(is_lsb){
494  val = (value & 1);
495  value >>= 1;
496  } else {
497  val = ((value & 128) != 0);
498  value <<= 1;
499  }
500  zrtos_gpio__digital_write(thiz,dataPin,val);
501  zrtos_gpio__set_high(thiz,clockPin);
502  zrtos_gpio__set_low(thiz,clockPin);
503  }
504 
505  return ZRTOS_ERROR__SUCCESS;
506 }
507 
510 }
511 
514 }
515 
516 #undef ZRTOS_GPIO__VA_ARG_MODE
517 #undef ZRTOS_GPIO__VA_ARG_PIN
518 #undef ZRTOS_GPIO__VA_ARG_VALUE_DIGITAL
519 #undef ZRTOS_GPIO__VA_ARG_VALUE_ANALOG
520 
521 
522 #ifdef __cplusplus
523 }
524 #endif
525 #endif
zrtos_error_t zrtos_gpio__analog_write(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_analog_t val)
Definition: gpio.h:412
#define ZRTOS_GPIO__VA_ARG_MODE(args)
Definition: gpio.h:37
zrtos_error_t(* analog_write)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_analog_t val)
Definition: gpio.h:69
#define ZRTOS_GPIO__VA_ARG_PIN(args)
Definition: gpio.h:39
zrtos_error_t zrtos_gpio__digital_read_ex(zrtos_gpio_t *thiz,...)
Definition: gpio.h:207
bool zrtos_gpio_value_digital_t
Definition: gpio.h:30
uint8_t zrtos_gpio__shift_in(zrtos_gpio_t *thiz, zrtos_gpio_pin_t dataPin, zrtos_gpio_pin_t clockPin, bool is_lsb)
Definition: gpio.h:459
zrtos_error_t zrtos_gpio__set_high_va(zrtos_gpio_t *thiz, va_list args)
Definition: gpio.h:282
zrtos_error_t zrtos_gpio__set_mode_va(zrtos_gpio_t *thiz, va_list args)
Definition: gpio.h:138
void zrtos_arch__delay_microseconds(uint16_t us)
Definition: atmega2560.h:296
zrtos_error_t zrtos_gpio__shift_out(zrtos_gpio_t *thiz, zrtos_gpio_pin_t dataPin, zrtos_gpio_pin_t clockPin, bool is_lsb, uint8_t value)
Definition: gpio.h:482
void zrtos_gpio__delay_microseconds(uint16_t us)
Definition: gpio.h:508
zrtos_error_t zrtos_gpio__analog_read(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_analog_t *val)
Definition: gpio.h:365
zrtos_error_t zrtos_gpio__set_mode(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_mode_t mode)
Definition: gpio.h:130
zrtos_error_t zrtos_gpio__set_low_ex(zrtos_gpio_t *thiz,...)
Definition: gpio.h:348
zrtos_error_t(* digital_write)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_digital_t val)
Definition: gpio.h:58
zrtos_gpio_mode_t
Definition: gpio.h:24
void zrtos_arch__delay_milliseconds(uint16_t ms)
Definition: atmega2560.h:300
zrtos_arch_gpio_pin_t zrtos_gpio_pin_t
Definition: gpio.h:22
struct _zrtos_gpio_t zrtos_gpio_t
zrtos_error_t(* set_mode)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_mode_t mode)
Definition: gpio.h:47
zrtos_error_t zrtos_gpio__digital_read_va(zrtos_gpio_t *thiz, va_list args)
Definition: gpio.h:185
zrtos_error_t(* analog_read)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_analog_t *val)
Definition: gpio.h:64
#define ZRTOS_GPIO__VA_ARG_VALUE_DIGITAL(args)
Definition: gpio.h:41
ZRTOS_ASSERT__STATIC(sizeof(zrtos_gpio_value_digital_t)<=sizeof(unsigned int))
zrtos_error_t zrtos_gpio__analog_read_va(zrtos_gpio_t *thiz, va_list args)
Definition: gpio.h:373
bool zrtos_error__is_success(zrtos_error_t thiz)
Definition: error.h:152
uint16_t zrtos_arch_gpio_value_analog_t
Definition: atmega2560.h:22
Successful program execution status.
Definition: error.h:22
#define ZRTOS_GPIO__VA_ARG_VALUE_ANALOG(args)
Definition: gpio.h:43
zrtos_error_t zrtos_gpio__set_low_va(zrtos_gpio_t *thiz, va_list args)
Definition: gpio.h:329
zrtos_error_t zrtos_gpio__digital_read(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_digital_t *val)
Definition: gpio.h:177
zrtos_error_t zrtos_gpio__analog_write_va(zrtos_gpio_t *thiz, va_list args)
Definition: gpio.h:420
zrtos_arch_gpio_value_analog_t zrtos_gpio_value_analog_t
Definition: gpio.h:31
zrtos_error_t zrtos_gpio__set_high_ex(zrtos_gpio_t *thiz,...)
Definition: gpio.h:301
zrtos_error_t zrtos_gpio__set_mode_ex(zrtos_gpio_t *thiz,...)
Definition: gpio.h:160
zrtos_error_t(* digital_read)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_digital_t *val)
Definition: gpio.h:53
zrtos_error_t zrtos_gpio__analog_write_ex(zrtos_gpio_t *thiz,...)
Definition: gpio.h:442
bool zrtos_gpio__init(zrtos_gpio_t *thiz, zrtos_error_t(*set_mode)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_mode_t mode), zrtos_error_t(*digital_read)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_digital_t *val), zrtos_error_t(*digital_write)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_digital_t val), zrtos_error_t(*analog_read)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_analog_t *val), zrtos_error_t(*analog_write)(struct _zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_analog_t val))
Definition: gpio.h:93
static uint8_t
Definition: mcp2515.h:159
zrtos_error_t zrtos_gpio__set_high(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin)
Definition: gpio.h:271
zrtos_error_t zrtos_gpio__digital_write_ex(zrtos_gpio_t *thiz,...)
Definition: gpio.h:254
zrtos_error_t
Definition: error.h:20
void zrtos_gpio__delay_milliseconds(uint16_t ms)
Definition: gpio.h:512
zrtos_error_t zrtos_gpio__digital_write(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_value_digital_t val)
Definition: gpio.h:224
zrtos_error_t zrtos_gpio__digital_write_va(zrtos_gpio_t *thiz, va_list args)
Definition: gpio.h:232
uint8_t zrtos_arch_gpio_pin_t
Definition: atmega2560.h:21
zrtos_error_t zrtos_gpio__analog_read_ex(zrtos_gpio_t *thiz,...)
Definition: gpio.h:395
zrtos_error_t zrtos_gpio__set_low(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin)
Definition: gpio.h:318