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;