Изменение модели отрисовки значений на LCD экране

Отрисовка по событию, а не таймеру
Возможность использовать экран как переменную с синхронным отображением в вебе
ВНИМАНИЕ! Убрали descr как часть выводимой строки
Добавили prefix и postfix для формирования строки вывода
This commit is contained in:
2023-06-30 10:01:11 +03:00
parent 965b340e5c
commit 45c575b755
2 changed files with 59 additions and 45 deletions

View File

@@ -1,22 +1,14 @@
#include "Global.h" #include "Global.h"
#include "classes/IoTItem.h" #include "classes/IoTItem.h"
//#include "LiquidCrystal_I2C.h"
#include <RobotClass_LiquidCrystal_I2C.h> #include <RobotClass_LiquidCrystal_I2C.h>
#include <map>
void scanI2C();
//LiquidCrystal_I2C *LCDI2C;
RobotClass_LiquidCrystal_I2C *LCDI2C; RobotClass_LiquidCrystal_I2C *LCDI2C;
class Lcd2004 : public IoTItem { class Lcd2004 : public IoTItem {
private: private:
unsigned int _x; unsigned int _x;
unsigned int _y; unsigned int _y;
String _id2show; String _id2show, _prefix = "", _postfix = "";
String _descr;
int _prevStrSize; int _prevStrSize;
String _addr; String _addr;
@@ -37,42 +29,52 @@ class Lcd2004 : public IoTItem {
int w = selectFromMarkerToMarker(size, ",", 0).toInt(); //количество столбцов int w = selectFromMarkerToMarker(size, ",", 0).toInt(); //количество столбцов
int h = selectFromMarkerToMarker(size, ",", 1).toInt(); //количество строк int h = selectFromMarkerToMarker(size, ",", 1).toInt(); //количество строк
if (LCDI2C == nullptr) { //инициализации экрана еще не было if (LCDI2C == nullptr) { //инициализации экрана еще не было
//LCDI2C = new LiquidCrystal_I2C(hexStringToUint8(_addr), w, h);
LCDI2C = new RobotClass_LiquidCrystal_I2C(hexStringToUint8(_addr), w, h, CP_UTF8); LCDI2C = new RobotClass_LiquidCrystal_I2C(hexStringToUint8(_addr), w, h, CP_UTF8);
if (LCDI2C != nullptr) { if (LCDI2C != nullptr) {
LCDI2C->init(); LCDI2C->init();
LCDI2C->clear();
LCDI2C->backlight();
} }
} }
LCDI2C->clear();
LCDI2C->backlight();
jsonRead(parameters, "coord", xy); jsonRead(parameters, "coord", xy);
_x = selectFromMarkerToMarker(xy, ",", 0).toInt(); _x = selectFromMarkerToMarker(xy, ",", 0).toInt();
_y = selectFromMarkerToMarker(xy, ",", 1).toInt(); _y = selectFromMarkerToMarker(xy, ",", 1).toInt();
jsonRead(parameters, "descr", _descr);
jsonRead(parameters, "id2show", _id2show); jsonRead(parameters, "id2show", _id2show);
jsonRead(parameters, "prefix", _prefix);
jsonRead(parameters, "postfix", _postfix);
} }
void doByInterval() { void drawItem(IoTItem* item) {
if (LCDI2C != nullptr) { String tmpStr = _prefix;
printBlankStr(_prevStrSize); tmpStr += item->getValue();
tmpStr += _postfix;
String tmpStr = getItemValue(_id2show);
if (_descr != "none") tmpStr = _descr + " " + tmpStr; printBlankStr(_prevStrSize);
LCDI2C->setCursor(_x, _y); LCDI2C->setCursor(_x, _y);
LCDI2C->print(tmpStr); LCDI2C->print(tmpStr);
_prevStrSize = tmpStr.length();
//LCDI2C->print("Helloy,Manager 404 !"); }
//Serial.printf("ffff %s\n", _id2show);
_prevStrSize = tmpStr.length(); void setValue(const IoTValue& Value, bool genEvent = true) {
} else { if (LCDI2C == nullptr) return;
scanI2C();
value = Value;
drawItem(this);
IoTItem::setValue(Value, genEvent);
}
void onRegEvent(IoTItem* eventItem) {
if (LCDI2C == nullptr) { scanI2C(); return;}
if (!eventItem || _id2show == "") return;
if (_id2show == eventItem->getID()) {
setValue(eventItem->value, false);
} }
} }
IoTValue execute(String command, std::vector<IoTValue> &param) { // будет возможным использовать, когда сценарии запустятся IoTValue execute(String command, std::vector<IoTValue> &param) {
if (command == "noBacklight") if (command == "noBacklight")
LCDI2C->noBacklight(); LCDI2C->noBacklight();
else if (command == "backlight") else if (command == "backlight")
@@ -99,9 +101,13 @@ class Lcd2004 : public IoTItem {
if (param.size()) { if (param.size()) {
_y = param[0].valD; _y = param[0].valD;
} }
} else if (command == "descr") { } else if (command == "prefix") {
if (param.size()) { if (param.size()) {
_descr = param[0].valS; _prefix = param[0].valS;
}
} else if (command == "postfix") {
if (param.size()) {
_postfix = param[0].valS;
} }
} else if (command == "id2show") { } else if (command == "id2show") {
if (param.size()) { if (param.size()) {

View File

@@ -7,30 +7,32 @@
"type": "Reading", "type": "Reading",
"subtype": "Lcd2004", "subtype": "Lcd2004",
"id": "Lcd", "id": "Lcd",
"widget": "", "widget": "inputTxt",
"page": "", "page": "Экраны",
"descr": "T", "descr": "LCD Экран",
"int": 15,
"addr": "0x27", "addr": "0x27",
"size": "20,4", "size": "20,4",
"coord": "0,0", "coord": "0,0",
"id2show": "id датчика" "id2show": "",
"prefix": "",
"postfix": ""
}, },
{ {
"name": "LCD экран 1602", "name": "LCD экран 1602",
"type": "Reading", "type": "Reading",
"subtype": "Lcd2004", "subtype": "Lcd2004",
"id": "Lcd", "id": "Lcd",
"widget": "", "widget": "inputTxt",
"page": "", "page": "Экраны",
"descr": "T", "descr": "LCD Экран",
"int": 15,
"addr": "0x27", "addr": "0x27",
"size": "16,2", "size": "16,2",
"coord": "0,0", "coord": "0,0",
"id2show": "id датчика" "id2show": "",
"prefix": "",
"postfix": ""
}], }],
"about": { "about": {
@@ -46,11 +48,12 @@
}, },
"moduleDesc": "Позволяет выводить на символьные экраны по указанным позициям значения других элементов конфигурации.", "moduleDesc": "Позволяет выводить на символьные экраны по указанным позициям значения других элементов конфигурации.",
"propInfo": { "propInfo": {
"int": "Период времени в секундах обновления информации на экране по конкретному элементу.", "addr": "Адрес устройства на шине, обычно 0x27. Установите пустую строку для включения режима сканирования адресов на шине (результат в консоли).",
"addr": "Адрес устройства на шине, обычно 0x27.",
"size": "Размерность матрицы экрана.", "size": "Размерность матрицы экрана.",
"coord": "Координата позиции для вывода данных элемента конфигурации.", "coord": "Координата позиции для вывода данных элемента конфигурации.",
"id2show": "id элемента конфигурации." "id2show": "id элемента конфигурации для отображения на экране. Если пустое значение, то данные берутся из собственной переменной.",
"prefix": "Символы до значения.",
"postfix": "Символы после значения."
}, },
"funcInfo": [ "funcInfo": [
{ {
@@ -89,10 +92,15 @@
"params": ["Номер столбца первого символа"] "params": ["Номер столбца первого символа"]
}, },
{ {
"name": "descr", "name": "prefix",
"descr": "Задает приставку слева от значения", "descr": "Задает приставку слева от значения",
"params": ["Строка"] "params": ["Строка"]
}, },
{
"name": "postfix",
"descr": "Задает приставку справа от значения",
"params": ["Строка"]
},
{ {
"name": "id2show", "name": "id2show",
"descr": "Задает ИД элемента, значение которого хотим отображать на экране", "descr": "Задает ИД элемента, значение которого хотим отображать на экране",