diff --git a/README.md b/README.md index 820ce6b7..46d2d3be 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,11 @@ In other cases you can contact the developer via email: -#include -#include -#include // std::stringstream - - -// #define OHNETFLITE - -#ifndef OHNETFLITE -#include "CTfLiteClass.h" -#endif - -#include "ClassLogFile.h" - -static const char* TAG = "flow_analog"; - -bool debugdetailanalog = false; - -void ClassFlowAnalog::SetInitialParameter(void) -{ - string cnnmodelfile = ""; - modelxsize = 1; - modelysize = 1; - ListFlowControll = NULL; - previousElement = NULL; - SaveAllFiles = false; - disabled = false; - extendedResolution = false; -} - -ClassFlowAnalog::ClassFlowAnalog(std::vector* lfc) : ClassFlowImage(lfc, TAG) -{ - SetInitialParameter(); - ListFlowControll = lfc; - - for (int i = 0; i < ListFlowControll->size(); ++i) - { - if (((*ListFlowControll)[i])->name().compare("ClassFlowAlignment") == 0) - { - flowpostalignment = (ClassFlowAlignment*) (*ListFlowControll)[i]; - } - } - -} - - -int ClassFlowAnalog::AnzahlROIs() -{ - int zw = ROI.size(); - if (extendedResolution) - zw++; - - return zw; -} - - -string ClassFlowAnalog::getReadout() -{ - string result = ""; - if (ROI.size() == 0) - return result; - - - float zahl = ROI[ROI.size() - 1]->result; - int ergebnis_nachkomma = ((int) floor(zahl * 10)) % 10; - - int prev = -1; - - prev = ZeigerEval(ROI[ROI.size() - 1]->result, prev); - result = std::to_string(prev); - - if (extendedResolution) - result = result + std::to_string(ergebnis_nachkomma); - - for (int i = ROI.size() - 2; i >= 0; --i) - { - prev = ZeigerEval(ROI[i]->result, prev); - result = std::to_string(prev) + result; - } - - return result; -} - -int ClassFlowAnalog::ZeigerEval(float zahl, int ziffer_vorgaenger) -{ - int ergebnis_nachkomma = ((int) floor(zahl * 10)) % 10; - int ergebnis_vorkomma = ((int) floor(zahl)) % 10; - int ergebnis, ergebnis_rating; - - if (ziffer_vorgaenger == -1) - return ergebnis_vorkomma % 10; - - ergebnis_rating = ergebnis_nachkomma - ziffer_vorgaenger; - if (ergebnis_nachkomma >= 5) - ergebnis_rating-=5; - else - ergebnis_rating+=5; - ergebnis = (int) round(zahl); - if (ergebnis_rating < 0) - ergebnis-=1; - if (ergebnis == -1) - ergebnis+=10; - - ergebnis = ergebnis % 10; - return ergebnis; -} - -bool ClassFlowAnalog::ReadParameter(FILE* pfile, string& aktparamgraph) -{ - std::vector zerlegt; - - aktparamgraph = trim(aktparamgraph); - - if (aktparamgraph.size() == 0) - if (!this->GetNextParagraph(pfile, aktparamgraph)) - return false; - - - if ((aktparamgraph.compare("[Analog]") != 0) && (aktparamgraph.compare(";[Analog]") != 0)) // Paragraph passt nich zu MakeImage - return false; - - if (aktparamgraph[0] == ';') - { - disabled = true; - while (getNextLine(pfile, &aktparamgraph) && !isNewParagraph(aktparamgraph)); - printf("[Analog] is disabled !!!\n"); - return true; - } - - - while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph)) - { - zerlegt = this->ZerlegeZeile(aktparamgraph); - if ((zerlegt[0] == "LogImageLocation") && (zerlegt.size() > 1)) - { - this->LogImageLocation = "/sdcard" + zerlegt[1]; - this->isLogImage = true; - } - if ((toUpper(zerlegt[0]) == "LOGFILERETENTIONINDAYS") && (zerlegt.size() > 1)) - { - this->logfileRetentionInDays = std::stoi(zerlegt[1]); - } - if ((zerlegt[0] == "Model") && (zerlegt.size() > 1)) - { - this->cnnmodelfile = zerlegt[1]; - } - if ((zerlegt[0] == "ModelInputSize") && (zerlegt.size() > 2)) - { - this->modelxsize = std::stoi(zerlegt[1]); - this->modelysize = std::stoi(zerlegt[2]); - } - if (zerlegt.size() >= 5) - { - roianalog* neuroi = new roianalog; - neuroi->name = zerlegt[0]; - neuroi->posx = std::stoi(zerlegt[1]); - neuroi->posy = std::stoi(zerlegt[2]); - neuroi->deltax = std::stoi(zerlegt[3]); - neuroi->deltay = std::stoi(zerlegt[4]); - neuroi->result = -1; - neuroi->image = NULL; - neuroi->image_org = NULL; - ROI.push_back(neuroi); - } - - if ((toUpper(zerlegt[0]) == "SAVEALLFILES") && (zerlegt.size() > 1)) - { - if (toUpper(zerlegt[1]) == "TRUE") - SaveAllFiles = true; - } - - if ((toUpper(zerlegt[0]) == "EXTENDEDRESOLUTION") && (zerlegt.size() > 1)) - { - if (toUpper(zerlegt[1]) == "TRUE") - extendedResolution = true; - } - } - - for (int i = 0; i < ROI.size(); ++i) - { - ROI[i]->image = new CImageBasis(modelxsize, modelysize, 3); - ROI[i]->image_org = new CImageBasis(ROI[i]->deltax, ROI[i]->deltay, 3); - } - - return true; -} - - -string ClassFlowAnalog::getHTMLSingleStep(string host) -{ - string result, zw; - std::vector htmlinfo; - - result = "

