263 Impuls added

This commit is contained in:
Dmitry Borisenko
2020-11-02 01:21:51 +03:00
parent 518a0e0404
commit 0bfc876c65
17 changed files with 161 additions and 127 deletions

View File

@@ -0,0 +1 @@
0;impuls-out;id;na;na;na;order;pin

View File

@@ -43,7 +43,7 @@
}, },
{ {
"type": "h4", "type": "h4",
"title": "LittleFS version: 262" "title": "LittleFS version: 263"
}, },
{ {
"type": "hr" "type": "hr"
@@ -74,7 +74,8 @@
"/set?addItem=bme280-press": "17.Датчик давления bme280", "/set?addItem=bme280-press": "17.Датчик давления bme280",
"/set?addItem=bmp280-temp": "18.Датчик температуры bmp280", "/set?addItem=bmp280-temp": "18.Датчик температуры bmp280",
"/set?addItem=bmp280-press": "19.Датчик давления 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=logging": "a.Логгирование и вывод в график любой величины",
"/set?addItem=uptime": "b.Отобразить время работы устройства" "/set?addItem=uptime": "b.Отобразить время работы устройства"
} }
@@ -116,7 +117,7 @@
}, },
{ {
"type": "text", "type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>После любого изменения таблицы элементов, включая удаление/добавление строк, необходимо нажать кнопку <b>СОХРАНИТЬ ТАБЛИЦУ</b></p></font></div>" "title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>После любого изменения таблицы элементов, включая удаление/добавление строк, необходимо нажать кнопку <b>СОХРАНИТЬ ТАБЛИЦУ</b>. Иногда, для корректной работы необходимо перезагрузить устройство после финального завершения его настройки</p></font></div>"
}, },
{ {
"type": "h2", "type": "h2",

View File

@@ -6,3 +6,5 @@ extern void fileCmdExecute(const String &filename);
extern void csvCmdExecute(String &cmdStr); extern void csvCmdExecute(String &cmdStr);
extern void spaceCmdExecute(String &cmdStr); extern void spaceCmdExecute(String &cmdStr);
extern void loopCmdExecute(); extern void loopCmdExecute();
extern void addKey(String& key, int number);
extern int getKeyNum(String& key);

View File

@@ -155,10 +155,10 @@ class LineParsing {
String gint() { String gint() {
return _int; return _int;
} }
String gmaxcnt() { String gcnt() {
return _cnt; return _cnt;
} }
String gvalue() { String gval() {
return _val; return _val;
} }

View File

@@ -3,7 +3,7 @@
//===========Firmware============================================================================================================================================= //===========Firmware=============================================================================================================================================
#ifdef ESP8266 #ifdef ESP8266
#define FIRMWARE_NAME "esp8266-iotm" #define FIRMWARE_NAME "esp8266-iotm"
#define FIRMWARE_VERSION 262 #define FIRMWARE_VERSION 263
#endif #endif
#ifdef ESP32 #ifdef ESP32
#define FIRMWARE_NAME "esp32-iotm" #define FIRMWARE_NAME "esp32-iotm"
@@ -31,7 +31,7 @@
//#define MDNS_ENABLED //#define MDNS_ENABLED
//#define WEBSOCKET_ENABLED //#define WEBSOCKET_ENABLED
//#define LAYOUT_IN_RAM //#define LAYOUT_IN_RAM
//#define UDP_ENABLED #define UDP_ENABLED
//#define SSDP_ENABLED //#define SSDP_ENABLED
//=========Sensors enable/disable================================================================================================================================= //=========Sensors enable/disable=================================================================================================================================

View File

@@ -65,23 +65,20 @@ extern String eventBuf;
extern String itemsFile; extern String itemsFile;
extern String itemsLine; extern String itemsLine;
//key lists and numbers
extern String impulsKeyList;
extern int impulsEnterCounter;
// Sensors // Sensors
extern String sensorReadingMap10sec; extern String sensorReadingMap10sec;
extern String sensorReadingMap30sec; extern String sensorReadingMap30sec;
extern int8_t dallasEnterCounter; extern int8_t dallasEnterCounter;
extern String logging_value_names_list; extern String loggingKeyList;
extern int enter_to_logging_counter; extern int enter_to_logging_counter;
extern int scenario_line_status[40]; extern int scenario_line_status[40];
extern int lastVersion; extern int lastVersion;
//Global functions
// Logging
extern void logging();
extern void deleteOldDate(String filename, size_t max_lines, String date_to_add);
// Main // Main
extern void setChipId(); extern void setChipId();
extern void saveConfig(); extern void saveConfig();

View File

@@ -51,3 +51,5 @@ extern void sysUptime();
extern void uptimeReading(); extern void uptimeReading();
extern void logging(); extern void logging();
extern void impuls();

View File

@@ -9,21 +9,23 @@ typedef std::vector<ImpulsOutClass> MyImpulsOutVector;
class ImpulsOutClass { class ImpulsOutClass {
public: public:
ImpulsOutClass(unsigned long impulsPeriod, unsigned int impulsCount, unsigned int impulsPin); ImpulsOutClass(unsigned int impulsPin);
~ImpulsOutClass(); ~ImpulsOutClass();
void loop(); void loop();
void activate(); void execute(unsigned long impulsPeriod, unsigned int impulsCount);
private: private:
unsigned long currentMillis; unsigned long currentMillis;
unsigned long prevMillis; unsigned long prevMillis;
unsigned long _impulsPeriod; unsigned long _impulsPeriod = 0;
unsigned int _impulsCount; unsigned int _impulsCount = 0;
unsigned int _impulsCountBuf; unsigned int _impulsCountBuf = 0;
unsigned int _impulsPin; unsigned int _impulsPin = 0;
}; };
extern MyImpulsOutVector* myImpulsOut; extern MyImpulsOutVector* myImpulsOut;
extern void impulsExecute();

View File

@@ -3,19 +3,19 @@
#include "Global.h" #include "Global.h"
#include "Module/Terminal.h" #include "Module/Terminal.h"
void loopCmdAdd(const String &cmdStr) { void loopCmdAdd(const String& cmdStr) {
orderBuf += cmdStr; orderBuf += cmdStr;
if (!cmdStr.endsWith(",")) { if (!cmdStr.endsWith(",")) {
orderBuf += ","; orderBuf += ",";
} }
} }
void fileCmdExecute(const String &filename) { void fileCmdExecute(const String& filename) {
String cmdStr = readFile(filename, 4096); String cmdStr = readFile(filename, 4096);
csvCmdExecute(cmdStr); csvCmdExecute(cmdStr);
} }
void csvCmdExecute(String &cmdStr) { void csvCmdExecute(String& cmdStr) {
cmdStr.replace(";", " "); cmdStr.replace(";", " ");
cmdStr += "\r\n"; cmdStr += "\r\n";
cmdStr.replace("\r\n", "\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 += "\r\n";
cmdStr.replace("\r\n", "\n"); cmdStr.replace("\r\n", "\n");
cmdStr.replace("\r", "\n"); cmdStr.replace("\r", "\n");
@@ -52,7 +52,7 @@ void loopCmdExecute() {
void sensorsInit() { void sensorsInit() {
ts.add( ts.add(
SENSORS10SEC, 10000, [&](void *) { SENSORS10SEC, 10000, [&](void*) {
String buf = sensorReadingMap10sec; String buf = sensorReadingMap10sec;
while (buf.length()) { while (buf.length()) {
String tmp = selectToMarker(buf, ","); String tmp = selectToMarker(buf, ",");
@@ -63,7 +63,7 @@ void sensorsInit() {
nullptr, true); nullptr, true);
ts.add( ts.add(
SENSORS30SEC, 30000, [&](void *) { SENSORS30SEC, 30000, [&](void*) {
String buf = sensorReadingMap30sec; String buf = sensorReadingMap30sec;
while (buf.length()) { while (buf.length()) {
String tmp = selectToMarker(buf, ","); String tmp = selectToMarker(buf, ",");
@@ -74,3 +74,21 @@ void sensorsInit() {
nullptr, true); 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;
}

View File

@@ -33,17 +33,21 @@ String scenario = "";
//orders and events //orders and events
String orderBuf = ""; String orderBuf = "";
String eventBuf = ""; String eventBuf = "";
String itemsFile = ""; String itemsFile = "";
String itemsLine = ""; String itemsLine = "";
//key lists and numbers
String impulsKeyList = "";
int impulsEnterCounter = -1;
// Sensors // Sensors
int8_t dallasEnterCounter = -1; int8_t dallasEnterCounter = -1;
String sensorReadingMap10sec; String sensorReadingMap10sec;
String sensorReadingMap30sec; String sensorReadingMap30sec;
// Logging // Logging
String logging_value_names_list; String loggingKeyList;
int enter_to_logging_counter; int enter_to_logging_counter;
// Upgrade // Upgrade

View File

@@ -1,5 +1,5 @@
#include "Init.h" #include "Init.h"
#include "BufferExecute.h"
#include "Cmd.h" #include "Cmd.h"
#include "Global.h" #include "Global.h"
#include "items/LoggingClass.h" #include "items/LoggingClass.h"
@@ -31,31 +31,12 @@ void Device_init() {
if (myLogging != nullptr) { if (myLogging != nullptr) {
myLogging->clear(); 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 #ifdef LAYOUT_IN_RAM
all_widgets = ""; all_widgets = "";

View File

@@ -49,6 +49,8 @@ void cmd_init() {
sCmd.addCommand("logging", logging); sCmd.addCommand("logging", logging);
sCmd.addCommand("impuls-out", impuls);
handle_time_init(); handle_time_init();
} }

View File

@@ -26,11 +26,13 @@ void mqttInit() {
if (mqtt.connected()) { if (mqtt.connected()) {
SerialPrint("I", "MQTT", "OK"); SerialPrint("I", "MQTT", "OK");
setLedStatus(LED_OFF); setLedStatus(LED_OFF);
} else { }
else {
SerialPrint("E", "MQTT", "lost connection"); SerialPrint("E", "MQTT", "lost connection");
mqttConnect(); mqttConnect();
} }
} else { }
else {
SerialPrint("E", "WIFI", "Lost WiFi connection"); SerialPrint("E", "WIFI", "Lost WiFi connection");
ts.remove(WIFI_MQTT_CONNECTION_CHECK); ts.remove(WIFI_MQTT_CONNECTION_CHECK);
startAPMode(); startAPMode();
@@ -89,7 +91,8 @@ boolean mqttConnect() {
setLedStatus(LED_OFF); setLedStatus(LED_OFF);
mqttSubscribe(); mqttSubscribe();
res = true; res = true;
} else { }
else {
SerialPrint("E", "MQTT", "could't connect, retry in " + String(MQTT_RECONNECT_INTERVAL / 1000) + "s"); SerialPrint("E", "MQTT", "could't connect, retry in " + String(MQTT_RECONNECT_INTERVAL / 1000) + "s");
setLedStatus(LED_FAST); setLedStatus(LED_FAST);
} }
@@ -116,7 +119,8 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
choose_log_date_and_send(); choose_log_date_and_send();
#endif #endif
} else if (topicStr.indexOf("control")) { }
else if (topicStr.indexOf("control")) {
String key = selectFromMarkerToMarker(topicStr, "/", 3); String key = selectFromMarkerToMarker(topicStr, "/", 3);
@@ -125,12 +129,14 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
orderBuf += payloadStr; orderBuf += payloadStr;
orderBuf += ","; orderBuf += ",";
} else if (topicStr.indexOf("order")) { }
else if (topicStr.indexOf("order")) {
payloadStr.replace("_", " "); payloadStr.replace("_", " ");
orderBuf += payloadStr; orderBuf += payloadStr;
orderBuf += ","; orderBuf += ",";
} else if (topicStr.indexOf("update")) { }
else if (topicStr.indexOf("update")) {
if (payloadStr == "1") { if (payloadStr == "1") {
myNotAsyncActions->make(do_UPGRADE); myNotAsyncActions->make(do_UPGRADE);
} }
@@ -245,38 +251,38 @@ void publishState() {
const String getStateStr() { const String getStateStr() {
switch (mqtt.state()) { switch (mqtt.state()) {
case -4: case -4:
return F("no respond"); return F("no respond");
break; break;
case -3: case -3:
return F("connection was broken"); return F("connection was broken");
break; break;
case -2: case -2:
return F("connection failed"); return F("connection failed");
break; break;
case -1: case -1:
return F("client disconnected"); return F("client disconnected");
break; break;
case 0: case 0:
return F("client connected"); return F("client connected");
break; break;
case 1: case 1:
return F("doesn't support the requested version"); return F("doesn't support the requested version");
break; break;
case 2: case 2:
return F("rejected the client identifier"); return F("rejected the client identifier");
break; break;
case 3: case 3:
return F("unable to accept the connection"); return F("unable to accept the connection");
break; break;
case 4: case 4:
return F("wrong username/password"); return F("wrong username/password");
break; break;
case 5: case 5:
return F("not authorized to connect"); return F("not authorized to connect");
break; break;
default: default:
return F("unspecified"); return F("unspecified");
break; break;
} }
} }

View File

@@ -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) { if (str.indexOf(separator) == -1) {
return 0; return 0;
@@ -91,7 +91,7 @@ size_t itemsCount(String str, const String &separator) {
return cnt; return cnt;
} }
boolean isDigitStr(const String &str) { boolean isDigitStr(const String& str) {
for (size_t i = 0; i < str.length(); i++) { for (size_t i = 0; i < str.length(); i++) {
if (!isDigit(str.charAt(i))) { if (!isDigit(str.charAt(i))) {
return false; return false;
@@ -111,3 +111,5 @@ String prettyBytes(size_t size) {
return String(size / 1024.0 / 1024.0 / 1024.0) + "GB"; return String(size / 1024.0 / 1024.0 / 1024.0) + "GB";
} }

View File

@@ -1,21 +1,21 @@
#include "items/ImpulsOutClass.h" #include "items/ImpulsOutClass.h"
#include <Arduino.h> #include <Arduino.h>
#include "BufferExecute.h"
#include "Class/LineParsing.h" #include "Class/LineParsing.h"
#include "Global.h" #include "Global.h"
#include "ItemsCmd.h" #include "ItemsCmd.h"
ImpulsOutClass::ImpulsOutClass(unsigned long impulsPeriod, unsigned int impulsCount, unsigned int impulsPin) { ImpulsOutClass::ImpulsOutClass(unsigned int impulsPin) {
_impulsPeriod = impulsPeriod;
_impulsCount = impulsCount * 2;
_impulsPin = impulsPin; _impulsPin = impulsPin;
pinMode(impulsPin, OUTPUT); pinMode(impulsPin, OUTPUT);
} }
ImpulsOutClass::~ImpulsOutClass() {} ImpulsOutClass::~ImpulsOutClass() {}
void ImpulsOutClass::activate() { void ImpulsOutClass::execute(unsigned long impulsPeriod, unsigned int impulsCount) {
_impulsPeriod = impulsPeriod;
_impulsCount = impulsCount * 2;
_impulsCountBuf = _impulsCount; _impulsCountBuf = _impulsCount;
} }
@@ -38,18 +38,34 @@ void ImpulsOutClass::loop() {
MyImpulsOutVector* myImpulsOut = nullptr; MyImpulsOutVector* myImpulsOut = nullptr;
//void impuls() { void impuls() {
// myLineParsing.update(); myLineParsing.update();
// String loggingValueKey = myLineParsing.gvalue(); String key = myLineParsing.gkey();
// String key = myLineParsing.gkey(); String pin = myLineParsing.gpin();
// String interv = myLineParsing.gint(); myLineParsing.clear();
// String maxcnt = myLineParsing.gmaxcnt();
// myLineParsing.clear(); impulsEnterCounter++;
// addKey(key, impulsEnterCounter);
// logging_value_names_list += key + ",";
// static bool firstTime = true;
// static bool firstTime = true; if (firstTime) myImpulsOut = new MyImpulsOutVector();
// if (firstTime) myImpulsOut = new MyImpulsOutVector(); firstTime = false;
// firstTime = false; myImpulsOut->push_back(ImpulsOutClass(pin.toInt()));
// myImpulsOut->push_back(ImpulsOutClass(interv.toInt(), maxcnt.toInt(), loggingValueKey, key));
//} 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());
}
}
}

View File

@@ -54,13 +54,13 @@ MyLoggingVector* myLogging = nullptr;
void logging() { void logging() {
myLineParsing.update(); myLineParsing.update();
String loggingValueKey = myLineParsing.gvalue(); String loggingValueKey = myLineParsing.gval();
String key = myLineParsing.gkey(); String key = myLineParsing.gkey();
String interv = myLineParsing.gint(); String interv = myLineParsing.gint();
String maxcnt = myLineParsing.gmaxcnt(); String maxcnt = myLineParsing.gcnt();
myLineParsing.clear(); myLineParsing.clear();
logging_value_names_list += key + ","; loggingKeyList += key + ",";
static bool firstTime = true; static bool firstTime = true;
if (firstTime) myLogging = new MyLoggingVector(); if (firstTime) myLogging = new MyLoggingVector();
@@ -69,7 +69,7 @@ void logging() {
} }
void choose_log_date_and_send() { void choose_log_date_and_send() {
String all_line = logging_value_names_list; String all_line = loggingKeyList;
while (all_line.length() != 0) { while (all_line.length() != 0) {
String tmp = selectToMarker(all_line, ","); String tmp = selectToMarker(all_line, ",");
sendLogData("logs/" + tmp + ".txt", tmp); sendLogData("logs/" + tmp + ".txt", tmp);

View File

@@ -101,11 +101,11 @@ void setup() {
just_load = false; 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) 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; //static bool firstTime = true;
if (firstTime) myImpulsOut = new MyImpulsOutVector(); //if (firstTime) myImpulsOut = new MyImpulsOutVector();
firstTime = false; //firstTime = false;
myImpulsOut->push_back(ImpulsOutClass(500, 10, 13)); //myImpulsOut->push_back(ImpulsOutClass(500, 10, 13));
myImpulsOut->at(0).activate(); //myImpulsOut->at(0).execute();
} }
void loop() { void loop() {