123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- #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 DINS_ENABLE
- #define INOUTS_EXPAND_AS_GPIO_GET(id, ...) \
- inputs[id - DIN1] = gpio_get(id);
- #define UPDATE_INPUTS() \
- DI_TABLE(INOUTS_EXPAND_AS_GPIO_GET) \
- uint8_t inputs[INPUTS_TOTAL_COUNT];
- /* data actuality mutexes */
- static SemaphoreHandle_t inputs_mutex;
- uint8_t get_state_din_outs(gpio_t pin) {
- uint8_t res = 0;
- res = gpio_get(pin);
- return res;
- }
- /*
- * 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;
- }
- #endif
- #ifdef DOUTS_ENABLE
- #define OUTPUTS_EXPAND_AS_GPIO_SET(id, ...) \
- gpio_set(id, outputs[id - DOUT1]);
- #define APPLY_OUTPUTS() \
- RELAYS(OUTPUTS_EXPAND_AS_GPIO_SET)
- uint8_t outputs[OUTPUTS_TOTAL_COUNT];
- /* data actuality mutexes */
- static SemaphoreHandle_t outputs_mutex;
- void set_state_douts(gpio_t pin, uint8_t value)
- {
- gpio_set(pin, value);
- }
- /*
- * 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;
- }
- #endif
- #ifdef DINS_ENABLE | DOUTS_ENABLE
- void d_inouts_task(void *arg) {
- #ifdef DINS_ENABLE
- inputs_mutex = xSemaphoreCreateMutex();
- #endif
- #ifdef DOUTS_ENABLE
- outputs_mutex = xSemaphoreCreateMutex();
- #endif
- while(true) {
- #ifdef DINS_ENABLE
- if (xSemaphoreTake(inputs_mutex, 100)) {
- UPDATE_INPUTS();
- xSemaphoreGive(inputs_mutex);
- }
- #endif
- #ifdef DOUTS_ENABLE
- if (xSemaphoreTake(outputs_mutex, 100)) {
- APPLY_OUTPUTS();
- xSemaphoreGive(outputs_mutex);
- }
- #endif
- vTaskDelay(50);
- }
- }
- #endif
- #if defined HARDWARE_BT6703
- char sn_bt_6702[] =
- "7030102\
- 7030105\
- 7030093\
- 7030103\
- 7030109\
- 7030091\
- 7030106\
- 7030099\
- 7030089\
- 7030114\
- 7030110\
- 7030111\
- 7030085\
- 7030112\
- 7030069\
- 7030090\
- 7030113\
- 7030092\
- 7030097\
- 7030100\
- 7030108\
- 7030115\
- 7030116\
- 7030101\
- 7030117\
- 7030120\
- 7030118\
- 7030086\
- 7030104\
- 7030119\
- 7030009\
- 7030030\
- 7030051\
- 7030019\
- 7030035\
- 7030065\
- 7030029\
- 7030094\
- 7030075\
- 7030040\
- 7030046\
- 7030006\
- 7030052\
- 7030068\
- 7030045\
- 7030059\
- 7030026\
- 7030084\
- 7030063\
- 7030080\
- 7030032\
- 7030077\
- 7030072\
- 7030011\
- 7030096\
- 7030018\
- 7030034\
- 7030047\
- 7030060\
- 7030039\
- 7030082\
- 7030001\
- 7030013\
- 7030098\
- 7030024\
- 7030073\
- 7030004\
- 7030025\
- 7030062\
- 7030010\
- 7030016\
- 7030053\
- 7030057\
- 7030066\
- 7030021\
- 7030022\
- 7030050\
- 7030079\
- 7030064\
- 7030043\
- 7030054\
- 7030038\
- 7030070\
- 7030081\
- 7030015\
- 7030061\
- 7030074\
- 7030044\
- 7030027\
- 7030087\
- 7030056\
- 7030095\
- 7030014\
- 7030012\
- 7030083\
- 7030048\
- 7030107\
- 7030017\
- 7030031\
- 7030007\
- 7030033\
- 7030088\
- 7030042\
- 7030076\
- 7030023\
- 7030008\
- 7030058\
- 7030003\
- 7030020\
- 7030049\
- 7030041\
- 7030002\
- 7030037\
- 7030055\
- 7030036\
- 7030071\
- 7030067\
- 7030078\
- 7030028\
- 7030005\
- ";
- #include "parameters.h"
- void check_outputs_config (void)
- {
- char *equivalent = NULL;
- char str[16];
- uint8_t len = 0;
- memset(str, 0, sizeof(str));
- GetSerialNumberStr(str, &len);
- equivalent = strstr(sn_bt_6702, str);
- if (equivalent != 0) {
- gpio_pins[DOUT1].pin = 4;
- gpio_pins[DOUT2].pin = 5;
- gpio_hw_config_pin(gpio_pins[DOUT1].port, gpio_pins[DOUT1].pin, GPIO_MODE_OUT_CFG |
- ((gpio_pins[DOUT1].flags & GPIO_OD) ?
- GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
- GPIO_SPEED_HIGH_CFG);
- gpio_set(DOUT1, gpio_pins[DOUT1].flags & GPIO_SET);
- gpio_hw_config_pin(gpio_pins[DOUT2].port, gpio_pins[DOUT2].pin, GPIO_MODE_OUT_CFG |
- ((gpio_pins[DOUT2].flags & GPIO_OD) ?
- GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
- GPIO_SPEED_HIGH_CFG);
- gpio_set(DOUT2, gpio_pins[DOUT2].flags & GPIO_SET);
- }
- }
- #endif
|