diff --git a/sonoff/xdrv_13_display.ino b/sonoff/xdrv_13_display.ino index f0c5128cf..98d854950 100644 --- a/sonoff/xdrv_13_display.ino +++ b/sonoff/xdrv_13_display.ino @@ -53,13 +53,15 @@ enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_E enum DisplayInitModes { DISPLAY_INIT_MODE, DISPLAY_INIT_PARTIAL, DISPLAY_INIT_FULL }; -enum DisplayCommands { - CMND_DISPLAY, CMND_DISP_MODEL, CMND_DISP_WIDTH, CMND_DISP_HEIGHT, CMND_DISP_MODE, CMND_DISP_REFRESH, CMND_DISP_DIMMER, - CMND_DISP_COLS, CMND_DISP_ROWS, CMND_DISP_SIZE, CMND_DISP_FONT, CMND_DISP_ROTATE, CMND_DISP_TEXT, CMND_DISP_ADDRESS }; - const char kDisplayCommands[] PROGMEM = - "|" 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_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 ; + +void (* const DisplayCommand[])(void) PROGMEM = { + &CmndDisplay, &CmndDisplayModel, &CmndDisplayWidth, &CmndDisplayHeight, &CmndDisplayMode, &CmndDisplayRefresh, + &CmndDisplayDimmer, &CmndDisplayColumns, &CmndDisplayRows, &CmndDisplaySize, &CmndDisplayFont, + &CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress }; const char S_JSON_DISPLAY_COMMAND_VALUE[] PROGMEM = "{\"" D_CMND_DISPLAY "%s\":\"%s\"}"; const char S_JSON_DISPLAY_COMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_DISPLAY "%s\":%d}"; @@ -103,7 +105,7 @@ bool disp_subscribed = false; /*********************************************************************************************/ -void DisplayInit(uint8_t mode) +void DisplayInit(uint32_t mode) { dsp_init = mode; XdspCall(FUNC_DISPLAY_INIT); @@ -114,7 +116,7 @@ void DisplayClear(void) XdspCall(FUNC_DISPLAY_CLEAR); } -void DisplayDrawHLine(uint16_t x, uint16_t y, int16_t len, uint16_t color) +void DisplayDrawHLine(uint32_t x, uint32_t y, int32_t len, uint32_t color) { dsp_x = x; dsp_y = y; @@ -123,7 +125,7 @@ void DisplayDrawHLine(uint16_t x, uint16_t y, int16_t len, uint16_t color) XdspCall(FUNC_DISPLAY_DRAW_HLINE); } -void DisplayDrawVLine(uint16_t x, uint16_t y, int16_t len, uint16_t color) +void DisplayDrawVLine(uint32_t x, uint32_t y, int32_t len, uint32_t color) { dsp_x = x; dsp_y = y; @@ -132,7 +134,7 @@ void DisplayDrawVLine(uint16_t x, uint16_t y, int16_t len, uint16_t color) XdspCall(FUNC_DISPLAY_DRAW_VLINE); } -void DisplayDrawLine(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2, uint16_t color) +void DisplayDrawLine(uint32_t x, uint32_t y, uint32_t x2, uint32_t y2, uint32_t color) { dsp_x = x; dsp_y = y; @@ -142,7 +144,7 @@ void DisplayDrawLine(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2, uint16_t XdspCall(FUNC_DISPLAY_DRAW_LINE); } -void DisplayDrawCircle(uint16_t x, uint16_t y, uint16_t rad, uint16_t color) +void DisplayDrawCircle(uint32_t x, uint32_t y, uint32_t rad, uint32_t color) { dsp_x = x; dsp_y = y; @@ -151,7 +153,7 @@ void DisplayDrawCircle(uint16_t x, uint16_t y, uint16_t rad, uint16_t color) XdspCall(FUNC_DISPLAY_DRAW_CIRCLE); } -void DisplayDrawFilledCircle(uint16_t x, uint16_t y, uint16_t rad, uint16_t color) +void DisplayDrawFilledCircle(uint32_t x, uint32_t y, uint32_t rad, uint32_t color) { dsp_x = x; dsp_y = y; @@ -160,7 +162,7 @@ void DisplayDrawFilledCircle(uint16_t x, uint16_t y, uint16_t rad, uint16_t colo XdspCall(FUNC_DISPLAY_FILL_CIRCLE); } -void DisplayDrawRectangle(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2, uint16_t color) +void DisplayDrawRectangle(uint32_t x, uint32_t y, uint32_t x2, uint32_t y2, uint32_t color) { dsp_x = x; dsp_y = y; @@ -170,7 +172,7 @@ void DisplayDrawRectangle(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2, uint XdspCall(FUNC_DISPLAY_DRAW_RECTANGLE); } -void DisplayDrawFilledRectangle(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2, uint16_t color) +void DisplayDrawFilledRectangle(uint32_t x, uint32_t y, uint32_t x2, uint32_t y2, uint32_t color) { dsp_x = x; dsp_y = y; @@ -185,25 +187,25 @@ void DisplayDrawFrame(void) XdspCall(FUNC_DISPLAY_DRAW_FRAME); } -void DisplaySetSize(uint8_t size) +void DisplaySetSize(uint32_t size) { Settings.display_size = size &3; XdspCall(FUNC_DISPLAY_TEXT_SIZE); } -void DisplaySetFont(uint8_t font) +void DisplaySetFont(uint32_t font) { Settings.display_font = font &3; XdspCall(FUNC_DISPLAY_FONT_SIZE); } -void DisplaySetRotation(uint8_t rotation) +void DisplaySetRotation(uint32_t rotation) { Settings.display_rotate = rotation &3; XdspCall(FUNC_DISPLAY_ROTATION); } -void DisplayDrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint8_t flag) +void DisplayDrawStringAt(uint32_t x, uint32_t y, char *str, uint32_t color, uint32_t flag) { dsp_x = x; dsp_y = y; @@ -213,7 +215,7 @@ void DisplayDrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint XdspCall(FUNC_DISPLAY_DRAW_STRING); } -void DisplayOnOff(uint8_t on) +void DisplayOnOff(uint32_t on) { dsp_on = on; XdspCall(FUNC_DISPLAY_ONOFF); @@ -543,9 +545,9 @@ void DisplayReAllocScreenBuffer(void) DisplayAllocScreenBuffer(); } -void DisplayFillScreen(uint8_t line) +void DisplayFillScreen(uint32_t line) { - uint8_t len = disp_screen_buffer_cols - strlen(disp_screen_buffer[line]); + uint32_t len = disp_screen_buffer_cols - strlen(disp_screen_buffer[line]); if (len) { memset(disp_screen_buffer[line] + strlen(disp_screen_buffer[line]), 0x20, len); disp_screen_buffer[line][disp_screen_buffer_cols -1] = 0; @@ -911,56 +913,54 @@ void DisplaySetPower(void) * Commands \*********************************************************************************************/ -bool DisplayCommand(void) +void CmndDisplay(void) { - char command [CMDSZ]; - bool serviced = true; - uint8_t disp_len = strlen(D_CMND_DISPLAY); // Prep for string length change + Response_P(PSTR("{\"" D_CMND_DISPLAY "\":{\"" D_CMND_DISP_MODEL "\":%d,\"" D_CMND_DISP_WIDTH "\":%d,\"" D_CMND_DISP_HEIGHT "\":%d,\"" + D_CMND_DISP_MODE "\":%d,\"" D_CMND_DISP_DIMMER "\":%d,\"" D_CMND_DISP_SIZE "\":%d,\"" D_CMND_DISP_FONT "\":%d,\"" + D_CMND_DISP_ROTATE "\":%d,\"" D_CMND_DISP_REFRESH "\":%d,\"" D_CMND_DISP_COLS "\":[%d,%d],\"" D_CMND_DISP_ROWS "\":%d}}"), + Settings.display_model, Settings.display_width, Settings.display_height, + Settings.display_mode, Settings.display_dimmer, Settings.display_size, Settings.display_font, + Settings.display_rotate, Settings.display_refresh, Settings.display_cols[0], Settings.display_cols[1], Settings.display_rows); +} - if (!strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_DISPLAY), disp_len)) { // Prefix - int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic +disp_len, kDisplayCommands); - if (-1 == command_code) { - serviced = false; // Unknown command +void CmndDisplayModel(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < DISPLAY_MAX_DRIVERS)) { + uint32_t last_display_model = Settings.display_model; + Settings.display_model = XdrvMailbox.payload; + if (XdspCall(FUNC_DISPLAY_MODEL)) { + restart_flag = 2; // Restart to re-init interface and add/Remove MQTT subscribe + } else { + Settings.display_model = last_display_model; } - else if (CMND_DISPLAY == command_code) { - Response_P(PSTR("{\"" D_CMND_DISPLAY "\":{\"" D_CMND_DISP_MODEL "\":%d,\"" D_CMND_DISP_WIDTH "\":%d,\"" D_CMND_DISP_HEIGHT "\":%d,\"" D_CMND_DISP_MODE "\":%d,\"" - D_CMND_DISP_DIMMER "\":%d,\"" D_CMND_DISP_SIZE "\":%d,\"" D_CMND_DISP_FONT "\":%d,\"" D_CMND_DISP_ROTATE "\":%d,\"" D_CMND_DISP_REFRESH "\":%d,\"" - D_CMND_DISP_COLS "\":[%d,%d],\"" D_CMND_DISP_ROWS "\":%d}}"), - Settings.display_model, Settings.display_width, Settings.display_height, Settings.display_mode, - Settings.display_dimmer, Settings.display_size, Settings.display_font, Settings.display_rotate, Settings.display_refresh, - Settings.display_cols[0], Settings.display_cols[1], Settings.display_rows); + } + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_model); +} + +void CmndDisplayWidth(void) +{ + if (XdrvMailbox.payload > 0) { + if (XdrvMailbox.payload != Settings.display_width) { + Settings.display_width = XdrvMailbox.payload; + restart_flag = 2; // Restart to re-init width } - else if (CMND_DISP_MODEL == command_code) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < DISPLAY_MAX_DRIVERS)) { - uint8_t last_display_model = Settings.display_model; - Settings.display_model = XdrvMailbox.payload; - if (XdspCall(FUNC_DISPLAY_MODEL)) { - restart_flag = 2; // Restart to re-init interface and add/Remove MQTT subscribe - } else { - Settings.display_model = last_display_model; - } - } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_model); + } + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_width); +} + +void CmndDisplayHeight(void) +{ + if (XdrvMailbox.payload > 0) { + if (XdrvMailbox.payload != Settings.display_height) { + Settings.display_height = XdrvMailbox.payload; + restart_flag = 2; // Restart to re-init height } - else if (CMND_DISP_WIDTH == command_code) { - if (XdrvMailbox.payload > 0) { - if (XdrvMailbox.payload != Settings.display_width) { - Settings.display_width = XdrvMailbox.payload; - restart_flag = 2; // Restart to re-init width - } - } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_width); - } - else if (CMND_DISP_HEIGHT == command_code) { - if (XdrvMailbox.payload > 0) { - if (XdrvMailbox.payload != Settings.display_height) { - Settings.display_height = XdrvMailbox.payload; - restart_flag = 2; // Restart to re-init height - } - } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_height); - } - else if (CMND_DISP_MODE == command_code) { + } + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_height); +} + +void CmndDisplayMode(void) +{ #ifdef USE_DISPLAY_MODES1TO5 /* Matrix LCD / Oled TFT * 1 = Text up and time Time @@ -969,130 +969,146 @@ bool DisplayCommand(void) * 4 = Mqtt left and time Mqtt (incl local) sensors Mqtt (incl local) sensors * 5 = Mqtt up and time Mqtt (incl local) sensors and time Mqtt (incl local) sensors and time */ - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 5)) { - uint32_t last_display_mode = Settings.display_mode; - Settings.display_mode = XdrvMailbox.payload; + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 5)) { + uint32_t last_display_mode = Settings.display_mode; + Settings.display_mode = XdrvMailbox.payload; - if (disp_subscribed != (Settings.display_mode &0x04)) { - restart_flag = 2; // Restart to Add/Remove MQTT subscribe - } else { - if (last_display_mode && !Settings.display_mode) { // Switch to mode 0 - DisplayInit(DISPLAY_INIT_MODE); - DisplayClear(); - } else { - DisplayLogBufferInit(); - DisplayInit(DISPLAY_INIT_MODE); - } - } - } -#endif // USE_DISPLAY_MODES1TO5 - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_mode); - } - else if (CMND_DISP_DIMMER == command_code) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) { - Settings.display_dimmer = ((XdrvMailbox.payload +1) * 100) / 666; // Correction for Domoticz (0 - 15) - if (Settings.display_dimmer && !(disp_power)) { - ExecuteCommandPower(disp_device, POWER_ON, SRC_DISPLAY); - } - else if (!Settings.display_dimmer && disp_power) { - ExecuteCommandPower(disp_device, POWER_OFF, SRC_DISPLAY); - } - } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_dimmer); - } - else if (CMND_DISP_SIZE == command_code) { - if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 4)) { - Settings.display_size = XdrvMailbox.payload; - } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_size); - } - else if (CMND_DISP_FONT == command_code) { - if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 4)) { - Settings.display_font = XdrvMailbox.payload; - } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_font); - } - else if (CMND_DISP_ROTATE == command_code) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 4)) { - if (Settings.display_rotate != XdrvMailbox.payload) { -/* - // Needs font info regarding height and width - if ((Settings.display_rotate &1) != (XdrvMailbox.payload &1)) { - uint8_t temp_rows = Settings.display_rows; - Settings.display_rows = Settings.display_cols[0]; - Settings.display_cols[0] = temp_rows; -#ifdef USE_DISPLAY_MODES1TO5 - DisplayReAllocScreenBuffer(); -#endif // USE_DISPLAY_MODES1TO5 - } -*/ - Settings.display_rotate = XdrvMailbox.payload; - DisplayInit(DISPLAY_INIT_MODE); -#ifdef USE_DISPLAY_MODES1TO5 - DisplayLogBufferInit(); -#endif // USE_DISPLAY_MODES1TO5 - } - } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_rotate); - } - else if (CMND_DISP_TEXT == command_code) { - mqtt_data[0] = '\0'; - if (disp_device && XdrvMailbox.data_len > 0) { -#ifndef USE_DISPLAY_MODES1TO5 - DisplayText(); -#else - if (!Settings.display_mode) { - DisplayText(); - } else { - DisplayLogBufferAdd(XdrvMailbox.data); - } -#endif // USE_DISPLAY_MODES1TO5 + if (disp_subscribed != (Settings.display_mode &0x04)) { + restart_flag = 2; // Restart to Add/Remove MQTT subscribe + } else { + if (last_display_mode && !Settings.display_mode) { // Switch to mode 0 + DisplayInit(DISPLAY_INIT_MODE); + DisplayClear(); } else { - Response_P(PSTR("No Text")); - } - if (mqtt_data[0] == '\0') { - Response_P(S_JSON_DISPLAY_COMMAND_VALUE, command, XdrvMailbox.data); - } - } - else if ((CMND_DISP_ADDRESS == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 8)) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 255)) { - Settings.display_address[XdrvMailbox.index -1] = XdrvMailbox.payload; - } - Response_P(S_JSON_DISPLAY_COMMAND_INDEX_NVALUE, command, XdrvMailbox.index, Settings.display_address[XdrvMailbox.index -1]); - } - else if (CMND_DISP_REFRESH == command_code) { - if ((XdrvMailbox.payload >= 1) && (XdrvMailbox.payload <= 7)) { - Settings.display_refresh = XdrvMailbox.payload; - } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_refresh); - } - else if ((CMND_DISP_COLS == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 2)) { - if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= DISPLAY_MAX_COLS)) { - Settings.display_cols[XdrvMailbox.index -1] = XdrvMailbox.payload; -#ifdef USE_DISPLAY_MODES1TO5 - if (1 == XdrvMailbox.index) { - DisplayLogBufferInit(); - DisplayReAllocScreenBuffer(); - } -#endif // USE_DISPLAY_MODES1TO5 - } - Response_P(S_JSON_DISPLAY_COMMAND_INDEX_NVALUE, command, XdrvMailbox.index, Settings.display_cols[XdrvMailbox.index -1]); - } - else if (CMND_DISP_ROWS == command_code) { - if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= DISPLAY_MAX_ROWS)) { - Settings.display_rows = XdrvMailbox.payload; -#ifdef USE_DISPLAY_MODES1TO5 DisplayLogBufferInit(); + DisplayInit(DISPLAY_INIT_MODE); + } + } + } +#endif // USE_DISPLAY_MODES1TO5 + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_mode); +} + +void CmndDisplayDimmer(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) { + Settings.display_dimmer = ((XdrvMailbox.payload +1) * 100) / 666; // Correction for Domoticz (0 - 15) + if (Settings.display_dimmer && !(disp_power)) { + ExecuteCommandPower(disp_device, POWER_ON, SRC_DISPLAY); + } + else if (!Settings.display_dimmer && disp_power) { + ExecuteCommandPower(disp_device, POWER_OFF, SRC_DISPLAY); + } + } + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_dimmer); +} + +void CmndDisplaySize(void) +{ + if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 4)) { + Settings.display_size = XdrvMailbox.payload; + } + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_size); +} + +void CmndDisplayFont(void) +{ + if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 4)) { + Settings.display_font = XdrvMailbox.payload; + } + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_font); +} + +void CmndDisplayRotate(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 4)) { + if (Settings.display_rotate != XdrvMailbox.payload) { +/* + // Needs font info regarding height and width + if ((Settings.display_rotate &1) != (XdrvMailbox.payload &1)) { + uint8_t temp_rows = Settings.display_rows; + Settings.display_rows = Settings.display_cols[0]; + Settings.display_cols[0] = temp_rows; +#ifdef USE_DISPLAY_MODES1TO5 DisplayReAllocScreenBuffer(); #endif // USE_DISPLAY_MODES1TO5 } - Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, command, Settings.display_rows); +*/ + Settings.display_rotate = XdrvMailbox.payload; + DisplayInit(DISPLAY_INIT_MODE); +#ifdef USE_DISPLAY_MODES1TO5 + DisplayLogBufferInit(); +#endif // USE_DISPLAY_MODES1TO5 } - else serviced = false; // Unknown command } - else serviced = false; // Unknown command + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_rotate); +} - return serviced; +void CmndDisplayText(void) +{ + mqtt_data[0] = '\0'; + if (disp_device && XdrvMailbox.data_len > 0) { +#ifndef USE_DISPLAY_MODES1TO5 + DisplayText(); +#else + if (!Settings.display_mode) { + DisplayText(); + } else { + DisplayLogBufferAdd(XdrvMailbox.data); + } +#endif // USE_DISPLAY_MODES1TO5 + } else { + Response_P(PSTR("No Text")); + } + if (mqtt_data[0] == '\0') { + Response_P(S_JSON_DISPLAY_COMMAND_VALUE, XdrvMailbox.command, XdrvMailbox.data); + } +} + +void CmndDisplayAddress(void) +{ + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 8)) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 255)) { + Settings.display_address[XdrvMailbox.index -1] = XdrvMailbox.payload; + } + Response_P(S_JSON_DISPLAY_COMMAND_INDEX_NVALUE, XdrvMailbox.command, XdrvMailbox.index, Settings.display_address[XdrvMailbox.index -1]); + } +} + +void CmndDisplayRefresh(void) +{ + if ((XdrvMailbox.payload >= 1) && (XdrvMailbox.payload <= 7)) { + Settings.display_refresh = XdrvMailbox.payload; + } + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_refresh); +} + +void CmndDisplayColumns(void) +{ + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 2)) { + if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= DISPLAY_MAX_COLS)) { + Settings.display_cols[XdrvMailbox.index -1] = XdrvMailbox.payload; +#ifdef USE_DISPLAY_MODES1TO5 + if (1 == XdrvMailbox.index) { + DisplayLogBufferInit(); + DisplayReAllocScreenBuffer(); + } +#endif // USE_DISPLAY_MODES1TO5 + } + Response_P(S_JSON_DISPLAY_COMMAND_INDEX_NVALUE, XdrvMailbox.command, XdrvMailbox.index, Settings.display_cols[XdrvMailbox.index -1]); + } +} + +void CmndDisplayRows(void) +{ + if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= DISPLAY_MAX_ROWS)) { + Settings.display_rows = XdrvMailbox.payload; +#ifdef USE_DISPLAY_MODES1TO5 + DisplayLogBufferInit(); + DisplayReAllocScreenBuffer(); +#endif // USE_DISPLAY_MODES1TO5 + } + Response_P(S_JSON_DISPLAY_COMMAND_NVALUE, XdrvMailbox.command, Settings.display_rows); } /*********************************************************************************************\ @@ -1111,9 +1127,6 @@ bool Xdrv13(uint8_t function) case FUNC_EVERY_50_MSECOND: if (Settings.display_model) { XdspCall(FUNC_DISPLAY_EVERY_50_MSECOND); } break; - case FUNC_COMMAND: - result = DisplayCommand(); - break; case FUNC_SET_POWER: DisplaySetPower(); break; @@ -1131,6 +1144,12 @@ bool Xdrv13(uint8_t function) DisplayLocalSensor(); break; #endif // USE_DISPLAY_MODES1TO5 + case FUNC_COMMAND: + if (!strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_DISPLAY), strlen(D_CMND_DISPLAY))) { // Prefix + XdrvMailbox.topic += strlen(D_CMND_DISPLAY); + result = DecodeCommand(kDisplayCommands, DisplayCommand); + } + break; } } return result;