From 0bfc876c655507bea75371864005fe62fe4e4735 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Mon, 2 Nov 2020 01:21:51 +0300 Subject: [PATCH] 263 Impuls added --- data/items/impuls-out.txt | 1 + data/set.device.json | 7 +-- include/BufferExecute.h | 4 +- include/Class/LineParsing.h | 4 +- include/Consts.h | 4 +- include/Global.h | 13 ++--- include/ItemsCmd.h | 2 + include/items/ImpulsOutClass.h | 14 +++--- src/BufferExecute.cpp | 30 +++++++++--- src/Global.cpp | 8 +++- src/Init.cpp | 33 +++---------- src/ItemsCmd.cpp | 2 + src/MqttClient.cpp | 86 ++++++++++++++++++---------------- src/Utils/StringUtils.cpp | 6 ++- src/items/ImpulsOutClass.cpp | 56 ++++++++++++++-------- src/items/LoggingClass.cpp | 8 ++-- src/main.cpp | 10 ++-- 17 files changed, 161 insertions(+), 127 deletions(-) create mode 100644 data/items/impuls-out.txt diff --git a/data/items/impuls-out.txt b/data/items/impuls-out.txt new file mode 100644 index 00000000..99994ae5 --- /dev/null +++ b/data/items/impuls-out.txt @@ -0,0 +1 @@ +0;impuls-out;id;na;na;na;order;pin \ No newline at end of file diff --git a/data/set.device.json b/data/set.device.json index 1a94ee8d..ae32d833 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -43,7 +43,7 @@ }, { "type": "h4", - "title": "LittleFS version: 262" + "title": "LittleFS version: 263" }, { "type": "hr" @@ -74,7 +74,8 @@ "/set?addItem=bme280-press": "17.Датчик давления bme280", "/set?addItem=bmp280-temp": "18.Датчик температуры bmp280", "/set?addItem=bmp280-press": "19.Датчик давления bmp280", - "/set?addItem=modbus": "20.Прочитать регистр modbus устройства", + "/set?addItem=impuls-out": "20.Создать импульсы через заданный промежуток времени (управление шд)", + "/set?addItem=modbus": "21.Прочитать регистр modbus устройства", "/set?addItem=logging": "a.Логгирование и вывод в график любой величины", "/set?addItem=uptime": "b.Отобразить время работы устройства" } @@ -116,7 +117,7 @@ }, { "type": "text", - "title": "

После любого изменения таблицы элементов, включая удаление/добавление строк, необходимо нажать кнопку СОХРАНИТЬ ТАБЛИЦУ

" + "title": "

После любого изменения таблицы элементов, включая удаление/добавление строк, необходимо нажать кнопку СОХРАНИТЬ ТАБЛИЦУ. Иногда, для корректной работы необходимо перезагрузить устройство после финального завершения его настройки

" }, { "type": "h2", diff --git a/include/BufferExecute.h b/include/BufferExecute.h index 85252a36..8575f6f4 100644 --- a/include/BufferExecute.h +++ b/include/BufferExecute.h @@ -5,4 +5,6 @@ extern void loopCmdAdd(const String &cmdStr); extern void fileCmdExecute(const String &filename); extern void csvCmdExecute(String &cmdStr); extern void spaceCmdExecute(String &cmdStr); -extern void loopCmdExecute(); \ No newline at end of file +extern void loopCmdExecute(); +extern void addKey(String& key, int number); +extern int getKeyNum(String& key); \ No newline at end of file diff --git a/include/Class/LineParsing.h b/include/Class/LineParsing.h index 3543b581..52135995 100644 --- a/include/Class/LineParsing.h +++ b/include/Class/LineParsing.h @@ -155,10 +155,10 @@ class LineParsing { String gint() { return _int; } - String gmaxcnt() { + String gcnt() { return _cnt; } - String gvalue() { + String gval() { return _val; } diff --git a/include/Consts.h b/include/Consts.h index fe42560a..61cbf9e1 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -3,7 +3,7 @@ //===========Firmware============================================================================================================================================= #ifdef ESP8266 #define FIRMWARE_NAME "esp8266-iotm" -#define FIRMWARE_VERSION 262 +#define FIRMWARE_VERSION 263 #endif #ifdef ESP32 #define FIRMWARE_NAME "esp32-iotm" @@ -31,7 +31,7 @@ //#define MDNS_ENABLED //#define WEBSOCKET_ENABLED //#define LAYOUT_IN_RAM -//#define UDP_ENABLED +#define UDP_ENABLED //#define SSDP_ENABLED //=========Sensors enable/disable================================================================================================================================= diff --git a/include/Global.h b/include/Global.h index fc9646a5..6a794f67 100644 --- a/include/Global.h +++ b/include/Global.h @@ -65,23 +65,20 @@ extern String eventBuf; extern String itemsFile; extern String itemsLine; +//key lists and numbers +extern String impulsKeyList; +extern int impulsEnterCounter; + // Sensors extern String sensorReadingMap10sec; extern String sensorReadingMap30sec; extern int8_t dallasEnterCounter; -extern String logging_value_names_list; +extern String loggingKeyList; extern int enter_to_logging_counter; extern int scenario_line_status[40]; extern int lastVersion; -//Global functions -// Logging -extern void logging(); -extern void deleteOldDate(String filename, size_t max_lines, String date_to_add); - - - // Main extern void setChipId(); extern void saveConfig(); diff --git a/include/ItemsCmd.h b/include/ItemsCmd.h index 24d04b67..39bbca79 100644 --- a/include/ItemsCmd.h +++ b/include/ItemsCmd.h @@ -51,3 +51,5 @@ extern void sysUptime(); extern void uptimeReading(); extern void logging(); + +extern void impuls(); diff --git a/include/items/ImpulsOutClass.h b/include/items/ImpulsOutClass.h index 2f6b8651..1d9f9fa6 100644 --- a/include/items/ImpulsOutClass.h +++ b/include/items/ImpulsOutClass.h @@ -9,21 +9,23 @@ typedef std::vector MyImpulsOutVector; class ImpulsOutClass { public: - ImpulsOutClass(unsigned long impulsPeriod, unsigned int impulsCount, unsigned int impulsPin); + ImpulsOutClass(unsigned int impulsPin); ~ImpulsOutClass(); void loop(); - void activate(); + void execute(unsigned long impulsPeriod, unsigned int impulsCount); private: unsigned long currentMillis; unsigned long prevMillis; - unsigned long _impulsPeriod; - unsigned int _impulsCount; - unsigned int _impulsCountBuf; - unsigned int _impulsPin; + unsigned long _impulsPeriod = 0; + unsigned int _impulsCount = 0; + unsigned int _impulsCountBuf = 0; + unsigned int _impulsPin = 0; }; extern MyImpulsOutVector* myImpulsOut; + +extern void impulsExecute(); diff --git a/src/BufferExecute.cpp b/src/BufferExecute.cpp index 83d6ab45..2e580fee 100644 --- a/src/BufferExecute.cpp +++ b/src/BufferExecute.cpp @@ -3,19 +3,19 @@ #include "Global.h" #include "Module/Terminal.h" -void loopCmdAdd(const String &cmdStr) { +void loopCmdAdd(const String& cmdStr) { orderBuf += cmdStr; if (!cmdStr.endsWith(",")) { orderBuf += ","; } } -void fileCmdExecute(const String &filename) { +void fileCmdExecute(const String& filename) { String cmdStr = readFile(filename, 4096); csvCmdExecute(cmdStr); } -void csvCmdExecute(String &cmdStr) { +void csvCmdExecute(String& cmdStr) { cmdStr.replace(";", " "); cmdStr += "\r\n"; cmdStr.replace("\r\n", "\n"); @@ -30,7 +30,7 @@ void csvCmdExecute(String &cmdStr) { } } -void spaceCmdExecute(String &cmdStr) { +void spaceCmdExecute(String& cmdStr) { cmdStr += "\r\n"; cmdStr.replace("\r\n", "\n"); cmdStr.replace("\r", "\n"); @@ -52,7 +52,7 @@ void loopCmdExecute() { void sensorsInit() { ts.add( - SENSORS10SEC, 10000, [&](void *) { + SENSORS10SEC, 10000, [&](void*) { String buf = sensorReadingMap10sec; while (buf.length()) { String tmp = selectToMarker(buf, ","); @@ -63,7 +63,7 @@ void sensorsInit() { nullptr, true); ts.add( - SENSORS30SEC, 30000, [&](void *) { + SENSORS30SEC, 30000, [&](void*) { String buf = sensorReadingMap30sec; while (buf.length()) { String tmp = selectToMarker(buf, ","); @@ -74,3 +74,21 @@ void sensorsInit() { nullptr, true); } +void addKey(String& key, int number) { + impulsKeyList += key + " " + String(number) + ","; +} + +int getKeyNum(String& key) { + String keyNumberTableBuf = impulsKeyList; + //SerialPrint("","",impulsKeyList); + int number = -1; + while (keyNumberTableBuf.length()) { + String tmp = selectToMarker(keyNumberTableBuf, ","); + String keyIncomming = selectToMarker(tmp, " "); + if (keyIncomming == key) { + number = selectToMarkerLast(tmp, " ").toInt(); + } + keyNumberTableBuf = deleteBeforeDelimiter(keyNumberTableBuf, ","); + } + return number; +} diff --git a/src/Global.cpp b/src/Global.cpp index c47fe17e..3a572d9d 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -33,17 +33,21 @@ String scenario = ""; //orders and events String orderBuf = ""; String eventBuf = ""; - String itemsFile = ""; String itemsLine = ""; +//key lists and numbers +String impulsKeyList = ""; +int impulsEnterCounter = -1; + + // Sensors int8_t dallasEnterCounter = -1; String sensorReadingMap10sec; String sensorReadingMap30sec; // Logging -String logging_value_names_list; +String loggingKeyList; int enter_to_logging_counter; // Upgrade diff --git a/src/Init.cpp b/src/Init.cpp index e8cccfdb..0996230a 100644 --- a/src/Init.cpp +++ b/src/Init.cpp @@ -1,5 +1,5 @@ #include "Init.h" - +#include "BufferExecute.h" #include "Cmd.h" #include "Global.h" #include "items/LoggingClass.h" @@ -31,32 +31,13 @@ void Device_init() { if (myLogging != nullptr) { myLogging->clear(); } - logging_value_names_list = ""; + + loggingKeyList = ""; + + impulsKeyList = ""; + impulsEnterCounter = -1; + - - //enter_to_logging_counter = LOG1 - 1; - //analog_value_names_list = ""; - //enter_to_analog_counter = 0; - //dallas_value_name = ""; - //enter_to_dallas_counter = 0; - //levelPr_value_name = ""; - //ultrasonicCm_value_name = ""; - //dhtT_value_name = ""; - //dhtH_value_name = ""; - //bmp280T_value_name = ""; - //bmp280P_value_name = ""; - //bme280T_value_name = ""; - //bme280P_value_name = ""; - //bme280H_value_name = ""; - //bme280A_value_name = ""; - //int array_sz = sizeof(sensors_reading_map) / sizeof(sensors_reading_map[0]); - //for (int i = 0; i < array_sz; i++) { - // sensors_reading_map[i] = 0; - //} - //for (int i = LOG1; i <= LOG5; i++) { - // ts.remove(i); - //} - #ifdef LAYOUT_IN_RAM all_widgets = ""; #else diff --git a/src/ItemsCmd.cpp b/src/ItemsCmd.cpp index 2a949050..4fc35acd 100644 --- a/src/ItemsCmd.cpp +++ b/src/ItemsCmd.cpp @@ -49,6 +49,8 @@ void cmd_init() { sCmd.addCommand("logging", logging); + sCmd.addCommand("impuls-out", impuls); + handle_time_init(); } diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index 6c94d73c..2210cbb3 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -26,11 +26,13 @@ void mqttInit() { if (mqtt.connected()) { SerialPrint("I", "MQTT", "OK"); setLedStatus(LED_OFF); - } else { + } + else { SerialPrint("E", "MQTT", "lost connection"); mqttConnect(); } - } else { + } + else { SerialPrint("E", "WIFI", "Lost WiFi connection"); ts.remove(WIFI_MQTT_CONNECTION_CHECK); startAPMode(); @@ -89,7 +91,8 @@ boolean mqttConnect() { setLedStatus(LED_OFF); mqttSubscribe(); res = true; - } else { + } + else { SerialPrint("E", "MQTT", "could't connect, retry in " + String(MQTT_RECONNECT_INTERVAL / 1000) + "s"); setLedStatus(LED_FAST); } @@ -116,8 +119,9 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { choose_log_date_and_send(); #endif - } else if (topicStr.indexOf("control")) { - + } + else if (topicStr.indexOf("control")) { + String key = selectFromMarkerToMarker(topicStr, "/", 3); orderBuf += key; @@ -125,12 +129,14 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { orderBuf += payloadStr; orderBuf += ","; - } else if (topicStr.indexOf("order")) { + } + else if (topicStr.indexOf("order")) { payloadStr.replace("_", " "); orderBuf += payloadStr; orderBuf += ","; - } else if (topicStr.indexOf("update")) { + } + else if (topicStr.indexOf("update")) { if (payloadStr == "1") { myNotAsyncActions->make(do_UPGRADE); } @@ -245,38 +251,38 @@ void publishState() { const String getStateStr() { switch (mqtt.state()) { - case -4: - return F("no respond"); - break; - case -3: - return F("connection was broken"); - break; - case -2: - return F("connection failed"); - break; - case -1: - return F("client disconnected"); - break; - case 0: - return F("client connected"); - break; - case 1: - return F("doesn't support the requested version"); - break; - case 2: - return F("rejected the client identifier"); - break; - case 3: - return F("unable to accept the connection"); - break; - case 4: - return F("wrong username/password"); - break; - case 5: - return F("not authorized to connect"); - break; - default: - return F("unspecified"); - break; + case -4: + return F("no respond"); + break; + case -3: + return F("connection was broken"); + break; + case -2: + return F("connection failed"); + break; + case -1: + return F("client disconnected"); + break; + case 0: + return F("client connected"); + break; + case 1: + return F("doesn't support the requested version"); + break; + case 2: + return F("rejected the client identifier"); + break; + case 3: + return F("unable to accept the connection"); + break; + case 4: + return F("wrong username/password"); + break; + case 5: + return F("not authorized to connect"); + break; + default: + return F("unspecified"); + break; } } diff --git a/src/Utils/StringUtils.cpp b/src/Utils/StringUtils.cpp index bf6af4b1..a158fa94 100644 --- a/src/Utils/StringUtils.cpp +++ b/src/Utils/StringUtils.cpp @@ -75,7 +75,7 @@ uint16_t hexStringToUint16(String hex) { } } -size_t itemsCount(String str, const String &separator) { +size_t itemsCount(String str, const String& separator) { // если строки поиск нет сразу выход if (str.indexOf(separator) == -1) { return 0; @@ -91,7 +91,7 @@ size_t itemsCount(String str, const String &separator) { return cnt; } -boolean isDigitStr(const String &str) { +boolean isDigitStr(const String& str) { for (size_t i = 0; i < str.length(); i++) { if (!isDigit(str.charAt(i))) { return false; @@ -111,3 +111,5 @@ String prettyBytes(size_t size) { return String(size / 1024.0 / 1024.0 / 1024.0) + "GB"; } + + diff --git a/src/items/ImpulsOutClass.cpp b/src/items/ImpulsOutClass.cpp index 6a0df539..fb423dcc 100644 --- a/src/items/ImpulsOutClass.cpp +++ b/src/items/ImpulsOutClass.cpp @@ -1,21 +1,21 @@ #include "items/ImpulsOutClass.h" #include - +#include "BufferExecute.h" #include "Class/LineParsing.h" #include "Global.h" #include "ItemsCmd.h" -ImpulsOutClass::ImpulsOutClass(unsigned long impulsPeriod, unsigned int impulsCount, unsigned int impulsPin) { - _impulsPeriod = impulsPeriod; - _impulsCount = impulsCount * 2; +ImpulsOutClass::ImpulsOutClass(unsigned int impulsPin) { _impulsPin = impulsPin; pinMode(impulsPin, OUTPUT); } ImpulsOutClass::~ImpulsOutClass() {} -void ImpulsOutClass::activate() { +void ImpulsOutClass::execute(unsigned long impulsPeriod, unsigned int impulsCount) { + _impulsPeriod = impulsPeriod; + _impulsCount = impulsCount * 2; _impulsCountBuf = _impulsCount; } @@ -38,18 +38,34 @@ void ImpulsOutClass::loop() { MyImpulsOutVector* myImpulsOut = nullptr; -//void impuls() { -// myLineParsing.update(); -// String loggingValueKey = myLineParsing.gvalue(); -// String key = myLineParsing.gkey(); -// String interv = myLineParsing.gint(); -// String maxcnt = myLineParsing.gmaxcnt(); -// myLineParsing.clear(); -// -// logging_value_names_list += key + ","; -// -// static bool firstTime = true; -// if (firstTime) myImpulsOut = new MyImpulsOutVector(); -// firstTime = false; -// myImpulsOut->push_back(ImpulsOutClass(interv.toInt(), maxcnt.toInt(), loggingValueKey, key)); -//} +void impuls() { + myLineParsing.update(); + String key = myLineParsing.gkey(); + String pin = myLineParsing.gpin(); + myLineParsing.clear(); + + impulsEnterCounter++; + addKey(key, impulsEnterCounter); + + static bool firstTime = true; + if (firstTime) myImpulsOut = new MyImpulsOutVector(); + firstTime = false; + myImpulsOut->push_back(ImpulsOutClass(pin.toInt())); + + sCmd.addCommand(key.c_str(), impulsExecute); +} + +void impulsExecute() { + String key = sCmd.order(); + String impulsPeriod = sCmd.next(); + String impulsCount = sCmd.next(); + + int number = getKeyNum(key); + SerialPrint("I", "Impuls", key + " " + String(number)); + + if (myImpulsOut != nullptr) { + if (number != -1) { + myImpulsOut->at(number).execute(impulsPeriod.toInt(), impulsCount.toInt()); + } + } +} diff --git a/src/items/LoggingClass.cpp b/src/items/LoggingClass.cpp index de9cdee3..ca34a0ce 100644 --- a/src/items/LoggingClass.cpp +++ b/src/items/LoggingClass.cpp @@ -54,13 +54,13 @@ MyLoggingVector* myLogging = nullptr; void logging() { myLineParsing.update(); - String loggingValueKey = myLineParsing.gvalue(); + String loggingValueKey = myLineParsing.gval(); String key = myLineParsing.gkey(); String interv = myLineParsing.gint(); - String maxcnt = myLineParsing.gmaxcnt(); + String maxcnt = myLineParsing.gcnt(); myLineParsing.clear(); - logging_value_names_list += key + ","; + loggingKeyList += key + ","; static bool firstTime = true; if (firstTime) myLogging = new MyLoggingVector(); @@ -69,7 +69,7 @@ void logging() { } void choose_log_date_and_send() { - String all_line = logging_value_names_list; + String all_line = loggingKeyList; while (all_line.length() != 0) { String tmp = selectToMarker(all_line, ","); sendLogData("logs/" + tmp + ".txt", tmp); diff --git a/src/main.cpp b/src/main.cpp index 14293ccc..15fc5ef4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -101,11 +101,11 @@ void setup() { just_load = false; initialized = true; //this second POST makes the data to be processed (you don't need to connect as "keep-alive" for that to work) - static bool firstTime = true; - if (firstTime) myImpulsOut = new MyImpulsOutVector(); - firstTime = false; - myImpulsOut->push_back(ImpulsOutClass(500, 10, 13)); - myImpulsOut->at(0).activate(); + //static bool firstTime = true; + //if (firstTime) myImpulsOut = new MyImpulsOutVector(); + //firstTime = false; + //myImpulsOut->push_back(ImpulsOutClass(500, 10, 13)); + //myImpulsOut->at(0).execute(); } void loop() {