mirror of
https://github.com/jomjol/AI-on-the-edge-device.git
synced 2025-12-10 05:26:52 +03:00
@@ -84,7 +84,7 @@ static esp_err_t favicon_get_handler(httpd_req_t *req)
|
|||||||
* a list of all files and folders under the requested path.
|
* a list of all files and folders under the requested path.
|
||||||
* In case of SPIFFS this returns empty list when path is any
|
* In case of SPIFFS this returns empty list when path is any
|
||||||
* string other than '/', since SPIFFS doesn't support directories */
|
* string other than '/', since SPIFFS doesn't support directories */
|
||||||
static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath)
|
static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath, const char* uripath, bool readonly)
|
||||||
{
|
{
|
||||||
char entrypath[FILE_PATH_MAX];
|
char entrypath[FILE_PATH_MAX];
|
||||||
char entrysize[16];
|
char entrysize[16];
|
||||||
@@ -120,7 +120,7 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath)
|
|||||||
httpd_resp_sendstr_chunk(req, "<!DOCTYPE html><html><body>");
|
httpd_resp_sendstr_chunk(req, "<!DOCTYPE html><html><body>");
|
||||||
|
|
||||||
/////////////////////////////////////////////////
|
/////////////////////////////////////////////////
|
||||||
|
if (!readonly) {
|
||||||
FILE *fd = fopen("/sdcard/html/upload_script.html", "r");
|
FILE *fd = fopen("/sdcard/html/upload_script.html", "r");
|
||||||
char *chunk = ((struct file_server_data *)req->user_ctx)->scratch;
|
char *chunk = ((struct file_server_data *)req->user_ctx)->scratch;
|
||||||
size_t chunksize;
|
size_t chunksize;
|
||||||
@@ -137,7 +137,7 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath)
|
|||||||
} while (chunksize != 0);
|
} while (chunksize != 0);
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
// ESP_LOGI(TAG, "File sending complete");
|
// ESP_LOGI(TAG, "File sending complete");
|
||||||
|
}
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
std::string _zw = std::string(dirpath);
|
std::string _zw = std::string(dirpath);
|
||||||
@@ -149,12 +149,16 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath)
|
|||||||
httpd_resp_sendstr_chunk(req,
|
httpd_resp_sendstr_chunk(req,
|
||||||
"<table class=\"fixed\" border=\"1\">"
|
"<table class=\"fixed\" border=\"1\">"
|
||||||
"<col width=\"800px\" /><col width=\"300px\" /><col width=\"300px\" /><col width=\"100px\" />"
|
"<col width=\"800px\" /><col width=\"300px\" /><col width=\"300px\" /><col width=\"100px\" />"
|
||||||
"<thead><tr><th>Name</th><th>Type</th><th>Size (Bytes)</th><th>Delete<br>"
|
"<thead><tr><th>Name</th><th>Type</th><th>Size (Bytes)</th>");
|
||||||
|
if (!readonly) {
|
||||||
|
httpd_resp_sendstr_chunk(req, "<th>Delete<br>"
|
||||||
"<form method=\"post\" action=\"");
|
"<form method=\"post\" action=\"");
|
||||||
httpd_resp_sendstr_chunk(req, _zw.c_str());
|
httpd_resp_sendstr_chunk(req, _zw.c_str());
|
||||||
httpd_resp_sendstr_chunk(req,
|
httpd_resp_sendstr_chunk(req,
|
||||||
"\"><button type=\"submit\">DELETE ALL!</button></form>"
|
"\"><button type=\"submit\">DELETE ALL!</button></form>"
|
||||||
"</th></tr></thead><tbody>\n");
|
"</th></tr>");
|
||||||
|
}
|
||||||
|
httpd_resp_sendstr_chunk(req, "</thead><tbody>\n");
|
||||||
|
|
||||||
/* Iterate over all files / folders and fetch their names and sizes */
|
/* Iterate over all files / folders and fetch their names and sizes */
|
||||||
while ((entry = readdir(dir)) != NULL) {
|
while ((entry = readdir(dir)) != NULL) {
|
||||||
@@ -173,7 +177,8 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath)
|
|||||||
|
|
||||||
/* Send chunk of HTML file containing table entries with file name and size */
|
/* Send chunk of HTML file containing table entries with file name and size */
|
||||||
httpd_resp_sendstr_chunk(req, "<tr><td><a href=\"");
|
httpd_resp_sendstr_chunk(req, "<tr><td><a href=\"");
|
||||||
httpd_resp_sendstr_chunk(req, req->uri);
|
httpd_resp_sendstr_chunk(req, "/fileserver");
|
||||||
|
httpd_resp_sendstr_chunk(req, uripath);
|
||||||
httpd_resp_sendstr_chunk(req, entry->d_name);
|
httpd_resp_sendstr_chunk(req, entry->d_name);
|
||||||
if (entry->d_type == DT_DIR) {
|
if (entry->d_type == DT_DIR) {
|
||||||
httpd_resp_sendstr_chunk(req, "/");
|
httpd_resp_sendstr_chunk(req, "/");
|
||||||
@@ -184,11 +189,13 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath)
|
|||||||
httpd_resp_sendstr_chunk(req, entrytype);
|
httpd_resp_sendstr_chunk(req, entrytype);
|
||||||
httpd_resp_sendstr_chunk(req, "</td><td>");
|
httpd_resp_sendstr_chunk(req, "</td><td>");
|
||||||
httpd_resp_sendstr_chunk(req, entrysize);
|
httpd_resp_sendstr_chunk(req, entrysize);
|
||||||
|
if (!readonly) {
|
||||||
httpd_resp_sendstr_chunk(req, "</td><td>");
|
httpd_resp_sendstr_chunk(req, "</td><td>");
|
||||||
httpd_resp_sendstr_chunk(req, "<form method=\"post\" action=\"/delete");
|
httpd_resp_sendstr_chunk(req, "<form method=\"post\" action=\"/delete");
|
||||||
httpd_resp_sendstr_chunk(req, req->uri + strlen("/fileserver"));
|
httpd_resp_sendstr_chunk(req, uripath);
|
||||||
httpd_resp_sendstr_chunk(req, entry->d_name);
|
httpd_resp_sendstr_chunk(req, entry->d_name);
|
||||||
httpd_resp_sendstr_chunk(req, "\"><button type=\"submit\">Delete</button></form>");
|
httpd_resp_sendstr_chunk(req, "\"><button type=\"submit\">Delete</button></form>");
|
||||||
|
}
|
||||||
httpd_resp_sendstr_chunk(req, "</td></tr>\n");
|
httpd_resp_sendstr_chunk(req, "</td></tr>\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -226,6 +233,7 @@ static esp_err_t download_get_handler(httpd_req_t *req)
|
|||||||
// filename = get_path_from_uri(filepath, ((struct file_server_data *)req->user_ctx)->base_path,
|
// filename = get_path_from_uri(filepath, ((struct file_server_data *)req->user_ctx)->base_path,
|
||||||
// req->uri, sizeof(filepath));
|
// req->uri, sizeof(filepath));
|
||||||
|
|
||||||
|
|
||||||
if (!filename) {
|
if (!filename) {
|
||||||
ESP_LOGE(TAG, "Filename is too long");
|
ESP_LOGE(TAG, "Filename is too long");
|
||||||
/* Respond with 500 Internal Server Error */
|
/* Respond with 500 Internal Server Error */
|
||||||
@@ -235,7 +243,22 @@ static esp_err_t download_get_handler(httpd_req_t *req)
|
|||||||
|
|
||||||
/* If name has trailing '/', respond with directory contents */
|
/* If name has trailing '/', respond with directory contents */
|
||||||
if (filename[strlen(filename) - 1] == '/') {
|
if (filename[strlen(filename) - 1] == '/') {
|
||||||
return http_resp_dir_html(req, filepath);
|
bool readonly = false;
|
||||||
|
size_t buf_len = httpd_req_get_url_query_len(req) + 1;
|
||||||
|
if (buf_len > 1) {
|
||||||
|
char buf[buf_len];
|
||||||
|
if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) {
|
||||||
|
ESP_LOGI(TAG, "Found URL query => %s", buf);
|
||||||
|
char param[32];
|
||||||
|
/* Get value of expected key from query string */
|
||||||
|
if (httpd_query_key_value(buf, "readonly", param, sizeof(param)) == ESP_OK) {
|
||||||
|
ESP_LOGI(TAG, "Found URL query parameter => readonly=%s", param);
|
||||||
|
readonly = param && strcmp(param,"true")==0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return http_resp_dir_html(req, filepath, filename, readonly);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string testwlan = toUpper(std::string(filename));
|
std::string testwlan = toUpper(std::string(filename));
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
#define LOGFILE_TIME_FORMAT "%Y%m%d-%H%M%S"
|
||||||
|
#define LOGFILE_TIME_FORMAT_DATE_EXTR substr(0, 8)
|
||||||
|
#define LOGFILE_TIME_FORMAT_HOUR_EXTR substr(9, 2)
|
||||||
|
|
||||||
struct HTMLInfo
|
struct HTMLInfo
|
||||||
{
|
{
|
||||||
float val;
|
float val;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sstream>
|
#include <sys/types.h>
|
||||||
|
|
||||||
// #define OHNETFLITE
|
// #define OHNETFLITE
|
||||||
|
|
||||||
@@ -12,25 +12,23 @@
|
|||||||
|
|
||||||
#include "ClassLogFile.h"
|
#include "ClassLogFile.h"
|
||||||
|
|
||||||
|
static const char* TAG = "flow_analog";
|
||||||
|
|
||||||
bool debugdetailanalog = false;
|
bool debugdetailanalog = false;
|
||||||
|
|
||||||
ClassFlowAnalog::ClassFlowAnalog()
|
ClassFlowAnalog::ClassFlowAnalog() : ClassFlowImage(TAG)
|
||||||
{
|
{
|
||||||
isLogImage = false;
|
|
||||||
string cnnmodelfile = "";
|
string cnnmodelfile = "";
|
||||||
modelxsize = 1;
|
modelxsize = 1;
|
||||||
modelysize = 1;
|
modelysize = 1;
|
||||||
ListFlowControll = NULL;
|
ListFlowControll = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassFlowAnalog::ClassFlowAnalog(std::vector<ClassFlow*>* lfc)
|
ClassFlowAnalog::ClassFlowAnalog(std::vector<ClassFlow*>* lfc) : ClassFlowImage(lfc, TAG)
|
||||||
{
|
{
|
||||||
isLogImage = false;
|
|
||||||
string cnnmodelfile = "";
|
string cnnmodelfile = "";
|
||||||
modelxsize = 1;
|
modelxsize = 1;
|
||||||
modelysize = 1;
|
modelysize = 1;
|
||||||
ListFlowControll = NULL;
|
|
||||||
ListFlowControll = lfc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -90,8 +88,12 @@ bool ClassFlowAnalog::ReadParameter(FILE* pfile, string& aktparamgraph)
|
|||||||
zerlegt = this->ZerlegeZeile(aktparamgraph);
|
zerlegt = this->ZerlegeZeile(aktparamgraph);
|
||||||
if ((zerlegt[0] == "LogImageLocation") && (zerlegt.size() > 1))
|
if ((zerlegt[0] == "LogImageLocation") && (zerlegt.size() > 1))
|
||||||
{
|
{
|
||||||
|
this->LogImageLocation = "/sdcard" + zerlegt[1];
|
||||||
this->isLogImage = true;
|
this->isLogImage = true;
|
||||||
this->LogImageLocation = zerlegt[1];
|
}
|
||||||
|
if ((toUpper(zerlegt[0]) == "LOGFILERETENTIONINDAYS") && (zerlegt.size() > 1))
|
||||||
|
{
|
||||||
|
this->logfileRetentionInDays = std::stoi(zerlegt[1]);
|
||||||
}
|
}
|
||||||
if ((zerlegt[0] == "Model") && (zerlegt.size() > 1))
|
if ((zerlegt[0] == "Model") && (zerlegt.size() > 1))
|
||||||
{
|
{
|
||||||
@@ -153,6 +155,8 @@ bool ClassFlowAnalog::doFlow(string time)
|
|||||||
|
|
||||||
doNeuralNetwork(time);
|
doNeuralNetwork(time);
|
||||||
|
|
||||||
|
RemoveOldLogs();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,10 +237,11 @@ bool ClassFlowAnalog::doAlignAndCut(string time)
|
|||||||
|
|
||||||
bool ClassFlowAnalog::doNeuralNetwork(string time)
|
bool ClassFlowAnalog::doNeuralNetwork(string time)
|
||||||
{
|
{
|
||||||
|
string logPath = CreateLogFolder(time);
|
||||||
|
|
||||||
string input = "/sdcard/img_tmp/alg.jpg";
|
string input = "/sdcard/img_tmp/alg.jpg";
|
||||||
string ioresize = "/sdcard/img_tmp/resize.bmp";
|
string ioresize = "/sdcard/img_tmp/resize.bmp";
|
||||||
string output;
|
string output;
|
||||||
string nm;
|
|
||||||
input = FormatFileName(input);
|
input = FormatFileName(input);
|
||||||
|
|
||||||
#ifndef OHNETFLITE
|
#ifndef OHNETFLITE
|
||||||
@@ -275,19 +280,7 @@ bool ClassFlowAnalog::doNeuralNetwork(string time)
|
|||||||
|
|
||||||
printf("Result Analog%i: %f\n", i, ROI[i]->result);
|
printf("Result Analog%i: %f\n", i, ROI[i]->result);
|
||||||
|
|
||||||
if (isLogImage)
|
LogImage(logPath, ROI[i]->name, &ROI[i]->result, NULL, time);
|
||||||
{
|
|
||||||
std::stringstream stream;
|
|
||||||
stream << std::fixed << std::setprecision(1) << ROI[i]->result;
|
|
||||||
std::string s = stream.str();
|
|
||||||
// std::snprintf(&s[0], s.size(), "%.2f", pi);
|
|
||||||
nm = "/sdcard" + LogImageLocation + "/" + s + "_" + ROI[i]->name + "_" + time + ".jpg";
|
|
||||||
nm = FormatFileName(nm);
|
|
||||||
output = "/sdcard/img_tmp/" + ROI[i]->name + ".jpg";
|
|
||||||
output = FormatFileName(output);
|
|
||||||
printf("Analog - save to file: %s\n", nm.c_str());
|
|
||||||
CopyFile(output, nm);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#ifndef OHNETFLITE
|
#ifndef OHNETFLITE
|
||||||
delete tflite;
|
delete tflite;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "ClassFlow.h"
|
#include "ClassFlowImage.h"
|
||||||
// #include "CTfLiteClass.h"
|
// #include "CTfLiteClass.h"
|
||||||
|
|
||||||
struct roianalog {
|
struct roianalog {
|
||||||
@@ -10,11 +10,9 @@ struct roianalog {
|
|||||||
|
|
||||||
|
|
||||||
class ClassFlowAnalog :
|
class ClassFlowAnalog :
|
||||||
public ClassFlow
|
public ClassFlowImage
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
string LogImageLocation;
|
|
||||||
bool isLogImage;
|
|
||||||
std::vector<roianalog*> ROI;
|
std::vector<roianalog*> ROI;
|
||||||
string cnnmodelfile;
|
string cnnmodelfile;
|
||||||
int modelxsize, modelysize;
|
int modelxsize, modelysize;
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
#include "ClassFlowControll.h"
|
#include "ClassFlowControll.h"
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <dirent.h>
|
||||||
#include "ClassLogFile.h"
|
#include "ClassLogFile.h"
|
||||||
#include "time_sntp.h"
|
#include "time_sntp.h"
|
||||||
#include "Helper.h"
|
#include "Helper.h"
|
||||||
#include "server_ota.h"
|
#include "server_ota.h"
|
||||||
|
|
||||||
|
static const char* TAG = "flow_controll";
|
||||||
|
|
||||||
std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _host){
|
std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _host){
|
||||||
std::string _classname = "";
|
std::string _classname = "";
|
||||||
std::string result = "";
|
std::string result = "";
|
||||||
@@ -149,6 +153,8 @@ std::string ClassFlowControll::getActStatus(){
|
|||||||
|
|
||||||
bool ClassFlowControll::doFlow(string time)
|
bool ClassFlowControll::doFlow(string time)
|
||||||
{
|
{
|
||||||
|
CleanTempFolder();
|
||||||
|
|
||||||
bool result = true;
|
bool result = true;
|
||||||
std::string zw_time;
|
std::string zw_time;
|
||||||
int repeat = 0;
|
int repeat = 0;
|
||||||
@@ -281,7 +287,40 @@ bool ClassFlowControll::ReadParameter(FILE* pfile, string& aktparamgraph)
|
|||||||
LogFile.SwitchOnOff(false);
|
LogFile.SwitchOnOff(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((toUpper(zerlegt[0]) == "LOGFILERETENTIONINDAYS") && (zerlegt.size() > 1))
|
||||||
|
{
|
||||||
|
LogFile.SetRetention(std::stoi(zerlegt[1]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ClassFlowControll::CleanTempFolder() {
|
||||||
|
const char* folderPath = "/sdcard/img_tmp";
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Clean up temporary folder to avoid damage of sdcard sectors : %s", folderPath);
|
||||||
|
DIR *dir = opendir(folderPath);
|
||||||
|
if (!dir) {
|
||||||
|
ESP_LOGE(TAG, "Failed to stat dir : %s", folderPath);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dirent *entry;
|
||||||
|
int deleted = 0;
|
||||||
|
while ((entry = readdir(dir)) != NULL) {
|
||||||
|
std::string path = string(folderPath) + "/" + entry->d_name;
|
||||||
|
if (entry->d_type == DT_REG) {
|
||||||
|
if (unlink(path.c_str()) == 0) {
|
||||||
|
deleted ++;
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(TAG, "can't delete file : %s", path.c_str());
|
||||||
|
}
|
||||||
|
} else if (entry->d_type == DT_DIR) {
|
||||||
|
deleted += removeFolder(path.c_str(), TAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
ESP_LOGI(TAG, "%d files deleted", deleted);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -42,6 +42,8 @@ public:
|
|||||||
std::vector<HTMLInfo*> GetAllDigital();
|
std::vector<HTMLInfo*> GetAllDigital();
|
||||||
std::vector<HTMLInfo*> GetAllAnalog();
|
std::vector<HTMLInfo*> GetAllAnalog();
|
||||||
|
|
||||||
|
int CleanTempFolder();
|
||||||
|
|
||||||
string name(){return "ClassFlowControll";};
|
string name(){return "ClassFlowControll";};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -13,23 +13,21 @@
|
|||||||
|
|
||||||
#include "ClassLogFile.h"
|
#include "ClassLogFile.h"
|
||||||
|
|
||||||
ClassFlowDigit::ClassFlowDigit()
|
static const char* TAG = "flow_digital";
|
||||||
|
|
||||||
|
ClassFlowDigit::ClassFlowDigit() : ClassFlowImage(TAG)
|
||||||
{
|
{
|
||||||
isLogImage = false;
|
|
||||||
string cnnmodelfile = "";
|
string cnnmodelfile = "";
|
||||||
modelxsize = 1;
|
modelxsize = 1;
|
||||||
modelysize = 1;
|
modelysize = 1;
|
||||||
ListFlowControll = NULL;
|
ListFlowControll = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassFlowDigit::ClassFlowDigit(std::vector<ClassFlow*>* lfc)
|
ClassFlowDigit::ClassFlowDigit(std::vector<ClassFlow*>* lfc) : ClassFlowImage(lfc, TAG)
|
||||||
{
|
{
|
||||||
isLogImage = false;
|
|
||||||
string cnnmodelfile = "";
|
string cnnmodelfile = "";
|
||||||
modelxsize = 1;
|
modelxsize = 1;
|
||||||
modelysize = 1;
|
modelysize = 1;
|
||||||
ListFlowControll = NULL;
|
|
||||||
ListFlowControll = lfc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string ClassFlowDigit::getReadout()
|
string ClassFlowDigit::getReadout()
|
||||||
@@ -66,8 +64,8 @@ bool ClassFlowDigit::ReadParameter(FILE* pfile, string& aktparamgraph)
|
|||||||
zerlegt = this->ZerlegeZeile(aktparamgraph);
|
zerlegt = this->ZerlegeZeile(aktparamgraph);
|
||||||
if ((zerlegt[0] == "LogImageLocation") && (zerlegt.size() > 1))
|
if ((zerlegt[0] == "LogImageLocation") && (zerlegt.size() > 1))
|
||||||
{
|
{
|
||||||
|
LogImageLocation = "/sdcard" + zerlegt[1];
|
||||||
isLogImage = true;
|
isLogImage = true;
|
||||||
LogImageLocation = zerlegt[1];
|
|
||||||
}
|
}
|
||||||
if ((zerlegt[0] == "Model") && (zerlegt.size() > 1))
|
if ((zerlegt[0] == "Model") && (zerlegt.size() > 1))
|
||||||
{
|
{
|
||||||
@@ -128,6 +126,8 @@ bool ClassFlowDigit::doFlow(string time)
|
|||||||
|
|
||||||
doNeuralNetwork(time);
|
doNeuralNetwork(time);
|
||||||
|
|
||||||
|
RemoveOldLogs();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,6 +194,8 @@ bool ClassFlowDigit::doAlignAndCut(string time)
|
|||||||
|
|
||||||
bool ClassFlowDigit::doNeuralNetwork(string time)
|
bool ClassFlowDigit::doNeuralNetwork(string time)
|
||||||
{
|
{
|
||||||
|
string logPath = CreateLogFolder(time);
|
||||||
|
|
||||||
string input = "/sdcard/img_tmp/alg.jpg";
|
string input = "/sdcard/img_tmp/alg.jpg";
|
||||||
string ioresize = "/sdcard/img_tmp/resize.bmp";
|
string ioresize = "/sdcard/img_tmp/resize.bmp";
|
||||||
string output;
|
string output;
|
||||||
@@ -223,14 +225,7 @@ bool ClassFlowDigit::doNeuralNetwork(string time)
|
|||||||
#endif
|
#endif
|
||||||
printf("Result Digit%i: %d\n", i, ROI[i]->resultklasse);
|
printf("Result Digit%i: %d\n", i, ROI[i]->resultklasse);
|
||||||
|
|
||||||
if (isLogImage)
|
LogImage(logPath, ROI[i]->name, NULL, &ROI[i]->resultklasse, time);
|
||||||
{
|
|
||||||
nm = "/sdcard" + LogImageLocation + "/" + std::to_string(ROI[i]->resultklasse) + "/" + time + "_" + ROI[i]->name + ".jpg";
|
|
||||||
output = "/sdcard/img_tmp/" + ROI[i]->name + ".jpg";
|
|
||||||
output = FormatFileName(output);
|
|
||||||
nm = FormatFileName(nm);
|
|
||||||
CopyFile(output, nm);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#ifndef OHNETFLITE
|
#ifndef OHNETFLITE
|
||||||
delete tflite;
|
delete tflite;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "ClassFlow.h"
|
#include "ClassFlowImage.h"
|
||||||
#include "Helper.h"
|
#include "Helper.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -12,11 +12,9 @@ struct roi {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class ClassFlowDigit :
|
class ClassFlowDigit :
|
||||||
public ClassFlow
|
public ClassFlowImage
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
string LogImageLocation;
|
|
||||||
bool isLogImage;
|
|
||||||
std::vector<roi*> ROI;
|
std::vector<roi*> ROI;
|
||||||
string cnnmodelfile;
|
string cnnmodelfile;
|
||||||
int modelxsize, modelysize;
|
int modelxsize, modelysize;
|
||||||
|
|||||||
101
code/lib/jomjol_flowcontroll/ClassFlowImage.cpp
Normal file
101
code/lib/jomjol_flowcontroll/ClassFlowImage.cpp
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
#include "ClassFlowImage.h"
|
||||||
|
#include <string>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include "time_sntp.h"
|
||||||
|
#include "ClassLogFile.h"
|
||||||
|
|
||||||
|
ClassFlowImage::ClassFlowImage(const char* logTag)
|
||||||
|
{
|
||||||
|
this->logTag = logTag;
|
||||||
|
isLogImage = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFlowImage::ClassFlowImage(std::vector<ClassFlow*> * lfc, const char* logTag) : ClassFlow((std::vector<ClassFlow*>*)lfc)
|
||||||
|
{
|
||||||
|
this->logTag = logTag;
|
||||||
|
isLogImage = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
string ClassFlowImage::CreateLogFolder(string time) {
|
||||||
|
if (!isLogImage)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
string logPath = LogImageLocation + "/" + time.LOGFILE_TIME_FORMAT_DATE_EXTR + "/" + time.LOGFILE_TIME_FORMAT_HOUR_EXTR;
|
||||||
|
isLogImage = mkdir_r(logPath.c_str(), S_IRWXU) == 0;
|
||||||
|
if (!isLogImage) {
|
||||||
|
ESP_LOGW(logTag, "Can't create log foolder for analog images. Path %s", logPath.c_str());
|
||||||
|
LogFile.WriteToFile("Can't create log foolder for analog images. Path " + logPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return logPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClassFlowImage::LogImage(string logPath, string name, float *resultFloat, int *resultInt, string time) {
|
||||||
|
if (!isLogImage)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char buf[10];
|
||||||
|
if (resultFloat != NULL) {
|
||||||
|
sprintf(buf, "%.1f_", *resultFloat);
|
||||||
|
} else if (resultInt != NULL) {
|
||||||
|
sprintf(buf, "%d_", *resultInt);
|
||||||
|
} else {
|
||||||
|
buf[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
string nm = logPath + "/" + buf + name + "_" + time + ".jpg";
|
||||||
|
nm = FormatFileName(nm);
|
||||||
|
string output = "/sdcard/img_tmp/" + name + ".jpg";
|
||||||
|
output = FormatFileName(output);
|
||||||
|
printf("save to file: %s\n", nm.c_str());
|
||||||
|
CopyFile(output, nm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClassFlowImage::RemoveOldLogs()
|
||||||
|
{
|
||||||
|
if (!isLogImage)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ESP_LOGI(logTag, "remove old log images");
|
||||||
|
if (logfileRetentionInDays == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t rawtime;
|
||||||
|
struct tm* timeinfo;
|
||||||
|
char cmpfilename[30];
|
||||||
|
|
||||||
|
time(&rawtime);
|
||||||
|
rawtime = addDays(rawtime, -logfileRetentionInDays);
|
||||||
|
timeinfo = localtime(&rawtime);
|
||||||
|
|
||||||
|
strftime(cmpfilename, 30, LOGFILE_TIME_FORMAT, timeinfo);
|
||||||
|
//ESP_LOGE(TAG, "log file name to compare: %s", cmpfilename);
|
||||||
|
string folderName = string(cmpfilename).LOGFILE_TIME_FORMAT_DATE_EXTR;
|
||||||
|
|
||||||
|
DIR *dir = opendir(LogImageLocation.c_str());
|
||||||
|
if (!dir) {
|
||||||
|
ESP_LOGI(logTag, "Failed to stat dir : %s", LogImageLocation.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dirent *entry;
|
||||||
|
int deleted = 0;
|
||||||
|
int notDeleted = 0;
|
||||||
|
while ((entry = readdir(dir)) != NULL) {
|
||||||
|
string folderPath = LogImageLocation + "/" + entry->d_name;
|
||||||
|
if (entry->d_type == DT_DIR) {
|
||||||
|
//ESP_LOGI(logTag, "Compare %s %s", entry->d_name, folderName.c_str());
|
||||||
|
if ((strlen(entry->d_name) == folderName.length()) && (strcmp(entry->d_name, folderName.c_str()) < 0)) {
|
||||||
|
deleted += removeFolder(folderPath.c_str(), logTag);
|
||||||
|
} else {
|
||||||
|
notDeleted ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ESP_LOGI(logTag, "%d older log files deleted. %d current log files not deleted.", deleted, notDeleted);
|
||||||
|
closedir(dir);
|
||||||
|
}
|
||||||
|
|
||||||
22
code/lib/jomjol_flowcontroll/ClassFlowImage.h
Normal file
22
code/lib/jomjol_flowcontroll/ClassFlowImage.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "ClassFlow.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class ClassFlowImage : public ClassFlow
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
string LogImageLocation;
|
||||||
|
bool isLogImage;
|
||||||
|
unsigned short logfileRetentionInDays;
|
||||||
|
const char* logTag;
|
||||||
|
|
||||||
|
string CreateLogFolder(string time);
|
||||||
|
void LogImage(string logPath, string name, float *resultFloat, int *resultInt, string time);
|
||||||
|
|
||||||
|
public:
|
||||||
|
ClassFlowImage(const char* logTag);
|
||||||
|
ClassFlowImage(std::vector<ClassFlow*> * lfc, const char* logTag);
|
||||||
|
|
||||||
|
void RemoveOldLogs();
|
||||||
|
};
|
||||||
@@ -6,8 +6,6 @@
|
|||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
static const char* TAG2 = "example";
|
|
||||||
|
|
||||||
ClassFlowMQTT::ClassFlowMQTT()
|
ClassFlowMQTT::ClassFlowMQTT()
|
||||||
{
|
{
|
||||||
uri = "";
|
uri = "";
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
#include "ClassFlowMakeImage.h"
|
#include "ClassFlowMakeImage.h"
|
||||||
#include "Helper.h"
|
#include "Helper.h"
|
||||||
|
|
||||||
|
|
||||||
#include "CFindTemplate.h"
|
#include "CFindTemplate.h"
|
||||||
#include "ClassControllCamera.h"
|
#include "ClassControllCamera.h"
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
static const char* TAG = "flow_make_image";
|
||||||
|
|
||||||
esp_err_t ClassFlowMakeImage::camera_capture(){
|
esp_err_t ClassFlowMakeImage::camera_capture(){
|
||||||
string nm = namerawimage;
|
string nm = namerawimage;
|
||||||
@@ -24,11 +24,8 @@ void ClassFlowMakeImage::takePictureWithFlash(int flashdauer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ClassFlowMakeImage::ClassFlowMakeImage() : ClassFlowImage(TAG)
|
||||||
|
|
||||||
ClassFlowMakeImage::ClassFlowMakeImage()
|
|
||||||
{
|
{
|
||||||
isLogImage = false;
|
|
||||||
waitbeforepicture = 5;
|
waitbeforepicture = 5;
|
||||||
isImageSize = false;
|
isImageSize = false;
|
||||||
ImageQuality = -1;
|
ImageQuality = -1;
|
||||||
@@ -36,16 +33,13 @@ ClassFlowMakeImage::ClassFlowMakeImage()
|
|||||||
namerawimage = "/sdcard/img_tmp/raw.jpg";
|
namerawimage = "/sdcard/img_tmp/raw.jpg";
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassFlowMakeImage::ClassFlowMakeImage(std::vector<ClassFlow*>* lfc)
|
ClassFlowMakeImage::ClassFlowMakeImage(std::vector<ClassFlow*>* lfc) : ClassFlowImage(lfc, TAG)
|
||||||
{
|
{
|
||||||
isLogImage = false;
|
|
||||||
waitbeforepicture = 5;
|
waitbeforepicture = 5;
|
||||||
isImageSize = false;
|
isImageSize = false;
|
||||||
ImageQuality = -1;
|
ImageQuality = -1;
|
||||||
TimeImageTaken = 0;
|
TimeImageTaken = 0;
|
||||||
namerawimage = "/sdcard/img_tmp/raw.jpg";
|
namerawimage = "/sdcard/img_tmp/raw.jpg";
|
||||||
|
|
||||||
ListFlowControll = lfc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
|
bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
|
||||||
@@ -66,8 +60,8 @@ bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
|
|||||||
zerlegt = this->ZerlegeZeile(aktparamgraph);
|
zerlegt = this->ZerlegeZeile(aktparamgraph);
|
||||||
if ((zerlegt[0] == "LogImageLocation") && (zerlegt.size() > 1))
|
if ((zerlegt[0] == "LogImageLocation") && (zerlegt.size() > 1))
|
||||||
{
|
{
|
||||||
this->isLogImage = true;
|
LogImageLocation = "/sdcard" + zerlegt[1];
|
||||||
this->LogImageLocation = zerlegt[1];
|
isLogImage = true;
|
||||||
}
|
}
|
||||||
if ((zerlegt[0] == "ImageQuality") && (zerlegt.size() > 1))
|
if ((zerlegt[0] == "ImageQuality") && (zerlegt.size() > 1))
|
||||||
this->ImageQuality = std::stod(zerlegt[1]);
|
this->ImageQuality = std::stod(zerlegt[1]);
|
||||||
@@ -81,45 +75,6 @@ bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ClassFlowMakeImage::CopyFile(string input, string output)
|
|
||||||
{
|
|
||||||
input = FormatFileName(input);
|
|
||||||
output = FormatFileName(output);
|
|
||||||
input = namerawimage;
|
|
||||||
|
|
||||||
|
|
||||||
printf("Copy Input : %s\n", input.c_str());
|
|
||||||
printf("Copy Output: %s\n", output.c_str());
|
|
||||||
|
|
||||||
char cTemp;
|
|
||||||
FILE* fpSourceFile = fopen(input.c_str(), "rb");
|
|
||||||
FILE* fpTargetFile = fopen(output.c_str(), "wb");
|
|
||||||
|
|
||||||
if (fpSourceFile == NULL)
|
|
||||||
{
|
|
||||||
printf("fpSourceFile == NULL\n");
|
|
||||||
perror("Error");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fpTargetFile == NULL)
|
|
||||||
{
|
|
||||||
printf("fpTargetFile == NULL\n");
|
|
||||||
perror("Error");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
while (fread(&cTemp, 1, 1, fpSourceFile) == 1)
|
|
||||||
{
|
|
||||||
fwrite(&cTemp, 1, 1, fpTargetFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close The Files
|
|
||||||
fclose(fpSourceFile);
|
|
||||||
fclose(fpTargetFile);
|
|
||||||
printf("Copy done\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
string ClassFlowMakeImage::getHTMLSingleStep(string host)
|
string ClassFlowMakeImage::getHTMLSingleStep(string host)
|
||||||
{
|
{
|
||||||
string result;
|
string result;
|
||||||
@@ -133,6 +88,8 @@ bool ClassFlowMakeImage::doFlow(string zwtime)
|
|||||||
// TakeImage and Store into /image_tmp/raw.jpg TO BE DONE
|
// TakeImage and Store into /image_tmp/raw.jpg TO BE DONE
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
string logPath = CreateLogFolder(zwtime);
|
||||||
|
|
||||||
int flashdauer = (int) waitbeforepicture * 1000;
|
int flashdauer = (int) waitbeforepicture * 1000;
|
||||||
|
|
||||||
|
|
||||||
@@ -140,16 +97,9 @@ bool ClassFlowMakeImage::doFlow(string zwtime)
|
|||||||
time(&TimeImageTaken);
|
time(&TimeImageTaken);
|
||||||
localtime(&TimeImageTaken);
|
localtime(&TimeImageTaken);
|
||||||
|
|
||||||
|
LogImage(logPath, "raw", NULL, NULL, zwtime);
|
||||||
|
|
||||||
if (this->isLogImage)
|
RemoveOldLogs();
|
||||||
{
|
|
||||||
string nm = "/sdcard" + this->LogImageLocation + "/" + zwtime + ".jpg";
|
|
||||||
string input = "/sdcard/image_tmp/raw.jgp";
|
|
||||||
printf("loginput from: %s to: %s\n", input.c_str(), nm.c_str());
|
|
||||||
nm = FormatFileName(nm);
|
|
||||||
input = FormatFileName(input);
|
|
||||||
CopyFile(input, nm);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "ClassFlow.h"
|
#include "ClassFlowImage.h"
|
||||||
#include "ClassControllCamera.h"
|
#include "ClassControllCamera.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
static const char* TAG2 = "example";
|
|
||||||
|
|
||||||
#define BLINK_GPIO GPIO_NUM_4
|
#define BLINK_GPIO GPIO_NUM_4
|
||||||
|
|
||||||
#define CAMERA_MODEL_AI_THINKER
|
#define CAMERA_MODEL_AI_THINKER
|
||||||
@@ -13,11 +11,9 @@ static const char* TAG2 = "example";
|
|||||||
|
|
||||||
|
|
||||||
class ClassFlowMakeImage :
|
class ClassFlowMakeImage :
|
||||||
public ClassFlow
|
public ClassFlowImage
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
string LogImageLocation;
|
|
||||||
bool isLogImage;
|
|
||||||
float waitbeforepicture;
|
float waitbeforepicture;
|
||||||
framesize_t ImageSize;
|
framesize_t ImageSize;
|
||||||
bool isImageSize;
|
bool isImageSize;
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
//#pragma warning(disable : 4996)
|
//#pragma warning(disable : 4996)
|
||||||
|
|
||||||
#include "Helper.h"
|
#include "Helper.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <esp_log.h>
|
||||||
|
|
||||||
//#define ISWINDOWS_TRUE
|
//#define ISWINDOWS_TRUE
|
||||||
|
#define PATH_MAX_STRING_SIZE 256
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@@ -159,6 +165,63 @@ string getFileType(string filename)
|
|||||||
return zw;
|
return zw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* recursive mkdir */
|
||||||
|
int mkdir_r(const char *dir, const mode_t mode) {
|
||||||
|
char tmp[PATH_MAX_STRING_SIZE];
|
||||||
|
char *p = NULL;
|
||||||
|
struct stat sb;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
/* copy path */
|
||||||
|
len = strnlen (dir, PATH_MAX_STRING_SIZE);
|
||||||
|
if (len == 0 || len == PATH_MAX_STRING_SIZE) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memcpy (tmp, dir, len);
|
||||||
|
tmp[len] = '\0';
|
||||||
|
|
||||||
|
/* remove trailing slash */
|
||||||
|
if(tmp[len - 1] == '/') {
|
||||||
|
tmp[len - 1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if path exists and is a directory */
|
||||||
|
if (stat (tmp, &sb) == 0) {
|
||||||
|
if (S_ISDIR (sb.st_mode)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* recursive mkdir */
|
||||||
|
for(p = tmp + 1; *p; p++) {
|
||||||
|
if(*p == '/') {
|
||||||
|
*p = 0;
|
||||||
|
/* test path */
|
||||||
|
if (stat(tmp, &sb) != 0) {
|
||||||
|
/* path does not exist - create directory */
|
||||||
|
if (mkdir(tmp, mode) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (!S_ISDIR(sb.st_mode)) {
|
||||||
|
/* not a directory */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*p = '/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* test path */
|
||||||
|
if (stat(tmp, &sb) != 0) {
|
||||||
|
/* path does not exist - create directory */
|
||||||
|
if (mkdir(tmp, mode) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (!S_ISDIR(sb.st_mode)) {
|
||||||
|
/* not a directory */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
string toUpper(string in)
|
string toUpper(string in)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < in.length(); ++i)
|
for (int i = 0; i < in.length(); ++i)
|
||||||
@@ -173,3 +236,42 @@ float temperatureRead()
|
|||||||
{
|
{
|
||||||
return (temprature_sens_read() - 32) / 1.8;
|
return (temprature_sens_read() - 32) / 1.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time_t addDays(time_t startTime, int days) {
|
||||||
|
struct tm* tm = localtime(&startTime);
|
||||||
|
tm->tm_mday += days;
|
||||||
|
return mktime(tm);
|
||||||
|
}
|
||||||
|
|
||||||
|
int removeFolder(const char* folderPath, const char* logTag) {
|
||||||
|
ESP_LOGI(logTag, "Delete folder %s", folderPath);
|
||||||
|
|
||||||
|
DIR *dir = opendir(folderPath);
|
||||||
|
if (!dir) {
|
||||||
|
ESP_LOGI(logTag, "Failed to stat dir : %s", folderPath);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dirent *entry;
|
||||||
|
int deleted = 0;
|
||||||
|
while ((entry = readdir(dir)) != NULL) {
|
||||||
|
std::string path = string(folderPath) + "/" + entry->d_name;
|
||||||
|
if (entry->d_type == DT_REG) {
|
||||||
|
if (unlink(path.c_str()) == 0) {
|
||||||
|
deleted ++;
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(logTag, "can't delete file : %s", path.c_str());
|
||||||
|
}
|
||||||
|
} else if (entry->d_type == DT_DIR) {
|
||||||
|
deleted += removeFolder(path.c_str(), logTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(dir);
|
||||||
|
if (rmdir(folderPath) != 0) {
|
||||||
|
ESP_LOGE(logTag, "can't delete file : %s", folderPath);
|
||||||
|
}
|
||||||
|
ESP_LOGI(logTag, "%d older log files in folder %s deleted.", deleted, folderPath);
|
||||||
|
|
||||||
|
return deleted;
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,6 +17,11 @@ bool ctype_space(const char c, string adddelimiter);
|
|||||||
|
|
||||||
string getFileType(string filename);
|
string getFileType(string filename);
|
||||||
|
|
||||||
|
int mkdir_r(const char *dir, const mode_t mode);
|
||||||
|
int removeFolder(const char* folderPath, const char* logTag);
|
||||||
|
|
||||||
string toUpper(string in);
|
string toUpper(string in);
|
||||||
|
|
||||||
float temperatureRead();
|
float temperatureRead();
|
||||||
|
|
||||||
|
time_t addDays(time_t startTime, int days);
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
#include "ClassLogFile.h"
|
#include "ClassLogFile.h"
|
||||||
#include "time_sntp.h"
|
#include "time_sntp.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include "Helper.h"
|
||||||
|
|
||||||
ClassLogFile LogFile("/sdcard/log.txt");
|
static const char *TAG = "log";
|
||||||
|
|
||||||
|
ClassLogFile LogFile("/sdcard/log/message", "log_%Y-%m-%d.txt");
|
||||||
|
|
||||||
void ClassLogFile::WriteToDedicatedFile(std::string _fn, std::string info, bool _time)
|
void ClassLogFile::WriteToDedicatedFile(std::string _fn, std::string info, bool _time)
|
||||||
{
|
{
|
||||||
@@ -13,7 +20,7 @@ void ClassLogFile::WriteToDedicatedFile(std::string _fn, std::string info, bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
pFile = fopen(_fn.c_str(), "a+");
|
pFile = fopen(_fn.c_str(), "a+");
|
||||||
|
if (pFile!=NULL) {
|
||||||
if (_time)
|
if (_time)
|
||||||
{
|
{
|
||||||
time_t rawtime;
|
time_t rawtime;
|
||||||
@@ -32,20 +39,92 @@ void ClassLogFile::WriteToDedicatedFile(std::string _fn, std::string info, bool
|
|||||||
fputs("\n", pFile);
|
fputs("\n", pFile);
|
||||||
|
|
||||||
fclose(pFile);
|
fclose(pFile);
|
||||||
|
} else {
|
||||||
|
ESP_LOGI(TAG, "Can't open log file %s", _fn.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClassLogFile::SwitchOnOff(bool _doLogFile){
|
void ClassLogFile::SwitchOnOff(bool _doLogFile){
|
||||||
doLogFile = _doLogFile;
|
doLogFile = _doLogFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void ClassLogFile::SetRetention(unsigned short _retentionInDays){
|
||||||
|
retentionInDays = _retentionInDays;
|
||||||
|
};
|
||||||
|
|
||||||
void ClassLogFile::WriteToFile(std::string info, bool _time)
|
void ClassLogFile::WriteToFile(std::string info, bool _time)
|
||||||
{
|
{
|
||||||
WriteToDedicatedFile(logfile, info, _time);
|
struct stat path_stat;
|
||||||
|
if (stat(logroot.c_str(), &path_stat) != 0) {
|
||||||
|
ESP_LOGI(TAG, "Create log folder: %s", logroot.c_str());
|
||||||
|
if (mkdir_r(logroot.c_str(), S_IRWXU) == -1) {
|
||||||
|
ESP_LOGI(TAG, "Can't create log foolder");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassLogFile::ClassLogFile(std::string _logfile)
|
time_t rawtime;
|
||||||
|
struct tm* timeinfo;
|
||||||
|
char buffer[30];
|
||||||
|
|
||||||
|
time(&rawtime);
|
||||||
|
timeinfo = localtime(&rawtime);
|
||||||
|
|
||||||
|
strftime(buffer, 30, logfile.c_str(), timeinfo);
|
||||||
|
std::string logpath = logroot + "/" + buffer;
|
||||||
|
|
||||||
|
WriteToDedicatedFile(logpath, info, _time);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClassLogFile::RemoveOld()
|
||||||
{
|
{
|
||||||
|
if (retentionInDays == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t rawtime;
|
||||||
|
struct tm* timeinfo;
|
||||||
|
char cmpfilename[30];
|
||||||
|
|
||||||
|
time(&rawtime);
|
||||||
|
rawtime = addDays(rawtime, -retentionInDays);
|
||||||
|
timeinfo = localtime(&rawtime);
|
||||||
|
|
||||||
|
strftime(cmpfilename, 30, logfile.c_str(), timeinfo);
|
||||||
|
//ESP_LOGE(TAG, "log file name to compare: %s", cmpfilename);
|
||||||
|
|
||||||
|
DIR *dir = opendir(logroot.c_str());
|
||||||
|
if (!dir) {
|
||||||
|
ESP_LOGI(TAG, "Failed to stat dir : %s", logroot.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dirent *entry;
|
||||||
|
int deleted = 0;
|
||||||
|
int notDeleted = 0;
|
||||||
|
while ((entry = readdir(dir)) != NULL) {
|
||||||
|
if (entry->d_type == DT_REG) {
|
||||||
|
//ESP_LOGI(TAG, "list log file : %s %s", entry->d_name, cmpfilename);
|
||||||
|
if ((strlen(entry->d_name) == strlen(cmpfilename)) && (strcmp(entry->d_name, cmpfilename) < 0)) {
|
||||||
|
ESP_LOGI(TAG, "delete log file : %s", entry->d_name);
|
||||||
|
std::string filepath = logroot + "/" + entry->d_name;
|
||||||
|
if (unlink(filepath.c_str()) == 0) {
|
||||||
|
deleted ++;
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(TAG, "can't delete file : %s", entry->d_name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notDeleted ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ESP_LOGI(TAG, "%d older log files deleted. %d current log files not deleted.", deleted, notDeleted);
|
||||||
|
closedir(dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassLogFile::ClassLogFile(std::string _logroot, std::string _logfile)
|
||||||
|
{
|
||||||
|
logroot = _logroot;
|
||||||
logfile = _logfile;
|
logfile = _logfile;
|
||||||
doLogFile = true;
|
doLogFile = true;
|
||||||
|
retentionInDays = 10;
|
||||||
}
|
}
|
||||||
@@ -5,15 +5,19 @@
|
|||||||
class ClassLogFile
|
class ClassLogFile
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
std::string logroot;
|
||||||
std::string logfile;
|
std::string logfile;
|
||||||
bool doLogFile;
|
bool doLogFile;
|
||||||
|
unsigned short retentionInDays;
|
||||||
public:
|
public:
|
||||||
ClassLogFile(std::string _logfile);
|
ClassLogFile(std::string _logpath, std::string _logfile);
|
||||||
|
|
||||||
void SwitchOnOff(bool _doLogFile);
|
void SwitchOnOff(bool _doLogFile);
|
||||||
|
void SetRetention(unsigned short _retentionInDays);
|
||||||
|
|
||||||
void WriteToFile(std::string info, bool _time = true);
|
void WriteToFile(std::string info, bool _time = true);
|
||||||
void WriteToDedicatedFile(std::string _fn, std::string info, bool _time = true);
|
void WriteToDedicatedFile(std::string _fn, std::string info, bool _time = true);
|
||||||
|
void RemoveOld();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ClassLogFile LogFile;
|
extern ClassLogFile LogFile;
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#include <esp_http_server.h>
|
#include <esp_http_server.h>
|
||||||
|
|
||||||
static const char *TAG = "example";
|
static const char *TAG = "server-main";
|
||||||
|
|
||||||
extern httpd_handle_t server;
|
extern httpd_handle_t server;
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,8 @@ void doInit(void)
|
|||||||
|
|
||||||
bool doflow(void)
|
bool doflow(void)
|
||||||
{
|
{
|
||||||
std::string zw_time = gettimestring("%Y%m%d-%H%M%S");
|
|
||||||
|
std::string zw_time = gettimestring(LOGFILE_TIME_FORMAT);
|
||||||
printf("doflow - start %s\n", zw_time.c_str());
|
printf("doflow - start %s\n", zw_time.c_str());
|
||||||
flowisrunning = true;
|
flowisrunning = true;
|
||||||
tfliteflow.doFlow(zw_time);
|
tfliteflow.doFlow(zw_time);
|
||||||
@@ -433,6 +434,8 @@ void task_autodoFlow(void *pvParameter)
|
|||||||
printf("Autoflow: doFLow wird gestartet\n");
|
printf("Autoflow: doFLow wird gestartet\n");
|
||||||
flowisrunning = true;
|
flowisrunning = true;
|
||||||
doflow();
|
doflow();
|
||||||
|
printf("Remove older log files\n");
|
||||||
|
LogFile.RemoveOld();
|
||||||
}
|
}
|
||||||
|
|
||||||
LogFile.WriteToFile("task_autodoFlow - round done");
|
LogFile.WriteToFile("task_autodoFlow - round done");
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
[MakeImage]
|
[MakeImage]
|
||||||
;LogImageLocation = /log/source
|
;LogImageLocation = /log/source
|
||||||
|
;LogfileRetentionInDays = 15
|
||||||
WaitBeforeTakingPicture=5
|
WaitBeforeTakingPicture=5
|
||||||
ImageQuality = 5
|
ImageQuality = 5
|
||||||
ImageSize = VGA
|
ImageSize = VGA
|
||||||
@@ -15,6 +16,7 @@ SearchFieldY = 20
|
|||||||
[Digits]
|
[Digits]
|
||||||
Model=/config/dig0650s3.tflite
|
Model=/config/dig0650s3.tflite
|
||||||
LogImageLocation = /log/digit
|
LogImageLocation = /log/digit
|
||||||
|
LogfileRetentionInDays = 15
|
||||||
ModelInputSize 20, 32
|
ModelInputSize 20, 32
|
||||||
digit1, 306, 120, 37, 67
|
digit1, 306, 120, 37, 67
|
||||||
digit2, 355, 120, 37, 67
|
digit2, 355, 120, 37, 67
|
||||||
@@ -23,6 +25,7 @@ digit3, 404, 120, 37, 67
|
|||||||
[Analog]
|
[Analog]
|
||||||
Model=/config/ana0630s2.tflite
|
Model=/config/ana0630s2.tflite
|
||||||
LogImageLocation = /log/analog
|
LogImageLocation = /log/analog
|
||||||
|
LogfileRetentionInDays = 15
|
||||||
ModelInputSize 32, 32
|
ModelInputSize 32, 32
|
||||||
analog1, 444, 225, 92, 92
|
analog1, 444, 225, 92, 92
|
||||||
analog2, 391, 329, 92, 92
|
analog2, 391, 329, 92, 92
|
||||||
@@ -51,5 +54,7 @@ Intervall = 4.85
|
|||||||
|
|
||||||
[Debug]
|
[Debug]
|
||||||
Logfile = False
|
Logfile = False
|
||||||
|
; Number of days before a log file is deleted. 0 = disabled. 10 is default value (if not defined)
|
||||||
|
;LogfileRetentionInDays = 10
|
||||||
|
|
||||||
[Ende]
|
[Ende]
|
||||||
@@ -91,7 +91,7 @@ li.dropdown {
|
|||||||
<a href="javascript:void(0)" class="dropbtn">System</a>
|
<a href="javascript:void(0)" class="dropbtn">System</a>
|
||||||
<div class="dropdown-content">
|
<div class="dropdown-content">
|
||||||
<a href="#"onclick="document.getElementById('maincontent').src = '/ota_page.html';">OTA Update</a>
|
<a href="#"onclick="document.getElementById('maincontent').src = '/ota_page.html';">OTA Update</a>
|
||||||
<a href="#"onclick="document.getElementById('maincontent').src = '/fileserver/log.txt';">Log Viewer</a>
|
<a href="#"onclick="document.getElementById('maincontent').src = '/fileserver/log/message/?readonly=true';">Log Viewer</a>
|
||||||
<a href="#"onclick="document.getElementById('maincontent').src = '/reboot_page.html';">Reboot</a>
|
<a href="#"onclick="document.getElementById('maincontent').src = '/reboot_page.html';">Reboot</a>
|
||||||
<a href="#"onclick="document.getElementById('maincontent').src = '/info.html';">Info</a>
|
<a href="#"onclick="document.getElementById('maincontent').src = '/info.html';">Info</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user