Просмотр исходного кода

rotation of image log files implemented
improved rotation of message log files
implement deletion of temp images before start new flow
a little bit code cleaning

Jurij Retzlaff 5 лет назад
Родитель
Сommit
f4f871002b

+ 4 - 0
code/lib/jomjol_flowcontroll/ClassFlow.h

@@ -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;

+ 15 - 22
code/lib/jomjol_flowcontroll/ClassFlowAnalog.cpp

@@ -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)
-        {
-            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);
-        }        
+        LogImage(logPath, ROI[i]->name, &ROI[i]->result, NULL, time); 
     }
     }
 #ifndef OHNETFLITE
 #ifndef OHNETFLITE
         delete tflite;
         delete tflite;

+ 2 - 4
code/lib/jomjol_flowcontroll/ClassFlowAnalog.h

@@ -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;

+ 35 - 0
code/lib/jomjol_flowcontroll/ClassFlowControll.cpp

@@ -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;
@@ -289,3 +295,32 @@ bool ClassFlowControll::ReadParameter(FILE* pfile, string& aktparamgraph)
     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;
+}

+ 2 - 0
code/lib/jomjol_flowcontroll/ClassFlowControll.h

@@ -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";};
 };
 };
 
 

+ 12 - 17
code/lib/jomjol_flowcontroll/ClassFlowDigit.cpp

@@ -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))
         {
         {
-            isLogImage = true;
-            LogImageLocation = zerlegt[1];
+            LogImageLocation = "/sdcard" + zerlegt[1];
+            isLogImage = true;            
         }
         }
         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;
@@ -221,16 +223,9 @@ bool ClassFlowDigit::doNeuralNetwork(string time)
 #ifndef OHNETFLITE
 #ifndef OHNETFLITE
         ROI[i]->resultklasse = tflite->GetClassFromImage(ioresize);
         ROI[i]->resultklasse = tflite->GetClassFromImage(ioresize);
 #endif
 #endif
-        printf("Result Digit%i: %d\n", i, ROI[i]->resultklasse);           
+        printf("Result Digit%i: %d\n", i, ROI[i]->resultklasse);
 
 
-        if (isLogImage)
-        {
-            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);
-        }        
+        LogImage(logPath, ROI[i]->name, NULL, &ROI[i]->resultklasse, time);
     }
     }
 #ifndef OHNETFLITE
 #ifndef OHNETFLITE
         delete tflite;
         delete tflite;

+ 2 - 4
code/lib/jomjol_flowcontroll/ClassFlowDigit.h

@@ -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 - 0
code/lib/jomjol_flowcontroll/ClassFlowImage.cpp

@@ -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 - 0
code/lib/jomjol_flowcontroll/ClassFlowImage.h

@@ -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();
+};

+ 0 - 2
code/lib/jomjol_flowcontroll/ClassFlowMQTT.cpp

@@ -6,8 +6,6 @@
 
 
 #include <time.h>
 #include <time.h>
 
 
-static const char* TAG2 = "example";
-
 ClassFlowMQTT::ClassFlowMQTT()
 ClassFlowMQTT::ClassFlowMQTT()
 {
 {
     uri = "";
     uri = "";

+ 9 - 59
code/lib/jomjol_flowcontroll/ClassFlowMakeImage.cpp

@@ -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()
+ClassFlowMakeImage::ClassFlowMakeImage() : ClassFlowImage(TAG)
 {
 {
-    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;
-            this->LogImageLocation = zerlegt[1];
+            LogImageLocation = "/sdcard" + 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)
-    {
-        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);
-    }
+    RemoveOldLogs();
 
 
     return true;
     return true;
 }
 }

+ 2 - 4
code/lib/jomjol_flowcontroll/ClassFlowMakeImage.h

@@ -1,5 +1,5 @@
 #pragma once
 #pragma once
-#include "ClassFlow.h"
+#include "ClassFlowImage.h"
 #include "ClassControllCamera.h"
 #include "ClassControllCamera.h"
 
 
 #include <string>
 #include <string>
@@ -11,11 +11,9 @@
 
 
 
 
 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;

+ 36 - 1
code/lib/jomjol_helper/Helper.cpp

@@ -3,7 +3,9 @@
 #include "Helper.h"
 #include "Helper.h"
 #include <sys/types.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/stat.h>
+#include <dirent.h>
 #include <string.h>
 #include <string.h>
+#include <esp_log.h>
 
 
 //#define ISWINDOWS_TRUE
 //#define ISWINDOWS_TRUE
 #define PATH_MAX_STRING_SIZE 256
 #define PATH_MAX_STRING_SIZE 256
