32 broken

This commit is contained in:
Yuri Trikoz
2020-06-22 03:11:02 +03:00
parent 40688130fd
commit 092bec7dde
34 changed files with 1308 additions and 341 deletions

View File

@@ -1,18 +1,15 @@
#include "Utils/FileUtils.h"
#include "Utils/PrintMessage.h"
static const char* MODULE = "FS";
void printError(const String str) {
Serial.printf("[E] [%s] %s\n", MODULE, str.c_str());
}
const String filepath(const String& filename) {
return filename.startsWith("/") ? filename : "/" + filename;
}
bool fileSystemInit() {
if (!LittleFS.begin()) {
printError("init");
pm.error("init");
return false;
}
return true;
@@ -20,14 +17,14 @@ bool fileSystemInit() {
void removeFile(const String filename) {
if (!LittleFS.remove(filepath(filename))) {
printError("remove " + filename);
pm.error("remove " + filename);
}
}
File seekFile(const String filename, size_t position) {
auto file = LittleFS.open(filepath(filename), "r");
if (!file) {
printError("open " + filename);
pm.error("open " + filename);
}
// поставим курсор в начало файла
file.seek(position, SeekSet);

View File

@@ -61,7 +61,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;
@@ -77,7 +77,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;
@@ -96,3 +96,27 @@ String prettyBytes(size_t size) {
else
return String(size / 1024.0 / 1024.0 / 1024.0) + "GB";
}
static const char *str_info = "I";
static const char *str_warn = "W";
static const char *str_error = "E";
static const char *str_unknown = "?";
String getErrorLevelStr(ErrorLevel_t level) {
const char *ptr;
switch (level) {
case EL_INFO:
ptr = str_info;
break;
case EL_WARNING:
ptr = str_warn;
break;
case EL_ERROR:
ptr = str_error;
break;
default:
ptr = str_unknown;
break;
}
return String(ptr);
}

View File

@@ -3,54 +3,33 @@
#include "Global.h"
#include "Utils\StringUtils.h"
void Time_Init() {
ts.add(
TIME_SYNC, 30000, [&](void*) {
time_check();
},
nullptr, true);
#define ONE_MINUTE_s 60
#define ONE_HOUR_s 60 * ONE_MINUTE_s
int getBiasInSeconds() {
return 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
}
void time_check() {
if (getTimeUnix() == "failed") {
Serial.println("[I] Trying to obtain time");
reconfigTime();
}
int getBiasInMinutes() {
return getBiasInSeconds() / 60;
}
void reconfigTime() {
if (WiFi.status() == WL_CONNECTED) {
String ntp = jsonReadStr(configSetupJson, "ntp");
configTime(0, 0, ntp.c_str());
Serial.println("[I] Time sync");
#ifdef ESP32
uint8_t i = 0;
struct tm timeinfo;
while (!getLocalTime(&timeinfo) && i <= 4) {
Serial.print(".");
i++;
delay(1000);
}
#endif
#ifdef ESP8266
//uint8_t i = 0;
//while (!time(nullptr) && i < 4) {
// Serial.print(".");
// i++;
delay(2000);
//}
#endif
if (getTimeUnix() != "failed") {
Serial.print("[V] Got time = ");
Serial.print(getDateDigitalFormated());
Serial.print(' ');
Serial.println(getTime());
} else {
Serial.println("[E] Failed to obtain time, retry in 30 sec");
}
} else {
Serial.println("[E] Unable to obtain time");
}
const timezone getTimeZone() {
return timezone{getBiasInMinutes(), 0};
}
time_t getSystemTime() {
timeval tv{0, 0};
timezone tz = getTimeZone();
time_t epoch = 0;
if (gettimeofday(&tv, &tz) != -1)
epoch = tv.tv_sec;
return epoch;
}
bool hasTimeSynced() {
time_t now = time(nullptr);
return now > millis();
}
String getTimeUnix() {
@@ -69,7 +48,7 @@ boolean getUnixTimeStr(String& res) {
}
String getTime() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
time_t now = time(nullptr);
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
now = now + zone;
String Time = ""; // Строка для результатов времени
@@ -80,7 +59,7 @@ String getTime() {
}
String getTimeWOsec() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
time_t now = time(nullptr);
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
now = now + zone;
String Time = ""; // Строка для результатов времени
@@ -91,7 +70,7 @@ String getTimeWOsec() {
}
String getDate() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
time_t now = time(nullptr);
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
now = now + zone;
String Data = ""; // Строка для результатов времени
@@ -142,11 +121,11 @@ int timeToMin(String Time) {
return min;
}
static const char* TIME_FORMAT PROGMEM = "%2d:%2d:%2d";
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %2d:%2d";
static const char* TIME_FORMAT PROGMEM = "%02d:%02d:%02d";
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d";
const String prettyMillis(unsigned long time_ms) {
unsigned long tmp = time_ms;
unsigned long tmp = time_ms / 1000;
unsigned long seconds;
unsigned long minutes;
unsigned long hours;
@@ -156,15 +135,137 @@ const String prettyMillis(unsigned long time_ms) {
minutes = tmp % 60;
tmp = tmp / 60;
hours = tmp % 24;
days = tmp / 24;
char buf[16];
char buf[32];
if (days) {
sprintf_P(buf, TIME_FORMAT, hours, minutes, seconds);
sprintf_P(buf, TIME_FORMAT_WITH_DAYS, days, hours, minutes, seconds);
} else {
sprintf_P(buf, TIME_FORMAT_WITH_DAYS, days, hours, minutes);
sprintf_P(buf, TIME_FORMAT, hours, minutes, seconds);
}
return String(buf);
}
int timeZoneInSeconds(const byte timeZone) {
int res = 0;
switch (constrain(timeZone, 1, 38)) {
case 1:
res = -12 * ONE_HOUR_s;
break;
case 2:
res = -11 * ONE_HOUR_s;
break;
case 3:
res = -10 * ONE_HOUR_s;
break;
case 4:
res = -9 * ONE_HOUR_s - 30 * ONE_MINUTE_s;
break;
case 5:
res = -9 * ONE_HOUR_s;
break;
case 6:
res = -8 * ONE_HOUR_s;
break;
case 7:
res = -7 * ONE_HOUR_s;
break;
case 8:
res = -6 * ONE_HOUR_s;
break;
case 9:
res = -5 * ONE_HOUR_s;
break;
case 10:
res = -4 * ONE_HOUR_s;
break;
case 11:
res = -3 * ONE_HOUR_s - 30 * ONE_MINUTE_s;
break;
case 12:
res = -3 * ONE_HOUR_s;
break;
case 13:
res = -2 * ONE_HOUR_s;
break;
case 14:
res = -1 * ONE_HOUR_s;
break;
case 15:
res = 0;
break;
case 16:
res = 1 * ONE_HOUR_s;
break;
case 17:
res = 2 * ONE_HOUR_s;
break;
case 18:
res = 3 * ONE_HOUR_s;
break;
case 19:
res = 3 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
break;
case 20:
res = 4 * ONE_HOUR_s;
break;
case 21:
res = 4 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
break;
case 22:
res = 5 * ONE_HOUR_s;
break;
case 23:
res = 5 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
break;
case 24:
res = 5 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
break;
case 25:
res = 6 * ONE_HOUR_s;
break;
case 26:
res = 6 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
break;
case 27:
res = 7 * ONE_HOUR_s;
break;
case 28:
res = 8 * ONE_HOUR_s;
break;
case 29:
res = 8 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
break;
case 30:
res = 9 * ONE_HOUR_s;
break;
case 31:
res = 9 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
break;
case 32:
res = 10 * ONE_HOUR_s;
break;
case 33:
res = 10 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
break;
case 34:
res = 11 * ONE_HOUR_s;
break;
case 35:
res = 12 * ONE_HOUR_s;
break;
case 36:
res = 12 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
break;
case 37:
res = 13 * ONE_HOUR_s;
break;
case 38:
res = 14 * ONE_HOUR_s;
break;
}
return res;
}

108
src/Utils/WiFiUtils.cpp Normal file
View File

@@ -0,0 +1,108 @@
#include "Utils/WiFiUtils.h"
static const char* MODULE = "WiFi";
void startSTAMode() {
setLedStatus(LED_SLOW);
pm.info("STA Mode");
String ssid = jsonReadStr(configSetupJson, "routerssid");
String passwd = jsonReadStr(configSetupJson, "routerpass");
WiFi.mode(WIFI_STA);
if (ssid == "" && passwd == "") {
WiFi.begin();
} else {
if (WiFi.begin(ssid.c_str(), passwd.c_str()) == WL_CONNECT_FAILED) {
pm.error("failed on start");
}
}
bool keepConnecting = true;
uint8_t tries = 20;
do {
sint8_t connRes = WiFi.waitForConnectResult(1000);
switch (connRes) {
case WL_NO_SSID_AVAIL: {
pm.error("No ssid available");
keepConnecting = false;
} break;
case WL_CONNECTED: {
String hostIpStr = WiFi.localIP().toString();
pm.info("http://" + hostIpStr);
jsonWriteStr(configSetupJson, "ip", hostIpStr);
keepConnecting = false;
} break;
case WL_CONNECT_FAILED: {
pm.error("Check credentials");
jsonWriteInt(configOptionJson, "pass_status", 1);
keepConnecting = false;
} break;
default:
break;
}
} while (keepConnecting && tries--);
if (WiFi.status() == WL_CONNECTED) {
MQTT_init();
setLedStatus(LED_OFF);
} else {
startAPMode();
};
}
bool startAPMode() {
setLedStatus(LED_ON);
pm.info("AP Mode");
String ssid = jsonReadStr(configSetupJson, "apssid");
String passwd = jsonReadStr(configSetupJson, "appass");
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid.c_str(), passwd.c_str());
String hostIpStr = WiFi.softAPIP().toString();
pm.info("Host IP: " + hostIpStr);
jsonWriteStr(configSetupJson, "ip", hostIpStr);
ts.add(
WIFI_SCAN, 10 * 1000,
[&](void*) {
String sta_ssid = jsonReadStr(configSetupJson, "routerssid");
pm.info("scanning for " + sta_ssid);
if (scanWiFi(sta_ssid)) {
ts.remove(WIFI_SCAN);
startSTAMode();
}
},
nullptr, true);
return true;
}
boolean scanWiFi(String ssid) {
bool res = false;
int8_t n = WiFi.scanComplete();
pm.info("scan result: " + String(n, DEC));
if (n == -2) {
// не было запущено, запускаем
pm.info("start scanning");
// async, show_hidden
WiFi.scanNetworks(true, false);
} else if (n == -1) {
// все еще выполняется
pm.info("scanning in progress");
} else if (n == 0) {
// не найдена ни одна сеть
pm.info("no networks found");
WiFi.scanNetworks(true, false);
} else if (n > 0) {
for (int8_t i = 0; i < n; i++) {
if (WiFi.SSID(i) == ssid) {
res = true;
}
pm.info((res ? "*" : "") + String(i, DEC) + ") " + WiFi.SSID(i));
}
}
return res;
}