Found ROIs:

\n"; - result = result + "Analog Pointers:

"; - - htmlinfo = GetHTMLInfo(); - for (int i = 0; i < htmlinfo.size(); ++i) - { - std::stringstream stream; - stream << std::fixed << std::setprecision(1) << htmlinfo[i]->val; - zw = stream.str(); - - result = result + "filename + "\"> " + zw; - delete htmlinfo[i]; - } - htmlinfo.clear(); - - return result; -} - - - -bool ClassFlowAnalog::doFlow(string time) -{ - if (disabled) - return true; - - if (!doAlignAndCut(time)){ - return false; - }; - - if (debugdetailanalog) LogFile.WriteToFile("ClassFlowAnalog::doFlow nach Alignment"); - - doNeuralNetwork(time); - - RemoveOldLogs(); - - return true; -} - -bool ClassFlowAnalog::doAlignAndCut(string time) -{ - if (disabled) - return true; - - CAlignAndCutImage *caic = flowpostalignment->GetAlignAndCutImage(); - - for (int i = 0; i < ROI.size(); ++i) - { - printf("Analog %d - Align&Cut\n", i); - - caic->CutAndSave(ROI[i]->posx, ROI[i]->posy, ROI[i]->deltax, ROI[i]->deltay, ROI[i]->image_org); - if (SaveAllFiles) ROI[i]->image_org->SaveToFile(FormatFileName("/sdcard/img_tmp/" + ROI[i]->name + ".jpg")); - - ROI[i]->image_org->Resize(modelxsize, modelysize, ROI[i]->image); - if (SaveAllFiles) ROI[i]->image->SaveToFile(FormatFileName("/sdcard/img_tmp/" + ROI[i]->name + ".bmp")); - } - - return true; -} - -void ClassFlowAnalog::DrawROI(CImageBasis *_zw) -{ - int r = 0; - int g = 255; - int b = 0; - - for (int i = 0; i < ROI.size(); ++i) - { - _zw->drawRect(ROI[i]->posx, ROI[i]->posy, ROI[i]->deltax, ROI[i]->deltay, r, g, b, 1); - _zw->drawCircle((int) (ROI[i]->posx + ROI[i]->deltax/2), (int) (ROI[i]->posy + ROI[i]->deltay/2), (int) (ROI[i]->deltax/2), r, g, b, 2); - _zw->drawLine((int) (ROI[i]->posx + ROI[i]->deltax/2), (int) ROI[i]->posy, (int) (ROI[i]->posx + ROI[i]->deltax/2), (int) (ROI[i]->posy + ROI[i]->deltay), r, g, b, 2); - _zw->drawLine((int) ROI[i]->posx, (int) (ROI[i]->posy + ROI[i]->deltay/2), (int) ROI[i]->posx + ROI[i]->deltax, (int) (ROI[i]->posy + ROI[i]->deltay/2), r, g, b, 2); - } -} - -bool ClassFlowAnalog::doNeuralNetwork(string time) -{ - if (disabled) - return true; - - string logPath = CreateLogFolder(time); - - string input = "/sdcard/img_tmp/alg.jpg"; - string ioresize = "/sdcard/img_tmp/resize.bmp"; - string output; - input = FormatFileName(input); - -#ifndef OHNETFLITE - CTfLiteClass *tflite = new CTfLiteClass; - string zwcnn = "/sdcard" + cnnmodelfile; - zwcnn = FormatFileName(zwcnn); - printf(zwcnn.c_str());printf("\n"); - tflite->LoadModel(zwcnn); - tflite->MakeAllocate(); -#endif - - for (int i = 0; i < ROI.size(); ++i) - { - printf("Analog %d - TfLite\n", i); - ioresize = "/sdcard/img_tmp/ra" + std::to_string(i) + ".bmp"; - ioresize = FormatFileName(ioresize); - - - float f1, f2; - f1 = 0; f2 = 0; - -#ifndef OHNETFLITE -// LogFile.WriteToFile("ClassFlowAnalog::doNeuralNetwork vor CNN tflite->LoadInputImage(ioresize)"); -// tflite->LoadInputImage(ioresize); - tflite->LoadInputImageBasis(ROI[i]->image); - tflite->Invoke(); - if (debugdetailanalog) LogFile.WriteToFile("Nach Invoke"); - - - f1 = tflite->GetOutputValue(0); - f2 = tflite->GetOutputValue(1); -#endif - - float result = fmod(atan2(f1, f2) / (M_PI * 2) + 2, 1); -// printf("Result sin, cos, ziffer: %f, %f, %f\n", f1, f2, result); - ROI[i]->result = result * 10; - - printf("Result Analog%i: %f\n", i, ROI[i]->result); - - if (isLogImage) - { - LogImage(logPath, ROI[i]->name, &ROI[i]->result, NULL, time, ROI[i]->image_org); - } - } -#ifndef OHNETFLITE - delete tflite; -#endif - - return true; -} - - -std::vector ClassFlowAnalog::GetHTMLInfo() -{ - std::vector result; - - for (int i = 0; i < ROI.size(); ++i) - { - HTMLInfo *zw = new HTMLInfo; - zw->filename = ROI[i]->name + ".bmp"; - zw->filename_org = ROI[i]->name + ".jpg"; - zw->val = ROI[i]->result; - zw->image = ROI[i]->image; - zw->image_org = ROI[i]->image_org; - result.push_back(zw); - } - - return result; -} - - diff --git a/code/components/jomjol_flowcontroll/ClassFlowAnalog._h_ b/code/components/jomjol_flowcontroll/ClassFlowAnalog._h_ deleted file mode 100644 index 08a29be7..00000000 --- a/code/components/jomjol_flowcontroll/ClassFlowAnalog._h_ +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include "ClassFlowImage.h" -#include "ClassFlowAlignment.h" -// #include "CTfLiteClass.h" - -struct roianalog { - int posx, posy, deltax, deltay; - float result; - CImageBasis *image, *image_org; - string name; -}; - - -class ClassFlowAnalog : - public ClassFlowImage -{ -protected: - std::vector ROI; - string cnnmodelfile; - int modelxsize, modelysize; - int ZeigerEval(float zahl, int ziffer_vorgaenger); - bool SaveAllFiles; - - - ClassFlowAlignment* flowpostalignment; - - void SetInitialParameter(void); - -public: - bool extendedResolution; - - ClassFlowAnalog(std::vector* lfc); - - bool ReadParameter(FILE* pfile, string& aktparamgraph); - bool doFlow(string time); - string getHTMLSingleStep(string host); - string getReadout(); - - void DrawROI(CImageBasis *_zw); - - bool doNeuralNetwork(string time); - bool doAlignAndCut(string time); - std::vector GetHTMLInfo(); - int AnzahlROIs(); - - string name(){return "ClassFlowAnalog";}; -}; - diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index b540e83f..d4ad7bbe 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -160,6 +160,15 @@ bool ClassFlowMQTT::doFlow(string zwtime) zw = namenumber + "timestamp"; MQTTPublish(zw, resulttimestamp); + + + std::string json="{\"value\":"+result; + json += ",\"error\":\""+resulterror; + json += "\",\"rate\":"+resultrate; + json += ",\"timestamp\":\""+resulttimestamp+"\"}"; + + zw = namenumber + "json"; + MQTTPublish(zw, json); } } else diff --git a/code/main/version.cpp b/code/main/version.cpp index 82ab68fc..4e3b07c4 100644 --- a/code/main/version.cpp +++ b/code/main/version.cpp @@ -1,4 +1,4 @@ -const char* GIT_REV="e24ba68"; +const char* GIT_REV="08b0b25"; const char* GIT_TAG=""; const char* GIT_BRANCH="rolling"; -const char* BUILD_TIME="2021-07-07 21:50"; \ No newline at end of file +const char* BUILD_TIME="2021-07-08 21:42"; \ No newline at end of file diff --git a/code/version.cpp b/code/version.cpp index 82ab68fc..4e3b07c4 100644 --- a/code/version.cpp +++ b/code/version.cpp @@ -1,4 +1,4 @@ -const char* GIT_REV="e24ba68"; +const char* GIT_REV="08b0b25"; const char* GIT_TAG=""; const char* GIT_BRANCH="rolling"; -const char* BUILD_TIME="2021-07-07 21:50"; \ No newline at end of file +const char* BUILD_TIME="2021-07-08 21:42"; \ No newline at end of file diff --git a/firmware/bootloader.bin b/firmware/bootloader.bin index 7d5a4029..c6963e7a 100644 Binary files a/firmware/bootloader.bin and b/firmware/bootloader.bin differ diff --git a/firmware/firmware.bin b/firmware/firmware.bin index 1f085a92..38df11d0 100644 Binary files a/firmware/firmware.bin and b/firmware/firmware.bin differ diff --git a/sd-card/config/config.ini b/sd-card/config/config.ini index fa1c1977..fcfeb5a5 100644 --- a/sd-card/config/config.ini +++ b/sd-card/config/config.ini @@ -29,7 +29,7 @@ main.digit2 340 120 37 67 main.digit3 389 120 37 67 [Analog] -Model = /config/ana0630s2.tflite +Model = /config/ana0700s1lq.tflite ;LogImageLocation = /log/analog ;LogfileRetentionInDays = 3 ModelInputSize = 32 32 diff --git a/sd-card/html/gethost.js b/sd-card/html/gethost.js index 0a72da08..d7a4c082 100644 --- a/sd-card/html/gethost.js +++ b/sd-card/html/gethost.js @@ -8,8 +8,8 @@ function getbasepath(){ if ((host == "127.0.0.1") || (host == "localhost")) { // host = "http://192.168.2.219"; // jomjol interner test - host = "http://192.168.178.46"; // jomjol interner test - host = "http://192.168.178.22"; // jomjol interner Real + host = "http://192.168.178.51"; // jomjol interner test +// host = "http://192.168.178.22"; // jomjol interner Real // host = "."; // jomjol interner localhost