mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 03:49:13 +03:00
попытка использовать альтнрнативный метод поиска
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
#include "Consts.h"
|
#include "Consts.h"
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
|
|
||||||
@@ -44,6 +45,11 @@ const String writeFile(const String& filename, const String& str);
|
|||||||
*/
|
*/
|
||||||
const String readFile(const String& filename, size_t max_size);
|
const String readFile(const String& filename, size_t max_size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Чтение файла в строку с записью его размера
|
||||||
|
*/
|
||||||
|
const String readFileSz(const String& filename, size_t max_size, size_t& size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Размер файла
|
* Размер файла
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ String deleteToMarkerLast(String str, String found);
|
|||||||
|
|
||||||
String selectFromMarkerToMarker(String str, String found, int number);
|
String selectFromMarkerToMarker(String str, String found, int number);
|
||||||
|
|
||||||
size_t itemsCount(String str, const String& separator);
|
size_t itemsCount2(String& str, const String& separator);
|
||||||
|
|
||||||
|
size_t itemsCount(String& str, const char* delim);
|
||||||
|
|
||||||
boolean isDigitStr(const String&);
|
boolean isDigitStr(const String&);
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class LoggingClass {
|
|||||||
~LoggingClass();
|
~LoggingClass();
|
||||||
|
|
||||||
void loop();
|
void loop();
|
||||||
void execute(String payload);
|
void execute(String keyOrValue);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -35,4 +35,5 @@ extern void logging();
|
|||||||
extern void loggingExecute();
|
extern void loggingExecute();
|
||||||
extern void choose_log_date_and_send();
|
extern void choose_log_date_and_send();
|
||||||
extern void sendLogData(String file, String topic);
|
extern void sendLogData(String file, String topic);
|
||||||
|
extern void sendLogData2(String file, String topic);
|
||||||
extern void cleanLogAndData();
|
extern void cleanLogAndData();
|
||||||
|
|||||||
@@ -8,13 +8,12 @@
|
|||||||
; Please visit documentation for the other options and examples
|
; Please visit documentation for the other options and examples
|
||||||
; https://docs.platformio.org/page/projectconf.html
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
;Please use one of definition:
|
;To choose board please use one of definition:
|
||||||
;esp8266_1mb , esp8266_4mb , esp32_4mb
|
;esp8266_1mb , esp8266_4mb , esp32_4mb
|
||||||
[platformio]
|
[platformio]
|
||||||
default_envs = esp8266_4mb
|
default_envs = esp8266_4mb
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[common_env_data]
|
[common_env_data]
|
||||||
lib_deps_external =
|
lib_deps_external =
|
||||||
bblanchon/ArduinoJson @5.*
|
bblanchon/ArduinoJson @5.*
|
||||||
|
|||||||
@@ -1,10 +1,16 @@
|
|||||||
#include "Tests.h"
|
#include "Tests.h"
|
||||||
#include "Macro.h"
|
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#include "ItemsList.h"
|
#include "ItemsList.h"
|
||||||
|
#include "Macro.h"
|
||||||
|
#include "Utils/StringUtils.h"
|
||||||
|
|
||||||
void testsPerform() {
|
void testsPerform() {
|
||||||
Serial.println("====some tests section====");
|
Serial.println("====some tests section====");
|
||||||
|
|
||||||
|
//String str = "Geeks for Geeks ";
|
||||||
|
//
|
||||||
|
//Serial.println(itemsCount2(str, " "));
|
||||||
|
|
||||||
Serial.println("==========end============");
|
Serial.println("==========end============");
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
#include "FileSystem.h"
|
|
||||||
|
|
||||||
#include "Utils/FileUtils.h"
|
#include "Utils/FileUtils.h"
|
||||||
#include "Utils\SerialPrint.h"
|
|
||||||
#include "Utils/StringUtils.h"
|
|
||||||
|
|
||||||
|
#include "FileSystem.h"
|
||||||
|
#include "Utils/StringUtils.h"
|
||||||
|
#include "Utils\SerialPrint.h"
|
||||||
|
|
||||||
const String filepath(const String& filename) {
|
const String filepath(const String& filename) {
|
||||||
return filename.startsWith("/") ? filename : "/" + filename;
|
return filename.startsWith("/") ? filename : "/" + filename;
|
||||||
@@ -22,10 +21,10 @@ void removeFile(const String& filename) {
|
|||||||
String path = filepath(filename);
|
String path = filepath(filename);
|
||||||
if (FileFS.exists(path)) {
|
if (FileFS.exists(path)) {
|
||||||
if (!FileFS.remove(path)) {
|
if (!FileFS.remove(path)) {
|
||||||
SerialPrint("I","Files","remove " + path);
|
SerialPrint("I", "Files", "remove " + path);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SerialPrint("E","Files","not exist" + path);
|
SerialPrint("E", "Files", "not exist" + path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,7 +32,7 @@ File seekFile(const String& filename, size_t position) {
|
|||||||
String path = filepath(filename);
|
String path = filepath(filename);
|
||||||
auto file = FileFS.open(path, "r");
|
auto file = FileFS.open(path, "r");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
SerialPrint("[E]","Files","open " + path);
|
SerialPrint("[E]", "Files", "open " + path);
|
||||||
}
|
}
|
||||||
// поставим курсор в начало файла
|
// поставим курсор в начало файла
|
||||||
file.seek(position, SeekSet);
|
file.seek(position, SeekSet);
|
||||||
@@ -79,14 +78,14 @@ const String addFile(const String& filename, const String& str) {
|
|||||||
bool copyFile(const String& src, const String& dst, bool overwrite) {
|
bool copyFile(const String& src, const String& dst, bool overwrite) {
|
||||||
String srcPath = filepath(src);
|
String srcPath = filepath(src);
|
||||||
String dstPath = filepath(dst);
|
String dstPath = filepath(dst);
|
||||||
SerialPrint("I","Files","copy " + srcPath + " to " + dstPath);
|
SerialPrint("I", "Files", "copy " + srcPath + " to " + dstPath);
|
||||||
if (!FileFS.exists(srcPath)) {
|
if (!FileFS.exists(srcPath)) {
|
||||||
SerialPrint("[E]","Files","not exist: " + srcPath);
|
SerialPrint("[E]", "Files", "not exist: " + srcPath);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (FileFS.exists(dstPath)) {
|
if (FileFS.exists(dstPath)) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
SerialPrint("[E]","Files","already exist: " + dstPath);
|
SerialPrint("[E]", "Files", "already exist: " + dstPath);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
FileFS.remove(dstPath);
|
FileFS.remove(dstPath);
|
||||||
@@ -131,6 +130,22 @@ const String readFile(const String& filename, size_t max_size) {
|
|||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const String readFileSz(const String& filename, size_t max_size, size_t& size) {
|
||||||
|
String path = filepath(filename);
|
||||||
|
auto file = FileFS.open(path, "r");
|
||||||
|
if (!file) {
|
||||||
|
return "failed";
|
||||||
|
}
|
||||||
|
size = file.size();
|
||||||
|
if (size > max_size) {
|
||||||
|
file.close();
|
||||||
|
return "large";
|
||||||
|
}
|
||||||
|
String temp = file.readString();
|
||||||
|
file.close();
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
const String getFileSize(const String filename) {
|
const String getFileSize(const String filename) {
|
||||||
String filepath(filename);
|
String filepath(filename);
|
||||||
auto file = FileFS.open(filepath, "r");
|
auto file = FileFS.open(filepath, "r");
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "Utils/StringUtils.h"
|
#include "Utils/StringUtils.h"
|
||||||
|
|
||||||
#include "Consts.h"
|
#include "Consts.h"
|
||||||
|
|
||||||
String selectToMarkerLast(String str, String found) {
|
String selectToMarkerLast(String str, String found) {
|
||||||
@@ -75,7 +76,7 @@ uint16_t hexStringToUint16(String hex) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t itemsCount(String str, const String& separator) {
|
size_t itemsCount2(String& str, const String& separator) {
|
||||||
// если строки поиск нет сразу выход
|
// если строки поиск нет сразу выход
|
||||||
if (str.indexOf(separator) == -1) {
|
if (str.indexOf(separator) == -1) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -91,6 +92,19 @@ size_t itemsCount(String str, const String& separator) {
|
|||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t itemsCount(String& str, const char* delim) {
|
||||||
|
size_t cnt = 0;
|
||||||
|
char* cstr = new char[str.length() + 1];
|
||||||
|
strcpy(cstr, str.c_str());
|
||||||
|
char* token;
|
||||||
|
while ((token = strtok_r(cstr, delim, &cstr))) {
|
||||||
|
cnt++;
|
||||||
|
//printf("%s\n", token);
|
||||||
|
}
|
||||||
|
delete[] cstr;
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
boolean isDigitStr(const String& str) {
|
boolean isDigitStr(const String& str) {
|
||||||
for (size_t i = 0; i < str.length(); i++) {
|
for (size_t i = 0; i < str.length(); i++) {
|
||||||
if (!isDigit(str.charAt(i))) {
|
if (!isDigit(str.charAt(i))) {
|
||||||
@@ -110,6 +124,3 @@ String prettyBytes(size_t size) {
|
|||||||
else
|
else
|
||||||
return String(size / 1024.0 / 1024.0 / 1024.0) + "GB";
|
return String(size / 1024.0 / 1024.0 / 1024.0) + "GB";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ void LoggingClass::execute(String keyOrValue) {
|
|||||||
} else {
|
} else {
|
||||||
SerialPrint("E", "Logging", "This value not found on this device");
|
SerialPrint("E", "Logging", "This value not found on this device");
|
||||||
}
|
}
|
||||||
} else { //прилетело из события
|
} else { //прилетело из события
|
||||||
if (isDigitStr(keyOrValue) || keyOrValue.indexOf(".") != -1) { //если это число или дробное число
|
if (isDigitStr(keyOrValue) || keyOrValue.indexOf(".") != -1) { //если это число или дробное число
|
||||||
loggingValue = keyOrValue;
|
loggingValue = keyOrValue;
|
||||||
} else { //если это ключ
|
} else { //если это ключ
|
||||||
@@ -49,22 +49,33 @@ void LoggingClass::execute(String keyOrValue) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String filename = "logs/" + _key + ".txt";
|
String filename = "logs/" + _key + ".txt";
|
||||||
String logData = readFile(filename, 5120);
|
|
||||||
|
|
||||||
size_t lines_cnt = itemsCount(logData, "\r\n");
|
size_t sz = 0;
|
||||||
|
|
||||||
SerialPrint("I", "Logging", "http://" + WiFi.localIP().toString() + "/" + filename + " (" + String(lines_cnt, DEC) + ")");
|
String logData = readFileSz(filename, 10240, sz);
|
||||||
|
|
||||||
|
size_t lines_cnt = itemsCount2(logData, "\r\n");
|
||||||
|
|
||||||
|
SerialPrint("I", "Logging", "http://" + WiFi.localIP().toString() + "/" + filename + " lines " + String(lines_cnt, DEC) + ", size " + String(sz) + ", heap " + ESP.getFreeHeap());
|
||||||
|
|
||||||
|
if (logData == "large") {
|
||||||
|
SerialPrint("E", "Logging", "File is very large");
|
||||||
|
}
|
||||||
|
|
||||||
if ((lines_cnt > _maxPoints + 1) || !lines_cnt) {
|
if ((lines_cnt > _maxPoints + 1) || !lines_cnt) {
|
||||||
removeFile(filename);
|
removeFile(filename);
|
||||||
lines_cnt = 0;
|
lines_cnt = 0;
|
||||||
|
SerialPrint("E", "Logging", "file been remooved: " + filename + " " + String(lines_cnt) + ">" + String(_maxPoints));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loggingValue != "") {
|
if (loggingValue != "") {
|
||||||
if (lines_cnt > _maxPoints) { //удаляем старую строку и добавляем новую
|
if (lines_cnt > _maxPoints) { //удаляем старую строку и добавляем новую
|
||||||
|
//for (int i = 0; i < 5; i++) {
|
||||||
logData = deleteBeforeDelimiter(logData, "\r\n");
|
logData = deleteBeforeDelimiter(logData, "\r\n");
|
||||||
|
//}
|
||||||
if (timeNow->hasTimeSynced()) {
|
if (timeNow->hasTimeSynced()) {
|
||||||
logData += timeNow->getTimeUnix() + " " + loggingValue + "\r\n";
|
logData += timeNow->getTimeUnix() + " " + loggingValue + "\r\n";
|
||||||
|
|
||||||
writeFile(filename, logData);
|
writeFile(filename, logData);
|
||||||
}
|
}
|
||||||
} else { //просто добавляем новую строку
|
} else { //просто добавляем новую строку
|
||||||
@@ -73,6 +84,7 @@ void LoggingClass::execute(String keyOrValue) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String buf = "{}";
|
String buf = "{}";
|
||||||
jsonWriteInt(buf, "x", timeNow->getTimeUnix().toInt());
|
jsonWriteInt(buf, "x", timeNow->getTimeUnix().toInt());
|
||||||
jsonWriteFloat(buf, "y1", loggingValue.toFloat());
|
jsonWriteFloat(buf, "y1", loggingValue.toFloat());
|
||||||
@@ -123,7 +135,7 @@ void choose_log_date_and_send() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendLogData(String file, String topic) {
|
void sendLogData2(String file, String topic) {
|
||||||
String log_date = readFile(file, 5120);
|
String log_date = readFile(file, 5120);
|
||||||
if (log_date != "failed") {
|
if (log_date != "failed") {
|
||||||
log_date.replace("\r\n", "\n");
|
log_date.replace("\r\n", "\n");
|
||||||
@@ -156,6 +168,46 @@ void sendLogData(String file, String topic) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sendLogData(String file, String topic) {
|
||||||
|
File configFile = FileFS.open(file, "r");
|
||||||
|
if (!configFile) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
configFile.seek(0, SeekSet);
|
||||||
|
int i = 0;
|
||||||
|
String buf = "{}";
|
||||||
|
String json_array;
|
||||||
|
String unix_time;
|
||||||
|
String value;
|
||||||
|
unsigned int psn;
|
||||||
|
unsigned int sz = configFile.size();
|
||||||
|
do {
|
||||||
|
i++;
|
||||||
|
psn = configFile.position();
|
||||||
|
String line = configFile.readStringUntil('\n');
|
||||||
|
unix_time = selectToMarker(line, " ");
|
||||||
|
jsonWriteInt(buf, "x", unix_time.toInt());
|
||||||
|
value = deleteBeforeDelimiter(line, " ");
|
||||||
|
jsonWriteFloat(buf, "y1", value.toFloat());
|
||||||
|
if (unix_time != "" || value != "") {
|
||||||
|
json_array += buf + ",";
|
||||||
|
}
|
||||||
|
if (i >= 100) {
|
||||||
|
json_array = "{\"status\":[" + json_array + "]}";
|
||||||
|
json_array.replace("},]}", "}]}");
|
||||||
|
publishChart(topic, json_array);
|
||||||
|
json_array = "";
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
} while (psn < sz);
|
||||||
|
|
||||||
|
configFile.close();
|
||||||
|
|
||||||
|
json_array = "{\"status\":[" + json_array + "]}";
|
||||||
|
json_array.replace("},]}", "}]}");
|
||||||
|
publishChart(topic, json_array);
|
||||||
|
}
|
||||||
|
|
||||||
void cleanLogAndData() {
|
void cleanLogAndData() {
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
auto dir = FileFS.openDir("logs");
|
auto dir = FileFS.openDir("logs");
|
||||||
|
|||||||
Reference in New Issue
Block a user