@@ -239,4 +241,37 @@ time_t addDays(time_t startTime, int days) {
 	struct tm* tm = localtime(&startTime);
 	struct tm* tm = localtime(&startTime);
 	tm->tm_mday += days;
 	tm->tm_mday += days;
 	return mktime(tm);
 	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;
+}

+ 1 - 0
code/lib/jomjol_helper/Helper.h

@@ -18,6 +18,7 @@ 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 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);
 
 

+ 4 - 4
code/lib/jomjol_logfile/ClassLogFile.cpp

@@ -94,7 +94,7 @@ void ClassLogFile::RemoveOld()
 
 
     DIR *dir = opendir(logroot.c_str());
     DIR *dir = opendir(logroot.c_str());
     if (!dir) {
     if (!dir) {
-        ESP_LOGE(TAG, "Failed to stat dir : %s", logroot.c_str());
+        ESP_LOGI(TAG, "Failed to stat dir : %s", logroot.c_str());
         return;
         return;
     }
     }
 
 
@@ -103,9 +103,9 @@ void ClassLogFile::RemoveOld()
     int notDeleted = 0;
     int notDeleted = 0;
     while ((entry = readdir(dir)) != NULL) {
     while ((entry = readdir(dir)) != NULL) {
         if (entry->d_type == DT_REG) {
         if (entry->d_type == DT_REG) {
-            //ESP_LOGE(TAG, "list log file : %s", entry->d_name);
+            //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)) {
             if ((strlen(entry->d_name) == strlen(cmpfilename)) && (strcmp(entry->d_name, cmpfilename) < 0)) {
-                ESP_LOGE(TAG, "delete log file : %s", entry->d_name);
+                ESP_LOGI(TAG, "delete log file : %s", entry->d_name);
                 std::string filepath = logroot + "/" + entry->d_name; 
                 std::string filepath = logroot + "/" + entry->d_name; 
                 if (unlink(filepath.c_str()) == 0) {
                 if (unlink(filepath.c_str()) == 0) {
                     deleted ++;
                     deleted ++;
@@ -117,7 +117,7 @@ void ClassLogFile::RemoveOld()
             }
             }
         }
         }
     }
     }
-    ESP_LOGE(TAG, "%d older log files deleted. %d current log files not deleted.", deleted, notDeleted);
+    ESP_LOGI(TAG, "%d older log files deleted. %d current log files not deleted.", deleted, notDeleted);
     closedir(dir);
     closedir(dir);
 }
 }
 
 

+ 1 - 1
code/lib/jomjol_time_sntp/time_sntp.cpp

@@ -124,4 +124,4 @@ static void initialize_sntp(void)
     sntp_setservername(0, "pool.ntp.org");
     sntp_setservername(0, "pool.ntp.org");
     sntp_set_time_sync_notification_cb(time_sync_notification_cb);
     sntp_set_time_sync_notification_cb(time_sync_notification_cb);
     sntp_init();
     sntp_init();
-}
+}

+ 2 - 0
code/src/server_main.h

@@ -14,6 +14,8 @@
 
 
 #include <esp_http_server.h>
 #include <esp_http_server.h>
 
 
+static const char *TAG = "server-main";
+
 extern httpd_handle_t server;
 extern httpd_handle_t server;
 
 
 httpd_handle_t start_webserver(void);
 httpd_handle_t start_webserver(void);

+ 2 - 1
code/src/server_tflite.cpp

@@ -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);

+ 2 - 2
code/src/version.cpp

@@ -1,4 +1,4 @@
-const char* GIT_REV="05a0f6f";
+const char* GIT_REV="acc7253";
 const char* GIT_TAG="";
 const char* GIT_TAG="";
 const char* GIT_BRANCH="master";
 const char* GIT_BRANCH="master";
-const char* BUILD_TIME="2020-11-06 17:57";
+const char* BUILD_TIME="2020-11-09 00:12";

+ 2 - 2
code/version.cpp

@@ -1,4 +1,4 @@
-const char* GIT_REV="05a0f6f";
+const char* GIT_REV="acc7253";
 const char* GIT_TAG="";
 const char* GIT_TAG="";
 const char* GIT_BRANCH="master";
 const char* GIT_BRANCH="master";
-const char* BUILD_TIME="2020-11-06 17:57";
+const char* BUILD_TIME="2020-11-09 00:12";

+ 3 - 0
sd-card/config/config.ini

@@ -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