diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index f443ceb1..c2c94550 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -882,19 +882,26 @@ void dispatch_send_discovery(const char*, const char*) { #if HASP_USE_MQTT > 0 + StaticJsonDocument<512> doc; char data[512]; - { - char buffer[128]; + haspGetVersion(data, sizeof(data)); - haspGetVersion(buffer, sizeof(buffer)); - snprintf_P(data, sizeof(data), - PSTR("{\"node\":\"%s\",\"manufacturer\":\"" D_MANUFACTURER - "\",\"model\":\"%s\",\"hwid\":\"%s\",\"version\":\"%s\",\"numPages\":%u}"), - haspDevice.get_hostname(), haspDevice.get_model(), haspDevice.get_hardware_id(), buffer, - haspPages.count()); - } + doc[F("node")] = haspDevice.get_hostname(); + doc[F("model")] = haspDevice.get_model(); + doc[F("manufacturer")] = F(D_MANUFACTURER); + doc[F("hwid")] = haspDevice.get_hardware_id(); + doc[F("version")] = data; + doc[F("numPages")] = haspPages.count(); - switch(mqtt_send_discovery(data)) { + JsonArray relay = doc.createNestedArray(F("relay")); + JsonArray led = doc.createNestedArray(F("led")); + +#if HASP_USE_GPIO > 0 + gpio_discovery(relay, led); +#endif + + size_t len = serializeJson(doc, data); + switch(mqtt_send_discovery(data, len)) { case MQTT_ERR_OK: LOG_TRACE(TAG_MQTT_PUB, F("discovery => %s"), data); break; @@ -907,7 +914,7 @@ void dispatch_send_discovery(const char*, const char*) default: LOG_ERROR(TAG_MQTT, F(D_ERROR_UNKNOWN)); } - dispatchLastMillis = millis(); + // dispatchLastMillis = millis(); #endif } diff --git a/src/main_sdl2.cpp b/src/main_sdl2.cpp index 905863fa..97f96586 100644 --- a/src/main_sdl2.cpp +++ b/src/main_sdl2.cpp @@ -132,6 +132,11 @@ void setup() mqttStart(); #endif +#if HASP_USE_GPIO > 0 + printf("%s %d\n", __FILE__, __LINE__); + gpioSetup(); +#endif + mainLastLoopTime = millis() - 1000; // reset loop counter delay(250); printf("%s %d\n", __FILE__, __LINE__); @@ -146,6 +151,10 @@ void loop() haspDevice.loop(); guiLoop(); +#if HASP_USE_GPIO > 0 + gpioLoop(); +#endif + /* Timer Loop */ if(millis() - mainLastLoopTime >= 1000) { /* Runs Every Second */ diff --git a/src/mqtt/hasp_mqtt.h b/src/mqtt/hasp_mqtt.h index f5111f71..92cda407 100644 --- a/src/mqtt/hasp_mqtt.h +++ b/src/mqtt/hasp_mqtt.h @@ -30,7 +30,7 @@ void mqttStop(); int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload); int mqtt_send_state(const char* subtopic, const char* payload); -int mqtt_send_discovery(const char* payload); +int mqtt_send_discovery(const char* payload, size_t len); int mqttPublish(const char* topic, const char* payload, size_t len, bool retain); bool mqttIsConnected(); diff --git a/src/mqtt/hasp_mqtt_paho_single.cpp b/src/mqtt/hasp_mqtt_paho_single.cpp index 9e10f8ac..3938f4f3 100644 --- a/src/mqtt/hasp_mqtt_paho_single.cpp +++ b/src/mqtt/hasp_mqtt_paho_single.cpp @@ -238,11 +238,11 @@ int mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload) return mqttPublish(tmp_topic, payload, strlen(payload), false); } -int mqtt_send_discovery(const char* payload) +int mqtt_send_discovery(const char* payload, size_t len) { char tmp_topic[20]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR(MQTT_PREFIX "/discovery")); - return mqttPublish(tmp_topic, payload, strlen(payload), false); + return mqttPublish(tmp_topic, payload, len, false); } int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload) diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index 9898fc5f..0911017a 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -144,11 +144,11 @@ int mqtt_send_state(const char* subtopic, const char* payload) return mqttPublish(tmp_topic, payload, false); } -int mqtt_send_discovery(const char* payload) +int mqtt_send_discovery(const char* payload, size_t len) { char tmp_topic[20]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR(MQTT_PREFIX "/discovery")); - return mqttPublish(tmp_topic, payload, false); + return mqttPublish(tmp_topic, payload, len, false); } //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/sys/gpio/hasp_gpio.cpp b/src/sys/gpio/hasp_gpio.cpp index 738bed7d..7cdb1c13 100644 --- a/src/sys/gpio/hasp_gpio.cpp +++ b/src/sys/gpio/hasp_gpio.cpp @@ -1,7 +1,6 @@ /* MIT License - Copyright (c) 2019-2021 Francis Van Roie For full license information read the LICENSE file in the project folder */ -#include "AceButton.h" #include "lv_conf.h" // For timing defines #include "hasplib.h" @@ -12,10 +11,19 @@ #define INPUT_PULLDOWN INPUT #endif -uint8_t gpioUsedInputCount = 0; - +#ifdef ARDUINO +#include "AceButton.h" using namespace ace_button; static AceButton* button[HASP_NUM_INPUTS]; +#else +#define HIGH 1 +#define LOW 0 +#define NUM_DIGITAL_PINS 40 +#define digitalWrite(x, y) +#define analogWrite(x, y) +#endif + +uint8_t gpioUsedInputCount = 0; // An array of button pins, led pins, and the led states. Cannot be const // because ledState is mutable. @@ -48,6 +56,7 @@ class TouchConfig : public ButtonConfig { TouchConfig touchConfig(); #endif +#ifdef ARDUINO static void gpio_event_handler(AceButton* button, uint8_t eventType, uint8_t buttonState) { uint8_t btnid = button->getId(); @@ -94,14 +103,6 @@ static void gpio_event_handler(AceButton* button, uint8_t eventType, uint8_t but /* ********************************* GPIO Setup *************************************** */ -void gpio_log_serial_dimmer(const char* command) -{ - char buffer[32]; - snprintf_P(buffer, sizeof(buffer), PSTR("Dimmer: %02x %02x %02x %02x"), command[0], command[1], command[2], - command[3]); - LOG_VERBOSE(TAG_GPIO, buffer); -} - void aceButtonSetup(void) { ButtonConfig* buttonConfig = ButtonConfig::getSystemButtonConfig(); @@ -122,14 +123,6 @@ void aceButtonSetup(void) buttonConfig->setRepeatPressInterval(LV_INDEV_DEF_LONG_PRESS_REP_TIME); } -void gpioLoop(void) -{ - // Should be called every 4-5ms or faster, for the default debouncing time of ~20ms. - for(uint8_t i = 0; i < gpioUsedInputCount; i++) { - if(button[i]) button[i]->check(); - } -} - void gpioAddButton(uint8_t pin, uint8_t input_mode, uint8_t default_state, uint8_t index) { uint8_t i; @@ -297,6 +290,34 @@ void gpioSetup() } } +void gpioLoop(void) +{ + // Should be called every 4-5ms or faster, for the default debouncing time of ~20ms. + for(uint8_t i = 0; i < gpioUsedInputCount; i++) { + if(button[i]) button[i]->check(); + } +} + +#else +void gpioSetup(void) +{ + gpioSavePinConfig(0, 3, HASP_GPIO_RELAY, 0, -1); + gpioSavePinConfig(1, 4, HASP_GPIO_RELAY_INVERTED, 0, -1); + gpioSavePinConfig(2, 13, HASP_GPIO_LED, 0, -1); + gpioSavePinConfig(3, 14, HASP_GPIO_LED_INVERTED, 0, -1); +} +void gpioLoop(void) +{} +#endif // ARDUINO + +void gpio_log_serial_dimmer(const char* command) +{ + char buffer[32]; + snprintf_P(buffer, sizeof(buffer), PSTR("Dimmer: %02x %02x %02x %02x"), command[0], command[1], command[2], + command[3]); + LOG_VERBOSE(TAG_GPIO, buffer); +} + /* ********************************* State Setters *************************************** */ void gpio_get_value(hasp_gpio_config_t gpio) @@ -358,8 +379,7 @@ void gpio_set_value(hasp_gpio_config_t gpio, int16_t val) break; case HASP_GPIO_SERIAL_DIMMER: { - gpio.val = val >= 100 ? 100 : val > 0 ? val : 0; -#if defined(ARDUINO_ARCH_ESP32) + gpio.val = val >= 100 ? 100 : val > 0 ? val : 0; char command[5] = "\xEF\x02\x00\xED"; if(gpio.val == 0) { command[2] = 0x20; @@ -367,10 +387,11 @@ void gpio_set_value(hasp_gpio_config_t gpio, int16_t val) command[2] = (uint8_t)gpio.val; command[3] ^= command[2]; } +#if defined(ARDUINO_ARCH_ESP32) Serial2.print(command); +#endif gpio_log_serial_dimmer(command); -#endif break; } @@ -628,6 +649,13 @@ hasp_gpio_config_t gpioGetPinConfig(uint8_t num) return gpioConfig[num]; } +void gpio_discovery(JsonArray& relay, JsonArray& led) +{ + relay.add(5); + relay.add(12); + led.add(3); +}; + //////////////////////////////////////////////////////////////////////////////////////////////////// #if HASP_USE_CONFIG > 0 bool gpioGetConfig(const JsonObject& settings) diff --git a/src/sys/gpio/hasp_gpio.h b/src/sys/gpio/hasp_gpio.h index 4e114da4..8300cefb 100644 --- a/src/sys/gpio/hasp_gpio.h +++ b/src/sys/gpio/hasp_gpio.h @@ -30,6 +30,8 @@ void gpio_get_value(uint8_t pin); void gpio_set_value(uint8_t pin, int16_t val); void gpio_set_moodlight(uint8_t r, uint8_t g, uint8_t b); +void gpio_discovery(JsonArray& relay, JsonArray& led); + bool gpioSavePinConfig(uint8_t config_num, uint8_t pin, uint8_t type, uint8_t group, uint8_t pinfunc); bool gpioIsSystemPin(uint8_t gpio); bool gpioInUse(uint8_t gpio); diff --git a/user_setups/darwin_sdl/darwin_sdl_64bits.ini b/user_setups/darwin_sdl/darwin_sdl_64bits.ini index 1551e83e..9142ead5 100644 --- a/user_setups/darwin_sdl/darwin_sdl_64bits.ini +++ b/user_setups/darwin_sdl/darwin_sdl_64bits.ini @@ -26,7 +26,7 @@ build_flags = -D HASP_USE_SPIFFS=0 -D HASP_USE_LITTLEFS=0 -D HASP_USE_EEPROM=0 - -D HASP_USE_GPIO=0 + -D HASP_USE_GPIO=1 -D HASP_USE_CONFIG=0 ; Standalone application, as library -D HASP_USE_DEBUG=1 -D HASP_USE_MQTT=1 @@ -86,6 +86,7 @@ src_filter = - - - + + - + - diff --git a/user_setups/linux_sdl/linux_sdl_64bits.ini b/user_setups/linux_sdl/linux_sdl_64bits.ini index bc7217ac..e1e408d7 100644 --- a/user_setups/linux_sdl/linux_sdl_64bits.ini +++ b/user_setups/linux_sdl/linux_sdl_64bits.ini @@ -25,7 +25,7 @@ build_flags = -D HASP_USE_SPIFFS=0 -D HASP_USE_LITTLEFS=0 -D HASP_USE_EEPROM=0 - -D HASP_USE_GPIO=0 + -D HASP_USE_GPIO=1 -D HASP_USE_CONFIG=0 ; Standalone application, as library -D HASP_USE_DEBUG=1 -D HASP_USE_MQTT=1 @@ -81,6 +81,7 @@ src_filter = - - - + + - + - diff --git a/user_setups/win32/windows_sdl_64bits.ini b/user_setups/win32/windows_sdl_64bits.ini index 2359ec83..a2c6422b 100644 --- a/user_setups/win32/windows_sdl_64bits.ini +++ b/user_setups/win32/windows_sdl_64bits.ini @@ -25,7 +25,7 @@ build_flags = -D HASP_USE_SPIFFS=0 -D HASP_USE_LITTLEFS=0 -D HASP_USE_EEPROM=0 - -D HASP_USE_GPIO=0 + -D HASP_USE_GPIO=1 -D HASP_USE_CONFIG=0 ; Standalone application, as library -D HASP_USE_DEBUG=1 -D HASP_USE_MQTT=1 @@ -102,6 +102,7 @@ src_filter = - - - + + - + -