| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | 
							- #include "d_inouts.h"
 
- #include "gpio.h"
 
- #include "FreeRTOS.h"
 
- #include "task.h"
 
- #include "semphr.h"
 
- #ifdef PRINTF_STDLIB
 
- #include <stdio.h>
 
- #endif
 
- #ifdef PRINTF_CUSTOM
 
- #include "tinystdio.h"
 
- #endif
 
- #ifdef INOUTS_ENABLE
 
- #define INOUTS_EXPAND_AS_GPIO_GET(id, ...) 		\
 
- 		inputs[id - DIN1] = gpio_get(id);
 
- #define OUTPUTS_EXPAND_AS_GPIO_SET(id, ...) 		\
 
- 		gpio_set(id, outputs[id - DOUT1]);
 
- #define UPDATE_INPUTS() \
 
- 	DI_TABLE(INOUTS_EXPAND_AS_GPIO_GET) \
 
- #define APPLY_OUTPUTS() \
 
- 	RELAYS(OUTPUTS_EXPAND_AS_GPIO_SET)
 
- uint8_t  inputs[INPUTS_TOTAL_COUNT], outputs[OUTPUTS_TOTAL_COUNT];
 
- /* data actuality mutexes */
 
- static SemaphoreHandle_t outputs_mutex, inputs_mutex;
 
- uint8_t get_state_din_outs(gpio_t pin) {
 
- 	uint8_t res = 0;
 
- 	res = gpio_get(pin);
 
- 	return res;
 
- }
 
- void set_state_douts(gpio_t pin, uint8_t value)
 
- {
 
- 	gpio_set(pin, value);
 
- }
 
- void d_inouts_task(void *arg) {
 
- 	inputs_mutex  = xSemaphoreCreateMutex();
 
- 	outputs_mutex = xSemaphoreCreateMutex();
 
- 	while(true) {
 
- 		if (xSemaphoreTake(inputs_mutex, 100)) {
 
- 			UPDATE_INPUTS();
 
- 			xSemaphoreGive(inputs_mutex);
 
- 		}
 
- 		if (xSemaphoreTake(outputs_mutex, 100)) {
 
- 			APPLY_OUTPUTS();
 
- 			xSemaphoreGive(outputs_mutex);
 
- 		}
 
- 		vTaskDelay(50);
 
- 	}
 
- }
 
- /* 
 
-  * get state of discrete inputs;
 
-  ** parameters
 
-  * 	inputs_p - a pointer to array of size INPUTS_TOTAL_COUNT in which inputs 
 
-  * 	states must be stored;
 
-  ** return value:
 
-  * 	true if inputs states read successfully
 
-  *
 
-  ** example:
 
-  * uint8_t inputs_state[INPUTS_TOTAL_COUNT]
 
-  * ...
 
-  * 	if (get_inputs(inputs_state))
 
-  *		... do smth ...
 
-  *	else
 
-  *		... do smth ...
 
-  */
 
- bool get_inputs(uint8_t *inputs_p) {
 
- 	bool res = 0;
 
- 	if (xSemaphoreTake(inputs_mutex, 100)) {
 
- 			memcpy(inputs_p, inputs, INPUTS_TOTAL_COUNT);
 
- 			res = 1;
 
- 			xSemaphoreGive(inputs_mutex);
 
- 	}
 
- 	return res;
 
- }
 
- /* 
 
-  * set outputs to a given state;
 
-  ** parameters:
 
-  * 	outputs_p - a pointer to array of size OUTPUTS_TOTAL_COUNT from which outputs
 
-  * 	states should be read;
 
-  ** return value:
 
-  * 	true if outputs applied successfully
 
-  ** example:
 
-  * uint8_t outputs_state[OUTPUTS_TOTAL_COUNT]
 
-  * ...
 
-  * 	if (set_outputs(outputs_state))
 
-  * 		... do smth ...
 
-  * 	else
 
-  * 		... do smth ...
 
-  */
 
- bool set_outputs(uint8_t *outputs_p) {
 
- 	bool res = 0;
 
- 	if (xSemaphoreTake(outputs_mutex, 100)) {
 
- 			memcpy(outputs, outputs_p, OUTPUTS_TOTAL_COUNT);
 
- 			res = 1;
 
- 			xSemaphoreGive(outputs_mutex);
 
- 	}
 
- 	return res;
 
- }
 
- /* passed */
 
- void d_inouts_test(void *arg) {
 
- 	uint8_t tmp[INPUTS_TOTAL_COUNT] = {0};
 
- 	while (true) {
 
- 		if (get_inputs(tmp))
 
- 			set_outputs(tmp);
 
- 		vTaskDelay(50);
 
- 	}
 
- }
 
- 	
 
- #endif
 
 
  |