From 58d60c02b8379d1b6f3408d2ca6fd260fbe4e98e Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Mon, 10 Jul 2023 13:30:59 +0200 Subject: [PATCH] brightness: - use callback for when brightness is updated - avoid dependency on mqtt - encapsulate brigthness in its own namespace - improve readability --- include/display.h | 53 ++++++++++++++++++++++------------------------- include/mqtt.h | 34 +++++++++++++++--------------- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/include/display.h b/include/display.h index e4344d6..d10b8ca 100644 --- a/include/display.h +++ b/include/display.h @@ -5,7 +5,6 @@ #include #include #include "ntp_time.h" -#include "mqtt.h" #define DISPLAY_ADDRESS 0x70 #define BRIGHTNESS_MIN 0 @@ -16,13 +15,6 @@ #define DISPLAY_TIME 2000 #define DISPLAY_TEMP_TIME 5000 -namespace Mqtt { - void publishBrightness(); - bool connected(); -} - -Task tPublishBrightness(TASK_IMMEDIATE, TASK_ONCE, Mqtt::publishBrightness, &ts, false, Mqtt::connected); - namespace Display { void display(); @@ -35,6 +27,29 @@ namespace Display { // Create display object Adafruit_7segment clockDisplay = Adafruit_7segment(); + namespace Brightness { + uint8_t current = BRIGHTNESS_NIGHT; + void (*brightnessChangedCallback)(); + + void set(uint8_t value) { + current = value % (BRIGHTNESS_MAX + 1); + clockDisplay.setBrightness(current); + brightnessChangedCallback(); + } + + void onChanged(void (*f)()) { + brightnessChangedCallback = f; + } + + void change(bool increase) { + increase ? set(current + BRIGHTNESS_STEP) : set(current - BRIGHTNESS_STEP); + } + + void update() { + currentHour > 8 && currentHour < 17 ? set(BRIGHTNESS_DAY) : set(BRIGHTNESS_NIGHT); + } + } + void drawTime() { int displayHour = hourFormat24 ? hour() : hourFormat12(); int displayMinute = minute(); @@ -54,29 +69,11 @@ namespace Display { } } - void setBrightness(uint8_t value) { - brightness = value % (BRIGHTNESS_MAX+1); - clockDisplay.setBrightness(brightness); - tPublishBrightness.restart(); - } - - void changeBrightness(bool increase) { - increase ? setBrightness(brightness + BRIGHTNESS_STEP) : setBrightness(brightness - BRIGHTNESS_STEP); - } - - void updateBrightness() { - if (currentHour > 8 && currentHour < 17) { - setBrightness(BRIGHTNESS_DAY); - } else { - setBrightness(BRIGHTNESS_NIGHT); - } - } - void drawColon(bool colonOn) { if (colonOn) { if (currentHour != hour()) { currentHour = hour(); - updateBrightness(); + Brightness::update(); if (currentHour == 8) Wifi::reconnect(); } if (currentMin != minute()) { @@ -125,7 +122,7 @@ namespace Display { void setup() { clockDisplay.begin(DISPLAY_ADDRESS); - clockDisplay.setBrightness(brightness); + clockDisplay.setBrightness(Brightness::current); drawTime(); display(); } diff --git a/include/mqtt.h b/include/mqtt.h index f4a8190..b8fb634 100644 --- a/include/mqtt.h +++ b/include/mqtt.h @@ -40,10 +40,6 @@ namespace Mqtt { const char* espClockTopic = "homeassistant/+/esp_clock/#"; - bool connected() { - return client.connected(); - } - void connect() { client.connect(); } @@ -61,7 +57,7 @@ namespace Mqtt { Ha::Command* brightnessMqtt = (new Ha::Brightness{ "ESP Clock Brightness", "brightness", [](const char* msg) { - Display::setBrightness(String{ msg }.toInt()); + Display::Brightness::set(String{ msg }.toInt()); } })->withStateTopic(); @@ -90,6 +86,10 @@ namespace Mqtt { brightnessMqtt }; + uint16_t publish(const char* topic, const char* message) { + return client.publish(topic, 0, true, message); + } + void publishComponentConfig(Ha::Component& component) { StaticJsonDocument jsonDoc; component.buildConfig(jsonDoc); @@ -97,7 +97,14 @@ namespace Mqtt { char message[JSON_SIZE]; serializeJson(jsonDoc, message); - client.publish(component.configTopic, 0, true, message); + publish(component.configTopic, message); + } + + void publishBrightness() { + if (!client.connected()) return ; + char message[32]; + sprintf(message, "%u", Display::Brightness::current); + publish(brightnessMqtt->stateTopic, message); } void publishConfig() { @@ -107,7 +114,7 @@ namespace Mqtt { for (Ha::Component* cmp : switches) { publishComponentConfig(*cmp); } - // publishBrightness(Display::brightness); + publishBrightness(); ts.deleteTask(tPublishConfig); } @@ -119,20 +126,14 @@ namespace Mqtt { jsonDoc["altitude"] = Bmp::data.altitude; char message[255]; serializeJson(jsonDoc, message); - client.publish(Ha::Sensor::stateTopic, 0, true, message); - } - - void publishBrightness() { - char message[32]; - sprintf(message, "%X", Display::brightness); - client.publish(brightnessMqtt->stateTopic, 0, true, message); + publish(Ha::Sensor::stateTopic, message); } void publishCommand() { if (uint8_t cmd = commands.getCurrent()) { char message[32]; sprintf(message, "%X", cmd); - if (client.publish(commands.topic, 0, true, message) != 0) { + if (publish(commands.topic, message) != 0) { Serial.print(cmd, HEX); Serial.println(); commands.queue.pop(); @@ -153,11 +154,11 @@ namespace Mqtt { } void setup() { + Display::Brightness::onChanged(publishBrightness); client.onConnect([](bool sessionPresent) { tPublishConfig.enable(); tPublishBmp.enableIfNot(); tPublishCommand.enableDelayed(); - tPublishBrightness.enable(); client.subscribe(espClockTopic, 0); tReConnect.disable(); Serial.println("Connected to MQTT"); @@ -166,7 +167,6 @@ namespace Mqtt { tReConnect.enableDelayed(); tPublishCommand.disable(); tPublishBmp.disable(); - tPublishBrightness.disable(); Serial.println("Disconnected from MQTT"); }); client.onMessage(onMessage);