diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 1ecd1541..06269767 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -42,12 +42,7 @@ uint32_t dispatchLastMillis = -3000000; // force discovery uint8_t nCommands = 0; haspCommand_t commands[20]; -struct moodlight_t -{ - uint8_t power; - uint8_t r, g, b; -}; -moodlight_t moodlight; +moodlight_t moodlight = {.brightness = 255}; static void dispatch_config(const char* topic, const char* payload); // void dispatch_group_value(uint8_t groupid, int16_t state, lv_obj_t * obj); @@ -705,6 +700,7 @@ void dispatch_moodlight(const char* topic, const char* payload) if(!json["r"].isNull()) moodlight.r = json["r"].as(); if(!json["g"].isNull()) moodlight.g = json["g"].as(); if(!json["b"].isNull()) moodlight.b = json["b"].as(); + if(!json["brightness"].isNull()) moodlight.brightness = json["brightness"].as(); if(!json[F("color")].isNull()) { if(!json[F("color")]["r"].isNull()) { @@ -725,10 +721,7 @@ void dispatch_moodlight(const char* topic, const char* payload) } #if HASP_USE_GPIO > 0 - if(moodlight.power) - gpio_set_moodlight(moodlight.r, moodlight.g, moodlight.b); - else - gpio_set_moodlight(0, 0, 0); + gpio_set_moodlight(moodlight); #endif } } @@ -740,8 +733,8 @@ void dispatch_moodlight(const char* topic, const char* payload) snprintf_P( // buffer, sizeof(buffer), // PSTR("{\"state\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%u,\"g\":%u,\"b\":%u}"), - buffer, sizeof(buffer), PSTR("{\"state\":\"%s\",\"color\":{\"r\":%u,\"g\":%u,\"b\":%u}}"), - moodlight.power ? "ON" : "OFF", moodlight.r, moodlight.g, moodlight.b); + buffer, sizeof(buffer), PSTR("{\"state\":\"%s\",\"color\":{\"r\":%u,\"g\":%u,\"b\":%u,\"brightness\":%u}}"), + moodlight.power ? "ON" : "OFF", moodlight.r, moodlight.g, moodlight.b, moodlight.brightness); dispatch_state_subtopic(out_topic, buffer); } @@ -1000,9 +993,7 @@ void dispatchSetup() } IRAM_ATTR void dispatchLoop() -{ - lv_task_handler(); // process animations -} +{} #if 1 || ARDUINO void dispatchEverySecond() diff --git a/src/sys/gpio/hasp_gpio.cpp b/src/sys/gpio/hasp_gpio.cpp index b613ca50..c10c09cd 100644 --- a/src/sys/gpio/hasp_gpio.cpp +++ b/src/sys/gpio/hasp_gpio.cpp @@ -575,8 +575,20 @@ bool gpio_set_pin_value(uint8_t pin, int32_t val) } // Updates the RGB pins directly, rgb are already normalized values -void gpio_set_moodlight(uint8_t r, uint8_t g, uint8_t b) +void gpio_set_moodlight(moodlight_t& moodlight) { + uint8_t r = 0; + uint8_t g = 0; + uint8_t b = 0; + + if(moodlight.power && moodlight.brightness) { + r = (moodlight.r * moodlight.brightness + 127) / 255; + g = (moodlight.g * moodlight.brightness + 127) / 255; + b = (moodlight.b * moodlight.brightness + 127) / 255; + } else { + moodlight.power = 0; + } + // RGBXX https://stackoverflow.com/questions/39949331/how-to-calculate-rgbaw-amber-white-from-rgb-for-leds for(uint8_t i = 0; i < HASP_NUM_GPIO_CONFIG; i++) { switch(gpioConfig[i].type) { @@ -591,6 +603,16 @@ void gpio_set_moodlight(uint8_t r, uint8_t g, uint8_t b) break; } } + + for(uint8_t i = 0; i < HASP_NUM_GPIO_CONFIG; i++) { + switch(gpioConfig[i].type) { + case HASP_GPIO_LED_B: + case HASP_GPIO_LED_G: + case HASP_GPIO_LED_R: + LOG_VERBOSE(TAG_GPIO, F(D_BULLET D_GPIO_PIN " %d => %d"), gpioConfig[i].pin, gpioConfig[i].val); + break; + } + } } bool gpioIsSystemPin(uint8_t gpio) diff --git a/src/sys/gpio/hasp_gpio.h b/src/sys/gpio/hasp_gpio.h index 62ec3beb..10519c6e 100644 --- a/src/sys/gpio/hasp_gpio.h +++ b/src/sys/gpio/hasp_gpio.h @@ -31,7 +31,7 @@ void gpio_set_normalized_group_values(uint8_t group, int32_t val, int32_t min, i // void gpio_set_gpio_state(uint8_t pin, uint16_t state); bool gpio_get_value(uint8_t pin, uint16_t& val); bool gpio_set_pin_value(uint8_t pin, int32_t val); -void gpio_set_moodlight(uint8_t r, uint8_t g, uint8_t b); +void gpio_set_moodlight(moodlight_t& moodlight); void gpio_discovery(JsonArray& relay, JsonArray& led);