From 0747239d4c6bf702b8c258b845cd79e5c12d9f58 Mon Sep 17 00:00:00 2001 From: Christian Langanke Date: Fri, 1 Jan 2021 18:17:55 +0100 Subject: [PATCH] - for 7 segment displays - added support for FUNC_DISPLAY_DIM - added new FUNC_DISPLAY_BLINKRATE with new command DisplayBlinkrate Value is not being persistently stored, so no seting req. - added SevensegLog for DisplayMode 1..5 support, displaying the nth sensor value to nth atached 7-segment display. For that unsed display adresses before the first one being used may not be zero, but must be configured to unused addresses (e.g. 0xFF), otherwise driver init will fail. --- tasmota/xdrv_13_display.ino | 23 ++++++++++--- tasmota/xdsp_11_sevenseg.ino | 63 ++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index 00a2ac8a5..6bdab9d03 100644 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -63,6 +63,7 @@ const uint8_t DISPLAY_LOG_ROWS = 32; // Number of lines in display log #define D_CMND_DISP_TEXT "Text" #define D_CMND_DISP_WIDTH "Width" #define D_CMND_DISP_HEIGHT "Height" +#define D_CMND_DISP_BLINKRATE "Blinkrate" enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_EVERY_50_MSECOND, FUNC_DISPLAY_EVERY_SECOND, FUNC_DISPLAY_MODEL, FUNC_DISPLAY_MODE, FUNC_DISPLAY_POWER, @@ -70,19 +71,20 @@ enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_E FUNC_DISPLAY_DRAW_HLINE, FUNC_DISPLAY_DRAW_VLINE, FUNC_DISPLAY_DRAW_LINE, FUNC_DISPLAY_DRAW_CIRCLE, FUNC_DISPLAY_FILL_CIRCLE, FUNC_DISPLAY_DRAW_RECTANGLE, FUNC_DISPLAY_FILL_RECTANGLE, - FUNC_DISPLAY_TEXT_SIZE, FUNC_DISPLAY_FONT_SIZE, FUNC_DISPLAY_ROTATION, FUNC_DISPLAY_DRAW_STRING }; + FUNC_DISPLAY_TEXT_SIZE, FUNC_DISPLAY_FONT_SIZE, FUNC_DISPLAY_ROTATION, FUNC_DISPLAY_DRAW_STRING, + FUNC_DISPLAY_DIM, FUNC_DISPLAY_BLINKRATE }; enum DisplayInitModes { DISPLAY_INIT_MODE, DISPLAY_INIT_PARTIAL, DISPLAY_INIT_FULL }; const char kDisplayCommands[] PROGMEM = D_PRFX_DISPLAY "|" // Prefix "|" D_CMND_DISP_MODEL "|" D_CMND_DISP_WIDTH "|" D_CMND_DISP_HEIGHT "|" D_CMND_DISP_MODE "|" D_CMND_DISP_REFRESH "|" D_CMND_DISP_DIMMER "|" D_CMND_DISP_COLS "|" D_CMND_DISP_ROWS "|" D_CMND_DISP_SIZE "|" D_CMND_DISP_FONT "|" - D_CMND_DISP_ROTATE "|" D_CMND_DISP_TEXT "|" D_CMND_DISP_ADDRESS ; + D_CMND_DISP_ROTATE "|" D_CMND_DISP_TEXT "|" D_CMND_DISP_ADDRESS "|" D_CMND_DISP_BLINKRATE ; void (* const DisplayCommand[])(void) PROGMEM = { &CmndDisplay, &CmndDisplayModel, &CmndDisplayWidth, &CmndDisplayHeight, &CmndDisplayMode, &CmndDisplayRefresh, &CmndDisplayDimmer, &CmndDisplayColumns, &CmndDisplayRows, &CmndDisplaySize, &CmndDisplayFont, - &CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress }; + &CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress, &CmndDisplayBlinkrate }; char *dsp_str; @@ -1410,11 +1412,24 @@ void CmndDisplayDimmer(void) else if (!Settings.display_dimmer && disp_power) { ExecuteCommandPower(disp_device, POWER_OFF, SRC_DISPLAY); } - if (renderer) renderer->dim(Settings.display_dimmer); + if (renderer) + renderer->dim(Settings.display_dimmer); + else + XdspCall(FUNC_DISPLAY_DIM); } ResponseCmndNumber(Settings.display_dimmer); } +void CmndDisplayBlinkrate(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 3)) { + + if (!renderer) + XdspCall(FUNC_DISPLAY_BLINKRATE); + } + ResponseCmndNumber(XdrvMailbox.payload); +} + void CmndDisplaySize(void) { if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 4)) { diff --git a/tasmota/xdsp_11_sevenseg.ino b/tasmota/xdsp_11_sevenseg.ino index ea3db7e4a..b3bde3149 100644 --- a/tasmota/xdsp_11_sevenseg.ino +++ b/tasmota/xdsp_11_sevenseg.ino @@ -62,6 +62,61 @@ void SevensegWrite(void) } } +void SevensegLog(void) +{ + // get sensor data + ResponseClear(); + ResponseAppendTime(); + XsnsCall(FUNC_JSON_APPEND); + ResponseJsonEnd(); + + // display nth sensor value on nth display + // code adapted from xdrv_13_display.ino, DisplayAnalyzeJson() + uint8_t unit = 0; + int16_t valueDecimal = 0; + double valueFloat = 0; + uint8 fDigits = 0; + String jsonStr = TasmotaGlobal.mqtt_data; // Move from stack to heap to fix watchdogs (20180626) + JsonParser parser((char*)jsonStr.c_str()); + JsonParserObject object_root = parser.getRootObject(); + if (object_root) { + for (auto key_level1 : object_root) { + JsonParserToken token_level1 = key_level1.getValue(); + if (token_level1.isObject()) { + JsonParserObject object_level1 = token_level1.getObject(); + for (auto key_level2 : object_level1) { + const char* value_level2 = key_level2.getValue().getStr(nullptr); + if (value_level2 != nullptr) { + if ((unit < sevensegs) && (sevenseg[unit] != nullptr)) { + if (strchr( value_level2, '.') == NULL) { + sevenseg[unit]->print(atoi(value_level2), DEC); + } else { + sevenseg[unit]->printFloat(atof(value_level2), 1, DEC); + } + sevenseg[unit]->writeDisplay(); + unit++; + } + } + } + } + } + } +} + +void SevensegDim(void) +{ + for (uint32_t i = 0; i < sevensegs; i++) { + sevenseg[i]->setBrightness(Settings.display_dimmer); + } +} + +void SevensegBlinkrate( void) +{ + for (uint32_t i = 0; i < sevensegs; i++) { + sevenseg[i]->blinkRate(XdrvMailbox.payload); + } +} + void SevensegClear(void) { for (uint32_t i = 0; i < sevensegs; i++) { @@ -352,6 +407,7 @@ void SevensegRefresh(void) // Every second case 4: // Mqtt case 3: // Local case 5: { // Mqtt + SevensegLog(); break; } } @@ -396,6 +452,13 @@ bool Xdsp11(uint8_t function) case FUNC_DISPLAY_DRAW_STRING: SevensegDrawStringAt(dsp_x, dsp_y, dsp_str, dsp_color, dsp_flag); break; + case FUNC_DISPLAY_DIM: + SevensegDim(); + break; + case FUNC_DISPLAY_BLINKRATE: + SevensegBlinkrate(); + break; + } } return result;