123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #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
- #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);
- }
- }
-
|