This commit is contained in:
Dmitry Borisenko
2020-08-01 20:06:40 +02:00
52 changed files with 758 additions and 846 deletions

View File

@@ -1,18 +1,23 @@
#include "Bus/BusScanner.h"
#include "Bus/I2CScanner.h"
#include "Utils/PrintMessage.h"
#include <Wire.h>
#include "Utils/PrintMessage.h"
static const char* MODULE = "I2C";
boolean I2CScanner::syncScan() {
I2CScanner::I2CScanner(String& out) : BusScanner(TAG_I2C, out, 2){};
void I2CScanner::init() {
Wire.begin();
pm.info("scanning i2c...");
}
boolean I2CScanner::syncScan() {
pm.info("scanning...");
size_t cnt = 0;
for (uint8_t i = 8; i < 120; i++) {
Wire.beginTransmission(i);
if (Wire.endTransmission() == 0) {
pm.info("found device: " + i);
pm.info("found: " + i);
addResult(i, i < 119);
cnt++;
}

View File

@@ -1,28 +0,0 @@
#include "Bus/BusScanner.h"
#include "Utils/PresetUtils.h"
#include "Utils/PrintMessage.h"
#include <OneWire.h>
const char* MODULE = "1Wire";
bool OneWireScanner::syncScan() {
// Connect your 1-wire device to pin 3
OneWire ds(3);
uint8_t addr[8];
pm.info("scanning 1-Wire...");
while (ds.search(addr)) {
for (uint8_t i = 0; i < 8; i++) {
pm.info("found device: " + i);
addResult(addr[i], i < 7);
}
}
if (OneWire::crc8(addr, 7) != addr[7]) {
pm.error("CRC!");
return false;
}
ds.reset_search();
return true;
}

View File

@@ -1,33 +0,0 @@
#include "CaptiveRequestHandler.h"
CaptiveRequestHandler::CaptiveRequestHandler(const char *host) {
strlcpy(_local_name, host, sizeof(_local_name));
strcat(_local_name, ".local");
}
CaptiveRequestHandler::~CaptiveRequestHandler() {
}
bool CaptiveRequestHandler::isLocalIp(String address) {
IPAddress ip;
return !ip.fromString(address) || (ip != _local_ip);
}
bool CaptiveRequestHandler::isLocalName(String host_name) {
return host_name.equalsIgnoreCase(_local_name);
}
bool CaptiveRequestHandler::canHandle(AsyncWebServerRequest *request) {
_local_ip = request->client()->localIP();
return !isLocalIp(request->getHeader("HOST")->value()) && !isLocalName(request->getHeader("HOST")->value());
}
void CaptiveRequestHandler::CaptiveRequestHandler::handleRequest(AsyncWebServerRequest *request) {
char buf[64];
sprintf(buf, "http://%s%s", _local_name, request->url().c_str());
auto response = request->beginResponse(302, "text/html");
response->addHeader("Location", buf);
response->addHeader("Connection", "close");
request->send(response);
};

View File

@@ -1,6 +1,7 @@
#include "Global.h"
#include "Module/Terminal.h"
#include "Servo/Servos.h"
static const char *MODULE = "Cmd";
@@ -9,9 +10,11 @@ Terminal *term = nullptr;
boolean but[NUM_BUTTONS];
Bounce *buttons = new Bounce[NUM_BUTTONS];
Servo myServo1;
Servo myServo2;
#ifdef ESP8266
SoftwareSerial *mySerial = nullptr;
#else
HardwareSerial *mySerial = nullptr;
#endif
void getData();
@@ -105,6 +108,7 @@ void cmd_init() {
//==========================================================================================================
//==========================================Модуль кнопок===================================================
void button() {
pm.info("create 'button'");
String number = sCmd.next();
@@ -174,25 +178,23 @@ void buttonSet() {
}
eventGen("button", button_number);
jsonWriteStr(configLiveJson, "button" + button_number, button_state);
MqttClient::publishStatus("button" + button_number, button_state);
}
void buttonChange() {
String button_number = sCmd.next();
String current_state = jsonReadStr(configLiveJson, "button" + button_number);
if (current_state == "1") {
current_state = "0";
} else if (current_state == "0") {
current_state = "1";
if (!isDigitStr(button_number)) {
pm.error("wrong button " + button_number);
return;
}
order_loop += "buttonSet " + button_number + " " + current_state + ",";
jsonWriteStr(configLiveJson, "button" + button_number, current_state);
String name = "button" + button_number;
bool current_state = !jsonReadBool(configLiveJson, name);
String stateStr = current_state ? "1" : "0";
MqttClient::publishStatus("button" + button_number, current_state);
jsonWriteStr(configLiveJson, name, stateStr);
addCommandLoop("buttonSet " + button_number + " " + stateStr);
MqttClient::publishStatus(name, stateStr);
}
void pinSet() {
@@ -223,9 +225,8 @@ void pwm() {
jsonWriteStr(configOptionJson, "pwm_pin" + pwm_number, pwm_pin);
pinMode(pwm_pin_int, INPUT);
analogWrite(pwm_pin_int, start_state.toInt());
//analogWriteFreq(32000);
jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state);
jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state);
createWidget(widget_name, page_name, page_number, "range", "pwm" + pwm_number);
}
@@ -246,13 +247,13 @@ void pwmSet() {
//==================================================================================================================
//==========================================Модуль физической кнопки================================================
void switch_() {
String switch_number = sCmd.next();
String switch_pin = sCmd.next();
String switch_delay = sCmd.next();
int number = String(sCmd.next()).toInt();
int pin = String(sCmd.next()).toInt();
int delay = String(sCmd.next()).toInt();
buttons[switch_number.toInt()].attach(switch_pin.toInt());
buttons[switch_number.toInt()].interval(switch_delay.toInt());
but[switch_number.toInt()] = true;
buttons[number].attach(pin);
buttons[number].interval(delay);
but[number] = true;
}
void loopSerial() {
@@ -294,6 +295,7 @@ void inputDigit() {
page_name.replace("#", " ");
String start_state = sCmd.next();
String page_number = sCmd.next();
jsonWriteStr(configLiveJson, "digit" + number, start_state);
createWidget(widget_name, page_name, page_number, "inputNum", "digit" + number);
}
@@ -301,6 +303,7 @@ void inputDigit() {
void digitSet() {
String number = sCmd.next();
String value = sCmd.next();
jsonWriteStr(configLiveJson, "digit" + number, value);
MqttClient::publishStatus("digit" + number, value);
}
@@ -316,6 +319,7 @@ void inputTime() {
page_name.replace("#", " ");
String start_state = sCmd.next();
String page_number = sCmd.next();
jsonWriteStr(configLiveJson, "time" + number, start_state);
createWidget(widget_name, page_name, page_number, "inputTime", "time" + number);
}
@@ -323,6 +327,7 @@ void inputTime() {
void timeSet() {
String number = sCmd.next();
String value = sCmd.next();
jsonWriteStr(configLiveJson, "time" + number, value);
MqttClient::publishStatus("time" + number, value);
}
@@ -356,9 +361,7 @@ void textSet() {
if (text.indexOf("-time") >= 0) {
text.replace("-time", "");
text.replace("#", " ");
String time = timeNow->getTime();
time.replace(":", ".");
text = text + " " + timeNow->getDateDigitalFormated() + " " + time;
text = text + " " + timeNow->getDateTimeDotFormated();
}
jsonWriteStr(configLiveJson, "text" + number, text);
@@ -431,94 +434,59 @@ void stepperSet() {
#ifdef SERVO_ENABLED
//servo 1 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2
void servo_() {
String servo_number = sCmd.next();
String servo_pin = sCmd.next();
String start_state = sCmd.next();
int start_state_int = start_state.toInt();
String widget_name = sCmd.next();
String page_name = sCmd.next();
String number = sCmd.next();
uint8_t pin = String(sCmd.next()).toInt();
int value = String(sCmd.next()).toInt();
String min_value = sCmd.next();
String max_value = sCmd.next();
String widget = sCmd.next();
String page = sCmd.next();
String min_deg = sCmd.next();
String max_deg = sCmd.next();
int min_value = String(sCmd.next()).toInt();
int max_value = String(sCmd.next()).toInt();
int min_deg = String(sCmd.next()).toInt();
int max_deg = String(sCmd.next()).toInt();
String page_number = sCmd.next();
String pageNumber = sCmd.next();
jsonWriteStr(configOptionJson, "servo_pin" + servo_number, servo_pin);
start_state_int = map(start_state_int, min_value.toInt(), max_value.toInt(), min_deg.toInt(), max_deg.toInt());
jsonWriteStr(configOptionJson, "servo_pin" + number, String(pin, DEC));
if (servo_number == "1") {
#ifdef ESP8266
myServo1.attach(servo_pin.toInt());
myServo1.write(start_state_int);
#endif
value = map(value, min_value, max_value, min_deg, max_deg);
Servo *servo = myServo.create(number.toInt(), pin);
servo->write(value);
#ifdef ESP32
myServo1.attach(servo_pin.toInt(), 500, 2400);
myServo1.write(start_state_int);
myServo1.attach(servo_pin.toInt(), 500, 2400);
myServo1.write(start_state_int);
#endif
}
if (servo_number == "2") {
#ifdef ESP8266
myServo2.attach(servo_pin.toInt());
myServo2.write(start_state_int);
#endif
#ifdef ESP32
myServo2.attach(servo_pin.toInt(), 500, 2400);
myServo2.write(start_state_int);
#endif
}
jsonWriteInt(configOptionJson, "s_min_val" + number, min_value);
jsonWriteInt(configOptionJson, "s_max_val" + number, max_value);
jsonWriteInt(configOptionJson, "s_min_deg" + number, min_deg);
jsonWriteInt(configOptionJson, "s_max_deg" + number, max_deg);
jsonWriteStr(configOptionJson, "s_min_val" + servo_number, min_value);
jsonWriteStr(configOptionJson, "s_max_val" + servo_number, max_value);
jsonWriteStr(configOptionJson, "s_min_deg" + servo_number, min_deg);
jsonWriteStr(configOptionJson, "s_max_deg" + servo_number, max_deg);
jsonWriteInt(configLiveJson, "servo" + number, value);
jsonWriteStr(configLiveJson, "servo" + servo_number, start_state);
createWidgetParam(widget_name, page_name, page_number, "range", "servo" + servo_number, "min", min_value, "max", max_value, "k", "1");
createWidgetParam(widget, page, pageNumber, "range", "servo" + number, "min", String(min_value), "max", String(max_value), "k", "1");
}
void servoSet() {
String servo_number = sCmd.next();
String servo_state = sCmd.next();
int servo_state_int = servo_state.toInt();
String number = sCmd.next();
int value = String(sCmd.next()).toInt();
//int pin = jsonReadInt(configOptionJson, "servo_pin" + servo_number);
value = map(value,
jsonReadInt(configOptionJson, "s_min_val" + number),
jsonReadInt(configOptionJson, "s_max_val" + number),
jsonReadInt(configOptionJson, "s_min_deg" + number),
jsonReadInt(configOptionJson, "s_max_deg" + number));
servo_state_int = map(servo_state_int,
jsonReadInt(configOptionJson, "s_min_val" + servo_number),
jsonReadInt(configOptionJson, "s_max_val" + servo_number),
jsonReadInt(configOptionJson, "s_min_deg" + servo_number),
jsonReadInt(configOptionJson, "s_max_deg" + servo_number));
if (servo_number == "1") {
#ifdef ESP8266
myServo1.write(servo_state_int);
#endif
#ifdef ESP32
myServo1.write(servo_state_int);
#endif
Servo *servo = myServo.get(number.toInt());
if (servo) {
servo->write(value);
}
if (servo_number == "2") {
#ifdef ESP8266
myServo2.write(servo_state_int);
#endif
#ifdef ESP32
myServo2.write(servo_state_int);
#endif
}
//Serial.println(servo_state_int);
eventGen("servo", servo_number);
jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state);
MqttClient::publishStatus("servo" + servo_number, servo_state);
eventGen("servo", number);
jsonWriteInt(configLiveJson, "servo" + number, value);
MqttClient::publishStatus("servo" + number, String(value, DEC));
}
#endif
@@ -532,8 +500,13 @@ void serialBegin() {
delete mySerial;
}
#ifdef ESP8266
mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt());
mySerial->begin(s_speed.toInt());
#else
mySerial = new HardwareSerial(2);
mySerial->begin(rxPin.toInt(), txPin.toInt());
#endif
term = new Terminal(mySerial);
term->setEOL(LF);
@@ -542,8 +515,6 @@ void serialBegin() {
term->enableEcho(false);
term->setOnReadLine([](const char *str) {
String line = String(str);
pm.info("serial read: " + line);
//line.replace("#", " ");
addCommandLoop(line);
});
}
@@ -583,7 +554,7 @@ void httpOrderSend() {
}
void firmwareUpdate() {
upgrade = true;
updateFlag = true;
}
void firmwareVersion() {
@@ -592,7 +563,6 @@ void firmwareVersion() {
String pageNumber = sCmd.next();
jsonWriteStr(configLiveJson, "firmver", FIRMWARE_VERSION);
createWidget(widget, page, pageNumber, "anydata", "firmver");
}
@@ -605,20 +575,11 @@ void addCommandLoop(const String &cmdStr) {
void fileExecute(const String &filename) {
String cmdStr = readFile(filename, 2048);
cmdStr += "\r\n";
cmdStr.replace("\r\n", "\n");
cmdStr.replace("\r", "\n");
while (cmdStr.length() != 0) {
String buf = selectToMarker(cmdStr, "\n");
sCmd.readStr(buf);
cmdStr = deleteBeforeDelimiter(cmdStr, "\n");
}
stringExecute(cmdStr);
}
void stringExecute(String &cmdStr) {
cmdStr = cmdStr + "\r\n";
cmdStr += "\r\n";
cmdStr.replace("\r\n", "\n");
cmdStr.replace("\r", "\n");
@@ -632,8 +593,8 @@ void stringExecute(String &cmdStr) {
void loopCmd() {
if (order_loop.length()) {
String tmp = selectToMarker(order_loop, ","); //выделяем первую команду rel 5 1,
sCmd.readStr(tmp); //выполняем
pm.info("do: " + order_loop);
pm.info("do: " + tmp);
sCmd.readStr(tmp); //выполняем
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем
}
}

View File

@@ -17,6 +17,8 @@ StringCommand sCmd;
AsyncWebServer server(80);
OneWire *oneWire;
DallasTemperature sensors;
/*
@@ -41,6 +43,9 @@ String order_loop = "";
String analog_value_names_list;
int enter_to_analog_counter;
String dallas_value_name;
int enter_to_dallas_counter;
String levelPr_value_name;
String ultrasonicCm_value_name;
@@ -67,8 +72,8 @@ int scenario_line_status[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
String lastVersion = "";
// Async actions
boolean upgrade_url = false;
boolean upgrade = false;
boolean checkUpdatesFlag = false;
boolean updateFlag = false;
boolean mqttParamsChanged = false;
boolean udp_data_parse = false;

View File

@@ -15,8 +15,8 @@ void init() {
String login = jsonReadStr(configSetupJson, "weblogin");
String pass = jsonReadStr(configSetupJson, "webpass");
#ifdef ESP32
server.addHandler(new SPIFFSEditor(LittleFS, login, pass);
#elif defined(ESP8266)
server.addHandler(new SPIFFSEditor(LittleFS, login, pass));
#else
server.addHandler(new SPIFFSEditor(login, pass));
#endif
@@ -51,7 +51,7 @@ void init() {
server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(200, "application/json", configOptionJson);
});
// для хранения постоянных данных
server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(200, "application/json", configSetupJson);
@@ -59,13 +59,13 @@ void init() {
server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest *request) {
String cmdStr = request->getParam("command")->value();
pm.info("command: " + cmdStr);
pm.info("do: " + cmdStr);
addCommandLoop(cmdStr);
request->send(200, "text/text", "OK");
request->send(200, "text/html", "OK");
});
server.begin();
initOta();
initMDNS();
initWS();
@@ -190,7 +190,7 @@ void initWS() {
ws.onEvent(onWsEvent);
server.addHandler(&ws);
events.onConnect([](AsyncEventSourceClient *client) {
//!!!client->send("hello!", NULL, millis(), 1000);
client->send("", NULL, millis(), 1000);
});
server.addHandler(&events);
#endif

View File

@@ -30,6 +30,9 @@ void Device_init() {
analog_value_names_list = "";
enter_to_analog_counter = 0;
dallas_value_name = "";
enter_to_dallas_counter = 0;
levelPr_value_name = "";
ultrasonicCm_value_name = "";

View File

@@ -16,7 +16,7 @@ void Telnet::onEnd() {
bool Telnet::onStart() {
_server->begin();
_server->setNoDelay(true);
return _server->status() != CLOSED;
return true;
}
void Telnet::onStop() {

View File

@@ -45,8 +45,8 @@ void Terminal::quit() {}
void Terminal::loop() {
if (_stream == nullptr || !_stream->available()) return;
sint8_t moveX = 0;
sint8_t moveY = 0;
byte moveX = 0;
byte moveY = 0;
char c = _stream->read();

View File

@@ -147,7 +147,7 @@ void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
order_loop += ",";
} else if (topicStr.indexOf("update")) {
if (payloadStr == "1") {
upgrade = true;
updateFlag = true;
}
} else if (topicStr.indexOf("devc")) {
writeFile(String(DEVICE_CONFIG_FILE), payloadStr);
@@ -279,7 +279,7 @@ const String getStateStr() {
return F("connection failed");
break;
case -1:
return F("client disconnected ");
return F("client disconnected");
break;
case 0:
return F("client connected");

View File

@@ -22,7 +22,6 @@ void loopScenario() {
return;
}
i++;
if (scenario_line_status[i] == 1) {
//выделяем первую строку самого сценария button1 = 1 (условие)
String condition = selectToMarker(block, "\n");
@@ -30,9 +29,8 @@ void loopScenario() {
String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий
String param = selectToMarker(order, ","); //читаем первое событие из файла событий
if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку
String sign = selectFromMarkerToMarker(condition, " ", 1); //читаем знак (=)
String value = selectFromMarkerToMarker(condition, " ", 2); //читаем значение (1)
String sign = selectFromMarkerToMarker(condition, " ", 1); //читаем знак (=)
String value = selectFromMarkerToMarker(condition, " ", 2); //читаем значение (1)
if (value.indexOf("digit") != -1) {
// value = add_set(value);
value = jsonReadStr(configLiveJson, value);
@@ -41,31 +39,29 @@ void loopScenario() {
// value = add_set(value);
value = jsonReadStr(configLiveJson, value);
}
boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады
// если условие выполнилось, тогда начинаем выполнять комнады
boolean flag = false;
String param = jsonReadStr(configLiveJson, param_name);
if (sign == "=") {
if (jsonReadStr(configLiveJson, param_name) == value) flag = true;
}
if (sign == "!=") {
if (jsonReadStr(configLiveJson, param_name) != value) flag = true;
}
if (sign == "<") {
if (jsonReadStr(configLiveJson, param_name).toInt() < value.toInt()) flag = true;
}
if (sign == ">") {
if (jsonReadStr(configLiveJson, param_name).toInt() > value.toInt()) flag = true;
}
if (sign == ">=") {
if (jsonReadStr(configLiveJson, param_name).toInt() >= value.toInt()) flag = true;
}
if (sign == "<=") {
if (jsonReadStr(configLiveJson, param_name).toInt() <= value.toInt()) flag = true;
flag = param == value;
} else if (sign == "!=") {
flag = param != value;
} else if (sign == "<") {
flag = param.toInt() < value.toInt();
} else if (sign == ">") {
flag = param.toInt() > value.toInt();
} else if (sign == ">=") {
flag = param.toInt() >= value.toInt();
} else if (sign == "<=") {
flag = param.toInt() <= value.toInt();
}
if (flag) {
block = deleteBeforeDelimiter(block, "\n"); //удаляем строку самого сценария оставляя только команды
stringExecute(block); //выполняем все команды
pm.info(condition + "'");
// удаляем строку самого сценария оставляя только команды
block = deleteBeforeDelimiter(block, "\n");
pm.info("do: " + block);
// выполняем все команды
stringExecute(block);
}
}
}

View File

@@ -1,6 +1,5 @@
#include "Global.h"
OneWire *oneWire;
GMedian<10, int> medianFilter;
DHTesp dht;
@@ -232,32 +231,40 @@ void analog_reading2() {
//=========================================================================================================================================
//=========================================Модуль температурного сенсора ds18b20===========================================================
#ifdef DALLAS_ENABLED
//dallas temp1 2 1 Температура Датчики anydata 1
//dallas temp2 2 2 Температура Датчики anydata 2
void dallas() {
String value_name = sCmd.next();
String pin = sCmd.next();
String address = sCmd.next();
jsonWriteStr(configOptionJson, value_name + "_ds", address);
String widget_name = sCmd.next();
String page_name = sCmd.next();
String type = sCmd.next();
String page_number = sCmd.next();
oneWire = new OneWire((uint8_t)pin.toInt());
oneWire = new OneWire((uint8_t) pin.toInt());
sensors.setOneWire(oneWire);
sensors.begin();
sensors.setResolution(12);
createWidgetByType(widget_name, page_name, page_number, type, "dallas");
dallas_value_name += value_name + ";";
createWidgetByType(widget_name, page_name, page_number, type, value_name);
sensors_reading_map[3] = 1;
}
void dallas_reading() {
float temp = 0;
byte num = sensors.getDS18Count();
String dallas_value_name_tmp_buf = dallas_value_name;
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
jsonWriteStr(configLiveJson, "dallas", String(temp));
eventGen("dallas", "");
MqttClient::publishStatus("dallas", String(temp));
Serial.println("[I] sensor 'dallas' send date " + String(temp));
for (byte i = 0; i < num; i++) {
temp = sensors.getTempCByIndex(i);
String buf = selectToMarker(dallas_value_name_tmp_buf, ";");
dallas_value_name_tmp_buf = deleteBeforeDelimiter(dallas_value_name_tmp_buf, ";");
jsonWriteStr(configLiveJson, buf, String(temp));
eventGen(buf, "");
MqttClient::publishStatus(buf, String(temp));
Serial.println("[I] sensor '" + buf + "' send date " + String(temp));
}
}
#endif
//=========================================================================================================================================

40
src/Servo/Servs.cpp Normal file
View File

@@ -0,0 +1,40 @@
#include "Servo/Servos.h"
Servos myServo;
Servos::Servos(){};
Servo *Servos::create(uint8_t num, uint8_t pin) {
// Ищем среди ранее созданных
for (size_t i = 0; i < _items.size(); i++) {
auto item = _items.at(i);
if (item.num == num) {
if (item.pin != pin) {
item.obj->attach(pin);
item.pin = pin;
};
return item.obj;
}
}
// Добавляем новый
Servo_t newItem{num, pin};
newItem.obj = new Servo();
newItem.obj->attach(pin);
_items.push_back(newItem);
return newItem.obj;
}
Servo *Servos::get(uint8_t num) {
// Ищем среди ранее созданных
for (size_t i = 0; i < _items.size(); i++) {
auto item = _items.at(i);
if (item.num == num) {
return item.obj;
}
}
return nullptr;
}
size_t Servos::count() {
return _items.size();
}

View File

@@ -1,30 +1,29 @@
#include "Upgrade.h"
#include "Global.h"
#include "ESP8266.h"
static const char* MODULE = "Upgr";
static const char* MODULE = "Update";
static const char* filesystem_image_url PROGMEM = "http://91.204.228.124:1100/update/%s/fs.bin";
static const char* available_url PROGMEM = "http://91.204.228.124:1100/update/%s/version.txt";
static const char* check_update_url PROGMEM = "http://91.204.228.124:1100/update/%s/version.txt";
const String getAvailableUrl(const char* mcu) {
char buf[128];
sprintf_P(buf, available_url, mcu);
sprintf_P(buf, check_update_url, mcu);
return buf;
}
void getLastVersion() {
if (upgrade_url) {
upgrade_url = false;
if (checkUpdatesFlag) {
String url;
#ifdef ESP32
url = getAvailableUrl("esp32");
#endif
#ifdef ESP8266
url = getAvailableUrl("esp8266");
#else
url = getAvailableUrl("esp32");
#endif
lastVersion = getURL(url);
jsonWriteStr(configSetupJson, "last_version", lastVersion);
checkUpdatesFlag = false;
}
}
@@ -38,76 +37,51 @@ void initUpdater() {
}
void upgrade_firmware() {
String scenario_for_update;
String config_for_update;
String configSetup_for_update;
String scanerioBackup, configBackup, setupBackup;
scenario_for_update = readFile(String(DEVICE_SCENARIO_FILE), 4000);
config_for_update = readFile(String(DEVICE_CONFIG_FILE), 4000);
configSetup_for_update = configSetupJson;
scanerioBackup = readFile(String(DEVICE_SCENARIO_FILE), 4096);
configBackup = readFile(String(DEVICE_CONFIG_FILE), 4096);
setupBackup = configSetupJson;
Serial.println("Start upgrade SPIFFS, please wait...");
WiFiClient client_for_upgrade;
#ifdef ESP32
pm.info("update data");
WiFiClient wifiClient;
#ifdef ESP8266
ESPhttpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(wifiClient, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#else
httpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = httpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
#ifdef ESP8266
ESPhttpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
if (ret == HTTP_UPDATE_OK) {
writeFile(String(DEVICE_SCENARIO_FILE), scenario_for_update);
writeFile(String(DEVICE_CONFIG_FILE), config_for_update);
writeFile("config.json", configSetup_for_update);
writeFile(String(DEVICE_SCENARIO_FILE), scanerioBackup);
writeFile(String(DEVICE_CONFIG_FILE), configBackup);
writeFile("config.json", setupBackup);
saveConfig();
Serial.println("Upgrade done!");
Serial.println("Start upgrade BUILD, please wait...");
#ifdef ESP32
//httpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = httpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
#ifdef ESP8266
//ESPhttpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = ESPhttpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
if (ret == HTTP_UPDATE_OK) {
Serial.println("Upgrade done!");
Serial.println("Restart...");
ESP.restart();
} else {
Serial.println("[E] on build");
}
pm.info("done!");
} else {
Serial.println("[E] on upgrade");
pm.error("on data");
return;
}
Serial.println("update firmware");
#ifdef ESP8266
ret = ESPhttpUpdate.update(wifiClient, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#else
ret = httpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
if (ret == HTTP_UPDATE_OK) {
pm.info("done! restart...");
ESP.restart();
} else {
pm.error("on firmware");
}
}
void flashUpgrade() {
if (upgrade) {
upgrade = false;
void do_update() {
if (updateFlag) {
updateFlag = false;
upgrade_firmware();
}
}
/*
void upgrade_status(t_httpUpdate_return set) {
switch (set) {
case HTTP_UPDATE_FAILED:
Serial.printf("UPDATE_FAILED Error (%d): %s", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str());
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println("NO_UPDATES");
break;
case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
break;
}
}
*/
}

View File

@@ -127,3 +127,24 @@ const String getFileSize(const String filename) {
file.close();
return String(size);
}
const String getFSSizeInfo() {
String res;
#ifdef ESP8266
FSInfo info;
if (LittleFS.info(info)) {
res = prettyBytes(info.usedBytes) + " of " + prettyBytes(info.totalBytes);
} else {
res = "error";
}
#else
res = prettyBytes(LittleFS.usedBytes()) + " of " + prettyBytes(LittleFS.totalBytes());
#endif
return res;
}
const String getConfigFile(uint8_t preset, ConfigType_t type) {
char buf[64];
sprintf(buf, "/conf/%s%03d.txt", (type == CT_CONFIG) ? "c" : "s", preset);
return String(buf);
}

View File

@@ -29,6 +29,10 @@ String jsonWriteStr(String& json, String name, String value) {
return json;
}
String jsonWriteBool(String& json, String name, boolean value) {
return jsonWriteStr(json, name, value ? "1" : "0");
}
String jsonWriteInt(String& json, String name, int value) {
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);

View File

@@ -1,9 +0,0 @@
#include "Utils/PresetUtils.h"
static const char* config_file_fmt PROGMEM = "/conf/%s%03d.txt";
const String getConfigFile(uint8_t preset, ConfigType_t type) {
char buf[64];
sprintf_P(buf, config_file_fmt, (type == CT_CONFIG) ? "c" : "s", preset);
return String(buf);
}

View File

@@ -1,5 +1,7 @@
#include "Utils\StringUtils.h"
#include "Consts.h"
String selectToMarkerLast(String str, String found) {
int p = str.lastIndexOf(found);
return str.substring(p + found.length());

View File

@@ -22,9 +22,8 @@ const String getChipId() {
#ifdef ESP8266
static uint32_t total_memory = 52864;
#endif
#ifdef ESP32
static uint32_t total_memory = 362868;
#else
static uint32_t total_memory = ESP.getHeapSize();
#endif
const String printMemoryStatus() {
@@ -49,19 +48,10 @@ const String getHeapStats() {
buf += '%';
return buf;
}
#endif
#ifdef ESP32
String getHeapStats() {
uint32_t free;
uint16_t max;
uint8_t frag;
ESP.getHeapStats(&free, &max, &frag);
#else
const String getHeapStats() {
String buf;
buf += prettyBytes(free);
buf += " ";
buf += frag;
buf += '%';
buf = prettyBytes(ESP.getFreeHeap());
return buf;
}
#endif

View File

@@ -20,11 +20,16 @@ void startSTAMode() {
bool keepConnecting = true;
uint8_t tries = 20;
sint8_t connRes;
do {
sint8_t connRes = WiFi.waitForConnectResult(1000);
#ifdef ESP8266
connRes = WiFi.waitForConnectResult(1000);
#else
byte connRes = WiFi.waitForConnectResult();
#endif
switch (connRes) {
case WL_NO_SSID_AVAIL: {
pm.error("No ssid available");
pm.error("no network");
keepConnecting = false;
} break;
case WL_CONNECTED: {
@@ -34,7 +39,7 @@ void startSTAMode() {
keepConnecting = false;
} break;
case WL_CONNECT_FAILED: {
pm.error("Check credentials");
pm.error("check credentials");
jsonWriteInt(configOptionJson, "pass_status", 1);
keepConnecting = false;
} break;
@@ -45,9 +50,9 @@ void startSTAMode() {
if (isNetworkActive()) {
MqttClient::init();
setLedStatus(LED_OFF);
} else {
pm.error("failed: " + String(connRes, DEC));
startAPMode();
};
}

View File

@@ -1,13 +1,7 @@
#include "Global.h"
#include "CaptiveRequestHandler.h"
#include "Utils/PresetUtils.h"
static const char* MODULE = "Web";
static const uint8_t MIN_PRESET = 1;
static const uint8_t MAX_PRESET = 21;
bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
if (request->hasArg("preset")) {
preset = request->getParam("preset")->value().toInt();
@@ -17,8 +11,18 @@ bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
}
void web_init() {
// dnsServer.start(53, "*", WiFi.softAPIP());
// server.addHandler(new CaptiveRequestHandler(jsonReadStr(configSetupJson, "name").c_str())).setFilter(ON_AP_FILTER);
server.on("/restart", HTTP_GET, [](AsyncWebServerRequest* request) {
if (request->hasArg("device")) {
if (request->getParam("device")->value() == "ok") {
ESP.restart();
}
request->send(200);
};
});
server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
uint8_t preset;
if (parseRequestForPreset(request, preset)) {
@@ -35,49 +39,35 @@ void web_init() {
//--------------------------------------------------------------------------------
if (request->hasArg("devinit")) {
Device_init();
request->send(200, "text/text", "OK");
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("scen")) {
String value = request->getParam("scen")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "scen", value);
saveConfig();
loadScenario();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "scen", value);
saveConfig();
loadScenario();
}
request->send(200, "text/text", "OK");
bool value = request->getParam("scen")->value().toInt();
jsonWriteBool(configSetupJson, "scen", value);
saveConfig();
loadScenario();
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("sceninit")) {
loadScenario();
request->send(200, "text/text", "OK");
request->send(200);
}
//--------------------------------------------------------------------------------
#ifdef LOGGING_ENABLED
if (request->hasArg("cleanlog")) {
clean_log_date();
request->send(200, "text/text", "OK");
request->send(200);
}
#endif
//==============================udp settings=============================================
if (request->hasArg("udponoff")) {
String value = request->getParam("udponoff")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "udponoff", value);
saveConfig();
loadScenario();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "udponoff", value);
saveConfig();
loadScenario();
}
request->send(200, "text/text", "OK");
bool value = request->getParam("udponoff")->value().toInt();
jsonWriteBool(configSetupJson, "udponoff", value);
saveConfig();
loadScenario();
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("updatelist")) {
@@ -93,18 +83,18 @@ void web_init() {
if (request->hasArg("devname")) {
jsonWriteStr(configSetupJson, "name", request->getParam("devname")->value());
saveConfig();
request->send(200, "text/text", "OK");
request->send(200);
}
//==============================wifi settings=============================================
if (request->hasArg("routerssid")) {
jsonWriteStr(configSetupJson, "routerssid", request->getParam("routerssid")->value());
saveConfig();
request->send(200, "text/text", "OK");
request->send(200);
}
if (request->hasArg("routerpass")) {
jsonWriteStr(configSetupJson, "routerpass", request->getParam("routerpass")->value());
saveConfig();
request->send(200, "text/text", "OK");
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("apssid")) {
@@ -115,18 +105,18 @@ void web_init() {
if (request->hasArg("appass")) {
jsonWriteStr(configSetupJson, "appass", request->getParam("appass")->value());
saveConfig();
request->send(200, "text/text", "OK");
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("weblogin")) {
jsonWriteStr(configSetupJson, "weblogin", request->getParam("weblogin")->value());
saveConfig();
request->send(200, "text/text", "OK");
request->send(200);
}
if (request->hasArg("webpass")) {
jsonWriteStr(configSetupJson, "webpass", request->getParam("webpass")->value());
saveConfig();
request->send(200, "text/text", "OK");
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("timezone")) {
@@ -134,79 +124,69 @@ void web_init() {
jsonWriteStr(configSetupJson, "timezone", timezoneStr);
saveConfig();
timeNow->setTimezone(timezoneStr.toInt());
request->send(200, "text/text", "OK");
request->send(200);
}
if (request->hasArg("ntp")) {
String ntpStr = request->getParam("ntp")->value();
jsonWriteStr(configSetupJson, "ntp", ntpStr);
saveConfig();
timeNow->setNtpPool(ntpStr);
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("device")) {
if (request->getParam("device")->value() == "ok") ESP.restart();
request->send(200, "text/text", "OK");
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("blink")) {
String value = request->getParam("blink")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "blink", value);
saveConfig();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "blink", value);
saveConfig();
}
request->send(200, "text/text", "OK");
bool value = request->getParam("blink")->value().toInt();
jsonWriteBool(configSetupJson, "blink", value);
saveConfig();
request->send(200);
}
//==============================mqtt settings=============================================
if (request->hasArg("mqttServer")) {
jsonWriteStr(configSetupJson, "mqttServer", request->getParam("mqttServer")->value());
saveConfig();
mqttParamsChanged = true;
request->send(200, "text/text", "ok");
request->send(200);
}
if (request->hasArg("mqttPort")) {
int port = (request->getParam("mqttPort")->value()).toInt();
jsonWriteInt(configSetupJson, "mqttPort", port);
saveConfig();
mqttParamsChanged = true;
request->send(200, "text/text", "ok");
request->send(200);
}
if (request->hasArg("mqttPrefix")) {
jsonWriteStr(configSetupJson, "mqttPrefix", request->getParam("mqttPrefix")->value());
saveConfig();
mqttParamsChanged = true;
request->send(200, "text/text", "ok");
request->send(200);
}
if (request->hasArg("mqttUser")) {
jsonWriteStr(configSetupJson, "mqttUser", request->getParam("mqttUser")->value());
saveConfig();
mqttParamsChanged = true;
request->send(200, "text/text", "ok");
request->send(200);
}
if (request->hasArg("mqttPass")) {
jsonWriteStr(configSetupJson, "mqttPass", request->getParam("mqttPass")->value());
saveConfig();
mqttParamsChanged = true;
request->send(200, "text/text", "ok");
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("mqttsend")) {
mqtt_send_settings_to_udp = true;
request->send(200, "text/text", "ok");
request->send(200);
}
//--------------------------------------------------------------------------------
if (request->hasArg("mqttcheck")) {
String buf = "{}";
String payload = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + MqttClient::getStateStr();
jsonWriteStr(buf, "title", payload);
jsonWriteStr(buf, "class", "pop-up");
String buf = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + MqttClient::getStateStr();
request->send(200, "text/text", buf);
String payload = "{}";
jsonWriteStr(payload, "title", buf);
jsonWriteStr(payload, "class", "pop-up");
request->send(200, "text/html", payload);
}
//==============================push settings=============================================
@@ -214,96 +194,68 @@ void web_init() {
if (request->hasArg("pushingboxid")) {
jsonWriteStr(configSetupJson, "pushingboxid", request->getParam("pushingboxid")->value());
saveConfig();
request->send(200, "text/text", "ok");
request->send(200);
}
#endif
//==============================utilities settings=============================================
if (request->hasArg("itoc")) {
if (request->hasArg(TAG_I2C)) {
busScanFlag = true;
busToScan = BS_I2C;
request->redirect("/?set.utilities");
}
if (request->hasArg("onewire")) {
} else if (request->hasArg(TAG_ONE_WIRE)) {
busScanFlag = true;
busToScan = BS_ONE_WIRE;
if (request->hasParam(TAG_ONE_WIRE_PIN)) {
setConfigParam(TAG_ONE_WIRE_PIN, request->getParam(TAG_ONE_WIRE_PIN)->value());
}
request->redirect("/?set.utilities");
}
if (request->hasArg("fscheck")) {
fsCheckFlag = true;
request->redirect("/?set.utilities");
} else if (request->hasArg(TAG_ONE_WIRE_PIN)) {
setConfigParam(TAG_ONE_WIRE_PIN, request->getParam(TAG_ONE_WIRE_PIN)->value());
request->send(200);
}
});
//==============================upgrade settings=============================================
server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
upgrade_url = true;
pm.info("firmware version: " + lastVersion);
String tmp = "{}";
int case_of_update;
if (WiFi.status() != WL_CONNECTED) {
lastVersion = "nowifi";
}
/*
* Check
*/
server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
checkUpdatesFlag = true;
pm.info("firmware version: " + lastVersion);
if (!FLASH_4MB) {
lastVersion = "less";
} else if (isNetworkActive()) {
lastVersion = "nowifi";
}
if (lastVersion == FIRMWARE_VERSION) case_of_update = 1;
if (lastVersion != FIRMWARE_VERSION) case_of_update = 2;
if (lastVersion == "error") case_of_update = 3;
if (lastVersion == "") case_of_update = 4;
if (lastVersion == "less") case_of_update = 5;
if (lastVersion == "nowifi") case_of_update = 6;
if (lastVersion == "notsupported") case_of_update = 7;
switch (case_of_update) {
case 1: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Последняя версия прошивки уже установлена.");
jsonWriteStr(tmp, "class", "pop-up");
} break;
case 2: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Имеется новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/'; }, 120000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
jsonWriteStr(tmp, "class", "pop-up");
} break;
case 3: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Ошибка... Cервер не найден. Попробуйте позже...");
jsonWriteStr(tmp, "class", "pop-up");
} break;
case 4: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Нажмите на кнопку \"обновить прошивку\" повторно...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 5: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 6: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Устройство не подключено к роутеру...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 7: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление на новую версию возможно только через usb...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
String msg = "";
if (lastVersion == FIRMWARE_VERSION) {
msg = F("Актуальная версия прошивки уже установлена.");
} else if (lastVersion != FIRMWARE_VERSION) {
msg = F("Новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/'; }, 120000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
} else if (lastVersion == "error") {
msg = F("Cервер не найден. Попробуйте повторить позже...");
} else if (lastVersion == "") {
msg = F("Нажмите на кнопку \"обновить прошивку\" повторно...");
} else if (lastVersion == "less") {
msg = F("Обновление \"по воздуху\" не поддерживается!");
} else if (lastVersion == "nowifi") {
msg = F("Устройство не подключено к роутеру!");
} else if (lastVersion == "notsupported") {
msg = F("Обновление возможно только через usb!");
}
request->send(200, "text/text", tmp);
String tmp = "{}";
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + msg);
jsonWriteStr(tmp, "class", "pop-up");
request->send(200, "text/html", tmp);
});
/*
* Upgrade
*/
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest* request) {
upgrade = true;
String tmp = "{}";
request->send(200, "text/text", "ok");
updateFlag = true;
request->send(200, "text/html");
});
}

View File

@@ -16,7 +16,6 @@ bool loadWidget(const String& filename, String& buf) {
void createWidget(String widget, String page, String pageNumber, String filename, String topic) {
String buf = "{}";
if (!loadWidget(filename, buf)) {
pm.error("failed " + widget);
return;
}
widget.replace("#", " ");
@@ -34,7 +33,9 @@ void createWidget(String widget, String page, String pageNumber, String filename
#endif
}
void createWidgetParam(String widget, String page, String pageNumber, String filename, String topic, String name1, String param1, String name2, String param2, String name3, String param3) {
//TODO Вот эта процедура, и несколько оберток
void createWidgetParam(String widget, String page, String pageNumber, String filename, String topic,
String name1, String param1, String name2, String param2, String name3, String param3) {
String buf = "";
if (!loadWidget(filename, buf)) {
return;
@@ -59,7 +60,8 @@ void createWidgetParam(String widget, String page, String pageNumber, String fil
#endif
}
void createChart(String widget, String page, String pageNumber, String filename, String topic, String maxCount) {
void createChart(String widget, String page, String pageNumber, String filename, String topic,
String maxCount) {
String buf = "";
if (!loadWidget(filename, buf)) {
return;
@@ -83,11 +85,9 @@ void createChart(String widget, String page, String pageNumber, String filename,
}
void createWidgetByType(String widget, String page, String pageNumber, String type, String topic) {
pm.info("create" + type);
createWidget(widget, page, pageNumber, getWidgetFile(type), topic);
}
const String getWidgetFile(const String& name) {
pm.info("get " + name);
return "/widgets/" + name + ".json";
}

View File

@@ -1,7 +1,7 @@
#include "Global.h"
#include "HttpServer.h"
#include "Bus/BusScanner.h"
#include "Bus/BusScannerFactory.h"
#include "Utils/Timings.h"
void not_async_actions();
@@ -62,7 +62,7 @@ void setup() {
#ifdef UDP_ENABLED
pm.info("Broadcast UDP");
UDP_init();
udp_init();
#endif
ts.add(
TEST, 1000 * 60, [&](void*) {
@@ -114,7 +114,7 @@ void not_async_actions() {
getLastVersion();
flashUpgrade();
do_update();
#ifdef UDP_ENABLED
do_udp_data_parse();
@@ -122,8 +122,6 @@ void not_async_actions() {
#endif
do_scan_bus();
do_check_fs();
}
String getURL(const String& urls) {
@@ -140,42 +138,22 @@ String getURL(const String& urls) {
return res;
}
void safeDataToFile(String data, String Folder) {
String fileName;
fileName.toLowerCase();
fileName = deleteBeforeDelimiter(fileName, " ");
fileName.replace(" ", ".");
fileName.replace("..", ".");
fileName = Folder + "/" + fileName + ".txt";
jsonWriteStr(configLiveJson, "test", fileName);
}
void sendConfig(String topic, String widgetConfig, String key, String date) {
yield();
topic = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topic + "/status";
String outer = "{\"widgetConfig\":";
String inner = "{\"";
inner = inner + key;
inner = inner + "\":\"";
inner = inner + date;
inner = inner + "\"";
inner = inner + "}}";
String t = outer + inner;
yield();
}
void setChipId() {
chipId = getChipId();
Serial.println(chipId);
pm.info("id: " + chipId);
}
void saveConfig() {
writeFile(String("config.json"), configSetupJson);
}
void setConfigParam(const char* param, const String& value) {
pm.info("set " + String(param) + ": " + value);
jsonWriteStr(configSetupJson, param, value);
saveConfig();
}
#ifdef ESP8266
#ifdef LED_PIN
void setLedStatus(LedStatus_t status) {
pinMode(LED_PIN, OUTPUT);
switch (status) {
@@ -197,12 +175,25 @@ void setLedStatus(LedStatus_t status) {
break;
}
}
#endif
#endif
void do_fscheck(String& results) {
// TODO Проверка наличие важных файлов, возможно версии ФС
#else
void setLedStatus(LedStatus_t status) {
pinMode(LED_PIN, OUTPUT);
switch (status) {
case LED_OFF:
digitalWrite(LED_PIN, HIGH);
break;
case LED_ON:
digitalWrite(LED_PIN, LOW);
break;
case LED_SLOW:
break;
case LED_FAST:
break;
default:
break;
}
}
#endif
void clock_init() {
timeNow = new Clock();
@@ -215,21 +206,13 @@ void clock_init() {
},
nullptr, true);
}
void do_scan_bus() {
if (busScanFlag) {
String res = "";
BusScanner* scanner = BusScannerFactory::get(res, busToScan);
BusScanner* scanner = BusScannerFactory::get(configSetupJson, busToScan, res);
scanner->scan();
jsonWriteStr(configLiveJson, BusScannerFactory::label(busToScan), res);
jsonWriteStr(configLiveJson, String(scanner->tag()), res);
busScanFlag = false;
}
}
void do_check_fs() {
if (fsCheckFlag) {
String buf;
do_fscheck(buf);
jsonWriteStr(configLiveJson, "fscheck", buf);
fsCheckFlag = false;
}
}

View File

@@ -1,30 +1,33 @@
#include "Global.h"
static const char* MODULE = "Udp";
#ifdef ESP8266
IPAddress udp_multicastIP(255, 255, 255, 255);
ESP8266HTTPUpdateServer httpUpdater;
WiFiUDP Udp;
WiFiUDP udp;
#endif
#ifdef ESP32
IPAddress udp_multicastIP(239, 255, 255, 255);
AsyncUDP udp;
#endif
String received_ip;
String received_udp_line;
String remote_ip;
String received;
int udp_period;
boolean udp_busy = false;
unsigned int udp_port = 4210;
//TODO Помомему тут ошибка в define'ах
void handleUdp_esp32();
void add_dev_in_list(String fileName, String id, String dev_name, String ip);
#ifdef UDP_ENABLED
void UDP_init() {
void udp_init() {
removeFile("dev.csv");
addFile("dev.csv", "device id;device name;ip address");
#ifdef ESP8266
Udp.begin(udp_port);
udp.begin(udp_port);
#endif
handleUdp_esp32();
@@ -34,64 +37,68 @@ void UDP_init() {
ts.add(
UDP, udp_period, [&](void*) {
if (jsonReadStr(configSetupJson, "udponoff") == "1") {
if (WiFi.status() == WL_CONNECTED) {
if (!udp_busy) {
String line_to_send = "iotm;" + chipId + ";" + jsonReadStr(configSetupJson, "name");
if (jsonReadBool(configSetupJson, "udponoff") && isNetworkActive() && !udp_busy) {
pm.info("send info");
String payload = "iotm;";
payload += chipId;
payload += ";";
payload += jsonReadStr(configSetupJson, "name");
#ifdef ESP8266
Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP());
Udp.write(line_to_send.c_str());
Udp.endPacket();
udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP());
udp.write(payload.c_str());
udp.endPacket();
#endif
#ifdef ESP32
udp.broadcast(line_to_send.c_str());
udp.broadcast(line_to_send.c_str());
#endif
Serial.println("[UDP<=] dev info send");
}
}
}
},
nullptr, false);
}
bool isUdpEnabled() {
return jsonReadBool(configSetupJson, "udponoff") && isNetworkActive();
}
void loopUdp() {
#ifdef ESP8266
if (jsonReadStr(configSetupJson, "udponoff") == "1") {
if (WiFi.status() == WL_CONNECTED) {
int packetSize = Udp.parsePacket();
if (packetSize) {
char udp_incomingPacket[255];
Serial.printf("[UDP=>] Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
received_ip = Udp.remoteIP().toString();
int len = Udp.read(udp_incomingPacket, 255);
if (len > 0) {
udp_incomingPacket[len] = 0;
}
received_udp_line = String(udp_incomingPacket);
if (!isUdpEnabled()) {
return;
}
if (received_udp_line.indexOf("iotm;") >= 0) {
udp_data_parse = true;
}
if (received_udp_line.indexOf("mqttServer") >= 0) {
udp_data_parse = true;
}
}
}
int packetSize = udp.parsePacket();
if (!packetSize) {
return;
}
char udp_packet[255];
remote_ip = udp.remoteIP().toString();
pm.info(prettyBytes(packetSize) + " from " + remote_ip + ":" + udp.remotePort());
int len = udp.read(udp_packet, 255);
if (len) {
udp_packet[len] = '\x00';
}
received = String(udp_packet);
if (received.indexOf("iotm;") >= 0 || received.indexOf("mqttServer") >= 0) {
udp_data_parse = true;
}
#endif
;
}
void handleUdp_esp32() {
#ifdef ESP32
if (udp.listenMulticast(udp_multicastIP, udp_port)) {
udp.onPacket([](AsyncUDPPacket packet) {
received_udp_line = (char*)packet.data();
received_ip = packet.remoteIP().toString();
received = (char*)packet.data();
remote_ip = packet.remoteIP().toString();
if (jsonReadStr(configSetupJson, "udponoff") == "1") {
if (received_udp_line.indexOf("iotm;") >= 0) {
if (received.indexOf("iotm;") >= 0) {
udp_data_parse = true;
}
if (received_udp_line.indexOf("mqttServer") >= 0) {
if (received.indexOf("mqttServer") >= 0) {
udp_data_parse = true;
}
}
@@ -101,25 +108,23 @@ void handleUdp_esp32() {
}
void do_udp_data_parse() {
if (udp_data_parse) {
udp_data_parse = false;
Serial.print("[UDP=>] " + received_ip);
Serial.print(" ");
Serial.println(received_udp_line);
if (received_udp_line.indexOf("mqttServer") >= 0) {
jsonWriteStr(configSetupJson, "mqttServer", jsonReadStr(received_udp_line, "mqttServer"));
jsonWriteInt(configSetupJson, "mqttPort", jsonReadInt(received_udp_line, "mqttPort"));
jsonWriteStr(configSetupJson, "mqttPrefix", jsonReadStr(received_udp_line, "mqttPrefix"));
jsonWriteStr(configSetupJson, "mqttUser", jsonReadStr(received_udp_line, "mqttUser"));
jsonWriteStr(configSetupJson, "mqttPass", jsonReadStr(received_udp_line, "mqttPass"));
saveConfig();
Serial.println("[V] new mqtt setting received from udp and saved");
mqttParamsChanged = true;
}
if (received_udp_line.indexOf("iotm;") >= 0) {
add_dev_in_list("dev.csv", selectFromMarkerToMarker(received_udp_line, ";", 1), selectFromMarkerToMarker(received_udp_line, ";", 2), received_ip);
}
if (!udp_data_parse) {
return;
}
if (received.indexOf("mqttServer") >= 0) {
pm.info("received setting");
jsonWriteStr(configSetupJson, "mqttServer", jsonReadStr(received, "mqttServer"));
jsonWriteInt(configSetupJson, "mqttPort", jsonReadInt(received, "mqttPort"));
jsonWriteStr(configSetupJson, "mqttPrefix", jsonReadStr(received, "mqttPrefix"));
jsonWriteStr(configSetupJson, "mqttUser", jsonReadStr(received, "mqttUser"));
jsonWriteStr(configSetupJson, "mqttPass", jsonReadStr(received, "mqttPass"));
saveConfig();
mqttParamsChanged = true;
}
if (received.indexOf("iotm;") >= 0) {
add_dev_in_list("dev.csv", selectFromMarkerToMarker(received, ";", 1), selectFromMarkerToMarker(received, ";", 2), received);
}
udp_data_parse = false;
}
void add_dev_in_list(String filename, String id, String dev_name, String ip) {
@@ -130,28 +135,26 @@ void add_dev_in_list(String filename, String id, String dev_name, String ip) {
}
void send_mqtt_to_udp() {
if (jsonReadStr(configSetupJson, "udponoff") == "1") {
if (WiFi.status() == WL_CONNECTED) {
udp_busy = true;
String mqtt_data = "{}";
jsonWriteStr(mqtt_data, "mqttServer", jsonReadStr(configSetupJson, "mqttServer"));
jsonWriteInt(mqtt_data, "mqttPort", jsonReadInt(configSetupJson, "mqttPort"));
jsonWriteStr(mqtt_data, "mqttPrefix", jsonReadStr(configSetupJson, "mqttPrefix"));
jsonWriteStr(mqtt_data, "mqttUser", jsonReadStr(configSetupJson, "mqttUser"));
jsonWriteStr(mqtt_data, "mqttPass", jsonReadStr(configSetupJson, "mqttPass"));
Serial.println(mqtt_data);
if (!isUdpEnabled()) {
return;
}
udp_busy = true;
String data = "{}";
jsonWriteStr(data, "mqttServer", jsonReadStr(configSetupJson, "mqttServer"));
jsonWriteInt(data, "mqttPort", jsonReadInt(configSetupJson, "mqttPort"));
jsonWriteStr(data, "mqttPrefix", jsonReadStr(configSetupJson, "mqttPrefix"));
jsonWriteStr(data, "mqttUser", jsonReadStr(configSetupJson, "mqttUser"));
jsonWriteStr(data, "mqttPass", jsonReadStr(configSetupJson, "mqttPass"));
#ifdef ESP8266
Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP());
Udp.write(mqtt_data.c_str());
Udp.endPacket();
udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP());
udp.write(data.c_str());
udp.endPacket();
#endif
#ifdef ESP32
udp.broadcast(mqtt_data.c_str());
udp.broadcast(mqtt_data.c_str());
#endif
Serial.println("[UDP<=] mqtt info send");
udp_busy = false;
}
}
pm.info("sent info");
udp_busy = false;
}
void do_mqtt_send_settings_to_udp() {