From 36e0aaf1599d36154fba1b8cc48e9d8224462570 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Wed, 6 Jul 2022 23:02:01 +0200 Subject: [PATCH 1/5] [P116] Add support for ST7735 80x160px with inverted color --- docs/source/Plugin/P116.rst | 1 + .../Plugin/P116_TFTDisplayModelOptions.png | Bin 27986 -> 35569 bytes lib/Adafruit_ST77xx/Adafruit_ST7735.cpp | 9 +++++++ lib/Adafruit_ST77xx/Adafruit_ST7735.h | 1 + src/_P116_ST77xx.ino | 3 +++ src/src/PluginStructs/P116_data_struct.cpp | 9 +++++++ src/src/PluginStructs/P116_data_struct.h | 23 +++++++++--------- 7 files changed, 35 insertions(+), 11 deletions(-) diff --git a/docs/source/Plugin/P116.rst b/docs/source/Plugin/P116.rst index 9be499937..f0e806012 100644 --- a/docs/source/Plugin/P116.rst +++ b/docs/source/Plugin/P116.rst @@ -139,6 +139,7 @@ Available options: * *ST7735 128 x 128px* Allows about 12 lines of text in the smallest font scaling setting (the 13th line will be distorted, as the bottom 2 pixellines aren't available) * *ST7735 128 x 160px* Allows 16 lines of text in the smallest font scaling setting. * *ST7735 80 x 160px* Allows 16 lines of text in the smallest font scaling setting. +* *ST7735 80 x 160px (Color inverted)* Special color inverted configuration as used in f.e. M5Stack StickC. * *ST7789 240 x 320px* Allows 32 lines of text in the smallest font scaling setting. Predefined text only goes to 24, extra lines can be displayed from rules or external commands. * *ST7789 240 x 240px* Allows 24 lines of text in the smallest font scaling setting. * *ST7789 240 x 280px* Allows 28 lines of text in the smallest font scaling setting. Predefined text only goes to 24, extra lines can be displayed from rules or external commands. diff --git a/docs/source/Plugin/P116_TFTDisplayModelOptions.png b/docs/source/Plugin/P116_TFTDisplayModelOptions.png index a578b21460ee11390015f43bee553f8644348d07..a17199a9ce8602403257fb427fc1ceecbd9b5a55 100644 GIT binary patch literal 35569 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 F0sz0EVF~~M literal 27986 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 HS(ST77xx_type_e::ST7735s_128x128), static_cast(ST77xx_type_e::ST7735s_128x160), static_cast(ST77xx_type_e::ST7735s_80x160), + static_cast(ST77xx_type_e::ST7735s_80x160_M5), static_cast(ST77xx_type_e::ST7789vw_240x320), static_cast(ST77xx_type_e::ST7789vw_240x240), static_cast(ST77xx_type_e::ST7789vw_240x280), diff --git a/src/src/PluginStructs/P116_data_struct.cpp b/src/src/PluginStructs/P116_data_struct.cpp index 53b4e194f..726d48c1d 100644 --- a/src/src/PluginStructs/P116_data_struct.cpp +++ b/src/src/PluginStructs/P116_data_struct.cpp @@ -12,6 +12,7 @@ const __FlashStringHelper* ST77xx_type_toString(ST77xx_type_e device) { case ST77xx_type_e::ST7735s_128x128: return F("ST7735 128 x 128px"); case ST77xx_type_e::ST7735s_128x160: return F("ST7735 128 x 160px"); case ST77xx_type_e::ST7735s_80x160: return F("ST7735 80 x 160px"); + case ST77xx_type_e::ST7735s_80x160_M5: return F("ST7735 80 x 160px (Color inverted)"); case ST77xx_type_e::ST7789vw_240x320: return F("ST7789 240 x 320px"); case ST77xx_type_e::ST7789vw_240x240: return F("ST7789 240 x 240px"); case ST77xx_type_e::ST7789vw_240x280: return F("ST7789 240 x 280px"); @@ -35,6 +36,7 @@ void ST77xx_type_toResolution(ST77xx_type_e device, uint16_t& x, uint16_t& y) { x = 128; y = 160; break; + case ST77xx_type_e::ST7735s_80x160_M5: case ST77xx_type_e::ST7735s_80x160: x = 80; y = 160; @@ -140,6 +142,13 @@ bool P116_data_struct::plugin_init(struct EventStruct *event) { initRoptions = INITR_BLACKTAB; // 128x160px } + // fall through + case ST77xx_type_e::ST7735s_80x160_M5: + + if (initRoptions == 0xFF) { + initRoptions = INITR_GREENTAB160x80; // 80x160px ST7735sv, inverted (M5Stack StickC) + } + // fall through case ST77xx_type_e::ST7735s_80x160: { diff --git a/src/src/PluginStructs/P116_data_struct.h b/src/src/PluginStructs/P116_data_struct.h index b26e0ce63..758663f40 100644 --- a/src/src/PluginStructs/P116_data_struct.h +++ b/src/src/PluginStructs/P116_data_struct.h @@ -58,22 +58,23 @@ # else // ifdef ESP32 // Was: for D1 Mini with shield connection - # define P116_TFT_CS 0 // D3 - # define P116_TFT_DC 4 // D2 + # define P116_TFT_CS 0 // D3 + # define P116_TFT_DC 4 // D2 # define P116_TFT_RST -1 // D4 // -1 # define P116_BACKLIGHT_PIN -1 // D6 // 15 // D8 -> Blocks Wemos # endif // ifdef ESP32 enum class ST77xx_type_e : uint8_t { - ST7735s_128x128 = 0, - ST7735s_128x160, - ST7735s_80x160, - ST7789vw_240x320, - ST7789vw_240x240, - ST7789vw_240x280, - ST7789vw_135x240, - ST7796s_320x480, - ST77xx_MAX // must be last value in enum + ST7735s_128x128 = 0, + ST7735s_128x160 = 1u, + ST7735s_80x160 = 2u, + ST7735s_80x160_M5 = 8u, + ST7789vw_240x320 = 3u, + ST7789vw_240x240 = 4u, + ST7789vw_240x280 = 5u, + ST7789vw_135x240 = 6u, + ST7796s_320x480 = 7u, + ST77xx_MAX = 9u // must be last value in enum }; enum class P116_CommandTrigger : uint8_t { From befcfb3926deff661fdc7acb0938568fa9db2d40 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Thu, 7 Jul 2022 22:55:11 +0200 Subject: [PATCH 2/5] [P087] Add 'Serial Config' options --- src/_P087_SerialProxy.ino | 8 ++++++-- src/src/PluginStructs/P087_data_struct.cpp | 8 ++++++-- src/src/PluginStructs/P087_data_struct.h | 3 ++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/_P087_SerialProxy.ino b/src/_P087_SerialProxy.ino index 7faa8e852..c3fb632fe 100644 --- a/src/_P087_SerialProxy.ino +++ b/src/_P087_SerialProxy.ino @@ -21,6 +21,7 @@ #define P087_BAUDRATE PCONFIG_LONG(0) #define P087_BAUDRATE_LABEL PCONFIG_LABEL(0) +#define P087_SERIAL_CONFIG PCONFIG_LONG(1) #define P087_QUERY_VALUE 0 // Temp placement holder until we know what selectors are needed. #define P087_NR_OUTPUT_OPTIONS 1 @@ -133,6 +134,8 @@ boolean Plugin_087(uint8_t function, struct EventStruct *event, String& string) { addFormNumericBox(F("Baudrate"), P087_BAUDRATE_LABEL, P087_BAUDRATE, 2400, 115200); addUnit(F("baud")); + uint8_t serialConfChoice = serialHelper_convertOldSerialConfig(P087_SERIAL_CONFIG); + serialHelper_serialconfig_webformLoad(event, serialConfChoice); break; } @@ -148,7 +151,8 @@ boolean Plugin_087(uint8_t function, struct EventStruct *event, String& string) } case PLUGIN_WEBFORM_SAVE: { - P087_BAUDRATE = getFormItemInt(P087_BAUDRATE_LABEL); + P087_BAUDRATE = getFormItemInt(P087_BAUDRATE_LABEL); + P087_SERIAL_CONFIG = serialHelper_serialconfig_webformSave(); P087_data_struct *P087_data = static_cast(getPluginTaskData(event->TaskIndex)); @@ -178,7 +182,7 @@ boolean Plugin_087(uint8_t function, struct EventStruct *event, String& string) return success; } - if (P087_data->init(port, serial_rx, serial_tx, P087_BAUDRATE)) { + if (P087_data->init(port, serial_rx, serial_tx, P087_BAUDRATE, static_cast(P087_SERIAL_CONFIG))) { LoadCustomTaskSettings(event->TaskIndex, P087_data->_lines, P87_Nlines, 0); P087_data->post_init(); success = true; diff --git a/src/src/PluginStructs/P087_data_struct.cpp b/src/src/PluginStructs/P087_data_struct.cpp index b37c55126..0b24300b9 100644 --- a/src/src/PluginStructs/P087_data_struct.cpp +++ b/src/src/PluginStructs/P087_data_struct.cpp @@ -24,7 +24,7 @@ void P087_data_struct::reset() { } } -bool P087_data_struct::init(ESPEasySerialPort port, const int16_t serial_rx, const int16_t serial_tx, unsigned long baudrate) { +bool P087_data_struct::init(ESPEasySerialPort port, const int16_t serial_rx, const int16_t serial_tx, unsigned long baudrate, uint8_t config) { if ((serial_rx < 0) && (serial_tx < 0)) { return false; } @@ -32,7 +32,11 @@ bool P087_data_struct::init(ESPEasySerialPort port, const int16_t serial_rx, con easySerial = new (std::nothrow) ESPeasySerial(port, serial_rx, serial_tx); if (isInitialized()) { - easySerial->begin(baudrate); + # if defined(ESP8266) + easySerial->begin(baudrate, (SerialConfig)config); + # elif defined(ESP32) + easySerial->begin(baudrate, config); + # endif // if defined(ESP8266) return true; } return false; diff --git a/src/src/PluginStructs/P087_data_struct.h b/src/src/PluginStructs/P087_data_struct.h index ff66e41b8..7c6639feb 100644 --- a/src/src/PluginStructs/P087_data_struct.h +++ b/src/src/PluginStructs/P087_data_struct.h @@ -49,7 +49,8 @@ public: bool init(ESPEasySerialPort port, const int16_t serial_rx, const int16_t serial_tx, - unsigned long baudrate); + unsigned long baudrate, + uint8_t config); // Called after loading the config from the settings. // Will interpret some data and load caches. From aaba68453b99448ae33c78ee3089db6e0b652a28 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 8 Jul 2022 20:14:25 +0200 Subject: [PATCH 3/5] [P087] Lower minimum baudrate to 300 from 2400 --- src/_P087_SerialProxy.ino | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/_P087_SerialProxy.ino b/src/_P087_SerialProxy.ino index c3fb632fe..9b3dc8aec 100644 --- a/src/_P087_SerialProxy.ino +++ b/src/_P087_SerialProxy.ino @@ -8,6 +8,12 @@ // Interact with a device connected to serial // Allows to redirect data to a controller // +/** + * Changelog: + * 2022-07-08 tonhuisman: Allow baudrate lowest value to 300 (from 2400) + * 2022-07-07 tonhuisman: Add selection for serial protocol configuration (databits, parity, nr. of stopbits) + * 2022-07 First recorded changelog + **/ #include "src/PluginStructs/P087_data_struct.h" @@ -132,7 +138,7 @@ boolean Plugin_087(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_WEBFORM_SHOW_SERIAL_PARAMS: { - addFormNumericBox(F("Baudrate"), P087_BAUDRATE_LABEL, P087_BAUDRATE, 2400, 115200); + addFormNumericBox(F("Baudrate"), P087_BAUDRATE_LABEL, P087_BAUDRATE, 300, 115200); addUnit(F("baud")); uint8_t serialConfChoice = serialHelper_convertOldSerialConfig(P087_SERIAL_CONFIG); serialHelper_serialconfig_webformLoad(event, serialConfChoice); From 605647536db624eadf981462231d378ec79fa5cf Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 8 Jul 2022 20:45:56 +0200 Subject: [PATCH 4/5] [Helpers] enable parseString() family of functions optionally to not trim off white-space --- src/src/Helpers/StringConverter.cpp | 33 +++++++++++++++++------------ src/src/Helpers/StringConverter.h | 30 +++++++++++++++----------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/src/Helpers/StringConverter.cpp b/src/src/Helpers/StringConverter.cpp index 4d54491c8..efa2a38e3 100644 --- a/src/src/Helpers/StringConverter.cpp +++ b/src/src/Helpers/StringConverter.cpp @@ -640,31 +640,33 @@ String to_internal_string(const String& input, char replaceSpace) { IndexFind = 1 => command. // FIXME TD-er: parseString* should use index starting at 0. \*********************************************************************************************/ -String parseString(const String& string, uint8_t indexFind, char separator) { - String result = parseStringKeepCase(string, indexFind, separator); +String parseString(const String& string, uint8_t indexFind, char separator, bool trimResult) { + String result = parseStringKeepCase(string, indexFind, separator, trimResult); result.toLowerCase(); return result; } -String parseStringKeepCase(const String& string, uint8_t indexFind, char separator) { +String parseStringKeepCase(const String& string, uint8_t indexFind, char separator, bool trimResult) { String result; if (!GetArgv(string.c_str(), result, indexFind, separator)) { return EMPTY_STRING; } - result.trim(); + if (trimResult) { + result.trim(); + } return stripQuotes(result); } -String parseStringToEnd(const String& string, uint8_t indexFind, char separator) { - String result = parseStringToEndKeepCase(string, indexFind, separator); +String parseStringToEnd(const String& string, uint8_t indexFind, char separator, bool trimResult) { + String result = parseStringToEndKeepCase(string, indexFind, separator, trimResult); result.toLowerCase(); return result; } -String parseStringToEndKeepCase(const String& string, uint8_t indexFind, char separator) { +String parseStringToEndKeepCase(const String& string, uint8_t indexFind, char separator, bool trimResult) { // Loop over the arguments to find the first and last pos of the arguments. int pos_begin = string.length(); int pos_end = pos_begin; @@ -691,24 +693,27 @@ String parseStringToEndKeepCase(const String& string, uint8_t indexFind, char se } String result = string.substring(pos_begin, pos_end); - result.trim(); + if (trimResult) { + result.trim(); + } return stripQuotes(result); } String tolerantParseStringKeepCase(const char * string, - uint8_t indexFind, - char separator) + uint8_t indexFind, + char separator, + bool trimResult) { - return tolerantParseStringKeepCase(String(string), indexFind, separator); + return tolerantParseStringKeepCase(String(string), indexFind, separator, trimResult); } -String tolerantParseStringKeepCase(const String& string, uint8_t indexFind, char separator) +String tolerantParseStringKeepCase(const String& string, uint8_t indexFind, char separator, bool trimResult) { if (Settings.TolerantLastArgParse()) { - return parseStringToEndKeepCase(string, indexFind, separator); + return parseStringToEndKeepCase(string, indexFind, separator, trimResult); } - return parseStringKeepCase(string, indexFind, separator); + return parseStringKeepCase(string, indexFind, separator, trimResult); } // escapes special characters in strings for use in html-forms diff --git a/src/src/Helpers/StringConverter.h b/src/src/Helpers/StringConverter.h index 0419d246e..c2dc3b1ca 100644 --- a/src/src/Helpers/StringConverter.h +++ b/src/src/Helpers/StringConverter.h @@ -209,28 +209,34 @@ String to_internal_string(const String& input, // FIXME TD-er: parseString* should use index starting at 0. \*********************************************************************************************/ String parseString(const String& string, - uint8_t indexFind, - char separator = ','); + uint8_t indexFind, + char separator = ',', + bool trimResult = true); String parseStringKeepCase(const String& string, - uint8_t indexFind, - char separator = ','); + uint8_t indexFind, + char separator = ',', + bool trimResult = true); String parseStringToEnd(const String& string, - uint8_t indexFind, - char separator = ','); + uint8_t indexFind, + char separator = ',', + bool trimResult = true); String parseStringToEndKeepCase(const String& string, - uint8_t indexFind, - char separator = ','); + uint8_t indexFind, + char separator = ',', + bool trimResult = true); String tolerantParseStringKeepCase(const char * string, - uint8_t indexFind, - char separator = ','); + uint8_t indexFind, + char separator = ',', + bool trimResult = true); String tolerantParseStringKeepCase(const String& string, - uint8_t indexFind, - char separator = ','); + uint8_t indexFind, + char separator = ',', + bool trimResult = true); // escapes special characters in strings for use in html-forms bool htmlEscapeChar(char c, From 946eefc10cf7ceb11059846e9609961c03744d81 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 8 Jul 2022 20:48:01 +0200 Subject: [PATCH 5/5] [P087] Don't trim white-space from serialproxy_write command argument so f.e. CR/LF can be used to terminate a message --- src/_P087_SerialProxy.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/_P087_SerialProxy.ino b/src/_P087_SerialProxy.ino index 9b3dc8aec..a2b9c5876 100644 --- a/src/_P087_SerialProxy.ino +++ b/src/_P087_SerialProxy.ino @@ -11,6 +11,7 @@ /** * Changelog: * 2022-07-08 tonhuisman: Allow baudrate lowest value to 300 (from 2400) + * Don't trim off pre/post white-space from string to send * 2022-07-07 tonhuisman: Add selection for serial protocol configuration (databits, parity, nr. of stopbits) * 2022-07 First recorded changelog **/ @@ -240,7 +241,7 @@ boolean Plugin_087(uint8_t function, struct EventStruct *event, String& string) static_cast(getPluginTaskData(event->TaskIndex)); if ((nullptr != P087_data)) { - String param1 = parseStringKeepCase(string, 2); + String param1 = parseStringKeepCase(string, 2, ',', false); // Don't trim off white-space parseSystemVariables(param1, false); P087_data->sendString(param1); addLogMove(LOG_LEVEL_INFO, param1);