diff --git a/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp b/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp index 2b1a15b17..bcc80b27e 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp +++ b/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) + diff --git a/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp b/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp index a9dc4f65a..b7b0ef53c 100644 --- a/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp +++ b/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 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 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()); + +} + diff --git a/code/test/components/jomjol-flowcontroll/test_getReadoutRawString.cpp b/code/test/components/jomjol-flowcontroll/test_getReadoutRawString.cpp index 5cbd5ddbd..6ee19aceb 100644 --- a/code/test/components/jomjol-flowcontroll/test_getReadoutRawString.cpp +++ b/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()); diff --git a/code/test/test_suite_flowcontroll.cpp b/code/test/test_suite_flowcontroll.cpp index f737891c0..fed2218c5 100644 --- a/code/test/test_suite_flowcontroll.cpp +++ b/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);