From 518a0e0404b90c3438717a7549c1b01b1cd82688 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Sun, 1 Nov 2020 16:50:44 +0300 Subject: [PATCH 1/8] Impuls generator in progress --- include/Consts.h | 42 ++++++++------------------ include/items/ImpulsOutClass.h | 29 ++++++++++++++++++ src/Web.cpp | 5 +++- src/items/ImpulsOutClass.cpp | 55 ++++++++++++++++++++++++++++++++++ src/main.cpp | 16 ++++++++-- 5 files changed, 114 insertions(+), 33 deletions(-) create mode 100644 include/items/ImpulsOutClass.h create mode 100644 src/items/ImpulsOutClass.cpp diff --git a/include/Consts.h b/include/Consts.h index 0fbb2765..fe42560a 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -1,8 +1,6 @@ #pragma once -// -// Firmware -// +//===========Firmware============================================================================================================================================= #ifdef ESP8266 #define FIRMWARE_NAME "esp8266-iotm" #define FIRMWARE_VERSION 262 @@ -11,35 +9,24 @@ #define FIRMWARE_NAME "esp32-iotm" #define FIRMWARE_VERSION 259 #endif - #define FLASH_4MB true -// -// System -// +//===========FSystem============================================================================================================================================== #define NUM_BUTTONS 6 #define LED_PIN 2 -// -// MQTT -// +//===========MQTT================================================================================================================================================= #define MQTT_RECONNECT_INTERVAL 20000 -// -// Telemetry -// +//==========Telemetry============================================================================================================================================= #define TELEMETRY_UPDATE_INTERVAL_MIN 60 - -// -// Configuration -// +//=========Configuration========================================================================================================================================== #define DEVICE_CONFIG_FILE "s.conf.csv" #define DEVICE_SCENARIO_FILE "s.scen.txt" -// -// System parts -// + +//=========System parts=========================================================================================================================================== //#define OTA_UPDATES_ENABLED //#define MDNS_ENABLED //#define WEBSOCKET_ENABLED @@ -47,9 +34,7 @@ //#define UDP_ENABLED //#define SSDP_ENABLED -// -// Sensors enable/disable -// +//=========Sensors enable/disable================================================================================================================================= #define TANK_LEVEL_SAMPLES 10 #define LEVEL_ENABLED #define ANALOG_ENABLED @@ -58,15 +43,13 @@ #define BMP_ENABLED #define BME_ENABLED -// -// Gears enable/disable -// + +//=========Gears enable/disable=================================================================================================================================== #define STEPPER_ENABLED #define SERVO_ENABLED -// -// Other enable/disable -// + +//========Other enable/disable==================================================================================================================================== #define LOGGING_ENABLED #define SERIAL_ENABLED #define PUSH_ENABLED @@ -84,6 +67,7 @@ struct Time_t { unsigned long valid; }; +//================================================================================================================================================================ enum TimerTask_t { WIFI_SCAN, WIFI_MQTT_CONNECTION_CHECK, SENSORS10SEC, diff --git a/include/items/ImpulsOutClass.h b/include/items/ImpulsOutClass.h new file mode 100644 index 00000000..2f6b8651 --- /dev/null +++ b/include/items/ImpulsOutClass.h @@ -0,0 +1,29 @@ +#pragma once +#include + +#include "Global.h" + +class ImpulsOutClass; + +typedef std::vector MyImpulsOutVector; + +class ImpulsOutClass { + public: + ImpulsOutClass(unsigned long impulsPeriod, unsigned int impulsCount, unsigned int impulsPin); + ~ImpulsOutClass(); + + void loop(); + void activate(); + + private: + unsigned long currentMillis; + unsigned long prevMillis; + + unsigned long _impulsPeriod; + unsigned int _impulsCount; + unsigned int _impulsCountBuf; + unsigned int _impulsPin; + +}; + +extern MyImpulsOutVector* myImpulsOut; diff --git a/src/Web.cpp b/src/Web.cpp index e1485f23..bb033be1 100644 --- a/src/Web.cpp +++ b/src/Web.cpp @@ -1,9 +1,10 @@ #include "Web.h" -#include "items/LoggingClass.h" + #include "Class/NotAsync.h" #include "Global.h" #include "Init.h" #include "ItemsList.h" +#include "items/LoggingClass.h" bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) { if (request->hasArg("preset")) { @@ -239,6 +240,8 @@ void web_init() { msg = F("Cервер не найден. Попробуйте повторить позже..."); } else if (lastVersion == -2) { msg = F("Устройство не подключено к роутеру!"); + } else if (lastVersion < FIRMWARE_VERSION) { + msg = F("Ошибка версии. Попробуйте повторить позже..."); } // else if (lastVersion == "") { diff --git a/src/items/ImpulsOutClass.cpp b/src/items/ImpulsOutClass.cpp new file mode 100644 index 00000000..6a0df539 --- /dev/null +++ b/src/items/ImpulsOutClass.cpp @@ -0,0 +1,55 @@ +#include "items/ImpulsOutClass.h" + +#include + +#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; + _impulsPin = impulsPin; + pinMode(impulsPin, OUTPUT); +} + +ImpulsOutClass::~ImpulsOutClass() {} + +void ImpulsOutClass::activate() { + _impulsCountBuf = _impulsCount; +} + +void ImpulsOutClass::loop() { + currentMillis = millis(); + unsigned long difference = currentMillis - prevMillis; + if (_impulsCountBuf > 0) { + if (difference > _impulsPeriod) { + _impulsCountBuf--; + prevMillis = millis(); + yield(); + digitalWrite(_impulsPin, !digitalRead(_impulsPin)); + yield(); + } + } + if (_impulsCountBuf <= 0) { + digitalWrite(_impulsPin, LOW); + } +} + +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)); +//} diff --git a/src/main.cpp b/src/main.cpp index e94d744f..14293ccc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,8 @@ #include "items/ButtonInClass.h" #include "items/LoggingClass.h" +#include "items/ImpulsOutClass.h" + void not_async_actions(); Timings metric; @@ -99,11 +101,13 @@ 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(); } - - void loop() { if (!initialized) { return; @@ -129,4 +133,10 @@ void loop() { myLogging->at(i).loop(); } } + + if (myImpulsOut != nullptr) { + for (unsigned int i = 0; i < myImpulsOut->size(); i++) { + myImpulsOut->at(i).loop(); + } + } } \ No newline at end of file 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 2/8] 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() { From 50590bc90ebd9b767c06997fcb7c6ee05c013447 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Mon, 2 Nov 2020 04:09:15 +0300 Subject: [PATCH 3/8] fixed some bugs --- data/items/button-out.npin.txt | 2 +- include/Class/ScenarioClass.h | 13 ++- include/Consts.h | 2 +- include/items/ButtonOutClass.h | 9 +- include/items/SensorDallasClass.h | 6 +- src/Scenario.cpp | 148 +++++++++++++++--------------- 6 files changed, 92 insertions(+), 88 deletions(-) diff --git a/data/items/button-out.npin.txt b/data/items/button-out.npin.txt index 380b815f..33bb17da 100644 --- a/data/items/button-out.npin.txt +++ b/data/items/button-out.npin.txt @@ -1 +1 @@ -0;button-out;id;toggleSunMoon;Кнопки;Освещение;order;st[0] \ No newline at end of file +0;button-out;id;toggle;Кнопки;Освещение;order;st[0] \ No newline at end of file diff --git a/include/Class/ScenarioClass.h b/include/Class/ScenarioClass.h index 3a241112..051b4939 100644 --- a/include/Class/ScenarioClass.h +++ b/include/Class/ScenarioClass.h @@ -72,15 +72,18 @@ class Scenario { } else if (_conditionSign == "!=") { flag = _eventValue != _conditionValue; } else if (_conditionSign == "<") { - flag = _eventValue.toInt() < _conditionValue.toInt(); + flag = _eventValue.toFloat() < _conditionValue.toFloat(); } else if (_conditionSign == ">") { - flag = _eventValue.toInt() > _conditionValue.toInt(); + flag = _eventValue.toFloat() > _conditionValue.toFloat(); } else if (_conditionSign == ">=") { - flag = _eventValue.toInt() >= _conditionValue.toInt(); + flag = _eventValue.toFloat() >= _conditionValue.toFloat(); } else if (_conditionSign == "<=") { - flag = _eventValue.toInt() <= _conditionValue.toInt(); + flag = _eventValue.toFloat() <= _conditionValue.toFloat(); } + Serial.println("event Value: " + _eventValue); + Serial.println("cond Value: " + _conditionValue); + if (flag) Serial.println("I Scenario event: " + _condition); return flag; @@ -97,7 +100,7 @@ class Scenario { this->calculate2(); if (this->isConditionSatisfied()) { //если вошедшее событие выполняет условие сценария _scenBlok = deleteBeforeDelimiter(_scenBlok, "\n"); - //Serial.println(" [>] Making: " + _scenBlok); + Serial.println(" [>] Making: " + _scenBlok); spaceCmdExecute(_scenBlok); } } diff --git a/include/Consts.h b/include/Consts.h index 61cbf9e1..8b842ee9 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -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/items/ButtonOutClass.h b/include/items/ButtonOutClass.h index 46590814..bd3587c3 100644 --- a/include/items/ButtonOutClass.h +++ b/include/items/ButtonOutClass.h @@ -5,8 +5,8 @@ #include "Global.h" class ButtonOutClass : public LineParsing { - public: - ButtonOutClass() : LineParsing(){}; +public: + ButtonOutClass() : LineParsing() {}; void init() { if (_pin != "") { @@ -28,12 +28,13 @@ class ButtonOutClass : public LineParsing { if (inv == "") { digitalWrite(pinInt, state.toInt()); - } else { + } + else { digitalWrite(pinInt, !state.toInt()); } eventGen(key, ""); jsonWriteInt(configLiveJson, key, state.toInt()); - publishStatus(key, state); + publishStatus(key, state); } }; diff --git a/include/items/SensorDallasClass.h b/include/items/SensorDallasClass.h index 203bd7f0..c5b7b3dc 100644 --- a/include/items/SensorDallasClass.h +++ b/include/items/SensorDallasClass.h @@ -5,8 +5,8 @@ #include "items/SensorConvertingClass.h" class SensorDallasClass : public SensorConvertingClass { - public: - SensorDallasClass() : SensorConvertingClass(){}; +public: + SensorDallasClass() : SensorConvertingClass() {}; void SensorDallasInit() { oneWire = new OneWire((uint8_t)_pin.toInt()); @@ -36,7 +36,7 @@ class SensorDallasClass : public SensorConvertingClass { float valueFl = this->correction(key, value); eventGen(key, ""); jsonWriteStr(configLiveJson, key, String(valueFl)); - publishStatus(key, String(valueFl)); + publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); } } diff --git a/src/Scenario.cpp b/src/Scenario.cpp index 2399d178..ce0ec90d 100644 --- a/src/Scenario.cpp +++ b/src/Scenario.cpp @@ -8,68 +8,68 @@ boolean isScenarioEnabled() { return jsonReadBool(configSetupJson, "scen") && eventBuf != ""; } -void loopScenario() { - if (!isScenarioEnabled()) { - return; - } - String scenarioTmp = scenario; - scenarioTmp += "\n"; - scenarioTmp.replace("\r\n", "\n"); - scenarioTmp.replace("\r", "\n"); - - while (scenarioTmp.length()) { - String scenBlok = selectToMarker(scenarioTmp, "end"); //выделяем первый сценарий - if (!scenBlok.length()) { - return; - } - - size_t i = 0; - i++; - if (scenario_line_status[i] == 1) { - String condition = selectToMarker(scenBlok, "\n"); //выделяем условие - - String conditionParam = selectFromMarkerToMarker(condition, " ", 0); //выделяем параметр условия - String order = eventBuf; - String eventParam = selectToMarker(order, ","); //выделяем параметр события - - if (conditionParam == eventParam) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку - - String conditionSign = selectFromMarkerToMarker(condition, " ", 1); //выделяем знак (=) - - String conditionValue = selectFromMarkerToMarker(condition, " ", 2); //выделяем значение (1) - - boolean flag = false; - - String eventParam = jsonReadStr(configLiveJson, conditionParam); //получаем значение этого параметра события из json - - if (conditionSign == "=") { - flag = eventParam == conditionValue; - } else if (conditionSign == "!=") { - flag = eventParam != conditionValue; - } else if (conditionSign == "<") { - flag = eventParam.toInt() < conditionValue.toInt(); - } else if (conditionSign == ">") { - flag = eventParam.toInt() > conditionValue.toInt(); - } else if (conditionSign == ">=") { - flag = eventParam.toInt() >= conditionValue.toInt(); - } else if (conditionSign == "<=") { - flag = eventParam.toInt() <= conditionValue.toInt(); - } - - if (flag) { - scenBlok = deleteBeforeDelimiter(scenBlok, "\n"); // удаляем строку самого сценария оставляя только команды - SerialPrint("I","module","do: " + scenBlok); - spaceCmdExecute(scenBlok); // выполняем все команды - } - } - } - scenarioTmp = deleteBeforeDelimiter(scenarioTmp, "end\n"); //удаляем первый сценарий - } - - String eventBufTmp = eventBuf; //читаем файл событий - eventBufTmp = deleteBeforeDelimiter(eventBufTmp, ","); //удаляем выполненное событие - eventBuf = eventBufTmp; //записываем обновленный файл событий -} +//void loopScenario() { +// if (!isScenarioEnabled()) { +// return; +// } +// String scenarioTmp = scenario; +// scenarioTmp += "\n"; +// scenarioTmp.replace("\r\n", "\n"); +// scenarioTmp.replace("\r", "\n"); +// +// while (scenarioTmp.length()) { +// String scenBlok = selectToMarker(scenarioTmp, "end"); //выделяем первый сценарий +// if (!scenBlok.length()) { +// return; +// } +// +// size_t i = 0; +// i++; +// if (scenario_line_status[i] == 1) { +// String condition = selectToMarker(scenBlok, "\n"); //выделяем условие +// +// String conditionParam = selectFromMarkerToMarker(condition, " ", 0); //выделяем параметр условия +// String order = eventBuf; +// String eventParam = selectToMarker(order, ","); //выделяем параметр события +// +// if (conditionParam == eventParam) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку +// +// String conditionSign = selectFromMarkerToMarker(condition, " ", 1); //выделяем знак (=) +// +// String conditionValue = selectFromMarkerToMarker(condition, " ", 2); //выделяем значение (1) +// +// boolean flag = false; +// +// String eventParam = jsonReadStr(configLiveJson, conditionParam); //получаем значение этого параметра события из json +// +// if (conditionSign == "=") { +// flag = eventParam == conditionValue; +// } else if (conditionSign == "!=") { +// flag = eventParam != conditionValue; +// } else if (conditionSign == "<") { +// flag = eventParam.toInt() < conditionValue.toInt(); +// } else if (conditionSign == ">") { +// flag = eventParam.toInt() > conditionValue.toInt(); +// } else if (conditionSign == ">=") { +// flag = eventParam.toInt() >= conditionValue.toInt(); +// } else if (conditionSign == "<=") { +// flag = eventParam.toInt() <= conditionValue.toInt(); +// } +// +// if (flag) { +// scenBlok = deleteBeforeDelimiter(scenBlok, "\n"); // удаляем строку самого сценария оставляя только команды +// SerialPrint("I","module","do: " + scenBlok); +// spaceCmdExecute(scenBlok); // выполняем все команды +// } +// } +// } +// scenarioTmp = deleteBeforeDelimiter(scenarioTmp, "end\n"); //удаляем первый сценарий +// } +// +// String eventBufTmp = eventBuf; //читаем файл событий +// eventBufTmp = deleteBeforeDelimiter(eventBufTmp, ","); //удаляем выполненное событие +// eventBuf = eventBufTmp; //записываем обновленный файл событий +//} void eventGen(String event_name, String number) { if (!jsonReadBool(configSetupJson, "scen")) { @@ -78,18 +78,18 @@ void eventGen(String event_name, String number) { eventBuf = event_name + number + ","; } -String add_set(String str) { - String num1 = str.substring(str.length() - 1); - String num2 = str.substring(str.length() - 2, str.length() - 1); - if (isDigitStr(num1) && isDigitStr(num2)) { - str = str.substring(0, str.length() - 2) + "Set" + num2 + num1; - } else { - if (isDigitStr(num1)) { - str = str.substring(0, str.length() - 1) + "Set" + num1; - } - } - return str; -} +//String add_set(String str) { +// String num1 = str.substring(str.length() - 1); +// String num2 = str.substring(str.length() - 2, str.length() - 1); +// if (isDigitStr(num1) && isDigitStr(num2)) { +// str = str.substring(0, str.length() - 2) + "Set" + num2 + num1; +// } else { +// if (isDigitStr(num1)) { +// str = str.substring(0, str.length() - 1) + "Set" + num1; +// } +// } +// return str; +//} //button-out1 = 1 //button-out2 1 From 777a04b9011fca6926e9b5310cdf854bb8f7c0f7 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Mon, 2 Nov 2020 15:20:04 +0300 Subject: [PATCH 4/8] impuls bug fixed --- include/BufferExecute.h | 12 ++++++------ src/BufferExecute.cpp | 10 +++++----- src/Init.cpp | 12 ++++++++++-- src/items/ImpulsOutClass.cpp | 5 ++--- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/include/BufferExecute.h b/include/BufferExecute.h index 8575f6f4..076d73da 100644 --- a/include/BufferExecute.h +++ b/include/BufferExecute.h @@ -1,10 +1,10 @@ #pragma once #include -extern void loopCmdAdd(const String &cmdStr); -extern void fileCmdExecute(const String &filename); -extern void csvCmdExecute(String &cmdStr); -extern void spaceCmdExecute(String &cmdStr); +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(); -extern void addKey(String& key, int number); -extern int getKeyNum(String& key); \ No newline at end of file +extern void addKey(String& key, String& keyNumberTable, int number); +extern int getKeyNum(String& key, String& keyNumberTable); \ No newline at end of file diff --git a/src/BufferExecute.cpp b/src/BufferExecute.cpp index 2e580fee..ca6ec574 100644 --- a/src/BufferExecute.cpp +++ b/src/BufferExecute.cpp @@ -74,13 +74,13 @@ void sensorsInit() { nullptr, true); } -void addKey(String& key, int number) { - impulsKeyList += key + " " + String(number) + ","; +void addKey(String& key, String& keyNumberTable, int number) { + keyNumberTable += key + " " + String(number) + ","; } -int getKeyNum(String& key) { - String keyNumberTableBuf = impulsKeyList; - //SerialPrint("","",impulsKeyList); +int getKeyNum(String& key, String& keyNumberTable) { + String keyNumberTableBuf = keyNumberTable; + //SerialPrint("","",keyNumberTable); int number = -1; while (keyNumberTableBuf.length()) { String tmp = selectToMarker(keyNumberTableBuf, ","); diff --git a/src/Init.cpp b/src/Init.cpp index 0996230a..2d7ca95f 100644 --- a/src/Init.cpp +++ b/src/Init.cpp @@ -3,6 +3,7 @@ #include "Cmd.h" #include "Global.h" #include "items/LoggingClass.h" +#include "items/ImpulsOutClass.h" void loadConfig() { configSetupJson = readFile("config.json", 4096); @@ -26,18 +27,25 @@ void all_init() { } void Device_init() { + sensorReadingMap10sec = ""; + dallasEnterCounter = -1; + + //======clear logging params====== if (myLogging != nullptr) { myLogging->clear(); } - loggingKeyList = ""; + //======clear impuls params======= + if (myImpulsOut != nullptr) { + myImpulsOut->clear(); + } impulsKeyList = ""; impulsEnterCounter = -1; - + #ifdef LAYOUT_IN_RAM all_widgets = ""; #else diff --git a/src/items/ImpulsOutClass.cpp b/src/items/ImpulsOutClass.cpp index fb423dcc..99f860d4 100644 --- a/src/items/ImpulsOutClass.cpp +++ b/src/items/ImpulsOutClass.cpp @@ -45,7 +45,7 @@ void impuls() { myLineParsing.clear(); impulsEnterCounter++; - addKey(key, impulsEnterCounter); + addKey(key, impulsKeyList, impulsEnterCounter); static bool firstTime = true; if (firstTime) myImpulsOut = new MyImpulsOutVector(); @@ -60,8 +60,7 @@ void impulsExecute() { String impulsPeriod = sCmd.next(); String impulsCount = sCmd.next(); - int number = getKeyNum(key); - SerialPrint("I", "Impuls", key + " " + String(number)); + int number = getKeyNum(key, impulsKeyList); if (myImpulsOut != nullptr) { if (number != -1) { From 0efae6949d2d2e5611caae0eb104485d94b5f715 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 3 Nov 2020 00:04:07 +0300 Subject: [PATCH 5/8] presets added --- data/config.json | 6 +++--- data/presets/humstat.c.txt | 5 +++++ data/presets/humstat.s.txt | 6 ++++++ data/presets/termostat.s.txt | 0 data/presets/termostat.с.txt | 0 data/set.device.json | 14 ++++++++++++-- include/Global.h | 3 +-- include/ItemsList.h | 1 + include/items/SensorDallasClass.h | 2 ++ include/items/SensorDallasClass2.h | 0 src/ItemsList.cpp | 11 +++++++++++ src/Web.cpp | 6 ++++++ 12 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 data/presets/humstat.c.txt create mode 100644 data/presets/humstat.s.txt create mode 100644 data/presets/termostat.s.txt create mode 100644 data/presets/termostat.с.txt create mode 100644 include/items/SensorDallasClass2.h diff --git a/data/config.json b/data/config.json index 8c8b402a..562ff604 100644 --- a/data/config.json +++ b/data/config.json @@ -3,8 +3,8 @@ "chipID": "", "apssid": "IoTmanager", "appass": "", - "routerssid": "VOLODYA", - "routerpass": "BELCHENKO", + "routerssid": "rise", + "routerpass": "hostel3333", "timezone": 2, "ntp": "pool.ntp.org", "mqttServer": "91.204.228.124", @@ -17,7 +17,7 @@ "weblogin": "admin", "webpass": "admin", "udponoff": "1", - "blink": "0", + "blink": "1", "oneWirePin": "2", "serverip": "http://206.189.49.244" } \ No newline at end of file diff --git a/data/presets/humstat.c.txt b/data/presets/humstat.c.txt new file mode 100644 index 00000000..2c9acd11 --- /dev/null +++ b/data/presets/humstat.c.txt @@ -0,0 +1,5 @@ +0;dht-hum;hum;anydataHum;Теплица;Влажность;1;pin[2];type[dht11];c[1] +0;logging;log;chart;Теплица;Влажность;2;val[hum];int[60];cnt[100] +0;input-digit;inputU;inputDigit;Теплица;Верхний#порог;3;st[45] +0;input-digit;inputL;inputDigit;Теплица;Нижний#порог;4;st[35] +0;button-out;button;toggle;Теплица;Полив;5;pin[12];st[0] \ No newline at end of file diff --git a/data/presets/humstat.s.txt b/data/presets/humstat.s.txt new file mode 100644 index 00000000..bbf78407 --- /dev/null +++ b/data/presets/humstat.s.txt @@ -0,0 +1,6 @@ +hum > inputU +button 0 +end +hum < inputL +button 1 +end \ No newline at end of file diff --git a/data/presets/termostat.s.txt b/data/presets/termostat.s.txt new file mode 100644 index 00000000..e69de29b diff --git a/data/presets/termostat.с.txt b/data/presets/termostat.с.txt new file mode 100644 index 00000000..e69de29b diff --git a/data/set.device.json b/data/set.device.json index ae32d833..838ef0e3 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -50,7 +50,7 @@ }, { "type": "dropdown", - "name": "help-url", + "name": "help-url1", "class": "btn btn-default", "style": "display:inline", "title": { @@ -80,7 +80,17 @@ "/set?addItem=uptime": "b.Отобразить время работы устройства" } }, - + { + "type": "dropdown", + "name": "help-url2", + "class": "btn btn-default", + "style": "display:inline", + "title": { + "#": "Выберите пресет из списка", + "/set?addPreset=termostat.c": "1.Термостат на основе ds18b20 (устройство держит заданный уровень температуры)", + "/set?addPreset=humstat.c": "2.Контроль влажности на основе DHT (устройство держит заданный уровень влажности)" + } + }, { "type": "hr" }, diff --git a/include/Global.h b/include/Global.h index 6a794f67..f9ca0e6a 100644 --- a/include/Global.h +++ b/include/Global.h @@ -40,8 +40,7 @@ extern WiFiClient espClient; extern PubSubClient mqtt; extern StringCommand sCmd; extern AsyncWebServer server; -extern DallasTemperature sensors; -extern OneWire* oneWire; + extern boolean but[NUM_BUTTONS]; extern Bounce* buttons; diff --git a/include/ItemsList.h b/include/ItemsList.h index 940db0b5..c0b716ec 100644 --- a/include/ItemsList.h +++ b/include/ItemsList.h @@ -5,6 +5,7 @@ extern void itemsListInit(); extern void addItem(String name); +extern void addPreset(String name); extern void delChoosingItems(); extern void delAllItems(); extern uint8_t getNewElementNumber(String file); diff --git a/include/items/SensorDallasClass.h b/include/items/SensorDallasClass.h index c5b7b3dc..00090fa2 100644 --- a/include/items/SensorDallasClass.h +++ b/include/items/SensorDallasClass.h @@ -4,6 +4,8 @@ #include "Global.h" #include "items/SensorConvertingClass.h" +extern DallasTemperature sensors; +extern OneWire* oneWire; class SensorDallasClass : public SensorConvertingClass { public: SensorDallasClass() : SensorConvertingClass() {}; diff --git a/include/items/SensorDallasClass2.h b/include/items/SensorDallasClass2.h new file mode 100644 index 00000000..e69de29b diff --git a/src/ItemsList.cpp b/src/ItemsList.cpp index d6803b23..6fec78a4 100644 --- a/src/ItemsList.cpp +++ b/src/ItemsList.cpp @@ -54,6 +54,17 @@ void addItem(String name) { addFile(DEVICE_CONFIG_FILE, "\n" + item); } +void addPreset(String name) { + String preset = readFile("presets/" + name + ".txt", 2024); + addFile(DEVICE_CONFIG_FILE, "\n" + preset); + + name.replace(".c",".s"); + + String scenario = readFile("presets/" + name + ".txt", 2024); + removeFile(DEVICE_SCENARIO_FILE); + addFile(DEVICE_SCENARIO_FILE, scenario); +} + void delAllItems() { removeFile(DEVICE_CONFIG_FILE); addFile(DEVICE_CONFIG_FILE, String(firstLine)); diff --git a/src/Web.cpp b/src/Web.cpp index bb033be1..9625950b 100644 --- a/src/Web.cpp +++ b/src/Web.cpp @@ -23,6 +23,12 @@ void web_init() { request->redirect("/?set.device"); } + if (request->hasArg("addPreset")) { + String name = request->getParam("addPreset")->value(); + addPreset(name); + request->redirect("/?set.device"); + } + if (request->hasArg("delChoosingItems")) { myNotAsyncActions->make(do_delChoosingItems); request->send(200); From aba00d9a70b8080cbcf25b4eb89d8395e9bb5d91 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 3 Nov 2020 01:22:00 +0300 Subject: [PATCH 6/8] compiling version --- include/items/SensorDallas.h | 35 ++++++++++++++++++++ include/items/SensorDallasClass2.h | 0 src/items/SensorDallas.cpp | 52 ++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 include/items/SensorDallas.h delete mode 100644 include/items/SensorDallasClass2.h create mode 100644 src/items/SensorDallas.cpp diff --git a/include/items/SensorDallas.h b/include/items/SensorDallas.h new file mode 100644 index 00000000..fc3bd449 --- /dev/null +++ b/include/items/SensorDallas.h @@ -0,0 +1,35 @@ +#pragma once +#include "Global.h" +#include + +extern DallasTemperature sensors; +extern OneWire* oneWire; + +class SensorDallas; + +typedef std::vector MySensorDallasVector; + +class SensorDallas { + public: + + SensorDallas(unsigned long period,unsigned int pin, uint8_t deviceAddress, String key); + ~SensorDallas(); + + void loop(); + + private: + + unsigned long currentMillis; + unsigned long prevMillis; + unsigned long _period; + String _key; + unsigned int _pin; + uint8_t _deviceAddress; + + void readDallas(); + +}; + +extern MySensorDallasVector* mySensorDallas2; + + diff --git a/include/items/SensorDallasClass2.h b/include/items/SensorDallasClass2.h deleted file mode 100644 index e69de29b..00000000 diff --git a/src/items/SensorDallas.cpp b/src/items/SensorDallas.cpp new file mode 100644 index 00000000..9cae8a0f --- /dev/null +++ b/src/items/SensorDallas.cpp @@ -0,0 +1,52 @@ +#include "items/SensorDallas.h" +#include "Class/LineParsing.h" +#include "Global.h" +#include "ItemsCmd.h" +#include + +SensorDallas::SensorDallas(unsigned long period, unsigned int pin, uint8_t deviceAddress, String key) { + _period = period * 1000; + _key = key; + _pin = pin; + _deviceAddress = deviceAddress; + + oneWire = new OneWire((uint8_t)_pin); + sensors.setOneWire(oneWire); + sensors.begin(); + sensors.setResolution(12); +} + +SensorDallas::~SensorDallas() {} + +void SensorDallas::loop() { + currentMillis = millis(); + unsigned long difference = currentMillis - prevMillis; + if (difference >= _period) { + prevMillis = millis(); + + } +} + +void readDallas() { + +} + + +MySensorDallasVector* mySensorDallas2 = nullptr; + +//void logging() { +// myLineParsing.update(); +// String loggingValueKey = myLineParsing.gval(); +// String key = myLineParsing.gkey(); +// String interv = myLineParsing.gint(); +// String maxcnt = myLineParsing.gcnt(); +// myLineParsing.clear(); +// +// loggingKeyList += key + ","; +// +// static bool firstTime = true; +// if (firstTime) myLogging = new MySensorDallasVector(); +// firstTime = false; +// myLogging->push_back(SensorDallas(interv.toInt(), maxcnt.toInt(), loggingValueKey, key)); +//} + From c02abefb43891d3d824547bf59b86c7bf158706c Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 3 Nov 2020 19:07:22 +0300 Subject: [PATCH 7/8] 264 stable. Dallas bug fixed! --- data/items/dallas-temp.txt | 2 +- data/presets/dal.c.txt | 5 +++ data/presets/dal.s.txt | 6 +++ data/presets/{humstat.c.txt => dht.c.txt} | 0 data/presets/{humstat.s.txt => dht.s.txt} | 0 data/presets/termostat.s.txt | 0 data/presets/termostat.с.txt | 0 data/set.device.json | 6 +-- include/Class/LineParsing.h | 12 ++++- include/Class/ScenarioClass.h | 54 ++++++++++++++--------- include/Consts.h | 2 +- include/Global.h | 2 +- include/items/SensorDallas.h | 15 ++++--- include/items/SensorDallasClass.h | 47 -------------------- src/Global.cpp | 1 - src/Init.cpp | 6 ++- src/ItemsCmd.cpp | 4 +- src/ItemsList.cpp | 6 ++- src/items/SensorDallas.cpp | 48 ++++++++++---------- src/items/SensorDallasClass.cpp | 20 --------- src/main.cpp | 14 +++--- 21 files changed, 114 insertions(+), 136 deletions(-) create mode 100644 data/presets/dal.c.txt create mode 100644 data/presets/dal.s.txt rename data/presets/{humstat.c.txt => dht.c.txt} (100%) rename data/presets/{humstat.s.txt => dht.s.txt} (100%) delete mode 100644 data/presets/termostat.s.txt delete mode 100644 data/presets/termostat.с.txt delete mode 100644 include/items/SensorDallasClass.h delete mode 100644 src/items/SensorDallasClass.cpp diff --git a/data/items/dallas-temp.txt b/data/items/dallas-temp.txt index a6b87c28..0da8bdca 100644 --- a/data/items/dallas-temp.txt +++ b/data/items/dallas-temp.txt @@ -1 +1 @@ -0;dallas-temp;id;anydataTemp;Сенсоры;Температура;order;sal;c[1] \ No newline at end of file +0;dallas-temp;id;anydataTemp;Сенсоры;Температура;order;sal;index[0];int[10] \ No newline at end of file diff --git a/data/presets/dal.c.txt b/data/presets/dal.c.txt new file mode 100644 index 00000000..7cd73ce5 --- /dev/null +++ b/data/presets/dal.c.txt @@ -0,0 +1,5 @@ +0;dallas-temp;temp;anydataTemp;Термостат;Температура;1;pin[2];index[0];int[10] +0;logging;log;chart;Термостат;История;2;val[temp];int[60];cnt[100] +0;input-digit;inputU;inputDigit;Термостат;Верхний#порог;3;st[30] +0;input-digit;inputL;inputDigit;Термостат;Нижний#порог;4;st[20] +0;button-out;button;toggle;Термостат;Нагрев;5;pin[12];st[0] \ No newline at end of file diff --git a/data/presets/dal.s.txt b/data/presets/dal.s.txt new file mode 100644 index 00000000..43f05cc5 --- /dev/null +++ b/data/presets/dal.s.txt @@ -0,0 +1,6 @@ +temp > inputU +button 0 +end +temp < inputL +button 1 +end \ No newline at end of file diff --git a/data/presets/humstat.c.txt b/data/presets/dht.c.txt similarity index 100% rename from data/presets/humstat.c.txt rename to data/presets/dht.c.txt diff --git a/data/presets/humstat.s.txt b/data/presets/dht.s.txt similarity index 100% rename from data/presets/humstat.s.txt rename to data/presets/dht.s.txt diff --git a/data/presets/termostat.s.txt b/data/presets/termostat.s.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/data/presets/termostat.с.txt b/data/presets/termostat.с.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/data/set.device.json b/data/set.device.json index 838ef0e3..9dd95abc 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -43,7 +43,7 @@ }, { "type": "h4", - "title": "LittleFS version: 263" + "title": "LittleFS version: 264" }, { "type": "hr" @@ -87,8 +87,8 @@ "style": "display:inline", "title": { "#": "Выберите пресет из списка", - "/set?addPreset=termostat.c": "1.Термостат на основе ds18b20 (устройство держит заданный уровень температуры)", - "/set?addPreset=humstat.c": "2.Контроль влажности на основе DHT (устройство держит заданный уровень влажности)" + "/set?addPreset=dal.c": "1.Термостат на основе ds18b20 (устройство держит заданный уровень температуры)", + "/set?addPreset=dht.c": "2.Контроль влажности на основе DHT (устройство держит заданный уровень влажности)" } }, { diff --git a/include/Class/LineParsing.h b/include/Class/LineParsing.h index 52135995..99a807f1 100644 --- a/include/Class/LineParsing.h +++ b/include/Class/LineParsing.h @@ -24,6 +24,7 @@ class LineParsing { String _int; String _cnt; String _val; + String _index; public: LineParsing() : @@ -44,7 +45,8 @@ class LineParsing { _type{""}, _int{""}, _cnt{""}, - _val{""} + _val{""}, + _index{""} {}; @@ -98,6 +100,9 @@ class LineParsing { if (arg.indexOf("val[") != -1) { _val = extractInner(arg); } + if (arg.indexOf("index[") != -1) { + _index = extractInner(arg); + } } } @@ -161,6 +166,10 @@ class LineParsing { String gval() { return _val; } + String gindex() { + return _index; + } + void clear() { _key = ""; @@ -180,6 +189,7 @@ class LineParsing { _int = ""; _cnt = ""; _val = ""; + _index = ""; } String extractInnerDigit(String str) { diff --git a/include/Class/ScenarioClass.h b/include/Class/ScenarioClass.h index 051b4939..b3a1f064 100644 --- a/include/Class/ScenarioClass.h +++ b/include/Class/ScenarioClass.h @@ -4,7 +4,7 @@ #include "Global.h" class Scenario { - protected: +protected: String _scenarioTmp; String _condition; String _conditionParam; @@ -15,16 +15,16 @@ class Scenario { String _eventParam; String _eventValue; - public: - Scenario() : _scenarioTmp{""}, - _condition{""}, - _conditionParam{""}, - _conditionSign{""}, - _conditionValue{""}, - _scenBlok{""}, - _event{""}, - _eventParam{""}, - _eventValue{""} {}; +public: + Scenario() : _scenarioTmp{ "" }, + _condition{ "" }, + _conditionParam{ "" }, + _conditionSign{ "" }, + _conditionValue{ "" }, + _scenBlok{ "" }, + _event{ "" }, + _eventParam{ "" }, + _eventValue{ "" } {}; void load() { _scenarioTmp = scenario; @@ -69,22 +69,28 @@ class Scenario { if (_conditionSign == "=") { flag = _eventValue == _conditionValue; - } else if (_conditionSign == "!=") { + } + else if (_conditionSign == "!=") { flag = _eventValue != _conditionValue; - } else if (_conditionSign == "<") { + } + else if (_conditionSign == "<") { flag = _eventValue.toFloat() < _conditionValue.toFloat(); - } else if (_conditionSign == ">") { + } + else if (_conditionSign == ">") { flag = _eventValue.toFloat() > _conditionValue.toFloat(); - } else if (_conditionSign == ">=") { + } + else if (_conditionSign == ">=") { flag = _eventValue.toFloat() >= _conditionValue.toFloat(); - } else if (_conditionSign == "<=") { + } + else if (_conditionSign == "<=") { flag = _eventValue.toFloat() <= _conditionValue.toFloat(); } - Serial.println("event Value: " + _eventValue); - Serial.println("cond Value: " + _conditionValue); - - if (flag) Serial.println("I Scenario event: " + _condition); + if (flag) { + //SerialPrint("I", "Scenario", "event value: " + _eventValue); + //SerialPrint("I", "Scenario", "condition value: " + _conditionValue); + SerialPrint("I", "Scenario", "event: " + _condition); + } return flag; } @@ -100,7 +106,12 @@ class Scenario { this->calculate2(); if (this->isConditionSatisfied()) { //если вошедшее событие выполняет условие сценария _scenBlok = deleteBeforeDelimiter(_scenBlok, "\n"); - Serial.println(" [>] Making: " + _scenBlok); + String forPrint = _scenBlok; + forPrint.replace("end", ""); + forPrint.replace("\r\n", ""); + forPrint.replace("\r", ""); + forPrint.replace("\n", ""); + SerialPrint("I", "Scenario", "making: " + forPrint); spaceCmdExecute(_scenBlok); } } @@ -113,4 +124,5 @@ class Scenario { return jsonReadBool(configSetupJson, "scen") && eventBuf != ""; } }; + extern Scenario* myScenario; \ No newline at end of file diff --git a/include/Consts.h b/include/Consts.h index 8b842ee9..0f7b483f 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -3,7 +3,7 @@ //===========Firmware============================================================================================================================================= #ifdef ESP8266 #define FIRMWARE_NAME "esp8266-iotm" -#define FIRMWARE_VERSION 263 +#define FIRMWARE_VERSION 264 #endif #ifdef ESP32 #define FIRMWARE_NAME "esp32-iotm" diff --git a/include/Global.h b/include/Global.h index f9ca0e6a..b4bcb7c5 100644 --- a/include/Global.h +++ b/include/Global.h @@ -71,7 +71,7 @@ extern int impulsEnterCounter; // Sensors extern String sensorReadingMap10sec; extern String sensorReadingMap30sec; -extern int8_t dallasEnterCounter; + extern String loggingKeyList; extern int enter_to_logging_counter; diff --git a/include/items/SensorDallas.h b/include/items/SensorDallas.h index fc3bd449..3feeb572 100644 --- a/include/items/SensorDallas.h +++ b/include/items/SensorDallas.h @@ -10,26 +10,27 @@ class SensorDallas; typedef std::vector MySensorDallasVector; class SensorDallas { - public: +public: - SensorDallas(unsigned long period,unsigned int pin, uint8_t deviceAddress, String key); + SensorDallas(unsigned long interval, unsigned int pin, unsigned int index, String key); ~SensorDallas(); void loop(); + void readDallas(); - private: +private: unsigned long currentMillis; unsigned long prevMillis; - unsigned long _period; + unsigned long _interval; String _key; unsigned int _pin; - uint8_t _deviceAddress; - - void readDallas(); + unsigned int _index; }; extern MySensorDallasVector* mySensorDallas2; +extern void dallas(); + diff --git a/include/items/SensorDallasClass.h b/include/items/SensorDallasClass.h deleted file mode 100644 index 00090fa2..00000000 --- a/include/items/SensorDallasClass.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include -#include "Class/LineParsing.h" -#include "Global.h" -#include "items/SensorConvertingClass.h" - -extern DallasTemperature sensors; -extern OneWire* oneWire; -class SensorDallasClass : public SensorConvertingClass { -public: - SensorDallasClass() : SensorConvertingClass() {}; - - void SensorDallasInit() { - oneWire = new OneWire((uint8_t)_pin.toInt()); - sensors.setOneWire(oneWire); - sensors.begin(); - sensors.setResolution(48); - - sensorReadingMap10sec += _key + ","; - dallasEnterCounter++; - - jsonWriteInt(configOptionJson, _key + "_num", dallasEnterCounter); - jsonWriteStr(configOptionJson, _key + "_map", _map); - jsonWriteStr(configOptionJson, _key + "_с", _c); - } - - void SensorDallasRead(String key) { - float value; - byte num = sensors.getDS18Count(); - sensors.requestTemperatures(); - - int cnt = jsonReadInt(configOptionJson, key + "_num"); - - for (byte i = 0; i < num; i++) { - if (i == cnt) { - value = sensors.getTempCByIndex(i); - //value = this->mapping(key, value); - float valueFl = this->correction(key, value); - eventGen(key, ""); - jsonWriteStr(configLiveJson, key, String(valueFl)); - publishStatus(key, String(valueFl)); - SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); - } - } - } -}; -extern SensorDallasClass mySensorDallas; \ No newline at end of file diff --git a/src/Global.cpp b/src/Global.cpp index 3a572d9d..a6d8ae9e 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -42,7 +42,6 @@ int impulsEnterCounter = -1; // Sensors -int8_t dallasEnterCounter = -1; String sensorReadingMap10sec; String sensorReadingMap30sec; diff --git a/src/Init.cpp b/src/Init.cpp index 2d7ca95f..4b75d60f 100644 --- a/src/Init.cpp +++ b/src/Init.cpp @@ -4,6 +4,7 @@ #include "Global.h" #include "items/LoggingClass.h" #include "items/ImpulsOutClass.h" +#include "items/SensorDallas.h" void loadConfig() { configSetupJson = readFile("config.json", 4096); @@ -30,7 +31,10 @@ void Device_init() { sensorReadingMap10sec = ""; - dallasEnterCounter = -1; + //======clear dallas params====== + if (mySensorDallas2 != nullptr) { + mySensorDallas2->clear(); + } //======clear logging params====== if (myLogging != nullptr) { diff --git a/src/ItemsCmd.cpp b/src/ItemsCmd.cpp index 4fc35acd..4876b5e3 100644 --- a/src/ItemsCmd.cpp +++ b/src/ItemsCmd.cpp @@ -7,6 +7,8 @@ #include "Module/Terminal.h" #include "Servo/Servos.h" +#include "items/SensorDallas.h" + Terminal *term = nullptr; boolean but[NUM_BUTTONS]; @@ -31,7 +33,7 @@ void cmd_init() { sCmd.addCommand("analog-adc", analogAdc); sCmd.addCommand("ultrasonic-cm", ultrasonicCm); - sCmd.addCommand("dallas-temp", dallasTemp); + sCmd.addCommand("dallas-temp", dallas); sCmd.addCommand("dht-temp", dhtTemp); sCmd.addCommand("dht-hum", dhtHum); diff --git a/src/ItemsList.cpp b/src/ItemsList.cpp index 6fec78a4..ff9f6cb5 100644 --- a/src/ItemsList.cpp +++ b/src/ItemsList.cpp @@ -55,12 +55,14 @@ void addItem(String name) { } void addPreset(String name) { - String preset = readFile("presets/" + name + ".txt", 2024); + Serial.println(name); + String preset = readFile("presets/" + name + ".txt", 4048); + Serial.println(preset); addFile(DEVICE_CONFIG_FILE, "\n" + preset); name.replace(".c",".s"); - String scenario = readFile("presets/" + name + ".txt", 2024); + String scenario = readFile("presets/" + name + ".txt", 4048); removeFile(DEVICE_SCENARIO_FILE); addFile(DEVICE_SCENARIO_FILE, scenario); } diff --git a/src/items/SensorDallas.cpp b/src/items/SensorDallas.cpp index 9cae8a0f..f861dc20 100644 --- a/src/items/SensorDallas.cpp +++ b/src/items/SensorDallas.cpp @@ -4,11 +4,11 @@ #include "ItemsCmd.h" #include -SensorDallas::SensorDallas(unsigned long period, unsigned int pin, uint8_t deviceAddress, String key) { - _period = period * 1000; +SensorDallas::SensorDallas(unsigned long interval, unsigned int pin, unsigned int index, String key) { + _interval = interval * 1000; _key = key; _pin = pin; - _deviceAddress = deviceAddress; + _index = index; oneWire = new OneWire((uint8_t)_pin); sensors.setOneWire(oneWire); @@ -21,32 +21,34 @@ SensorDallas::~SensorDallas() {} void SensorDallas::loop() { currentMillis = millis(); unsigned long difference = currentMillis - prevMillis; - if (difference >= _period) { + if (difference >= _interval) { prevMillis = millis(); - + readDallas(); } } -void readDallas() { - +void SensorDallas::readDallas() { + sensors.requestTemperaturesByIndex(_index); + float value = sensors.getTempCByIndex(_index); + eventGen(_key, ""); + jsonWriteStr(configLiveJson, _key, String(value)); + publishStatus(_key, String(value)); + SerialPrint("I", "Sensor", "'" + _key + "' data: " + String(value)); } - MySensorDallasVector* mySensorDallas2 = nullptr; -//void logging() { -// myLineParsing.update(); -// String loggingValueKey = myLineParsing.gval(); -// String key = myLineParsing.gkey(); -// String interv = myLineParsing.gint(); -// String maxcnt = myLineParsing.gcnt(); -// myLineParsing.clear(); -// -// loggingKeyList += key + ","; -// -// static bool firstTime = true; -// if (firstTime) myLogging = new MySensorDallasVector(); -// firstTime = false; -// myLogging->push_back(SensorDallas(interv.toInt(), maxcnt.toInt(), loggingValueKey, key)); -//} +void dallas() { + myLineParsing.update(); + String interval = myLineParsing.gint(); + String pin = myLineParsing.gpin(); + String index = myLineParsing.gindex(); + String key = myLineParsing.gkey(); + myLineParsing.clear(); + + static bool firstTime = true; + if (firstTime) mySensorDallas2 = new MySensorDallasVector(); + firstTime = false; + mySensorDallas2->push_back(SensorDallas(interval.toInt(), pin.toInt(), index.toInt(), key)); +} diff --git a/src/items/SensorDallasClass.cpp b/src/items/SensorDallasClass.cpp deleted file mode 100644 index f0fe6dba..00000000 --- a/src/items/SensorDallasClass.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "ItemsCmd.h" -#include "items/SensorDallasClass.h" -//#ifdef SensorDallasEnabled -//=========================================Модуль ультрозвукового дальномера================================================================== -//dallas-temp;id;anydata;Сенсоры;Температура;order;pin;c[1] -//========================================================================================================================================= -SensorDallasClass mySensorDallas; -void dallasTemp() { - mySensorDallas.update(); - String key = mySensorDallas.gkey(); - sCmd.addCommand(key.c_str(), dallasReading); - mySensorDallas.SensorDallasInit(); - mySensorDallas.clear(); -} - -void dallasReading() { - String key = sCmd.order(); - mySensorDallas.SensorDallasRead(key); -} -//#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 15fc5ef4..fc1f3dc7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,8 +16,8 @@ #include "Utils/WebUtils.h" #include "items/ButtonInClass.h" #include "items/LoggingClass.h" - #include "items/ImpulsOutClass.h" +#include "items/SensorDallas.h" void not_async_actions(); @@ -101,11 +101,7 @@ 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).execute(); + } void loop() { @@ -139,4 +135,10 @@ void loop() { myImpulsOut->at(i).loop(); } } + + if (mySensorDallas2 != nullptr) { + for (unsigned int i = 0; i < mySensorDallas2->size(); i++) { + mySensorDallas2->at(i).loop(); + } + } } \ No newline at end of file From 9845f010fdc35e488806f16e0452ad3c98b8a37b Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 3 Nov 2020 19:07:59 +0300 Subject: [PATCH 8/8] some --- src/ItemsList.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ItemsList.cpp b/src/ItemsList.cpp index ff9f6cb5..d4d1cf8a 100644 --- a/src/ItemsList.cpp +++ b/src/ItemsList.cpp @@ -55,9 +55,7 @@ void addItem(String name) { } void addPreset(String name) { - Serial.println(name); String preset = readFile("presets/" + name + ".txt", 4048); - Serial.println(preset); addFile(DEVICE_CONFIG_FILE, "\n" + preset); name.replace(".c",".s");