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

Loading alignment page faster (#2868)

Da es Probleme mit param_temp gab (mal ging es, mal nicht), habe ich extra Parameter angelegt (_rotate_temp, _mirror_temp, _isize_temp, _grayscale_temp, _negative_temp, _aec2_temp, _FixedExposure_temp, _zoom_temp, _zm_temp, _x_temp, _y_temp, _intensity_temp, _brightness_temp, _contrast_temp, _saturation_temp, _sharpness_temp, _ae_temp).
Bei den bisherigen Tests, hat alles so funktioniert wie es soll.
michael 2 лет назад
Родитель
Сommit
6b38e44d7f

+ 234 - 257
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp

@@ -20,8 +20,7 @@ static const char* TAG = "CNN";
 #endif
 
 
-ClassFlowCNNGeneral::ClassFlowCNNGeneral(ClassFlowAlignment *_flowalign, t_CNNType _cnntype) : ClassFlowImage(NULL, TAG)
-{
+ClassFlowCNNGeneral::ClassFlowCNNGeneral(ClassFlowAlignment *_flowalign, t_CNNType _cnntype) : ClassFlowImage(NULL, TAG) {
     string cnnmodelfile = "";
     modelxsize = 1;
     modelysize = 1;
@@ -38,16 +37,16 @@ ClassFlowCNNGeneral::ClassFlowCNNGeneral(ClassFlowAlignment *_flowalign, t_CNNTy
 }
 
 
-string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution, int prev, float _before_narrow_Analog, float analogDigitalTransitionStart)
-{
+string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution, int prev, float _before_narrow_Analog, float analogDigitalTransitionStart) {
     string result = "";    
 
-    if (GENERAL[_analog]->ROI.size() == 0)
+    if (GENERAL[_analog]->ROI.size() == 0) {
         return result;
+    }
+    
     LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout _analog=" + std::to_string(_analog) + ", _extendedResolution=" + std::to_string(_extendedResolution) + ", prev=" + std::to_string(prev));
  
-    if (CNNType == Analogue || CNNType == Analogue100)
-    {
+    if (CNNType == Analogue || CNNType == Analogue100) {
         float number = GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float;
         int result_after_decimal_point = ((int) floor(number * 10) + 10) % 10;
         
@@ -55,37 +54,35 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
 //        LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(analog) number=" + std::to_string(number) + ", result_after_decimal_point=" + std::to_string(result_after_decimal_point) + ", prev=" + std::to_string(prev));
         result = std::to_string(prev);
 
-        if (_extendedResolution)
+        if (_extendedResolution) {
             result = result + std::to_string(result_after_decimal_point);
+        }
 
-        for (int i = GENERAL[_analog]->ROI.size() - 2; i >= 0; --i)
-        {
+        for (int i = GENERAL[_analog]->ROI.size() - 2; i >= 0; --i) {
             prev = PointerEvalAnalogNew(GENERAL[_analog]->ROI[i]->result_float, prev);
             result = std::to_string(prev) + result;
         }
         return result;
     }
 
-    if (CNNType == Digital)
-    {
-        for (int i = 0; i < GENERAL[_analog]->ROI.size(); ++i)
-        {
-            if (GENERAL[_analog]->ROI[i]->result_klasse >= 10)
+    if (CNNType == Digital) {
+        for (int i = 0; i < GENERAL[_analog]->ROI.size(); ++i) {
+            if (GENERAL[_analog]->ROI[i]->result_klasse >= 10) {
                 result = result + "N";
-            else
+            }
+            else {
                 result = result + std::to_string(GENERAL[_analog]->ROI[i]->result_klasse);
+            }
         }
         return result;
     }
 
-    if ((CNNType == DoubleHyprid10) || (CNNType == Digital100))
-    {
-
+    if ((CNNType == DoubleHyprid10) || (CNNType == Digital100)) {
         float number = GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float;
-        if (number >= 0)       // NaN?
-        {
-            if (_extendedResolution)            // is only set if it is the first digit (no analogue before!)
-            {
+        // NaN?
+        if (number >= 0) {
+            // is only set if it is the first digit (no analogue before!)
+            if (_extendedResolution) {
                 int result_after_decimal_point = ((int) floor(number * 10)) % 10;
                 int result_before_decimal_point = ((int) floor(number)) % 10;
 
@@ -93,36 +90,32 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
                 prev = result_before_decimal_point;
                 LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(dig100-ext) result_before_decimal_point=" + std::to_string(result_before_decimal_point) + ", result_after_decimal_point=" + std::to_string(result_after_decimal_point) + ", prev=" + std::to_string(prev));
             }
-            else
-            {
-                if (_before_narrow_Analog >= 0)
+            else {
+                if (_before_narrow_Analog >= 0) {
                     prev = PointerEvalHybridNew(GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float, _before_narrow_Analog, prev, true, analogDigitalTransitionStart);
-                else
+                }
+                else {
                     prev = PointerEvalHybridNew(GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float, prev, prev);
+                }
                 result = std::to_string(prev);
                 LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(dig100)  prev=" + std::to_string(prev));
-        
             }
         }
-        else
-        {
+        else {
             result = "N";
-            if (_extendedResolution && (CNNType != Digital))
+            if (_extendedResolution && (CNNType != Digital)) {
                 result = "NN";
+            }
         }
 
-        for (int i = GENERAL[_analog]->ROI.size() - 2; i >= 0; --i)
-        {
-            if (GENERAL[_analog]->ROI[i]->result_float >= 0)
-            {
+        for (int i = GENERAL[_analog]->ROI.size() - 2; i >= 0; --i) {
+            if (GENERAL[_analog]->ROI[i]->result_float >= 0) {
                 prev = PointerEvalHybridNew(GENERAL[_analog]->ROI[i]->result_float, GENERAL[_analog]->ROI[i+1]->result_float, prev);
                 LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout#PointerEvalHybridNew()= " + std::to_string(prev));
                 result = std::to_string(prev) + result;
                 LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout#result= " + result);
-                
             }
-            else
-            {
+            else {
                 prev = -1;
                 result = "N" + result;
                 LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(result_float<0 /'N')  result_float=" + std::to_string(GENERAL[_analog]->ROI[i]->result_float));
@@ -150,14 +143,12 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
  *
  * @return int the determined number of the current ROI
  */
-int ClassFlowCNNGeneral::PointerEvalHybridNew(float number, float number_of_predecessors, int eval_predecessors, bool Analog_Predecessors, float digitalAnalogTransitionStart)
-{
+int ClassFlowCNNGeneral::PointerEvalHybridNew(float number, float number_of_predecessors, int eval_predecessors, bool Analog_Predecessors, float digitalAnalogTransitionStart) {
     int result;
     int result_after_decimal_point = ((int) floor(number * 10)) % 10;
     int result_before_decimal_point = ((int) floor(number) + 10) % 10;
 
-    if (eval_predecessors < 0)
-    {   
+    if (eval_predecessors < 0) {   
         // on first digit is no spezial logic for transition needed
         // we use the recognition as given. The result is the int value of the recognition
         // add precisition of 2 digits and round before trunc
@@ -168,37 +159,40 @@ int ClassFlowCNNGeneral::PointerEvalHybridNew(float number, float number_of_pred
         return result;
     }
 
-    if (Analog_Predecessors)
-    {
+    if (Analog_Predecessors) {
         result = PointerEvalAnalogToDigitNew(number, number_of_predecessors, eval_predecessors, digitalAnalogTransitionStart);
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalHybridNew - Analog predecessor, evaluation over PointerEvalAnalogNew = " + std::to_string(result) +
                                                     " number: " + std::to_string(number) + " number_of_predecessors = " + std::to_string(number_of_predecessors)+ " eval_predecessors = " + std::to_string(eval_predecessors) + " Digital_Uncertainty = " +  std::to_string(Digital_Uncertainty));
         return result;
     }
 
-    if ((number_of_predecessors >= Digital_Transition_Area_Predecessor ) && (number_of_predecessors <= (10.0 - Digital_Transition_Area_Predecessor)))
-    {
+    if ((number_of_predecessors >= Digital_Transition_Area_Predecessor ) && (number_of_predecessors <= (10.0 - Digital_Transition_Area_Predecessor))) {
         // no digit change, because predecessor is far enough away (0+/-DigitalTransitionRangePredecessor) --> number is rounded
-        if ((result_after_decimal_point <= DigitalBand) || (result_after_decimal_point >= (10-DigitalBand)))     // Band around the digit --> Round off, as digit reaches inaccuracy in the frame
+        // Band around the digit --> Round off, as digit reaches inaccuracy in the frame
+        if ((result_after_decimal_point <= DigitalBand) || (result_after_decimal_point >= (10-DigitalBand))) {
             result = ((int) round(number) + 10) % 10;
-        else
+        }
+        else {
             result = ((int) trunc(number) + 10) % 10;
+        }
 
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalHybridNew - NO analogue predecessor, no change of digits, as pre-decimal point far enough away = " + std::to_string(result) +
                                                     " number: " + std::to_string(number) + " number_of_predecessors = " + std::to_string(number_of_predecessors)+ " eval_predecessors = " + std::to_string(eval_predecessors) + " Digital_Uncertainty = " +  std::to_string(Digital_Uncertainty));
         return result;
     }  
 
-    if (eval_predecessors <= 1)  // Zero crossing at the predecessor has taken place (! evaluation via Prev_value and not number!) --> round up here (2.8 --> 3, but also 3.1 --> 3)
-    {
+    // Zero crossing at the predecessor has taken place (! evaluation via Prev_value and not number!) --> round up here (2.8 --> 3, but also 3.1 --> 3)
+    if (eval_predecessors <= 1) {
         // We simply assume that the current digit after the zero crossing of the predecessor
         // has passed through at least half (x.5)
-        if (result_after_decimal_point > 5)
+        if (result_after_decimal_point > 5) {
             // The current digit does not yet have a zero crossing, but the predecessor does..
             result =  (result_before_decimal_point + 1) % 10;
-        else
+        }
+        else {
             // Act. digit and predecessor have zero crossing
             result =  result_before_decimal_point % 10;
+        }
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalHybridNew - NO analogue predecessor, zero crossing has taken placen = " + std::to_string(result) +
                                                     " number: " + std::to_string(number) + " number_of_predecessors = " + std::to_string(number_of_predecessors)+ " eval_predecessors = " + std::to_string(eval_predecessors) + " Digital_Uncertainty = " +  std::to_string(Digital_Uncertainty));
         return result;
@@ -210,13 +204,15 @@ int ClassFlowCNNGeneral::PointerEvalHybridNew(float number, float number_of_pred
     // everything >=x.4 can be considered as current number in transition. With 9.x predecessor the current
     // number can still be x.6 - x.7. 
     // Preceding (else - branch) does not already happen from 9.
-    if (Digital_Transition_Area_Forward>=number_of_predecessors || result_after_decimal_point >= 4)
+    if (Digital_Transition_Area_Forward>=number_of_predecessors || result_after_decimal_point >= 4) {
         // The current digit, like the previous digit, does not yet have a zero crossing. 
         result =  result_before_decimal_point % 10;
-    else
+    }
+    else {
         // current digit precedes the smaller digit (9.x). So already >=x.0 while the previous digit has not yet
         // has no zero crossing. Therefore, it is reduced by 1.
         result =  (result_before_decimal_point - 1 + 10) % 10;
+    }
 
     LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalHybridNew - O analogue predecessor, >= 9.5 --> no zero crossing yet = " + std::to_string(result) +
                                                 " number: " + std::to_string(number) + " number_of_predecessors = " + std::to_string(number_of_predecessors)+ " eval_predecessors = " + std::to_string(eval_predecessors) + " Digital_Uncertainty = " +  std::to_string(Digital_Uncertainty) + " result_after_decimal_point = " + std::to_string(result_after_decimal_point));
@@ -224,8 +220,7 @@ int ClassFlowCNNGeneral::PointerEvalHybridNew(float number, float number_of_pred
 }
 
 
-int ClassFlowCNNGeneral::PointerEvalAnalogToDigitNew(float number, float numeral_preceder,  int eval_predecessors, float analogDigitalTransitionStart)
-{
+int ClassFlowCNNGeneral::PointerEvalAnalogToDigitNew(float number, float numeral_preceder,  int eval_predecessors, float analogDigitalTransitionStart) {
     int result;
     int result_after_decimal_point = ((int) floor(number * 10)) % 10;
     int result_before_decimal_point = ((int) floor(number) + 10) % 10;
@@ -243,7 +238,8 @@ int ClassFlowCNNGeneral::PointerEvalAnalogToDigitNew(float number, float numeral
                                                     " number: " + std::to_string(number) + " numeral_preceder: " + std::to_string(numeral_preceder) +
                                                     " erg before comma: " + std::to_string(result_before_decimal_point) + 
                                                     " erg after comma: " + std::to_string(result_after_decimal_point));
-    } else {
+    } 
+    else {
         result = (int) ((int) trunc(number) + 10) % 10;
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalogToDigitNew - NO digital Uncertainty - Result = " + std::to_string(result) +
                                                     " number: " + std::to_string(number) + " numeral_preceder = " + std::to_string(numeral_preceder));
@@ -252,28 +248,23 @@ int ClassFlowCNNGeneral::PointerEvalAnalogToDigitNew(float number, float numeral
     // No zero crossing has taken place.
     // Only eval_predecessors used because numeral_preceder could be wrong here.
     // numeral_preceder<=0.1 & eval_predecessors=9 corresponds to analogue was reset because of previous analogue that are not yet at 0.
-    if ((eval_predecessors>=6 && (numeral_preceder>analogDigitalTransitionStart || numeral_preceder<=0.2) && roundedUp))
-    {
+    if ((eval_predecessors>=6 && (numeral_preceder>analogDigitalTransitionStart || numeral_preceder<=0.2) && roundedUp)) {
         result =  ((result_before_decimal_point+10) - 1) % 10;
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalogToDigitNew - Nulldurchgang noch nicht stattgefunden = " + std::to_string(result) +
                                     " number: " + std::to_string(number) + 
                                     " numeral_preceder = " + std::to_string(numeral_preceder) + 
                                     " eerg after comma = " +  std::to_string(result_after_decimal_point));
-
     }
 
     return result;
-
 }
 
 
-int ClassFlowCNNGeneral::PointerEvalAnalogNew(float number, int numeral_preceder)
-{
+int ClassFlowCNNGeneral::PointerEvalAnalogNew(float number, int numeral_preceder) {
     float number_min, number_max;
     int result;
 
-    if (numeral_preceder == -1)
-    {
+    if (numeral_preceder == -1) {
         result = (int) floor(number);
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalogNew - No predecessor - Result = " + std::to_string(result) +
                                                     " number: " + std::to_string(number) + " numeral_preceder = " + std::to_string(numeral_preceder) + " Analog_error = " +  std::to_string(Analog_error));
@@ -283,17 +274,14 @@ int ClassFlowCNNGeneral::PointerEvalAnalogNew(float number, int numeral_preceder
     number_min = number - Analog_error / 10.0;
     number_max = number + Analog_error / 10.0;
 
-    if ((int) floor(number_max) - (int) floor(number_min) != 0)
-    {
-        if (numeral_preceder <= Analog_error)
-        {
+    if ((int) floor(number_max) - (int) floor(number_min) != 0) {
+        if (numeral_preceder <= Analog_error) {
             result = ((int) floor(number_max) + 10) % 10;
             LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalogNew - number ambiguous, correction upwards - result = " + std::to_string(result) +
                                                         " number: " + std::to_string(number) + " numeral_preceder = " + std::to_string(numeral_preceder) + " Analog_error = " +  std::to_string(Analog_error));
             return result;
         }
-        if (numeral_preceder >= 10 - Analog_error)
-        {
+        if (numeral_preceder >= 10 - Analog_error) {
             result = ((int) floor(number_min) + 10) % 10;
             LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalogNew - number ambiguous, downward correction - result = " + std::to_string(result) +
                                                         " number: " + std::to_string(number) + " numeral_preceder = " + std::to_string(numeral_preceder) + " Analog_error = " +  std::to_string(Analog_error));
@@ -301,7 +289,6 @@ int ClassFlowCNNGeneral::PointerEvalAnalogNew(float number, int numeral_preceder
         }
     }
     
-
     result = ((int) floor(number) + 10) % 10;
     LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalogNew - number unambiguous, no correction necessary - result = " + std::to_string(result) +
                                                 " number: " + std::to_string(number) + " numeral_preceder = " + std::to_string(numeral_preceder) + " Analog_error = " +  std::to_string(Analog_error));
@@ -310,25 +297,25 @@ int ClassFlowCNNGeneral::PointerEvalAnalogNew(float number, int numeral_preceder
 }
 
 
-bool ClassFlowCNNGeneral::ReadParameter(FILE* pfile, string& aktparamgraph)
-{
+bool ClassFlowCNNGeneral::ReadParameter(FILE* pfile, string& aktparamgraph) {
     std::vector<string> splitted;
 
     aktparamgraph = trim(aktparamgraph);
 
-    if (aktparamgraph.size() == 0)
-        if (!this->GetNextParagraph(pfile, aktparamgraph))
+    if (aktparamgraph.size() == 0) {
+        if (!this->GetNextParagraph(pfile, aktparamgraph)) {
             return false;
-
+        }
+    }
 
     if ((toUpper(aktparamgraph) != "[ANALOG]") && (toUpper(aktparamgraph) != ";[ANALOG]") 
         && (toUpper(aktparamgraph) != "[DIGIT]") && (toUpper(aktparamgraph) != ";[DIGIT]")
-        && (toUpper(aktparamgraph) != "[DIGITS]") && (toUpper(aktparamgraph) != ";[DIGITS]")
-        )       // Paragraph passt nicht
+        && (toUpper(aktparamgraph) != "[DIGITS]") && (toUpper(aktparamgraph) != ";[DIGITS]")) {      
+        // Paragraph passt nicht
         return false;
+    }
 
-    if (aktparamgraph[0] == ';')
-    {
+    if (aktparamgraph[0] == ';') {
         disabled = true;
         while (getNextLine(pfile, &aktparamgraph) && !isNewParagraph(aktparamgraph));
         ESP_LOGD(TAG, "[Analog/Digit] is disabled!");
@@ -336,36 +323,31 @@ bool ClassFlowCNNGeneral::ReadParameter(FILE* pfile, string& aktparamgraph)
     }
 
 
-    while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
-    {
+    while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph)) {
         splitted = ZerlegeZeile(aktparamgraph);
-        if ((toUpper(splitted[0]) == "ROIIMAGESLOCATION") && (splitted.size() > 1))
-        {
+        if ((toUpper(splitted[0]) == "ROIIMAGESLOCATION") && (splitted.size() > 1)) {
             this->imagesLocation = "/sdcard" + splitted[1];
             this->isLogImage = true;
         }
-        if ((toUpper(splitted[0]) == "LOGIMAGESELECT") && (splitted.size() > 1))
-        {
+        
+        if ((toUpper(splitted[0]) == "LOGIMAGESELECT") && (splitted.size() > 1)) {
             LogImageSelect = splitted[1];
             isLogImageSelect = true;            
         }
 
-        if ((toUpper(splitted[0]) == "ROIIMAGESRETENTION") && (splitted.size() > 1))
-        {
+        if ((toUpper(splitted[0]) == "ROIIMAGESRETENTION") && (splitted.size() > 1)) {
             this->imagesRetention = std::stoi(splitted[1]);
         }
 
-        if ((toUpper(splitted[0]) == "MODEL") && (splitted.size() > 1))
-        {
+        if ((toUpper(splitted[0]) == "MODEL") && (splitted.size() > 1)) {
             this->cnnmodelfile = splitted[1];
         }
         
-        if ((toUpper(splitted[0]) == "CNNGOODTHRESHOLD") && (splitted.size() > 1))
-        {
+        if ((toUpper(splitted[0]) == "CNNGOODTHRESHOLD") && (splitted.size() > 1)) {
             CNNGoodThreshold = std::stof(splitted[1]);
         }
-        if (splitted.size() >= 5)
-        {
+        
+        if (splitted.size() >= 5) {
             general* _analog = GetGENERAL(splitted[0], true);
             roi* neuroi = _analog->ROI[_analog->ROI.size()-1];
             neuroi->posx = std::stoi(splitted[1]);
@@ -373,19 +355,20 @@ bool ClassFlowCNNGeneral::ReadParameter(FILE* pfile, string& aktparamgraph)
             neuroi->deltax = std::stoi(splitted[3]);
             neuroi->deltay = std::stoi(splitted[4]);
             neuroi->CCW = false;
-            if (splitted.size() >= 6)
-            {
+            
+            if (splitted.size() >= 6) {
                 neuroi->CCW = toUpper(splitted[5]) == "TRUE";
             }
+            
             neuroi->result_float = -1;
             neuroi->image = NULL;
             neuroi->image_org = NULL;
         }
 
-        if ((toUpper(splitted[0]) == "SAVEALLFILES") && (splitted.size() > 1))
-        {
-            if (toUpper(splitted[1]) == "TRUE")
+        if ((toUpper(splitted[0]) == "SAVEALLFILES") && (splitted.size() > 1)) {
+            if (toUpper(splitted[1]) == "TRUE") {
                 SaveAllFiles = true;
+            }
         }
     }
 
@@ -396,55 +379,57 @@ bool ClassFlowCNNGeneral::ReadParameter(FILE* pfile, string& aktparamgraph)
     }
 
 
-    for (int _ana = 0; _ana < GENERAL.size(); ++_ana)
-        for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i)
-        {
+    for (int _ana = 0; _ana < GENERAL.size(); ++_ana) {
+        for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i) {
             GENERAL[_ana]->ROI[i]->image = new CImageBasis("ROI " + GENERAL[_ana]->ROI[i]->name, 
                     modelxsize, modelysize, modelchannel);
             GENERAL[_ana]->ROI[i]->image_org = new CImageBasis("ROI " + GENERAL[_ana]->ROI[i]->name + " original",
                     GENERAL[_ana]->ROI[i]->deltax, GENERAL[_ana]->ROI[i]->deltay, 3);
         }
+    }
 
     return true;
 }
 
 
-general* ClassFlowCNNGeneral::FindGENERAL(string _name_number)
-{
-    for (int i = 0; i < GENERAL.size(); ++i)
-        if (GENERAL[i]->name == _name_number)
+general* ClassFlowCNNGeneral::FindGENERAL(string _name_number) {
+    for (int i = 0; i < GENERAL.size(); ++i) {
+        if (GENERAL[i]->name == _name_number) {
             return GENERAL[i];
+        }
+    }
+    
     return NULL;
 }
 
 
-general* ClassFlowCNNGeneral::GetGENERAL(string _name, bool _create = true)
-{
+general* ClassFlowCNNGeneral::GetGENERAL(string _name, bool _create = true) {
     string _analog, _roi;
     int _pospunkt = _name.find_first_of(".");
 
-    if (_pospunkt > -1)
-    {
+    if (_pospunkt > -1) {
         _analog = _name.substr(0, _pospunkt);
         _roi = _name.substr(_pospunkt+1, _name.length() - _pospunkt - 1);
     }
-    else
-    {
+    else {
         _analog = "default";
         _roi = _name;
     }
 
     general *_ret = NULL;
 
-    for (int i = 0; i < GENERAL.size(); ++i)
-        if (GENERAL[i]->name == _analog)
+    for (int i = 0; i < GENERAL.size(); ++i) {
+        if (GENERAL[i]->name == _analog) {
             _ret = GENERAL[i];
+        }
+    }
 
-    if (!_create)         // not found and should not be created
+    // not found and should not be created
+    if (!_create) {        
         return _ret;
+    }
 
-    if (_ret == NULL)
-    {
+    if (_ret == NULL) {
         _ret = new general;
         _ret->name = _analog;
         GENERAL.push_back(_ret);
@@ -461,8 +446,7 @@ general* ClassFlowCNNGeneral::GetGENERAL(string _name, bool _create = true)
 }
 
 
-string ClassFlowCNNGeneral::getHTMLSingleStep(string host)
-{
+string ClassFlowCNNGeneral::getHTMLSingleStep(string host) {
     string result, zw;
     std::vector<HTMLInfo*> htmlinfo;
 
@@ -470,8 +454,8 @@ string ClassFlowCNNGeneral::getHTMLSingleStep(string host)
     result = result + "Analog Pointers: <p> ";
 
     htmlinfo = GetHTMLInfo();
-    for (int i = 0; i < htmlinfo.size(); ++i)
-    {
+    
+    for (int i = 0; i < htmlinfo.size(); ++i) {
         std::stringstream stream;
         stream << std::fixed << std::setprecision(1) << htmlinfo[i]->val;
         zw = stream.str();
@@ -479,15 +463,14 @@ string ClassFlowCNNGeneral::getHTMLSingleStep(string host)
         result = result + "<img src=\"" + host + "/img_tmp/" +  htmlinfo[i]->filename + "\"> " + zw;
         delete htmlinfo[i];
     }
+    
     htmlinfo.clear();         
 
     return result;
 }
 
 
-bool ClassFlowCNNGeneral::doFlow(string time)
-{
-
+bool ClassFlowCNNGeneral::doFlow(string time) {
 #ifdef HEAP_TRACING_CLASS_FLOW_CNN_GENERAL_DO_ALING_AND_CUT
     //register a buffer to record the memory trace
     ESP_ERROR_CHECK( heap_trace_init_standalone(trace_record, NUM_RECORDS) );
@@ -495,8 +478,9 @@ bool ClassFlowCNNGeneral::doFlow(string time)
     ESP_ERROR_CHECK( heap_trace_start(HEAP_TRACE_LEAKS) );
 #endif
 
-    if (disabled)
+    if (disabled) {
       return true;
+    }
 
     if (!doAlignAndCut(time)){
         return false;
@@ -517,79 +501,80 @@ bool ClassFlowCNNGeneral::doFlow(string time)
 }
 
 
-bool ClassFlowCNNGeneral::doAlignAndCut(string time)
-{
-    if (disabled)
+bool ClassFlowCNNGeneral::doAlignAndCut(string time) {
+    if (disabled) {
         return true;
+    }
 
     CAlignAndCutImage *caic = flowpostalignment->GetAlignAndCutImage();    
 
-    for (int _ana = 0; _ana < GENERAL.size(); ++_ana)
-        for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i)
-        {
+    for (int _ana = 0; _ana < GENERAL.size(); ++_ana) {
+        for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i) {
             ESP_LOGD(TAG, "General %d - Align&Cut", i);
             
             caic->CutAndSave(GENERAL[_ana]->ROI[i]->posx, GENERAL[_ana]->ROI[i]->posy, GENERAL[_ana]->ROI[i]->deltax, GENERAL[_ana]->ROI[i]->deltay, GENERAL[_ana]->ROI[i]->image_org);
-            if (SaveAllFiles)
-            {
-                if (GENERAL[_ana]->name == "default")
+            if (SaveAllFiles) {
+                if (GENERAL[_ana]->name == "default") {
                     GENERAL[_ana]->ROI[i]->image_org->SaveToFile(FormatFileName("/sdcard/img_tmp/" + GENERAL[_ana]->ROI[i]->name + ".jpg"));
-                else
+                }
+                else {
                     GENERAL[_ana]->ROI[i]->image_org->SaveToFile(FormatFileName("/sdcard/img_tmp/" + GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name + ".jpg"));
+                }
             } 
 
             GENERAL[_ana]->ROI[i]->image_org->Resize(modelxsize, modelysize, GENERAL[_ana]->ROI[i]->image);
-            if (SaveAllFiles)
-            {
-                if (GENERAL[_ana]->name == "default")
+            if (SaveAllFiles) {
+                if (GENERAL[_ana]->name == "default") {
                     GENERAL[_ana]->ROI[i]->image->SaveToFile(FormatFileName("/sdcard/img_tmp/" + GENERAL[_ana]->ROI[i]->name + ".jpg"));
-                else
+                }
+                else {
                     GENERAL[_ana]->ROI[i]->image->SaveToFile(FormatFileName("/sdcard/img_tmp/" + GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name + ".jpg"));
+                }
             } 
         }
+    }
 
     return true;
 } 
 
 
-void ClassFlowCNNGeneral::DrawROI(CImageBasis *_zw)
-{
-    if (_zw->ImageOkay()) 
-    { 
-        if (CNNType == Analogue || CNNType == Analogue100)
-        {
+void ClassFlowCNNGeneral::DrawROI(CImageBasis *_zw) {
+    if (_zw->ImageOkay()) { 
+        if (CNNType == Analogue || CNNType == Analogue100) {
             int r = 0;
             int g = 255;
             int b = 0;
 
-            for (int _ana = 0; _ana < GENERAL.size(); ++_ana)
-                for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i)
-                {
+            for (int _ana = 0; _ana < GENERAL.size(); ++_ana) {
+                for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i) {
                     _zw->drawRect(GENERAL[_ana]->ROI[i]->posx, GENERAL[_ana]->ROI[i]->posy, GENERAL[_ana]->ROI[i]->deltax, GENERAL[_ana]->ROI[i]->deltay, r, g, b, 1);
                     _zw->drawEllipse( (int) (GENERAL[_ana]->ROI[i]->posx + GENERAL[_ana]->ROI[i]->deltax/2), (int)  (GENERAL[_ana]->ROI[i]->posy + GENERAL[_ana]->ROI[i]->deltay/2), (int) (GENERAL[_ana]->ROI[i]->deltax/2), (int) (GENERAL[_ana]->ROI[i]->deltay/2), r, g, b, 2);
                     _zw->drawLine((int) (GENERAL[_ana]->ROI[i]->posx + GENERAL[_ana]->ROI[i]->deltax/2), (int) GENERAL[_ana]->ROI[i]->posy, (int) (GENERAL[_ana]->ROI[i]->posx + GENERAL[_ana]->ROI[i]->deltax/2), (int) (GENERAL[_ana]->ROI[i]->posy + GENERAL[_ana]->ROI[i]->deltay), r, g, b, 2);
                     _zw->drawLine((int) GENERAL[_ana]->ROI[i]->posx, (int) (GENERAL[_ana]->ROI[i]->posy + GENERAL[_ana]->ROI[i]->deltay/2), (int) GENERAL[_ana]->ROI[i]->posx + GENERAL[_ana]->ROI[i]->deltax, (int) (GENERAL[_ana]->ROI[i]->posy + GENERAL[_ana]->ROI[i]->deltay/2), r, g, b, 2);
                 }
+            }
         }
-        else
-        {
-            for (int _dig = 0; _dig < GENERAL.size(); ++_dig)
-                for (int i = 0; i < GENERAL[_dig]->ROI.size(); ++i)
+        else {
+            for (int _dig = 0; _dig < GENERAL.size(); ++_dig) {
+                for (int i = 0; i < GENERAL[_dig]->ROI.size(); ++i) {
                     _zw->drawRect(GENERAL[_dig]->ROI[i]->posx, GENERAL[_dig]->ROI[i]->posy, GENERAL[_dig]->ROI[i]->deltax, GENERAL[_dig]->ROI[i]->deltay, 0, 0, (255 - _dig*100), 2);
+                }
+            }
         }
     }
 } 
 
 
-bool ClassFlowCNNGeneral::getNetworkParameter()
-{
-    if (disabled)
+bool ClassFlowCNNGeneral::getNetworkParameter() {
+    if (disabled) {
         return true;
+    }
 
     CTfLiteClass *tflite = new CTfLiteClass;  
     string zwcnn = "/sdcard" + cnnmodelfile;
     zwcnn = FormatFileName(zwcnn);
     ESP_LOGD(TAG, "%s", zwcnn.c_str());
+    
     if (!tflite->LoadModel(zwcnn)) {
         LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Can't load tflite model " + cnnmodelfile + " -> Init aborted!");
         LogFile.WriteHeapInfo("getNetworkParameter-LoadModel");
@@ -604,16 +589,14 @@ bool ClassFlowCNNGeneral::getNetworkParameter()
         return false;
     }
 
-    if (CNNType == AutoDetect)
-    {
+    if (CNNType == AutoDetect) {
         tflite->GetInputDimension(false);
         modelxsize = tflite->ReadInputDimenstion(0);
         modelysize = tflite->ReadInputDimenstion(1);
         modelchannel = tflite->ReadInputDimenstion(2);
 
         int _anzoutputdimensions = tflite->GetAnzOutPut();
-        switch (_anzoutputdimensions) 
-        {
+        switch (_anzoutputdimensions) {
             case 2:
                 CNNType = Analogue;
                 ESP_LOGD(TAG, "TFlite-Type set to Analogue");
@@ -639,7 +622,8 @@ bool ClassFlowCNNGeneral::getNetworkParameter()
                 if (modelxsize==32 && modelysize == 32) {
                     CNNType = Analogue100;
                     ESP_LOGD(TAG, "TFlite-Type set to Analogue100");
-                } else {
+                } 
+                else {
                     CNNType = Digital100;
                     ESP_LOGD(TAG, "TFlite-Type set to Digital");
                 }
@@ -654,10 +638,10 @@ bool ClassFlowCNNGeneral::getNetworkParameter()
 }
 
 
-bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
-{
-    if (disabled)
+bool ClassFlowCNNGeneral::doNeuralNetwork(string time) {
+    if (disabled) {
         return true;
+    }
 
     string logPath = CreateLogFolder(time);
 
@@ -680,11 +664,11 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
         return false;
     }
 
-    for (int n = 0; n < GENERAL.size(); ++n) // For each NUMBER
-    {
+    // For each NUMBER
+    for (int n = 0; n < GENERAL.size(); ++n) {
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Processing Number '" + GENERAL[n]->name + "'");
-        for (int roi = 0; roi < GENERAL[n]->ROI.size(); ++roi) // For each ROI
-        {
+        // For each ROI
+        for (int roi = 0; roi < GENERAL[n]->ROI.size(); ++roi) {
             LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ROI #" + std::to_string(roi) + " - TfLite");
             //ESP_LOGD(TAG, "General %d - TfLite", i);
 
@@ -703,14 +687,17 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
                         f2 = tflite->GetOutputValue(1);
                         float result = fmod(atan2(f1, f2) / (M_PI * 2) + 2, 1);
                               
-                        if(GENERAL[n]->ROI[roi]->CCW)
+                        if(GENERAL[n]->ROI[roi]->CCW) {
                             GENERAL[n]->ROI[roi]->result_float = 10 - (result * 10);
-                        else
+                        }
+                        else {
                             GENERAL[n]->ROI[roi]->result_float = result * 10;
+                        }
                               
                         ESP_LOGD(TAG, "General result (Analog)%i - CCW: %d -  %f", roi, GENERAL[n]->ROI[roi]->CCW, GENERAL[n]->ROI[roi]->result_float);
-                        if (isLogImage)
+                        if (isLogImage) {
                             LogImage(logPath, GENERAL[n]->ROI[roi]->name, &GENERAL[n]->ROI[roi]->result_float, NULL, time, GENERAL[n]->ROI[roi]->image_org);
+                        }
                     } break;
 
                 case Digital:
@@ -720,22 +707,19 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
                         GENERAL[n]->ROI[roi]->result_klasse = tflite->GetClassFromImageBasis(GENERAL[n]->ROI[roi]->image);
                         ESP_LOGD(TAG, "General result (Digit)%i: %d", roi, GENERAL[n]->ROI[roi]->result_klasse);
 
-                        if (isLogImage)
-                        {
+                        if (isLogImage) {
                             string _imagename = GENERAL[n]->name +  "_" + GENERAL[n]->ROI[roi]->name;
-                            if (isLogImageSelect)
-                            {
-                                if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos)
+                            if (isLogImageSelect) {
+                                if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos) {
                                     LogImage(logPath, _imagename, NULL, &GENERAL[n]->ROI[roi]->result_klasse, time, GENERAL[n]->ROI[roi]->image_org);
+                                }
                             }
-                            else
-                            {
+                            else {
                                 LogImage(logPath, _imagename, NULL, &GENERAL[n]->ROI[roi]->result_klasse, time, GENERAL[n]->ROI[roi]->image_org);
                             }
                         }
                     } break;
 
-
                 case DoubleHyprid10:
                     {
                     LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: DoubleHyprid10");
@@ -758,62 +742,56 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
 
                         float result = _num;
 
-                        if (_valplus > _valminus)
-                        {
+                        if (_valplus > _valminus) {
                             result = result + _valplus / (_valplus + _val);
                             _fit = _val + _valplus;
                         }
-                        else
-                        {
+                        else {
                             result = result - _valminus / (_val + _valminus);
                             _fit = _val + _valminus;
-
                         }
-                        if (result >= 10)
+                        
+                        if (result >= 10) {
                             result = result - 10;
-                        if (result < 0)
+                        }
+                        
+                        if (result < 0) {
                             result = result + 10;
+                        }
 
                         string zw = "_num (p, m): " + to_string(_num) + " " + to_string(_numplus) + " " + to_string(_numminus);
                         zw = zw + " _val (p, m): " + to_string(_val) + " " + to_string(_valplus) + " " + to_string(_valminus);
                         zw = zw + " result: " + to_string(result) + " _fit: " + to_string(_fit);
                         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, zw);
 
-
                         _result_save_file = result;
 
-                        if (_fit < CNNGoodThreshold)
-                        {
+                        if (_fit < CNNGoodThreshold) {
                             GENERAL[n]->ROI[roi]->isReject = true;
                             result = -1;
                             _result_save_file+= 100;     // In case fit is not sufficient, the result should still be saved with "-10x.y".
                             string zw = "Value Rejected due to Threshold (Fit: " + to_string(_fit) + ", Threshold: " + to_string(CNNGoodThreshold) + ")";
                             LogFile.WriteToFile(ESP_LOG_WARN, TAG, zw);
                         }
-                        else
-                        {
+                        else {
                             GENERAL[n]->ROI[roi]->isReject = false;
                         }
 
-
                         GENERAL[n]->ROI[roi]->result_float = result;
                         ESP_LOGD(TAG, "Result General(Analog)%i: %f", roi, GENERAL[n]->ROI[roi]->result_float);
 
-                        if (isLogImage)
-                        {
+                        if (isLogImage) {
                             string _imagename = GENERAL[n]->name +  "_" + GENERAL[n]->ROI[roi]->name;
-                            if (isLogImageSelect)
-                            {
-                                if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos)
+                            if (isLogImageSelect) {
+                                if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos) {
                                     LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org);
+                                }
                             }
-                            else
-                            {
+                            else {
                                 LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org);
                             }
                         }
-                    }
-                    break;
+                    } break;
                 case Digital100:
                 case Analogue100:
                     {
@@ -826,28 +804,27 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
     
                         _num = tflite->GetOutClassification();
                         
-                        if(GENERAL[n]->ROI[roi]->CCW)
-                            GENERAL[n]->ROI[roi]->result_float = 10 - ((float)_num / 10.0);                              
-                        else
+                        if(GENERAL[n]->ROI[roi]->CCW) {
+                            GENERAL[n]->ROI[roi]->result_float = 10 - ((float)_num / 10.0);
+                        }
+                        else {
                             GENERAL[n]->ROI[roi]->result_float = (float)_num / 10.0;
+                        }
 
                         _result_save_file = GENERAL[n]->ROI[roi]->result_float;
-
                         
                         GENERAL[n]->ROI[roi]->isReject = false;
                         
                         ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d -  %f", roi, GENERAL[n]->ROI[roi]->CCW, GENERAL[n]->ROI[roi]->result_float);
 
-                        if (isLogImage)
-                        {
+                        if (isLogImage) {
                             string _imagename = GENERAL[n]->name +  "_" + GENERAL[n]->ROI[roi]->name;
-                            if (isLogImageSelect)
-                            {
-                                if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos)
+                            if (isLogImageSelect) {
+                                if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos) {
                                     LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org);
+                                }
                             }
-                            else
-                            {
+                            else {
                                 LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org);
                             }
                         }
@@ -866,93 +843,94 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
 }
 
 
-bool ClassFlowCNNGeneral::isExtendedResolution(int _number)
-{
-    if (CNNType == Digital)
+bool ClassFlowCNNGeneral::isExtendedResolution(int _number) {
+    if (CNNType == Digital) {
         return false;
+    }
+    
     return true;
 }
 
 
-std::vector<HTMLInfo*> ClassFlowCNNGeneral::GetHTMLInfo()
-{
+std::vector<HTMLInfo*> ClassFlowCNNGeneral::GetHTMLInfo() {
     std::vector<HTMLInfo*> result;
 
-    for (int _ana = 0; _ana < GENERAL.size(); ++_ana)
-        for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i)
-        {
+    for (int _ana = 0; _ana < GENERAL.size(); ++_ana) {
+        for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i) {
             ESP_LOGD(TAG, "Image: %d", (int) GENERAL[_ana]->ROI[i]->image);
-            if (GENERAL[_ana]->ROI[i]->image)
-            {
-                if (GENERAL[_ana]->name == "default")
+            if (GENERAL[_ana]->ROI[i]->image) {
+                if (GENERAL[_ana]->name == "default") {
                     GENERAL[_ana]->ROI[i]->image->SaveToFile(FormatFileName("/sdcard/img_tmp/" + GENERAL[_ana]->ROI[i]->name + ".jpg"));
-                else
+                }
+                else {
                     GENERAL[_ana]->ROI[i]->image->SaveToFile(FormatFileName("/sdcard/img_tmp/" + GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name + ".jpg"));
+                }
             }
 
             HTMLInfo *zw = new HTMLInfo;
-            if (GENERAL[_ana]->name == "default")
-            {
+            if (GENERAL[_ana]->name == "default") {
                 zw->filename = GENERAL[_ana]->ROI[i]->name + ".jpg";
                 zw->filename_org = GENERAL[_ana]->ROI[i]->name + ".jpg";
             }
-            else
-            {
+            else {
                 zw->filename = GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name + ".jpg";
                 zw->filename_org = GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name + ".jpg";
             }
 
-            if (CNNType == Digital)
+            if (CNNType == Digital) {
                 zw->val = GENERAL[_ana]->ROI[i]->result_klasse;
-            else
+            }
+            else {
                 zw->val = GENERAL[_ana]->ROI[i]->result_float;
+            }
+            
             zw->image = GENERAL[_ana]->ROI[i]->image;
             zw->image_org = GENERAL[_ana]->ROI[i]->image_org;
 
             result.push_back(zw);
         }
+    }
 
     return result;
 }
 
 
-int ClassFlowCNNGeneral::getNumberGENERAL()
-{
+int ClassFlowCNNGeneral::getNumberGENERAL() {
     return GENERAL.size();
 }
 
 
-string ClassFlowCNNGeneral::getNameGENERAL(int _analog)
-{
-    if (_analog < GENERAL.size())
+string ClassFlowCNNGeneral::getNameGENERAL(int _analog) {
+    if (_analog < GENERAL.size()) {
         return GENERAL[_analog]->name;
+    }
 
     return "GENERAL DOES NOT EXIST";
 }
 
 
-general* ClassFlowCNNGeneral::GetGENERAL(int _analog)
-{
-    if (_analog < GENERAL.size())
+general* ClassFlowCNNGeneral::GetGENERAL(int _analog) {
+    if (_analog < GENERAL.size()) {
         return GENERAL[_analog];
+    }
 
     return NULL;
 }
 
 
-void ClassFlowCNNGeneral::UpdateNameNumbers(std::vector<std::string> *_name_numbers)
-{
-    for (int _dig = 0; _dig < GENERAL.size(); _dig++)
-    {
+void ClassFlowCNNGeneral::UpdateNameNumbers(std::vector<std::string> *_name_numbers) {
+    for (int _dig = 0; _dig < GENERAL.size(); _dig++) {
         std::string _name = GENERAL[_dig]->name;
         bool found = false;
-        for (int i = 0; i < (*_name_numbers).size(); ++i)
-        {
-            if ((*_name_numbers)[i] == _name)
+        
+        for (int i = 0; i < (*_name_numbers).size(); ++i) {
+            if ((*_name_numbers)[i] == _name) {
                 found = true;
+            }
         }
-        if (!found)
+        if (!found) {
             (*_name_numbers).push_back(_name);
+        }
     }
 }
 
@@ -961,26 +939,25 @@ string ClassFlowCNNGeneral::getReadoutRawString(int _analog)
 {
     string rt = "";
 
-    if (_analog >= GENERAL.size() || GENERAL[_analog]==NULL || GENERAL[_analog]->ROI.size() == 0)
+    if (_analog >= GENERAL.size() || GENERAL[_analog]==NULL || GENERAL[_analog]->ROI.size() == 0) {
         return rt;
+    }
  
-    for (int i = 0; i < GENERAL[_analog]->ROI.size(); ++i)
-    {
-        if (CNNType == Analogue || CNNType == Analogue100)
-        {
+    for (int i = 0; i < GENERAL[_analog]->ROI.size(); ++i) {
+        if (CNNType == Analogue || CNNType == Analogue100) {
             rt = rt + "," + RundeOutput(GENERAL[_analog]->ROI[i]->result_float, 1);
         }
 
-        if (CNNType == Digital)
-        {
-            if (GENERAL[_analog]->ROI[i]->result_klasse == 10)
+        if (CNNType == Digital) {
+            if (GENERAL[_analog]->ROI[i]->result_klasse >= 10) {
                 rt = rt + ",N";
-            else
+            }
+            else {
                 rt = rt + "," + RundeOutput(GENERAL[_analog]->ROI[i]->result_klasse, 0);
+            }
         }
 
-        if ((CNNType == DoubleHyprid10) || (CNNType == Digital100))
-        {
+        if ((CNNType == DoubleHyprid10) || (CNNType == Digital100)) {
             rt = rt + "," + RundeOutput(GENERAL[_analog]->ROI[i]->result_float, 1);
         }
     }

+ 160 - 189
code/components/jomjol_flowcontroll/MainFlowControl.cpp

@@ -48,51 +48,45 @@ bool isPlannedReboot = false;
 
 static const char *TAG = "MAINCTRL";
 
-
 //#define DEBUG_DETAIL_ON
 
 
-void CheckIsPlannedReboot()
-{
- 	FILE *pfile;
+void CheckIsPlannedReboot() {
+    FILE *pfile;
+	
     if ((pfile = fopen("/sdcard/reboot.txt", "r")) == NULL) {
-		//LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Initial boot or not a planned reboot");
+        //LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Initial boot or not a planned reboot");
         isPlannedReboot = false;
-	}
+    }
     else {
-		LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Planned reboot");
+        LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Planned reboot");
         DeleteFile("/sdcard/reboot.txt");   // Prevent Boot Loop!!!
         isPlannedReboot = true;
-	}
+    }
 }
 
 
-bool getIsPlannedReboot() 
-{
+bool getIsPlannedReboot() {
     return isPlannedReboot;
 }
 
 
-int getCountFlowRounds() 
-{
+int getCountFlowRounds() {
     return countRounds;
 }
 
 
-esp_err_t GetJPG(std::string _filename, httpd_req_t *req)
-{
+esp_err_t GetJPG(std::string _filename, httpd_req_t *req) {
     return flowctrl.GetJPGStream(_filename, req);
 }
 
 
-esp_err_t GetRawJPG(httpd_req_t *req)
-{
+esp_err_t GetRawJPG(httpd_req_t *req) {
     return flowctrl.SendRawJPG(req);
 }
 
 
-bool isSetupModusActive() 
-{
+bool isSetupModusActive() {
     return flowctrl.getStatusSetupModus();
 }
 
@@ -102,19 +96,19 @@ void DeleteMainFlowTask()
     #ifdef DEBUG_DETAIL_ON      
         ESP_LOGD(TAG, "DeleteMainFlowTask: xHandletask_autodoFlow: %ld", (long) xHandletask_autodoFlow);
     #endif
-    if( xHandletask_autodoFlow != NULL )
-    {
+	
+    if( xHandletask_autodoFlow != NULL ) {
         vTaskDelete(xHandletask_autodoFlow);
         xHandletask_autodoFlow = NULL;
     }
+	
     #ifdef DEBUG_DETAIL_ON      
     	ESP_LOGD(TAG, "Killed: xHandletask_autodoFlow");
     #endif
 }
 
 
-void doInit(void)
-{
+void doInit() {
     #ifdef DEBUG_DETAIL_ON
         ESP_LOGD(TAG, "Start flowctrl.InitFlow(config);");
     #endif
@@ -132,8 +126,7 @@ void doInit(void)
 }
 
 
-bool doflow(void)
-{   
+bool doflow() {   
     std::string zw_time = getCurrentTimeString(LOGFILE_TIME_FORMAT);
     ESP_LOGD(TAG, "doflow - start %s", zw_time.c_str());
     flowisrunning = true;
@@ -148,8 +141,7 @@ bool doflow(void)
 }
 
 
-esp_err_t handler_get_heap(httpd_req_t *req)
-{
+esp_err_t handler_get_heap(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON      
         LogFile.WriteHeapInfo("handler_get_heap - Start");       
         ESP_LOGD(TAG, "handler_get_heap uri: %s", req->uri);
@@ -172,12 +164,10 @@ esp_err_t handler_get_heap(httpd_req_t *req)
 
     httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
 
-    if (zw.length() > 0) 
-    {
+    if (zw.length() > 0) {
         httpd_resp_send(req, zw.c_str(), zw.length());
     }
-    else 
-    {
+    else {
         httpd_resp_send(req, NULL, 0);
     }
 
@@ -189,8 +179,7 @@ esp_err_t handler_get_heap(httpd_req_t *req)
 }
 
 
-esp_err_t handler_init(httpd_req_t *req)
-{
+esp_err_t handler_init(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON      
         LogFile.WriteHeapInfo("handler_init - Start");       
         ESP_LOGD(TAG, "handler_doinit uri: %s", req->uri);
@@ -213,8 +202,7 @@ esp_err_t handler_init(httpd_req_t *req)
 }
 
 
-esp_err_t handler_stream(httpd_req_t *req)
-{
+esp_err_t handler_stream(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON      
         LogFile.WriteHeapInfo("handler_stream - Start");       
         ESP_LOGD(TAG, "handler_stream uri: %s", req->uri);
@@ -224,16 +212,15 @@ esp_err_t handler_stream(httpd_req_t *req)
     char _value[10];
     bool flashlightOn = false;
 
-    if (httpd_req_get_url_query_str(req, _query, 50) == ESP_OK)
-    {
+    if (httpd_req_get_url_query_str(req, _query, 50) == ESP_OK) {
 //        ESP_LOGD(TAG, "Query: %s", _query);
-        if (httpd_query_key_value(_query, "flashlight", _value, 10) == ESP_OK)
-        {
+        if (httpd_query_key_value(_query, "flashlight", _value, 10) == ESP_OK) {
             #ifdef DEBUG_DETAIL_ON       
                 ESP_LOGD(TAG, "flashlight is found%s", _value);
             #endif
-            if (strlen(_value) > 0)
+            if (strlen(_value) > 0) {
                 flashlightOn = true;
+            }
         }
     }
 
@@ -279,20 +266,17 @@ esp_err_t handler_flow_start(httpd_req_t *req) {
 
 #ifdef ENABLE_MQTT
 esp_err_t MQTTCtrlFlowStart(std::string _topic) {
-
     #ifdef DEBUG_DETAIL_ON          
         LogFile.WriteHeapInfo("MQTTCtrlFlowStart - Start");       
     #endif
 
     ESP_LOGD(TAG, "MQTTCtrlFlowStart: topic %s", _topic.c_str());
 
-    if (autostartIsEnabled) 
-    {
+    if (autostartIsEnabled) {
         xTaskAbortDelay(xHandletask_autodoFlow); // Delay will be aborted if task is in blocked (waiting) state. If task is already running, no action
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Flow start triggered by MQTT topic " + _topic);
     }
-    else 
-    {
+    else {
         LogFile.WriteToFile(ESP_LOG_WARN, TAG, "Flow start triggered by MQTT topic " + _topic + ", but flow is not active!");
     }  
 
@@ -305,31 +289,26 @@ esp_err_t MQTTCtrlFlowStart(std::string _topic) {
 #endif //ENABLE_MQTT
 
 
-esp_err_t handler_json(httpd_req_t *req)
-{
+esp_err_t handler_json(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON       
         LogFile.WriteHeapInfo("handler_json - Start");    
     #endif
 
     ESP_LOGD(TAG, "handler_JSON uri: %s", req->uri);
     
-    if (bTaskAutoFlowCreated) 
-    {
+    if (bTaskAutoFlowCreated) {
         httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
         httpd_resp_set_type(req, "application/json");
 
         std::string zw = flowctrl.getJSON();
-        if (zw.length() > 0) 
-        {
+        if (zw.length() > 0) {
             httpd_resp_send(req, zw.c_str(), zw.length());
         }
-        else 
-        {
+        else {
             httpd_resp_send(req, NULL, 0);
         }
     }
-    else 
-    {
+    else {
         httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Flow not (yet) started: REST API /json not yet available!");
         return ESP_ERR_NOT_FOUND;
     }
@@ -342,14 +321,12 @@ esp_err_t handler_json(httpd_req_t *req)
 }
 
 
-esp_err_t handler_wasserzaehler(httpd_req_t *req)
-{
+esp_err_t handler_wasserzaehler(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON       
         LogFile.WriteHeapInfo("handler water counter - Start");    
     #endif
 
-    if (bTaskAutoFlowCreated) 
-    {
+    if (bTaskAutoFlowCreated) {
         bool _rawValue = false;
         bool _noerror = false;
         bool _all = false;
@@ -361,34 +338,30 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req)
         char _query[100];
         char _size[10];
 
-        if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK)
-        {
+        if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK) {
     //        ESP_LOGD(TAG, "Query: %s", _query);
-            if (httpd_query_key_value(_query, "all", _size, 10) == ESP_OK)
-            {
+            if (httpd_query_key_value(_query, "all", _size, 10) == ESP_OK) {
                 #ifdef DEBUG_DETAIL_ON       
                     ESP_LOGD(TAG, "all is found%s", _size);
                 #endif
                 _all = true;
             }
 
-            if (httpd_query_key_value(_query, "type", _size, 10) == ESP_OK)
-            {
+            if (httpd_query_key_value(_query, "type", _size, 10) == ESP_OK) {
                 #ifdef DEBUG_DETAIL_ON       
                     ESP_LOGD(TAG, "all is found: %s", _size);
                 #endif
                 _type = std::string(_size);
             }
 
-            if (httpd_query_key_value(_query, "rawvalue", _size, 10) == ESP_OK)
-            {
+            if (httpd_query_key_value(_query, "rawvalue", _size, 10) == ESP_OK) {
                 #ifdef DEBUG_DETAIL_ON       
                     ESP_LOGD(TAG, "rawvalue is found: %s", _size);
                 #endif
                 _rawValue = true;
             }
-            if (httpd_query_key_value(_query, "noerror", _size, 10) == ESP_OK)
-            {
+			
+            if (httpd_query_key_value(_query, "noerror", _size, 10) == ESP_OK) {
                 #ifdef DEBUG_DETAIL_ON       
                     ESP_LOGD(TAG, "noerror is found: %s", _size);
                 #endif
@@ -398,37 +371,42 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req)
 
         httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
 
-        if (_all)
-        {
+        if (_all) {
             httpd_resp_set_type(req, "text/plain");
             ESP_LOGD(TAG, "TYPE: %s", _type.c_str());
             int _intype = READOUT_TYPE_VALUE;
-            if (_type == "prevalue")
+		
+            if (_type == "prevalue") {
                 _intype = READOUT_TYPE_PREVALUE;
-            if (_type == "raw")
+            }
+		
+            if (_type == "raw") {
                 _intype = READOUT_TYPE_RAWVALUE;
-            if (_type == "error")
+            }
+		
+            if (_type == "error") {
                 _intype = READOUT_TYPE_ERROR;
-
+            }
 
             zw = flowctrl.getReadoutAll(_intype);
             ESP_LOGD(TAG, "ZW: %s", zw.c_str());
-            if (zw.length() > 0)
-                httpd_resp_send(req, zw.c_str(), zw.length()); 
+		
+            if (zw.length() > 0) {
+                httpd_resp_send(req, zw.c_str(), zw.length());
+            }
             
             return ESP_OK;
         }
 
-
         std::string *status = flowctrl.getActStatus();
         string query = std::string(_query);
     //    ESP_LOGD(TAG, "Query: %s, query.c_str());
-        if (query.find("full") != std::string::npos)
-        {
+        if (query.find("full") != std::string::npos) {
             string txt;
             txt = "<body style=\"font-family: arial\">";
 
-            if ((countRounds <= 1) && (*status != std::string("Flow finished"))) { // First round not completed yet
+            if ((countRounds <= 1) && (*status != std::string("Flow finished"))) { 
+                // First round not completed yet
                 txt += "<h3>Please wait for the first round to complete!</h3><h3>Current state: " + *status + "</h3>\n";
             }
             else {
@@ -439,15 +417,16 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req)
         }
 
         zw = flowctrl.getReadout(_rawValue, _noerror, 0);
-        if (zw.length() > 0)
+	    
+        if (zw.length() > 0) {
             httpd_resp_sendstr_chunk(req, zw.c_str()); 
+        }
 
-
-        if (query.find("full") != std::string::npos)
-        {
+        if (query.find("full") != std::string::npos) {
             string txt, zw;
 
-            if ((countRounds <= 1) && (*status != std::string("Flow finished"))) { // First round not completed yet
+            if ((countRounds <= 1) && (*status != std::string("Flow finished"))) { 
+                // First round not completed yet
                 // Nothing to do
             }
             else {
@@ -459,23 +438,26 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req)
                 std::vector<HTMLInfo*> htmlinfodig;
                 htmlinfodig = flowctrl.GetAllDigital(); 
 
-                for (int i = 0; i < htmlinfodig.size(); ++i)
-                {
-                    if (flowctrl.GetTypeDigital() == Digital)
-                    {
-                        if (htmlinfodig[i]->val == 10)
+                for (int i = 0; i < htmlinfodig.size(); ++i) {
+                    if (flowctrl.GetTypeDigital() == Digital) {
+                        if (htmlinfodig[i]->val >= 10) {
                             zw = "NaN";
-                        else
+                        }
+                        else {
                             zw = to_string((int) htmlinfodig[i]->val);
+                        }
 
                         txt += "<td style=\"width: 100px\"><h4>" + zw + "</h4><p><img src=\"/img_tmp/" +  htmlinfodig[i]->filename + "\"></p></td>\n";
                     }
-                    else
-                    {
+                    else {
                         std::stringstream stream;
                         stream << std::fixed << std::setprecision(1) << htmlinfodig[i]->val;
                         zw = stream.str();
 
+                        if (std::stod(zw) >= 10) {
+                            zw = "NaN";
+                        }
+
                         txt += "<td style=\"width: 100px\"><h4>" + zw + "</h4><p><img src=\"/img_tmp/" +  htmlinfodig[i]->filename + "\"></p></td>\n";
                     }
                     delete htmlinfodig[i];
@@ -486,31 +468,35 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req)
                 txt += "</tr></table>\n";
                 httpd_resp_sendstr_chunk(req, txt.c_str()); 
 
-
                 /* Analog ROIs */
                 txt = "<hr><h3>Recognized Analog ROIs (previous round)</h3>\n";
                 txt += "<table style=\"border-spacing: 5px\"><tr style=\"text-align: center; vertical-align: top;\">\n";
                 
                 std::vector<HTMLInfo*> htmlinfoana;
                 htmlinfoana = flowctrl.GetAllAnalog();
-                for (int i = 0; i < htmlinfoana.size(); ++i)
-                {
+		    
+                for (int i = 0; i < htmlinfoana.size(); ++i) {
                     std::stringstream stream;
                     stream << std::fixed << std::setprecision(1) << htmlinfoana[i]->val;
                     zw = stream.str();
 
+                    if (std::stod(zw) >= 10) {
+                        zw = "NaN";
+                    }			
+
                     txt += "<td style=\"width: 150px;\"><h4>" + zw + "</h4><p><img src=\"/img_tmp/" +  htmlinfoana[i]->filename + "\"></p></td>\n";
-                delete htmlinfoana[i];
+                    delete htmlinfoana[i];
                 }
+		    
                 htmlinfoana.clear();   
 
                 txt += "</tr>\n</table>\n";
                 httpd_resp_sendstr_chunk(req, txt.c_str()); 
 
-
                 /* Full Image 
                  * Only show it after the image got taken and aligned */
                 txt = "<hr><h3>Aligned Image (current round)</h3>\n";
+		    
                 if ((*status == std::string("Initialization")) || 
                     (*status == std::string("Initialization (delayed)")) || 
                     (*status == std::string("Take Image"))) {
@@ -526,8 +512,7 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req)
         /* Respond with an empty chunk to signal HTTP response completion */
         httpd_resp_sendstr_chunk(req, NULL);   
     }
-    else 
-    {
+    else {
         httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Flow not (yet) started: REST API /value not available!");
         return ESP_ERR_NOT_FOUND;
     }
@@ -540,8 +525,7 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req)
 }
 
 
-esp_err_t handler_editflow(httpd_req_t *req)
-{
+esp_err_t handler_editflow(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON       
         LogFile.WriteHeapInfo("handler_editflow - Start");       
     #endif
@@ -552,10 +536,8 @@ esp_err_t handler_editflow(httpd_req_t *req)
     char _valuechar[30];
     string _task;
 
-    if (httpd_req_get_url_query_str(req, _query, 200) == ESP_OK)
-    {
-        if (httpd_query_key_value(_query, "task", _valuechar, 30) == ESP_OK)
-        {
+    if (httpd_req_get_url_query_str(req, _query, 200) == ESP_OK) {
+        if (httpd_query_key_value(_query, "task", _valuechar, 30) == ESP_OK) {
             #ifdef DEBUG_DETAIL_ON       
                 ESP_LOGD(TAG, "task is found: %s", _valuechar);
             #endif
@@ -563,27 +545,22 @@ esp_err_t handler_editflow(httpd_req_t *req)
         }
     }  
 
-    if (_task.compare("namenumbers") == 0)
-    {
+    if (_task.compare("namenumbers") == 0) {
         ESP_LOGD(TAG, "Get NUMBER list");
         return get_numbers_file_handler(req);
     }
 
-    if (_task.compare("data") == 0)
-    {
+    if (_task.compare("data") == 0) {
         ESP_LOGD(TAG, "Get data list");
         return get_data_file_handler(req);
     }
 
-    if (_task.compare("tflite") == 0)
-    {
+    if (_task.compare("tflite") == 0) {
         ESP_LOGD(TAG, "Get tflite list");
         return get_tflite_file_handler(req);
     }
 
-
-    if (_task.compare("copy") == 0)
-    {
+    if (_task.compare("copy") == 0) {
         string in, out, zw;
 
         httpd_query_key_value(_query, "in", _valuechar, 30);
@@ -605,9 +582,7 @@ esp_err_t handler_editflow(httpd_req_t *req)
         httpd_resp_send(req, zw.c_str(), zw.length()); 
     }
 
-
-    if (_task.compare("cutref") == 0)
-    {
+    if (_task.compare("cutref") == 0) {
         string in, out, zw;
         int x, y, dx, dy;
         bool enhance = false;
@@ -643,11 +618,9 @@ esp_err_t handler_editflow(httpd_req_t *req)
             ESP_LOGD(TAG, "dy: %s", zw.c_str());
         #endif
 
-        if (httpd_query_key_value(_query, "enhance", _valuechar, 10) == ESP_OK)
-        {
+        if (httpd_query_key_value(_query, "enhance", _valuechar, 10) == ESP_OK) {
             zw = string(_valuechar);
-            if (zw.compare("true") == 0)
-            {
+            if (zw.compare("true") == 0) {
                 enhance = true;
             }
         }
@@ -665,8 +638,7 @@ esp_err_t handler_editflow(httpd_req_t *req)
             delete caic;   
 
             CImageBasis *cim = new CImageBasis("cutref", out2);
-            if (enhance)
-            {
+            if (enhance) {
                 cim->Contrast(90);
             }
 
@@ -674,8 +646,6 @@ esp_err_t handler_editflow(httpd_req_t *req)
             delete cim;        
 
             psram_deinit_shared_memory_for_take_image_step();
-
-
             zw = "CutImage Done";
         }
         else {
@@ -686,11 +656,10 @@ esp_err_t handler_editflow(httpd_req_t *req)
 
         httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
         httpd_resp_send(req, zw.c_str(), zw.length()); 
-        
     }
 
-    if (_task.compare("test_take") == 0)
-    {
+    if ((_task.compare("test_take") == 0) || (_task.compare("cam_settings") == 0)) {
+        std::string _zw = "";
         std::string _host = "";
         int bri = -100;
         int sat = -100;
@@ -739,31 +708,39 @@ esp_err_t handler_editflow(httpd_req_t *req)
         }
         if (httpd_query_key_value(_query, "gs", _valuechar, 30) == ESP_OK) {
             std::string _gr = std::string(_valuechar);
-            if (stoi(_gr) != 0)
+            if (stoi(_gr) != 0) {
                 grayscale = true;
-            else
+            }
+            else {
                 grayscale = false;
+            }
         }
         if (httpd_query_key_value(_query, "ne", _valuechar, 30) == ESP_OK) {
             std::string _ne = std::string(_valuechar);
-            if (stoi(_ne) != 0)
+            if (stoi(_ne) != 0) {
                 negative = true;
-            else
+            }
+            else {
                 negative = false;
+            }				
         }
         if (httpd_query_key_value(_query, "a2", _valuechar, 30) == ESP_OK) {
             std::string _a2 = std::string(_valuechar);
-            if (stoi(_a2) != 0)
+            if (stoi(_a2) != 0) {
                 aec2 = true;
-            else
+            }				
+            else {
                 aec2 = false;
+            }				
         }
         if (httpd_query_key_value(_query, "z", _valuechar, 30) == ESP_OK) {
             std::string _zoom = std::string(_valuechar);
-            if (stoi(_zoom) != 0)
+            if (stoi(_zoom) != 0) {
                 zoom = true;
-            else
+            }				
+            else {
                 zoom = false;
+            }		
         }
         if (httpd_query_key_value(_query, "zm", _valuechar, 30) == ESP_OK) {
             std::string _zm = std::string(_valuechar);
@@ -783,15 +760,24 @@ esp_err_t handler_editflow(httpd_req_t *req)
         Camera.SetZoom(zoom, zoommode, zoomoffsetx, zoomoffsety);
         Camera.SetBrightnessContrastSaturation(bri, con, sat, aelevel, grayscale, negative, aec2, sharpnessLevel);
         Camera.SetLEDIntensity(intens);
-        ESP_LOGD(TAG, "test_take - vor TakeImage");
-        std::string zw = flowctrl.doSingleStep("[TakeImage]", _host);
-        httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
-        httpd_resp_send(req, zw.c_str(), zw.length()); 
-    } 
 
+        if (_task.compare("cam_settings") == 0)
+        {
+            ESP_LOGD(TAG, "Cam Settings set");
+            _zw = "Cam Settings set";
+        }
 
-    if (_task.compare("test_align") == 0)
-    {
+        else
+        {
+            ESP_LOGD(TAG, "test_take - vor TakeImage");
+            _zw = flowctrl.doSingleStep("[TakeImage]", _host);
+        }
+		
+        httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
+        httpd_resp_send(req, _zw.c_str(), _zw.length()); 
+    } 
+	
+    if (_task.compare("test_align") == 0) {
         std::string _host = "";
         if (httpd_query_key_value(_query, "host", _valuechar, 30) == ESP_OK) {
             _host = std::string(_valuechar);
@@ -812,8 +798,7 @@ esp_err_t handler_editflow(httpd_req_t *req)
 }
 
 
-esp_err_t handler_statusflow(httpd_req_t *req)
-{
+esp_err_t handler_statusflow(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON       
         LogFile.WriteHeapInfo("handler_statusflow - Start");       
     #endif
@@ -821,8 +806,7 @@ esp_err_t handler_statusflow(httpd_req_t *req)
     const char* resp_str;
     httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
 
-    if (bTaskAutoFlowCreated) 
-    {
+    if (bTaskAutoFlowCreated)  {
         #ifdef DEBUG_DETAIL_ON       
             ESP_LOGD(TAG, "handler_statusflow: %s", req->uri);
         #endif
@@ -832,8 +816,7 @@ esp_err_t handler_statusflow(httpd_req_t *req)
 
         httpd_resp_send(req, resp_str, HTTPD_RESP_USE_STRLEN);   
     }
-    else 
-    {
+    else  {
         resp_str = "Flow task not yet created";
         httpd_resp_send(req, resp_str, HTTPD_RESP_USE_STRLEN);  
     }
@@ -846,8 +829,7 @@ esp_err_t handler_statusflow(httpd_req_t *req)
 }
 
 
-esp_err_t handler_cputemp(httpd_req_t *req)
-{
+esp_err_t handler_cputemp(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON       
         LogFile.WriteHeapInfo("handler_cputemp - Start");       
     #endif
@@ -863,19 +845,16 @@ esp_err_t handler_cputemp(httpd_req_t *req)
 }
 
 
-esp_err_t handler_rssi(httpd_req_t *req)
-{
+esp_err_t handler_rssi(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON       
         LogFile.WriteHeapInfo("handler_rssi - Start");       
     #endif
 
-    if (getWIFIisConnected()) 
-    {
+    if (getWIFIisConnected()) {
         httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
         httpd_resp_send(req, std::to_string(get_WIFI_RSSI()).c_str(), HTTPD_RESP_USE_STRLEN);
     }
-    else 
-    {
+    else {
         httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "WIFI not (yet) connected: REST API /rssi not available!");
         return ESP_ERR_NOT_FOUND;
     }      
@@ -888,9 +867,7 @@ esp_err_t handler_rssi(httpd_req_t *req)
 }
 
 
-esp_err_t handler_uptime(httpd_req_t *req)
-{
-
+esp_err_t handler_uptime(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON       
         LogFile.WriteHeapInfo("handler_uptime - Start");       
     #endif
@@ -908,8 +885,7 @@ esp_err_t handler_uptime(httpd_req_t *req)
 }
 
 
-esp_err_t handler_prevalue(httpd_req_t *req)
-{
+esp_err_t handler_prevalue(httpd_req_t *req) {
     #ifdef DEBUG_DETAIL_ON       
         LogFile.WriteHeapInfo("handler_prevalue - Start");          
         ESP_LOGD(TAG, "handler_prevalue: %s", req->uri);
@@ -938,7 +914,8 @@ esp_err_t handler_prevalue(httpd_req_t *req)
             ESP_LOGD(TAG, "Query: %s", _query);
         #endif
 
-        if (httpd_query_key_value(_query, "numbers", _numbersname, 50) != ESP_OK) { // If request is incomplete
+        if (httpd_query_key_value(_query, "numbers", _numbersname, 50) != ESP_OK) { 
+            // If request is incomplete
             sReturnMessage = "E91: Query parameter incomplete or not valid!<br> "
                              "Call /setPreValue to show REST API usage info and/or check documentation";
             httpd_resp_send(req, sReturnMessage.c_str(), sReturnMessage.length());
@@ -951,12 +928,14 @@ esp_err_t handler_prevalue(httpd_req_t *req)
             #endif
         }
     }
-    else {  // if no parameter is provided, print handler usage
+    else {  
+        // if no parameter is provided, print handler usage
         httpd_resp_send(req, RESTUsageInfo.c_str(), RESTUsageInfo.length());
         return ESP_OK; 
     }   
 
-    if (strlen(_value) == 0) { // If no value is povided --> return actual PreValue
+    if (strlen(_value) == 0) { 
+        // If no value is povided --> return actual PreValue
         sReturnMessage = flowctrl.GetPrevalue(std::string(_numbersname));
 
         if (sReturnMessage.empty()) {
@@ -995,14 +974,12 @@ esp_err_t handler_prevalue(httpd_req_t *req)
 }
 
 
-void task_autodoFlow(void *pvParameter)
-{
+void task_autodoFlow(void *pvParameter) {
     int64_t fr_start, fr_delta_ms;
 
     bTaskAutoFlowCreated = true;
 
-    if (!isPlannedReboot && (esp_reset_reason() == ESP_RST_PANIC))
-    {
+    if (!isPlannedReboot && (esp_reset_reason() == ESP_RST_PANIC)) {
         flowctrl.setActStatus("Initialization (delayed)");
         //#ifdef ENABLE_MQTT
             //MQTTPublish(mqttServer_getMainTopic() + "/" + "status", "Initialization (delayed)", false); // Right now, not possible -> MQTT Service is going to be started later
@@ -1016,8 +993,7 @@ void task_autodoFlow(void *pvParameter)
     flowctrl.setAutoStartInterval(auto_interval);
     autostartIsEnabled = flowctrl.getIsAutoStart();
 
-    if (isSetupModusActive()) 
-    {
+    if (isSetupModusActive()) {
         LogFile.WriteToFile(ESP_LOG_INFO, TAG, "We are in Setup Mode -> Not starting Auto Flow!");
         autostartIsEnabled = false;
         std::string zw_time = getCurrentTimeString(LOGFILE_TIME_FORMAT);
@@ -1031,22 +1007,19 @@ void task_autodoFlow(void *pvParameter)
         LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Autostart is not enabled -> Not starting Flow");
     }
     
-    while (autostartIsEnabled)
-    {
+    while (autostartIsEnabled) {
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "----------------------------------------------------------------"); // Clear separation between runs
         std::string _zw = "Round #" + std::to_string(++countRounds) + " started";
         time_t roundStartTime = getUpTime();
         LogFile.WriteToFile(ESP_LOG_INFO, TAG, _zw); 
         fr_start = esp_timer_get_time();
 
-        if (flowisrunning)
-        {
+        if (flowisrunning) {
             #ifdef DEBUG_DETAIL_ON       
                 ESP_LOGD(TAG, "Autoflow: doFlow is already running!");
             #endif
         }
-        else
-        {
+        else {
             #ifdef DEBUG_DETAIL_ON       
                 ESP_LOGD(TAG, "Autoflow: doFlow is started");
             #endif
@@ -1086,16 +1059,16 @@ void task_autodoFlow(void *pvParameter)
         #endif
         
         fr_delta_ms = (esp_timer_get_time() - fr_start) / 1000;
-        if (auto_interval > fr_delta_ms)
-        {
+	    
+        if (auto_interval > fr_delta_ms) {
             const TickType_t xDelay = (auto_interval - fr_delta_ms)  / portTICK_PERIOD_MS;
             ESP_LOGD(TAG, "Autoflow: sleep for: %ldms", (long) xDelay);
             vTaskDelay( xDelay );        
         }
     }
 
-    while(1) // Keep flow task running to handle necessary sub tasks like reboot handler, etc..
-    {
+    while(1) {
+        // Keep flow task running to handle necessary sub tasks like reboot handler, etc..
         vTaskDelay(2000 / portTICK_PERIOD_MS); 
     }
 
@@ -1105,25 +1078,24 @@ void task_autodoFlow(void *pvParameter)
 }
 
 
-void InitializeFlowTask()
-{
+void InitializeFlowTask() {
     BaseType_t xReturned;
 
     ESP_LOGD(TAG, "getESPHeapInfo: %s", getESPHeapInfo().c_str());
 
     uint32_t stackSize = 16 * 1024;
     xReturned = xTaskCreatePinnedToCore(&task_autodoFlow, "task_autodoFlow", stackSize, NULL, tskIDLE_PRIORITY+2, &xHandletask_autodoFlow, 0);
-    if( xReturned != pdPASS )
-    {
+	
+    if( xReturned != pdPASS ) {
         LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Creation task_autodoFlow failed. Requested stack size:" + std::to_string(stackSize));
         LogFile.WriteHeapInfo("Creation task_autodoFlow failed");
     }
+	
     ESP_LOGD(TAG, "getESPHeapInfo: %s", getESPHeapInfo().c_str());
 }
 
 
-void register_server_main_flow_task_uri(httpd_handle_t server)
-{
+void register_server_main_flow_task_uri(httpd_handle_t server) {
     ESP_LOGI(TAG, "server_main_flow_task - Registering URI handlers");
     
     httpd_uri_t camuri = { };
@@ -1223,5 +1195,4 @@ void register_server_main_flow_task_uri(httpd_handle_t server)
     camuri.handler   = handler_stream;
     camuri.user_ctx  = (void*) "stream"; 
     httpd_register_uri_handler(server, &camuri);
-
 }

+ 290 - 234
sd-card/html/edit_alignment.html

@@ -162,37 +162,63 @@
 <script type="text/javascript" src="readconfigparam.js?v=$COMMIT_HASH"></script>  
 
 <script language="JavaScript">
-        var canvas = document.getElementById('canvas'),
-            ctx = canvas.getContext('2d'),
-            imageObj = new Image(),
-            rect = {},
-            drag = false,
-            aktindex = 0,
-            refInfo,
-            enhanceCon = false,
-            param;
-            domainname = getDomainname();
-            param;
+var canvas = document.getElementById('canvas'),
+	ctx = canvas.getContext('2d'),
+    imageObj = new Image(),
+    rect = {},
+    drag = false,
+    aktindex = 0,
+    refInfo,
+    enhanceCon = false,
+    domainname = getDomainname(),
+	neueref1,
+	neueref2,
+    param;
     
 function doReboot() {
-    if (confirm("Are you sure you want to reboot? Did you save your changes?")) {
-            var stringota = getDomainname() + "/reboot";
-            window.location = stringota;
-            window.location.href = stringota;
-            window.location.assign(stringota);
-            window.location.replace(stringota);
+	if (confirm("Are you sure you want to reboot? Did you save your changes?")) {
+        var stringota = getDomainname() + "/reboot";
+        window.location = stringota;
+        window.location.href = stringota;
+        window.location.assign(stringota);
+        window.location.replace(stringota);
     }
 }
     
 function ChangeSelection(){
     aktindex = parseInt(document.getElementById("index").value);
-    UpdateReference();
+	
+	if (aktindex == 0 && neueref1 == 1) {
+		UpdateReference();
+	}
+	else if (aktindex == 1 && neueref2 == 1) {
+		UpdateReference();
+	}
+    else
+	{
+		LoadReference();
+	}
 }
 
 function SaveToConfig(){
     if (confirm("Are you sure you want to save the new alignment marker configuration?")) {
         WriteConfigININew();
-        UpdateConfigReference(domainname)
+		
+		if (neueref1 == 1 && neueref2 == 1) {
+			UpdateConfigReferences(domainname);
+		}
+		
+		else if (neueref1 == 1) {
+			var anzneueref = 1;
+			UpdateConfigReference(anzneueref, domainname);
+		}
+		
+		else if (neueref2 == 1) {
+			var anzneueref = 2;
+			UpdateConfigReference(anzneueref, domainname);
+		}
+		
+        //UpdateConfigReference(domainname)
         SaveConfigToServer(domainname);
         document.getElementById("savemarker").disabled = true;
         document.getElementById("enhancecontrast").disabled = true;
@@ -208,7 +234,7 @@ function EnhanceContrast(){
     refInfo[aktindex]["dx"] = document.getElementById("refdx").value;
     refInfo[aktindex]["dy"] = document.getElementById("refdy").value;       
 
-    enhanceCon = true;
+    var enhanceCon = true;
 
     document.getElementById("overlay").style.display = "block";
     document.getElementById("overlaytext").innerHTML = "Enhancing Image Contrast...";
@@ -219,11 +245,17 @@ function EnhanceContrast(){
 
     async function task() {
         while (true) {
-            var ret = MakeContrastImageZW(refInfo[aktindex], enhanceCon, domainname);
-            if (ret) {
+			var ret = MakeRefImageZW(refInfo[aktindex], enhanceCon, domainname);
+        	if (ret) {
                 UpdateReference();
                 //document.getElementById("enhancecontrast").disabled = true;
                 document.getElementById("overlay").style.display = "none";
+				if (aktindex == 0) {
+					neueref1 = 1;
+				}
+				else if (aktindex == 1) {
+					neueref2 = 1;
+				}				
                 return;
             }
             else {
@@ -276,260 +308,284 @@ function UpdateReference(){
 }
 			
 function dataURLtoBlob(dataurl) {
-    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
-        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
+    var arr = dataurl.split(',');
+	var mime = arr[0].match(/:(.*?);/)[1];
+    var bstr = atob(arr[1]);
+	var n = bstr.length;
+	var u8arr = new Uint8Array(n);
+	
     while(n--){
         u8arr[n] = bstr.charCodeAt(n);
     }
+	
     return new Blob([u8arr], {type:mime});
 }			
 			
+function loadCanvas(dataURL) {
+    var canvas = document.getElementById('canvas');
+    var context = canvas.getContext('2d');
     
-        function loadCanvas(dataURL) {
-                var canvas = document.getElementById('canvas');
-                var context = canvas.getContext('2d');
-    
-                imageObj.onload = function() {
-                    canvas.width = this.width;
-                    canvas.height = this.height;
-                    drawImage();
-                };
-    
-                imageObj.src = dataURL;
-            }
+    imageObj.onload = function() {
+        canvas.width = this.width;
+        canvas.height = this.height;
+        drawImage();
+    };
     
+    imageObj.src = dataURL;
+}
     
-        function getCoords(elem) { // crossbrowser version
-            var box = elem.getBoundingClientRect();
-            var body = document.body;
-            var docEl = document.documentElement;
-            var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
-            var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
-            var clientTop = docEl.clientTop || body.clientTop || 0;
-            var clientLeft = docEl.clientLeft || body.clientLeft || 0;
-            var top  = box.top +  scrollTop - clientTop;
-            var left = box.left + scrollLeft - clientLeft;
-            return { top: Math.round(top), left: Math.round(left) };
-        }
+function getCoords(elem) { // crossbrowser version
+    var box = elem.getBoundingClientRect();
+    var body = document.body;
+    var docEl = document.documentElement;
+    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
+    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
+    var clientTop = docEl.clientTop || body.clientTop || 0;
+    var clientLeft = docEl.clientLeft || body.clientLeft || 0;
+    var top  = box.top +  scrollTop - clientTop;
+    var left = box.left + scrollLeft - clientLeft;
+    return { top: Math.round(top), left: Math.round(left) };
+}
    
+/* hash #description open the details part of the page */
+function openDescription() {
+    if(window.location.hash) {
+        var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
+        if(hash == 'description') {
+            document.getElementById("desc_details").open = true;
+		}
+    }
+}
 
-        /* hash #description open the details part of the page */
-        function openDescription() {
-        if(window.location.hash) {
-            var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
-            if(hash == 'description')
-                document.getElementById("desc_details").open = true;
-            }
-        }
-
-    
-        function init() {
-            openDescription();
-            domainname = getDomainname();
-            loadConfig(domainname); 
-            ParseConfig();
-            param = getConfigParameters();
-
-            document.getElementById("savemarker").disabled = true;
-            document.getElementById("enhancecontrast").disabled = true;
-
-            canvas.addEventListener('mousedown', mouseDown, false);
-            canvas.addEventListener('mouseup', mouseUp, false);
-            canvas.addEventListener('mousemove', mouseMove, false);
-            loadCanvas(domainname + "/fileserver/config/reference.jpg");
-
-            CopyReferenceToImgTmp(domainname);
-            refInfo = GetReferencesInfo();
+function LoadReference(){
+    document.getElementById("img_ref").onload = function () {
+        document.getElementById("refdx").value = this.width;
+        document.getElementById("refdy").value = this.height;
+        refInfo[aktindex]["dx"] = this.width;
+        refInfo[aktindex]["dy"] = this.height;
+        rect.w = document.getElementById("refdx").value;
+        rect.h = document.getElementById("refdy").value;
+        draw();
+    }
 
-            UpdateReference();
+    _filenameurl = refInfo[aktindex]["name"];
+    var url = domainname + "/fileserver" + _filenameurl + "?"  + Date.now();
+    document.getElementById("img_ref").src = url;
+	
+    _filenameurl = _filenameurl.replace(".jpg", "_org.jpg");
+    var url = domainname + "/fileserver" + _filenameurl +  "?" + Date.now();
+    document.getElementById("img_ref_org").src = url;
 
-            drawImage();
-        }
+    document.getElementById("name").value = refInfo[aktindex]["name"];
+    document.getElementById("refx").value = refInfo[aktindex]["x"];
+    document.getElementById("refy").value = refInfo[aktindex]["y"];
+    rect.startX = document.getElementById("refx").value;
+    rect.startY = document.getElementById("refy").value;
+    draw();
+}	
+	
+function init() {
+    openDescription();
+    domainname = getDomainname();
+    loadConfig(domainname); 
+    ParseConfig();
+    param = getConfigParameters();
+
+    document.getElementById("savemarker").disabled = true;
+    document.getElementById("enhancecontrast").disabled = true;
+
+    canvas.addEventListener('mousedown', mouseDown, false);
+    canvas.addEventListener('mouseup', mouseUp, false);
+    canvas.addEventListener('mousemove', mouseMove, false);
+    loadCanvas(domainname + "/fileserver/config/reference.jpg");
+
+    //CopyReferenceToImgTmp(domainname);
+    refInfo = GetReferencesInfo();
+
+    //UpdateReference();
+	LoadReference();
+    drawImage();
+}
 
+function drawImage(){
+    var canvas = document.getElementById('canvas');
+    var context = canvas.getContext('2d');
 
-        function drawImage(){
-            var canvas = document.getElementById('canvas');
-            var context = canvas.getContext('2d');
+    context.clearRect(0,0,imageObj.width,imageObj.height);
+    context.save();
+    context.drawImage(imageObj, 0, 0);
+	// context.restore();
+}  
 
-            context.clearRect(0,0,imageObj.width,imageObj.height);
-            context.save();
-            context.drawImage(imageObj, 0, 0);
-//            context.restore();
-        }  
+function CutOutReference(){
+    refInfo[aktindex]["x"] = document.getElementById("refx").value;
+    refInfo[aktindex]["y"] = document.getElementById("refy").value; 
+    refInfo[aktindex]["dx"] = document.getElementById("refdx").value;
+    refInfo[aktindex]["dy"] = document.getElementById("refdy").value;
 
+	var enhanceCon = false;
 
-        function CutOutReference(){
-            refInfo[aktindex]["x"] = document.getElementById("refx").value;
-            refInfo[aktindex]["y"] = document.getElementById("refy").value; 
-            refInfo[aktindex]["dx"] = document.getElementById("refdx").value;
-            refInfo[aktindex]["dy"] = document.getElementById("refdy").value;
+    document.getElementById("overlay").style.display = "block";
+    document.getElementById("overlaytext").innerHTML = "Updating marker...";
 
-            document.getElementById("overlay").style.display = "block";
-            document.getElementById("overlaytext").innerHTML = "Updating marker...";
+    function sleep(ms) {
+        return new Promise(resolve => setTimeout(resolve, ms));
+    }
 
-            function sleep(ms) {
-                return new Promise(resolve => setTimeout(resolve, ms));
+    async function task() {
+        while (true) {
+			var ret = MakeRefImageZW(refInfo[aktindex], enhanceCon, domainname);
+            
+			if (ret) {
+                UpdateReference();
+                document.getElementById("enhancecontrast").disabled = false;
+                document.getElementById("savemarker").disabled = false;
+                document.getElementById("overlay").style.display = "none";
+				
+				if (aktindex == 0) {
+					neueref1 = 1;
+				}
+				else if (aktindex == 1) {
+					neueref2 = 1;
+				}					
+                return;
             }
-
-            async function task() {
-                while (true) {
-                    var ret = MakeRefZW(refInfo[aktindex], domainname);
-                    if (ret) {
-                        UpdateReference();
-                        document.getElementById("enhancecontrast").disabled = false;
-                        document.getElementById("savemarker").disabled = false;
-                        document.getElementById("overlay").style.display = "none";
-                        return;
-                    }
-                    else {
-                        // Get status
-                        var xhttp = new XMLHttpRequest();
-                        try {
-                            xhttp.open("GET", domainname + "/statusflow", false);
-                            xhttp.send();
-                        }
-                        catch (error){}
-
-                        document.getElementById("overlaytext").innerHTML = "Device is busy, waiting until the Digitalization Round got completed (this can take several minutes)...<br><br>Current step: " + xhttp.responseText;
-                        console.log("Device is busy, waiting 5s then checking again...");
-                        await sleep(5000);
-                    }
+            else {
+                // Get status
+                var xhttp = new XMLHttpRequest();
+                try {
+                    xhttp.open("GET", domainname + "/statusflow", false);
+                    xhttp.send();
                 }
-            }
+                catch (error){}
 
-            setTimeout(function() { // Delay so the overlay gets shown
-                task();
-            }, 1);
+                document.getElementById("overlaytext").innerHTML = "Device is busy, waiting until the Digitalization Round got completed (this can take several minutes)...<br><br>Current step: " + xhttp.responseText;
+                console.log("Device is busy, waiting 5s then checking again...");
+                await sleep(5000);
+            }
         }
+    }
 
-        function drawGrid(){
-            var canvas = document.getElementById('canvas');
-            var ctx = canvas.getContext('2d');
-            w = canvas.width;
-            h = canvas.height;
-            ctx.save();
-            ctx.strokeStyle = '#00FF00';
-
-            for (i = h/2; i < h; i += 100) 
-                {
-                ctx.moveTo(0, i);
-                ctx.lineTo(w, i);
-                ctx.stroke();
-                ctx.moveTo(0, h-i);
-                ctx.lineTo(w, h-i);
-                ctx.stroke();
-                }
-            for (i = w/2; i < w; i += 100) 
-                {
-                ctx.moveTo(i, 0);
-                ctx.lineTo(i, h);
-                ctx.stroke();
-                ctx.moveTo(w-i, 0);
-                ctx.lineTo(w-i, h);
-                ctx.stroke();                }
-//            ctx.restore();
-        }
+    setTimeout(function() { // Delay so the overlay gets shown
+        task();
+    }, 1);
+}
 
+function drawGrid(){
+    var canvas = document.getElementById('canvas');
+    var ctx = canvas.getContext('2d');
+    var w = canvas.width;
+    var h = canvas.height;
+    ctx.save();
+    ctx.strokeStyle = '#00FF00';
+
+    for (i = h/2; i < h; i += 100) {
+        ctx.moveTo(0, i);
+        ctx.lineTo(w, i);
+        ctx.stroke();
+        ctx.moveTo(0, h-i);
+        ctx.lineTo(w, h-i);
+        ctx.stroke();
+	}
+	
+    for (i = w/2; i < w; i += 100) {
+        ctx.moveTo(i, 0);
+        ctx.lineTo(i, h);
+        ctx.stroke();
+        ctx.moveTo(w-i, 0);
+        ctx.lineTo(w-i, h);
+        ctx.stroke();                
+	}
+	// ctx.restore();
+}
 
-        function draw() {
-        var canvas = document.getElementById('canvas');
-        var context = canvas.getContext('2d');
-        context.drawImage(imageObj, 0, 0);
-        lw = 4
-        context.lineWidth = lw;
-        context.strokeStyle = "#FF0000";
-        var x0 = parseInt(rect.startX) - parseInt(lw/2);
-        var y0 = parseInt(rect.startY) - parseInt(lw/2);
-        var dx = parseInt(rect.w) + parseInt(lw);
-        var dy = parseInt(rect.h) + parseInt(lw);
-        context.strokeRect(x0, y0, dx, dy);           
-    }
+function draw() {
+    var canvas = document.getElementById('canvas');
+    var context = canvas.getContext('2d');
+    context.drawImage(imageObj, 0, 0);
+    var lw = 4
+    context.lineWidth = lw;
+    context.strokeStyle = "#FF0000";
+    var x0 = parseInt(rect.startX) - parseInt(lw/2);
+    var y0 = parseInt(rect.startY) - parseInt(lw/2);
+    var dx = parseInt(rect.w) + parseInt(lw);
+    var dy = parseInt(rect.h) + parseInt(lw);
+    context.strokeRect(x0, y0, dx, dy);           
+}
 
-    function getCoords(elem) { // crossbrowser version
-        var box = elem.getBoundingClientRect();
-        var body = document.body;
-        var docEl = document.documentElement;
-        var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
-        var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
-        var clientTop = docEl.clientTop || body.clientTop || 0;
-        var clientLeft = docEl.clientLeft || body.clientLeft || 0;
-        var top  = box.top +  scrollTop - clientTop;
-        var left = box.left + scrollLeft - clientLeft;
-    return { top: Math.round(top), left: Math.round(left) };
+function mouseDown(e) {
+    var zw = getCoords(this)
+    rect.startX = e.pageX - zw.left;
+    rect.startY = e.pageY - zw.top;
+    document.getElementById("refx").value =  rect.startX;
+    document.getElementById("refy").value =  rect.startY;    
+    drag = true;
 }
 
-    function mouseDown(e) {
-        zw = getCoords(this)
-        rect.startX = e.pageX - zw.left;
-        rect.startY = e.pageY - zw.top;
-        document.getElementById("refx").value =  rect.startX;
-        document.getElementById("refy").value =  rect.startY;    
-        drag = true;
+function mouseUp() {
+    drag = false;
+    
+	if (rect.w < 0) {
+        rect.w = -rect.w
+        rect.startX-=rect.w
+    }
+    
+	if (rect.h < 0) {
+        rect.h = -rect.h
+        rect.startY-=rect.h
     }
+        
+	document.getElementById("refdx").value = rect.w;
+    document.getElementById("refdy").value = rect.h;
+    document.getElementById("refx").value = rect.startX;
+    document.getElementById("refy").value = rect.startY;    
+}
 
-    function mouseUp() {
-        drag = false;
-        if (rect.w < 0) {
-            rect.w = -rect.w
-            rect.startX-=rect.w
-            }
-        if (rect.h < 0) {
-            rect.h = -rect.h
-            rect.startY-=rect.h
-            }
+function mouseMove(e) {
+    if (drag) {
+        var zw = getCoords(this)        
+        rect.w = (e.pageX - zw.left) - rect.startX;
+        rect.h = (e.pageY - zw.top) - rect.startY ;
         document.getElementById("refdx").value = rect.w;
         document.getElementById("refdy").value = rect.h;
-        document.getElementById("refx").value = rect.startX;
-        document.getElementById("refy").value = rect.startY;    
+        draw();
     }
+    else {
+        draw();
+        var canvas = document.getElementById('canvas');
+        var context = canvas.getContext('2d');
 
-    function mouseMove(e) {
-        if (drag) {
-            zw = getCoords(this)        
-            rect.w = (e.pageX - zw.left) - rect.startX;
-            rect.h = (e.pageY - zw.top) - rect.startY ;
-            document.getElementById("refdx").value = rect.w;
-            document.getElementById("refdy").value = rect.h;
-            draw();
-        }
-        else {
-            draw();
-            var canvas = document.getElementById('canvas');
-            var context = canvas.getContext('2d');
-
-            zw = getCoords(this);
-            x = e.pageX - zw.left;
-            y = e.pageY - zw.top;
+        var zw = getCoords(this);
+        var x = e.pageX - zw.left;
+        var y = e.pageY - zw.top;
             
-            context.lineWidth = 2;
-            context.strokeStyle = "#00FF00";
-            context.beginPath(); 
-            context.moveTo(0,y);
-            context.lineTo(canvas.width, y);
-            context.moveTo(x, 0);
-            context.lineTo(x, canvas.height);
-            context.stroke();            
-        }
+        context.lineWidth = 2;
+        context.strokeStyle = "#00FF00";
+        context.beginPath(); 
+        context.moveTo(0,y);
+        context.lineTo(canvas.width, y);
+        context.moveTo(x, 0);
+        context.lineTo(x, canvas.height);
+        context.stroke();            
     }
+}
 
-    function namechanged()
-    {
-        _name = document.getElementById("name").value;
-        refInfo[aktindex]["name"] = _name;
-    }
+function namechanged() {
+    _name = document.getElementById("name").value;
+    refInfo[aktindex]["name"] = _name;
+}
 
-    function valuemanualchanged(){
-        if (!drag) {
-            rect.w = document.getElementById("refdx").value;
-            rect.h = document.getElementById("refdy").value;
-            rect.startX = document.getElementById("refx").value;
-            rect.startY = document.getElementById("refy").value; 
-            draw();            
-        }
+function valuemanualchanged(){
+    if (!drag) {
+        rect.w = document.getElementById("refdx").value;
+        rect.h = document.getElementById("refdy").value;
+        rect.startX = document.getElementById("refx").value;
+        rect.startY = document.getElementById("refy").value; 
+        draw();            
     }
-
+}
     
-    init();
+init();
     </script>
 </body>
 </html>

+ 146 - 132
sd-card/html/edit_config_param_template.html

@@ -1794,50 +1794,52 @@
 <script type="text/javascript" src="readconfigparam.js?v=$COMMIT_HASH"></script>  
  
 <script type="text/javascript">
-	var canvas = document.getElementById('canvas'),
-		domainname = getDomainname(); 
-		param;
-		category;
-		NUNBERSAkt = -1;
-		NUMBERS;
+var canvas = document.getElementById('canvas'),
+    domainname = getDomainname(),
+    param,
+    category,
+    NUNBERSAkt = -1,
+    NUMBERS;
 
 
 function LoadConfigNeu() {
-	domainname = getDomainname(); 
-	if (!loadConfig(domainname)) {
-		firework.launch('Configuration could not be loaded! Please reload the page!', 'danger', 30000);
-		return;
-	} 
-	ParseConfig();	
-	param = getConfigParameters();
-	category = getConfigCategory();
-	InitIndivParameter();
-
-	UpdateInput();
-	var sel = document.getElementById("Numbers_value1");
-	UpdateInputIndividual(sel);
-	UpdateExpertModus();
-	document.getElementById("divall").style.display = ''; 
+    domainname = getDomainname(); 
+    if (!loadConfig(domainname)) {
+        firework.launch('Configuration could not be loaded! Please reload the page!', 'danger', 30000);
+        return;
+    } 
+    ParseConfig();	
+    param = getConfigParameters();
+    category = getConfigCategory();
+    InitIndivParameter();
+
+    UpdateInput();
+    var sel = document.getElementById("Numbers_value1");
+    UpdateInputIndividual(sel);
+    UpdateExpertModus();
+    document.getElementById("divall").style.display = ''; 
 }
 
 
-function InitIndivParameter()
-{
+function InitIndivParameter() {
     NUMBERS = getNUMBERInfo();
 
     var _index = document.getElementById("Numbers_value1");
-    while (_index.length)
+    while (_index.length) {
         _index.remove(0);
+    }
 
     var _indexInflux = document.getElementById("NumbersInfluxDBv2_value1");
-    while (_indexInflux.length)
+    while (_indexInflux.length) {
         _indexInflux.remove(0);
+    }
 
     var _indexInfluxv1 = document.getElementById("NumbersInfluxDB_value1");
-    while (_indexInflux.length)
-    _indexInfluxv1.remove(0);
+    while (_indexInfluxv1.length) {
+        _indexInfluxv1.remove(0);
+    }
 
-    for (var i = 0; i < NUMBERS.length; ++i){
+    for (var i = 0; i < NUMBERS.length; ++i) {
         var option = document.createElement("option");
         option.text = NUMBERS[i]["name"];
         option.value = i;
@@ -1852,8 +1854,8 @@ function InitIndivParameter()
         optionInfluxv1.text = NUMBERS[i]["name"];
         optionInfluxv1.value = i;
         _indexInfluxv1.add(optionInfluxv1);
-
     }
+	
     _index.selectedIndex = 0; 
     _indexInflux.selectedIndex = 0;
     _indexInfluxv1.selectedIndex = 0;
@@ -1863,15 +1865,16 @@ function InitIndivParameter()
 function getParameterByName(name, url = window.location.href) {
     name = name.replace(/[\[\]]/g, '\\$&');
     var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
-        results = regex.exec(url);
+    results = regex.exec(url);
 
-    if (!results) return null;
-    if (!results[2]) return '';
+    if (!results) {return null;}
+    if (!results[2]) {return '';}
+	
     return decodeURIComponent(results[2].replace(/\+/g, ' '));
 }	
 
 
-function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1){
+function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1) {
     let anzpara;
     try {
         anzpara = _param[_cat][_name].anzParam;	
@@ -1882,8 +1885,9 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1)
     }
 
     if (_number > -1) {
-        if ((NUMBERS[_number] == undefined) || (NUMBERS[_number][_cat] == undefined) ||  (NUMBERS[_number][_cat][_name] == undefined))
+        if ((NUMBERS[_number] == undefined) || (NUMBERS[_number][_cat] == undefined) ||  (NUMBERS[_number][_cat][_name] == undefined)) {
             return;
+        }
 
         if (_optional) {
             document.getElementById(_cat+"_"+_name+"_enabled").checked = NUMBERS[_number][_cat][_name]["enabled"];
@@ -1891,6 +1895,7 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1)
                 document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !NUMBERS[_number][_cat][_name]["enabled"];	
             }		
         }
+	    
         document.getElementById(_cat+"_"+_name+"_text").style.color = "black"
         setEnabled(_cat+"_"+_name, true);
 
@@ -1898,8 +1903,9 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1)
             let element = document.getElementById(_cat+"_"+_name+"_value"+j);
             if (element.tagName.toLowerCase() == "select") {
                 var textToFind = NUMBERS[_number][_cat][_name]["value"+j];
-                if (textToFind == undefined)
+                if (textToFind == undefined) {
                     continue;
+                }
 
                 _isFound = false;
                 element.selectedIndex = -1;
@@ -1910,8 +1916,7 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1)
                         break;
                     }
                 }
-                if (!_isFound)
-                {
+                if (!_isFound) {
                     _zw_txt = "In the selected field the value '" + textToFind + "' in the parameter '";
                     _zw_txt = _zw_txt + _cat + "' in the field '" + _name + "' is invalid. PLEASE CHECK BEFORE SAVING!";
                     firework.launch(_zw_txt, 'warning', 10000);
@@ -1939,8 +1944,9 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1)
             let element = document.getElementById(_cat+"_"+_name+"_value"+j);
             if (element.tagName.toLowerCase() == "select") {
                 var textToFind = _param[_cat][_name]["value"+j];
-                if (textToFind == undefined)
+                if (textToFind == undefined) {
                     continue;
+                }
                 
                 _isFound = false;
                 element.selectedIndex = -1;
@@ -1951,8 +1957,7 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1)
                         break;
                     }
                 }
-                if (!_isFound)
-                {
+                if (!_isFound) {
                     _zw_txt = "In the selected field the value '" + textToFind + "' in the section '";
                     _zw_txt = _zw_txt + _cat + "' in the field '" + _name + "' is invalid. PLEASE CHECK BEFORE SAVING!";
                     firework.launch(_zw_txt, 'warning', 10000);
@@ -1969,8 +1974,7 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1)
     }
 
     ///////////////// am Ende, falls Kategorie als gesamtes nicht ausgewählt --> deaktivieren
-    if (_category[_cat]["enabled"] == false) 
-    {
+    if (_category[_cat]["enabled"] == false) {
         if (_optional) {
             document.getElementById(_cat+"_"+_name+"_enabled").disabled = true;
             for (var j = 1; j <= anzpara; ++j) {
@@ -1985,12 +1989,12 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1)
 }
 
 
-function InvertEnableItem(_cat, _param)
-{
+function InvertEnableItem(_cat, _param) {
     _zw = _cat + "_" + _param + "_enabled";
     _isOn = document.getElementById(_zw).checked;
 
     _color = "rgb(122, 122, 122)";
+	
     if (_isOn) {
         _color = "black";
     }
@@ -2002,8 +2006,8 @@ function InvertEnableItem(_cat, _param)
     setEnabled(_cat + "_" + _param, _isOn);
 
     for (var j = 1; j <= param[_cat][_param]["anzParam"]; ++j) {
-            document.getElementById(_cat+"_"+_param+"_value"+j).disabled = !_isOn;	
-            document.getElementById(_cat+"_"+_param+"_value"+j).style.color = _color;
+        document.getElementById(_cat+"_"+_param+"_value"+j).disabled = !_isOn;	
+        document.getElementById(_cat+"_"+_param+"_value"+j).style.color = _color;
     }
 }
 
@@ -2018,19 +2022,22 @@ function setEnabled(className, enabled) {
     for (i = 0; i < elements.length; i++) {
         if (enabled) {
             elements[i].classList.remove("disabled");
-        } else {
+        } 
+        else {
             elements[i].classList.add("disabled");
         }
 
         let inputs = elements[i].getElementsByTagName("input");
         for (j = 0; j < inputs.length; j++) {
-            if (inputs[j].id.endsWith("_enabled"))
+            if (inputs[j].id.endsWith("_enabled")) {
                 continue;
+            }
 
             inputs[j].style.color = _color;
             if (enabled) {
                 inputs[j].removeAttribute("disabled");
-            } else {
+            } 
+            else {
                 inputs[j].setAttribute("disabled", "disabled");
             }
         }
@@ -2043,15 +2050,15 @@ function setVisible(className, visible) {
     for (i = 0; i < elements.length; i++) {
         if (visible) {
             elements[i].classList.remove("hidden");
-        } else {
+        } 
+        else {
             elements[i].classList.add("hidden");
         }
     }
 }
 
 
-function EnDisableItem(_status, _param, _category, _cat, _name, _optional, _number = -1)
-{
+function EnDisableItem(_status, _param, _category, _cat, _name, _optional, _number = -1) {
     _status = _category[_cat]["enabled"];
 
     _color = "rgb(122, 122, 122)";
@@ -2064,18 +2071,18 @@ function EnDisableItem(_status, _param, _category, _cat, _name, _optional, _numb
         document.getElementById(_cat+"_"+_name+"_enabled").style.color = _color;	
     }
 
-    if (_number == -1){
+    if (_number == -1) {
         if (!_param[_cat][_name]["enabled"]) {
             _status = false;
             _color = "rgb(122, 122, 122)";
         }
     }
-    else
+    else {
         if (!NUMBERS[_number][_cat][_name]["enabled"]) {
-                _status = false;
-                _color = "rgb(122, 122, 122)";
-            }
-
+            _status = false;
+            _color = "rgb(122, 122, 122)";
+        }
+    }
 
     document.getElementById(_cat+"_"+_name+"_text").disabled = !_status;
     document.getElementById(_cat+"_"+_name+"_text").style.color = _color;
@@ -2083,22 +2090,25 @@ function EnDisableItem(_status, _param, _category, _cat, _name, _optional, _numb
     setEnabled(_cat+"_"+_name, _status);
 
     for (var j = 1; j <= _param[_cat][_name]["anzParam"]; ++j) {
-            document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !_status;	
-            document.getElementById(_cat+"_"+_name+"_value"+j).style.color = _color;	
+        document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !_status;	
+        document.getElementById(_cat+"_"+_name+"_value"+j).style.color = _color;	
     }
 }
 
 
-function ReadParameter(_param, _cat, _name, _optional, _number = -1){
+function ReadParameter(_param, _cat, _name, _optional, _number = -1) {
     if (_number > -1) {
-        if (_cat == "Digits")
+        if (_cat == "Digits") {
             _cat = "digit";
-        if (_cat == "Analog")
+        }
+	    
+        if (_cat == "Analog") {
             _cat = "analog";
+        }
 
-        if ((NUMBERS[_number] == undefined) || (NUMBERS[_number][_cat] == undefined) ||  (NUMBERS[_number][_cat][_name] == undefined))
+        if ((NUMBERS[_number] == undefined) || (NUMBERS[_number][_cat] == undefined) ||  (NUMBERS[_number][_cat][_name] == undefined)) {
             return;
-
+        }
 
         if (_optional) {
             NUMBERS[_number][_cat][_name]["enabled"] = document.getElementById(_cat+"_"+_name+"_enabled").checked;			
@@ -2116,7 +2126,8 @@ function ReadParameter(_param, _cat, _name, _optional, _number = -1){
                 if ((NUMBERS[_number][_cat][_name].checkRegExList != null) && (NUMBERS[_number][_cat][_name].checkRegExList[j-1] != null)) {
                     if (!element.value.match(NUMBERS[_cat][_name].checkRegExList[j-1])) {
                         element.classList.add("invalid-input");
-                    } else {
+                    } 
+                    else {
                         element.classList.remove("invalid-input");
                     }
                 }
@@ -2142,7 +2153,8 @@ function ReadParameter(_param, _cat, _name, _optional, _number = -1){
                 if ((_param[_cat][_name].checkRegExList != null) && (_param[_cat][_name].checkRegExList[j-1] != null)) {
                     if (!element.value.match(_param[_cat][_name].checkRegExList[j-1])) {
                         element.classList.add("invalid-input");
-                    } else {
+                    } 
+                    else {
                         element.classList.remove("invalid-input");
                     }
                 }
@@ -2153,10 +2165,8 @@ function ReadParameter(_param, _cat, _name, _optional, _number = -1){
 }
 
 
-function UpdateInputIndividual(sel)
-{
-    if (NUNBERSAkt != -1)
-    {
+function UpdateInputIndividual(sel) {
+    if (NUNBERSAkt != -1) {
         ReadParameter(param, "PostProcessing", "DecimalShift", true, NUNBERSAkt);
         ReadParameter(param, "PostProcessing", "AnalogDigitalTransitionStart", true, NUNBERSAkt);
         ReadParameter(param, "PostProcessing", "MaxRateValue", true, NUNBERSAkt);
@@ -2170,7 +2180,7 @@ function UpdateInputIndividual(sel)
         ReadParameter(param, "InfluxDBv2", "Measurement", true, NUNBERSAkt);
     }
 
-//	var sel = document.getElementById("Numbers_value1");
+    // var sel = document.getElementById("Numbers_value1");
     NUNBERSAkt = sel.selectedIndex;
     WriteParameter(param, category, "PostProcessing", "DecimalShift", true, NUNBERSAkt);
     WriteParameter(param, category, "PostProcessing", "AnalogDigitalTransitionStart", true, NUNBERSAkt);
@@ -2242,7 +2252,7 @@ function UpdateInput() {
     
     WriteParameter(param, category, "PostProcessing", "PreValueUse", false);		
     WriteParameter(param, category, "PostProcessing", "PreValueAgeStartup", true);		
-//	WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true);
+    // WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true);
     WriteParameter(param, category, "PostProcessing", "ErrorMessage", false);
     WriteParameter(param, category, "PostProcessing", "CheckDigitIncreaseConsistency", false);
 
@@ -2254,23 +2264,23 @@ function UpdateInput() {
     WriteParameter(param, category, "MQTT", "RetainMessages", false);
     WriteParameter(param, category, "MQTT", "HomeassistantDiscovery", false);
     WriteParameter(param, category, "MQTT", "MeterType", true);
-	WriteParameter(param, category, "MQTT", "CACert", true);
-	WriteParameter(param, category, "MQTT", "ClientCert", true);
-	WriteParameter(param, category, "MQTT", "ClientKey", true);
+    WriteParameter(param, category, "MQTT", "CACert", true);
+    WriteParameter(param, category, "MQTT", "ClientCert", true);
+    WriteParameter(param, category, "MQTT", "ClientKey", true);
     
     WriteParameter(param, category, "InfluxDB", "Uri", true);	
     WriteParameter(param, category, "InfluxDB", "Database", true);	
-//	WriteParameter(param, category, "InfluxDB", "Measurement", true);	
+    // WriteParameter(param, category, "InfluxDB", "Measurement", true);	
     WriteParameter(param, category, "InfluxDB", "user", true);	
     WriteParameter(param, category, "InfluxDB", "password", true);	
-//	WriteParameter(param, category, "InfluxDB", "Field", true);
+    // WriteParameter(param, category, "InfluxDB", "Field", true);
 
     WriteParameter(param, category, "InfluxDBv2", "Uri", true);	
     WriteParameter(param, category, "InfluxDBv2", "Bucket", true);	
-//	WriteParameter(param, category, "InfluxDBv2", "Measurement", true);	
+    // WriteParameter(param, category, "InfluxDBv2", "Measurement", true);	
     WriteParameter(param, category, "InfluxDBv2", "Org", true);	
     WriteParameter(param, category, "InfluxDBv2", "Token", true);	
-//	WriteParameter(param, category, "InfluxDBv2", "Field", true);
+    // WriteParameter(param, category, "InfluxDBv2", "Field", true);
 
     WriteParameter(param, category, "GPIO", "IO0", true);
     WriteParameter(param, category, "GPIO", "IO1", true);
@@ -2301,41 +2311,44 @@ function UpdateInput() {
 }
 
 
-function WriteModelFiles()
-{
+function WriteModelFiles() {
     list_tflite = getTFLITEList();
 
     var _indexDig = document.getElementById("Digits_Model_value1");
     var _indexAna = document.getElementById("Analog_Model_value1");
-    while (_indexDig.length)
+	
+    while (_indexDig.length) {
         _indexDig.remove(0);
-    while (_indexAna.length)
+    }
+	
+    while (_indexAna.length) {
         _indexAna.remove(0);
+    }
 
-    for (var i = 0; i < list_tflite.length; ++i){
+    for (var i = 0; i < list_tflite.length; ++i) {
         var optionDig = document.createElement("option");
         var optionAna = document.createElement("option");
         
         var text = list_tflite[i].replace("/config/", "");
         
         if (list_tflite[i].includes("/dig")) { // Its a digital file, only show in the digital list box
-        optionDig.text = text;
-        optionDig.value = list_tflite[i];
-        _indexDig.add(optionDig);
+            optionDig.text = text;
+            optionDig.value = list_tflite[i];
+            _indexDig.add(optionDig);
         }
         else if (list_tflite[i].includes("/ana")) { // Its a digital file, only show in the analog list box
-        optionAna.text = text;
-        optionAna.value = list_tflite[i];
-        _indexAna.add(optionAna);
+            optionAna.text = text;
+            optionAna.value = list_tflite[i];
+            _indexAna.add(optionAna);
         }
         else { // all other files, show in both list boxes
-        optionDig.text = text;
-        optionDig.value = list_tflite[i];
-        _indexDig.add(optionDig);
+            optionDig.text = text;
+            optionDig.value = list_tflite[i];
+            _indexDig.add(optionDig);
         
-        optionAna.text = text;
-        optionAna.value = list_tflite[i];
-        _indexAna.add(optionAna);
+            optionAna.text = text;
+            optionAna.value = list_tflite[i];
+            _indexAna.add(optionAna);
         }
     }
 
@@ -2344,8 +2357,7 @@ function WriteModelFiles()
 }
 
 
-function ReadParameterAll()
-{
+function ReadParameterAll() {
     category["Analog"]["enabled"] = document.getElementById("Category_Analog_enabled").checked;
     category["Digits"]["enabled"] = document.getElementById("Category_Digits_enabled").checked;
     category["MQTT"]["enabled"] = document.getElementById("Category_MQTT_enabled").checked;
@@ -2403,9 +2415,9 @@ function ReadParameterAll()
     ReadParameter(param, "MQTT", "RetainMessages", false);
     ReadParameter(param, "MQTT", "HomeassistantDiscovery", false);
     ReadParameter(param, "MQTT", "MeterType", true);
-	ReadParameter(param, "MQTT", "CACert", true);
-	ReadParameter(param, "MQTT", "ClientCert", true);
-	ReadParameter(param, "MQTT", "ClientKey", true);
+    ReadParameter(param, "MQTT", "CACert", true);
+    ReadParameter(param, "MQTT", "ClientCert", true);
+    ReadParameter(param, "MQTT", "ClientKey", true);
 
     ReadParameter(param, "InfluxDB", "Uri", true);
     ReadParameter(param, "InfluxDB", "Database", true);
@@ -2418,7 +2430,7 @@ function ReadParameterAll()
     ReadParameter(param, "InfluxDBv2", "Measurement", true);
     ReadParameter(param, "InfluxDBv2", "Org", true);
     ReadParameter(param, "InfluxDBv2", "Token", true);
-//	ReadParameter(param, "InfluxDB", "Field", true);	
+    // ReadParameter(param, "InfluxDB", "Field", true);	
 
     ReadParameter(param, "GPIO", "IO0", true);
     ReadParameter(param, "GPIO", "IO1", true);
@@ -2455,7 +2467,7 @@ function ReadParameterAll()
     var sel = document.getElementById("Numbers_value1");
     UpdateInputIndividual(sel);
     
-//	FormatDecimalValue(param, "PostProcessing", "MaxRateValue");
+    // FormatDecimalValue(param, "PostProcessing", "MaxRateValue");
 }
 
 
@@ -2483,44 +2495,43 @@ function UpdateAfterCategoryCheck() {
 }
 
 
-function UpdateExpertModus()
-{
-//	var _style = 'display:none;';
+function UpdateExpertModus() {
+    // var _style = 'display:none;';
     var _style_pur = 'none';
     var _hidden = true;
     if (document.getElementById("ExpertModus_enabled").checked) {
-//		_style = '';
+        // _style = '';
         _style_pur = '';
         _hidden = false;
         document.getElementById("Edit_Config_Direct").style.display = "";
         firework.launch("Expert view activated. Please use carefully", 'warning', 5000);
     }
-    else
-    {
+    else {
         document.getElementById("Edit_Config_Direct").style.display = "none"; 
     }
 
     const expert = document.querySelectorAll(".expert");
     for (var i = 0; i < expert.length; i++) {
         expert[i].style.display = _style_pur;
-//		document.getElementById(expert[i].id).style = _style;
+        // document.getElementById(expert[i].id).style = _style;
     }
 
     // Enable / Disable die Optionen in den Menues für die Auswahl. Falls kein Expertenmodus soll nur ein Wert (built-in-led oder externan-flash-ws281x) möglich sein
     Array.from(document.querySelector("#GPIO_IO4_value1").options).forEach(function(option_element) {
-        if (option_element.value != "built-in-led")
+        if (option_element.value != "built-in-led") {
             option_element.hidden = _hidden;
+        }
     });	
 
     Array.from(document.querySelector("#GPIO_IO12_value1").options).forEach(function(option_element) {
-        if (option_element.value != "external-flash-ws281x")
+        if (option_element.value != "external-flash-ws281x") {
             option_element.hidden = _hidden;
+        }
     });
 }
 
 
-function saveTextAsFile()
-{
+function saveTextAsFile() {
     ReadParameterAll();
     if (document.getElementsByClassName("invalid-input").length > 0) {
         firework.launch("Settings cannot be saved. Please check your entries!", 'danger', 30000);
@@ -2559,58 +2570,61 @@ function editConfigDirect() {
 }
 
 
-function numberChanged()
-{
+function numberChanged() {
     var sel = document.getElementById("Numbers_value1");
     _neu = sel.selectedIndex;
     UpdateInputIndividual(sel);
 
     var _selInflux = document.getElementById("NumbersInfluxDBv2_value1");
-    if (_selInflux.selectedIndex != _neu)
+    if (_selInflux.selectedIndex != _neu) {
         _selInflux.selectedIndex = _neu
+    }
 }
 
     
-function numberInfluxDBv2Changed()
-{
+function numberInfluxDBv2Changed() {
     var sel = document.getElementById("NumbersInfluxDBv2_value1");
     _neu = sel.selectedIndex;
     UpdateInputIndividual(sel);
 
     var _sel2 = document.getElementById("Numbers_value1");
-    if (_sel2.selectedIndex != _neu)
+    if (_sel2.selectedIndex != _neu) {
         _sel2.selectedIndex = _neu
+    }
 
     var _sel3 = document.getElementById("NumbersInfluxDB_value1");
-    if (_sel3.selectedIndex != _neu)
+    if (_sel3.selectedIndex != _neu) {
         _sel3.selectedIndex = _neu
+    }
 }
 
 
-function numberInfluxDBChanged()
-{
+function numberInfluxDBChanged() {
     var sel = document.getElementById("NumbersInfluxDB_value1");
     _neu = sel.selectedIndex;
     UpdateInputIndividual(sel);
     
     var _sel2 = document.getElementById("Numbers_value1");
-    if (_sel2.selectedIndex != _neu)
+    if (_sel2.selectedIndex != _neu) {
         _sel2.selectedIndex = _neu
+    }
 
     var _sel3 = document.getElementById("NumbersInfluxDBv2_value1");
-    if (_sel3.selectedIndex != _neu)
+    if (_sel3.selectedIndex != _neu) {
         _sel3.selectedIndex = _neu
+    }
 }
 
-    /* hash #description open the details part of the page */
-function openDescription() 
-{
+	
+/* hash #description open the details part of the page */
+function openDescription() {
     if(window.location.hash) {
         var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
-        if(hash == 'description')
+        if(hash == 'description') {
             document.getElementById("desc_details").open = true;
-			document.getElementById("reboot").style.display = "none";
-			document.getElementById("reboot_text").style.display = "none";
+            document.getElementById("reboot").style.display = "none";
+            document.getElementById("reboot_text").style.display = "none";
+        }
     }
 }
 

Разница между файлами не показана из-за своего большого размера
+ 447 - 415
sd-card/html/edit_reference.html


+ 7 - 34
sd-card/html/readconfigcommon.js

@@ -39,13 +39,11 @@ function createReader(file) {
  }
 
 
-
 function ZerlegeZeile(input, delimiter = " =\t\r")
      {
           var Output = Array(0);
 //          delimiter = " =,\t";
      
-
           /* The input can have multiple formats: 
            *  - key = value
            *  - key = value1 value2 value3 ...
@@ -82,7 +80,6 @@ function ZerlegeZeile(input, delimiter = " =\t\r")
           }
      
           return Output;
-     
      }    
 
 
@@ -110,7 +107,6 @@ function findDelimiterPos(input, delimiter)
           return pos;
      }
      
-     
 
 function trim(istring, adddelimiter)
      {
@@ -247,19 +243,21 @@ function SaveCanvasToImage(_canvas, _filename, _delete = true, _domainname = "")
 }
 
 
-function MakeContrastImageZW(zw, _enhance, _domainname){
-     _filename = zw["name"].replace("/config/", "/img_tmp/");
-     url = _domainname + "/editflow?task=cutref&in=/config/reference.jpg&out=" + _filename + "&x=" + zw["x"] + "&y="  + zw["y"] + "&dx=" + zw["dx"] + "&dy=" + zw["dy"];
+function MakeRefImageZW(zw, _enhance, _domainname){
+     var _filename = zw["name"].replace("/config/", "/img_tmp/");
+	 
+     var url = _domainname + "/editflow?task=cutref&in=/config/reference.jpg&out=" + _filename + "&x=" + zw["x"] + "&y="  + zw["y"] + "&dx=" + zw["dx"] + "&dy=" + zw["dy"];
+     
      if (_enhance == true){
           url = url + "&enhance=true";
      }
 
      var xhttp = new XMLHttpRequest();  
+     
      try {
           xhttp.open("GET", url, false);
           xhttp.send();
-     }
-     catch (error){}
+     } catch (error){}
 
      if (xhttp.responseText == "CutImage Done") {
           firework.launch('Image Contrast got enhanced', 'success', 5000);
@@ -269,28 +267,3 @@ function MakeContrastImageZW(zw, _enhance, _domainname){
           return false;
      }
 }
-
-
-function MakeRefZW(zw, _domainname){
-     _filetarget = zw["name"].replace("/config/", "/img_tmp/");
-     _filetarget = _filetarget.replace(".jpg", "_org.jpg");
-     url = _domainname + "/editflow?task=cutref&in=/config/reference.jpg&out="+_filetarget+"&x=" + zw["x"] + "&y="  + zw["y"] + "&dx=" + zw["dx"] + "&dy=" + zw["dy"];
-     var xhttp = new XMLHttpRequest();  
-     try {
-          xhttp.open("GET", url, false);
-          xhttp.send();
-     }
-     catch (error){}
-
-     if (xhttp.responseText == "CutImage Done") {
-          _filetarget2 = zw["name"].replace("/config/", "/img_tmp/");
-     //     _filetarget2 = _filetarget2.replace(".jpg", "_org.jpg");
-          FileCopyOnServer(_filetarget, _filetarget2, _domainname);
-          firework.launch('Marker got updated', 'success', 5000);
-          return true;
-     }
-     else {
-          return false;
-     }
-}
-

+ 26 - 7
sd-card/html/readconfigparam.js

@@ -467,8 +467,6 @@ function WriteConfigININew()
           }
      }
 
-
-
      config_split = new Array(0);
 
      for (var cat in param) {
@@ -565,7 +563,6 @@ function WriteConfigININew()
 }
 
 
-
 function isCommented(input)
      {
           let isComment = false;
@@ -602,7 +599,6 @@ function getConfigCategory() {
 }
 
 
-
 function ExtractROIs(_aktline, _type){
      var linesplit = ZerlegeZeile(_aktline);
      abc = getNUMBERS(linesplit[0], _type);
@@ -678,7 +674,6 @@ function getNUMBERS(_name, _type, _create = true)
 }
 
  
-
 function CopyReferenceToImgTmp(_domainname)
 {
      for (index = 0; index < 2; ++index)
@@ -700,7 +695,7 @@ function GetReferencesInfo(){
 }
 
 
-function UpdateConfigReference(_domainname){
+function UpdateConfigReferences(_domainname){
      for (var index = 0; index < 2; ++index)
      {
           _filenamenach = REFERENCES[index]["name"];
@@ -712,11 +707,35 @@ function UpdateConfigReference(_domainname){
           _filenamevon = _filenamevon.replace(".jpg", "_org.jpg");
           FileDeleteOnServer(_filenamenach, _domainname);
           FileCopyOnServer(_filenamevon, _filenamenach, _domainname);
-
      }
 }
 
 
+function UpdateConfigReference(_anzneueref, _domainname){
+    var index = 0;
+
+    if (_anzneueref == 1) {	
+        index = 0;
+    }
+
+    else if (_anzneueref == 2) {
+        index = 1;
+    }
+
+    _filenamenach = REFERENCES[index]["name"];
+    _filenamevon = _filenamenach.replace("/config/", "/img_tmp/");
+
+    FileDeleteOnServer(_filenamenach, _domainname);
+    FileCopyOnServer(_filenamevon, _filenamenach, _domainname);
+
+    _filenamenach = _filenamenach.replace(".jpg", "_org.jpg");
+    _filenamevon = _filenamevon.replace(".jpg", "_org.jpg");
+
+    FileDeleteOnServer(_filenamenach, _domainname);
+    FileCopyOnServer(_filenamevon, _filenamenach, _domainname);
+}	
+
+
 function getNUMBERInfo(){
      return NUMBERS;
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов