Ver código fonte

#1524 - ensure the recognized digit is less than 10 (#1525)

* fix kernel panic (vector out of range) in getReadoutRawString

* fix key of caches

* fix key of caches

* fix key caches

* fix cache keys

* fix cache keys

* move set variables to top

* debug

* fix key

* testing

* try fix changelog

* test

* Update Changelog.md for  release

* Revert "Update Changelog.md for  release"

This reverts commit 4f51ec79620734cac44c02025ded4a8171016814.

* remove testing

* fix release creation

* testing

* Update Changelog.md for  release

* test

* Revert "Merge branch 'master' of https://github.com/haverland/AI-on-the-edge-device"

This reverts commit f68695a4c0bda6a7ee563511040c0c89f1fed0c6, reversing
changes made to a096cf718223ca13b781fbf570e5fcbfb5689049.

* Revert "test"

This reverts commit a096cf718223ca13b781fbf570e5fcbfb5689049.

* revert testing

* #1524 - ensure the result of ZeigerEvalHybridNeu is <10

* Fix late digit transition #1503

Co-authored-by: github-actions <github-actions@github.com>
Frank Haverland 3 anos atrás
pai
commit
2997bf0911

+ 5 - 8
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp

@@ -177,7 +177,7 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
             result =  (ergebnis_vorkomma + 1) % 10;
         else
             // Akt. digit und Vorgänger haben Nulldurchgang
-            result =  ergebnis_vorkomma;
+            result =  ergebnis_vorkomma % 10;
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, Nulldurchgang hat stattgefunden = " + std::to_string(result) +
                                                     " zahl: " + std::to_string(zahl) + " zahl_vorgaenger = " + std::to_string(zahl_vorgaenger)+ " eval_vorgaenger = " + std::to_string(eval_vorgaenger) + " DigitalUnschaerfe = " +  std::to_string(DigitalUnschaerfe));
         return result;
@@ -191,7 +191,7 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
     // Vorlauf (else - Zweig) passiert nicht bereits ab 9.
     if (DigitalUebergangsbereichVorlauf>=zahl_vorgaenger || ergebnis_nachkomma >= 4)
         // aktuelles digit hat genauso wie das Vorgängerdigit noch keinen Nulldurchgang. 
-        result =  ergebnis_vorkomma;
+        result =  ergebnis_vorkomma % 10;
     else
         // aktuelles digit läuft dem kleineren digit (9.x) vor. Also schon >=x.0 während das vorherige Digit noch
         // keinen Nulldurchgang hat. Daher wird um 1 reduziert.
@@ -211,7 +211,8 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor
     bool roundedUp = false;
 
     // Innerhalb der digitalen Unschaefe 
-    if (ergebnis_nachkomma >= (10-DigitalUnschaerfe * 10))  {   // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
+    if ((ergebnis_nachkomma >= (10-DigitalUnschaerfe * 10))     // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
+        || (eval_vorgaenger <= 4 && ergebnis_nachkomma>=6))  {   // oder digit läuft nach (analog =0..4, digit >=6)
         result = (int) (round(zahl) + 10) % 10;
         roundedUp = true;
         // vor/nachkomma neu berechnen, da wir anhand der Unschaefe die Zahl anpassen.
@@ -230,11 +231,7 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor
     // Kein Nulldurchgang hat stattgefunden.
     // Nur eval_vorgaenger verwendet, da ziffer_vorgaenger hier falsch sein könnte.
     // ziffer_vorgaenger<=0.1 & eval_vorgaenger=9 entspricht analog wurde zurückgesetzt wegen vorhergehender analog, die noch nicht auf 0 sind.
-    if ((eval_vorgaenger>=6 && (ziffer_vorgaenger>analogDigitalTransitionStart || ziffer_vorgaenger<=0.2) && roundedUp)
-        // digit läuft dem Analog vor. Darf aber erst passieren, wenn 
-        // digit wirklich schnon los läuft, deshalb 9
-        || (eval_vorgaenger>9 && ziffer_vorgaenger>analogDigitalTransitionStart && ergebnis_nachkomma<=1))
-
+    if ((eval_vorgaenger>=6 && (ziffer_vorgaenger>analogDigitalTransitionStart || ziffer_vorgaenger<=0.2) && roundedUp))
     {
         result =  ((ergebnis_vorkomma+10) - 1) % 10;
         LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ZeigerEvalAnalogToDigitNeu - Nulldurchgang noch nicht stattgefunden = " + std::to_string(result) +

+ 20 - 0
code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp

@@ -522,4 +522,24 @@ void test_doFlowPP3() {
         delete undertestPost;
 }
 
+void test_doFlowPP4() {
+
+        // Fehler  V13.0.4 
+        // https://github.com/jomjol/AI-on-the-edge-device/issues/1503#issuecomment-1343335855
+         std::vector<float> digits = {  0.0, 0.0, 6.9, 1.0, 6.6};  // 716.0199 als falsches Ergebnis. 
+        // Test ist nur erfolgreich mit Veränderung des AnalogdigitTransistionStart
+         std::vector<float> analogs = {9.9, 1.8, 6.6, 5.8};
+        const char* expected = "717.0165";
+        const char* expected_extended= "717.01658";
+        
+        // extendResolution=false
+        std::string result = process_doFlow(analogs, digits, Digital100, false, false);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
+
+}
+
 

+ 1 - 1
code/test/components/jomjol-flowcontroll/test_getReadoutRawString.cpp

@@ -20,7 +20,7 @@ void test_getReadoutRawString() {
     gen_analog->ROI.push_back(anaROI);
 
     result = _undertestPost->flowAnalog->getReadoutRawString(0);
-    TEST_ASSERT_EQUAL_STRING("\t5.5", result.c_str());
+    TEST_ASSERT_EQUAL_STRING(",5.5", result.c_str());
 
 
 

+ 2 - 1
code/test/test_suite_flowcontroll.cpp

@@ -11,7 +11,7 @@
 #include "sdmmc_cmd.h"
 #include "driver/sdmmc_host.h"
 #include "driver/sdmmc_defs.h"
-static const char *TAG = "MAIN TEST";
+//static const char *TAG = "MAIN TEST";
 #define __SD_USE_ONE_LINE_MODE__
 #include "server_GPIO.h"
 
@@ -117,6 +117,7 @@ extern "C" void app_main()
     RUN_TEST(test_doFlowPP1);
     RUN_TEST(test_doFlowPP2);
     RUN_TEST(test_doFlowPP3);
+    RUN_TEST(test_doFlowPP4);
 
     // getReadoutRawString test
     RUN_TEST(test_getReadoutRawString);