| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- /**
- * esp-knx-ip library for KNX/IP communication on an ESP8266
- * Author: Nico Weichbrodt <envy>
- * License: MIT
- */
- #include "esp-knx-ip.h"
- /**
- * Physical address functions
- */
- void ESPKNXIP::physical_address_set(address_t const &addr)
- {
- physaddr = addr;
- }
- address_t ESPKNXIP::physical_address_get()
- {
- return physaddr;
- }
- /**
- * Configuration functions start here
- */
- config_id_t ESPKNXIP::config_register_string(String name, uint8_t len, String _default, enable_condition_t cond)
- {
- if (registered_configs >= MAX_CONFIGS)
- return -1;
- if (_default.length() >= len)
- return -1;
- config_id_t id = registered_configs;
- custom_configs[id].name = name;
- custom_configs[id].type = CONFIG_TYPE_STRING;
- custom_configs[id].len = sizeof(uint8_t) + len;
- custom_configs[id].cond = cond;
- if (id == 0)
- custom_configs[id].offset = 0;
- else
- custom_configs[id].offset = custom_configs[id - 1].offset + custom_configs[id - 1].len;
- __config_set_string(id, _default);
- registered_configs++;
- DEBUG_PRINT("Registered config >");
- DEBUG_PRINT(name);
- DEBUG_PRINT("< @ ");
- DEBUG_PRINT(id);
- DEBUG_PRINT("/string[");
- DEBUG_PRINT(custom_configs[id].offset);
- DEBUG_PRINT("+");
- DEBUG_PRINT(custom_configs[id].len);
- DEBUG_PRINTLN("]");
- return id;
- }
- config_id_t ESPKNXIP::config_register_int(String name, int32_t _default, enable_condition_t cond)
- {
- if (registered_configs >= MAX_CONFIGS)
- return -1;
- config_id_t id = registered_configs;
- custom_configs[id].name = name;
- custom_configs[id].type = CONFIG_TYPE_INT;
- custom_configs[id].len = sizeof(uint8_t) + sizeof(int32_t);
- custom_configs[id].cond = cond;
- if (id == 0)
- custom_configs[id].offset = 0;
- else
- custom_configs[id].offset = custom_configs[id - 1].offset + custom_configs[id - 1].len;
- __config_set_int(id, _default);
- registered_configs++;
- DEBUG_PRINT("Registered config >");
- DEBUG_PRINT(name);
- DEBUG_PRINT("< @ ");
- DEBUG_PRINT(id);
- DEBUG_PRINT("/int[");
- DEBUG_PRINT(custom_configs[id].offset);
- DEBUG_PRINT("+");
- DEBUG_PRINT(custom_configs[id].len);
- DEBUG_PRINTLN("]");
- return id;
- }
- config_id_t ESPKNXIP::config_register_bool(String name, bool _default, enable_condition_t cond)
- {
- if (registered_configs >= MAX_CONFIGS)
- return -1;
- config_id_t id = registered_configs;
- custom_configs[id].name = name;
- custom_configs[id].type = CONFIG_TYPE_BOOL;
- custom_configs[id].len = sizeof(uint8_t) + sizeof(uint8_t);
- custom_configs[id].cond = cond;
- if (id == 0)
- custom_configs[id].offset = 0;
- else
- custom_configs[id].offset = custom_configs[id - 1].offset + custom_configs[id - 1].len;
- __config_set_bool(id, _default);
- registered_configs++;
- DEBUG_PRINT("Registered config >");
- DEBUG_PRINT(name);
- DEBUG_PRINT("< @ ");
- DEBUG_PRINT(id);
- DEBUG_PRINT("/bool[");
- DEBUG_PRINT(custom_configs[id].offset);
- DEBUG_PRINT("+");
- DEBUG_PRINT(custom_configs[id].len);
- DEBUG_PRINTLN("]");
- return id;
- }
- config_id_t ESPKNXIP::config_register_options(String name, option_entry_t *options, uint8_t _default, enable_condition_t cond)
- {
- if (registered_configs >= MAX_CONFIGS)
- return -1;
- if (options == nullptr || options->name == nullptr)
- return -1;
- config_id_t id = registered_configs;
- custom_configs[id].name = name;
- custom_configs[id].type = CONFIG_TYPE_OPTIONS;
- custom_configs[id].len = sizeof(uint8_t) + sizeof(uint8_t);
- custom_configs[id].cond = cond;
- if (id == 0)
- custom_configs[id].offset = 0;
- else
- custom_configs[id].offset = custom_configs[id - 1].offset + custom_configs[id - 1].len;
- custom_configs[id].data.options = options;
- __config_set_options(id, _default);
- registered_configs++;
- DEBUG_PRINT("Registered config >");
- DEBUG_PRINT(name);
- DEBUG_PRINT("< @ ");
- DEBUG_PRINT(id);
- DEBUG_PRINT("/opt[");
- DEBUG_PRINT(custom_configs[id].offset);
- DEBUG_PRINT("+");
- DEBUG_PRINT(custom_configs[id].len);
- DEBUG_PRINTLN("]");
- return id;
- }
- config_id_t ESPKNXIP::config_register_ga(String name, enable_condition_t cond)
- {
- if (registered_configs >= MAX_CONFIGS)
- return -1;
- config_id_t id = registered_configs;
- custom_configs[id].name = name;
- custom_configs[id].type = CONFIG_TYPE_GA;
- custom_configs[id].len = sizeof(uint8_t) + sizeof(address_t);
- custom_configs[id].cond = cond;
- if (id == 0)
- custom_configs[id].offset = 0;
- else
- custom_configs[id].offset = custom_configs[id - 1].offset + custom_configs[id - 1].len;
- address_t t;
- t.value = 0;
- __config_set_ga(id, t);
- registered_configs++;
- DEBUG_PRINT("Registered config >");
- DEBUG_PRINT(name);
- DEBUG_PRINT("< @ ");
- DEBUG_PRINT(id);
- DEBUG_PRINT("/ga[");
- DEBUG_PRINT(custom_configs[id].offset);
- DEBUG_PRINT("+");
- DEBUG_PRINT(custom_configs[id].len);
- DEBUG_PRINTLN("]");
- return id;
- }
- void ESPKNXIP::__config_set_flags(config_id_t id, config_flags_t flags)
- {
- DEBUG_PRINT("Setting flag @ ");
- DEBUG_PRINT(custom_configs[id].offset);
- DEBUG_PRINT(" to ");
- DEBUG_PRINT(custom_config_data[custom_configs[id].offset], BIN);
- DEBUG_PRINT(" | ");
- DEBUG_PRINT(flags, BIN);
- custom_config_data[custom_configs[id].offset] |= (uint8_t)flags;
- DEBUG_PRINT(" = ");
- DEBUG_PRINTLN(custom_config_data[custom_configs[id].offset], BIN);
- }
- void ESPKNXIP::config_set_string(config_id_t id, String val)
- {
- if (id >= registered_configs)
- return;
- if (custom_configs[id].type != CONFIG_TYPE_STRING)
- return;
- if (val.length() >= custom_configs[id].len)
- return;
- __config_set_flags(id, CONFIG_FLAGS_VALUE_SET);
- __config_set_string(id, val);
- }
- void ESPKNXIP::__config_set_string(config_id_t id, String &val)
- {
- memcpy(&custom_config_data[custom_configs[id].offset + sizeof(uint8_t)], val.c_str(), val.length()+1);
- }
- void ESPKNXIP::config_set_int(config_id_t id, int32_t val)
- {
- if (id >= registered_configs)
- return;
- if (custom_configs[id].type != CONFIG_TYPE_INT)
- return;
- __config_set_flags(id, CONFIG_FLAGS_VALUE_SET);
- __config_set_int(id, val);
- }
- void ESPKNXIP::__config_set_int(config_id_t id, int32_t val)
- {
- // This does not work for some reason:
- // Could be due to pointer alignment
- //int32_t *v = (int32_t *)(custom_config_data + custom_configs[id].offset);
- //*v = val;
- custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 0] = (uint8_t)((val & 0xFF000000) >> 24);
- custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 1] = (uint8_t)((val & 0x00FF0000) >> 16);
- custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 2] = (uint8_t)((val & 0x0000FF00) >> 8);
- custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 3] = (uint8_t)((val & 0x000000FF) >> 0);
- }
- void ESPKNXIP::config_set_bool(config_id_t id, bool val)
- {
- if (id >= registered_configs)
- return;
- if (custom_configs[id].type != CONFIG_TYPE_BOOL)
- return;
- __config_set_flags(id, CONFIG_FLAGS_VALUE_SET);
- __config_set_bool(id, val);
- }
- void ESPKNXIP::__config_set_bool(config_id_t id, bool val)
- {
- custom_config_data[custom_configs[id].offset + sizeof(uint8_t)] = val ? 1 : 0;
- }
- void ESPKNXIP::config_set_options(config_id_t id, uint8_t val)
- {
- if (id >= registered_configs)
- return;
- if (custom_configs[id].type != CONFIG_TYPE_OPTIONS)
- return;
- option_entry_t *cur = custom_configs[id].data.options;
- while (cur->name != nullptr)
- {
- if (cur->value == val)
- {
- __config_set_flags(id, CONFIG_FLAGS_VALUE_SET);
- __config_set_options(id, val);
- break;
- }
- cur++;
- }
- }
- void ESPKNXIP::__config_set_options(config_id_t id, uint8_t val)
- {
- custom_config_data[custom_configs[id].offset + sizeof(uint8_t)] = val;
- }
- void ESPKNXIP::config_set_ga(config_id_t id, address_t const &val)
- {
- if (id >= registered_configs)
- return;
- if (custom_configs[id].type != CONFIG_TYPE_GA)
- return;
- __config_set_flags(id, CONFIG_FLAGS_VALUE_SET);
- __config_set_ga(id, val);
- }
- void ESPKNXIP::__config_set_ga(config_id_t id, address_t const &val)
- {
- custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 0] = val.bytes.high;
- custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 1] = val.bytes.low;
- }
- String ESPKNXIP::config_get_string(config_id_t id)
- {
- if (id >= registered_configs)
- return String("");
- return String((char *)&custom_config_data[custom_configs[id].offset + sizeof(uint8_t)]);
- }
- int32_t ESPKNXIP::config_get_int(config_id_t id)
- {
- if (id >= registered_configs)
- return 0;
- int32_t v = (custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 0] << 24) +
- (custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 1] << 16) +
- (custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 2] << 8) +
- (custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 3] << 0);
- return v;
- }
- bool ESPKNXIP::config_get_bool(config_id_t id)
- {
- if (id >= registered_configs)
- return false;
- return custom_config_data[custom_configs[id].offset + sizeof(uint8_t)] != 0;
- }
- uint8_t ESPKNXIP::config_get_options(config_id_t id)
- {
- if (id >= registered_configs)
- return false;
- return custom_config_data[custom_configs[id].offset + sizeof(uint8_t)];
- }
- address_t ESPKNXIP::config_get_ga(config_id_t id)
- {
- address_t t;
- if (id >= registered_configs)
- {
- t.value = 0;
- return t;
- }
- t.bytes.high = custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 0];
- t.bytes.low = custom_config_data[custom_configs[id].offset + sizeof(uint8_t) + 1];
- return t;
- }
|