mirror of
https://github.com/jomjol/AI-on-the-edge-device.git
synced 2025-12-07 12:06:58 +03:00
rewrite of ZeigerEvalAnalogToDigitNeu added explizit test-cases for it.
This commit is contained in:
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
static const char* TAG = "flow_analog";
|
static const char* TAG = "flow_analog";
|
||||||
|
|
||||||
bool debugdetailgeneral = false;
|
|
||||||
|
|
||||||
ClassFlowCNNGeneral::ClassFlowCNNGeneral(ClassFlowAlignment *_flowalign, t_CNNType _cnntype) : ClassFlowImage(NULL, TAG)
|
ClassFlowCNNGeneral::ClassFlowCNNGeneral(ClassFlowAlignment *_flowalign, t_CNNType _cnntype) : ClassFlowImage(NULL, TAG)
|
||||||
{
|
{
|
||||||
@@ -28,7 +28,7 @@ ClassFlowCNNGeneral::ClassFlowCNNGeneral(ClassFlowAlignment *_flowalign, t_CNNTy
|
|||||||
flowpostalignment = _flowalign;
|
flowpostalignment = _flowalign;
|
||||||
}
|
}
|
||||||
|
|
||||||
string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution, int prev, float _vorgaengerAnalog)
|
string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution, int prev, float _vorgaengerAnalog, float analogDigitalTransitionStart)
|
||||||
{
|
{
|
||||||
string result = "";
|
string result = "";
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
|
|||||||
{
|
{
|
||||||
// prev = ZeigerEval(GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float, prev);
|
// prev = ZeigerEval(GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float, prev);
|
||||||
if (_vorgaengerAnalog >= 0)
|
if (_vorgaengerAnalog >= 0)
|
||||||
prev = ZeigerEvalHybridNeu(GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float, _vorgaengerAnalog, prev, true);
|
prev = ZeigerEvalHybridNeu(GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float, _vorgaengerAnalog, prev, true, analogDigitalTransitionStart);
|
||||||
else
|
else
|
||||||
prev = ZeigerEvalHybridNeu(GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float, prev, prev);
|
prev = ZeigerEvalHybridNeu(GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float, prev, prev);
|
||||||
result = std::to_string(prev);
|
result = std::to_string(prev);
|
||||||
@@ -127,7 +127,7 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, int eval_vorgaenger, bool AnalogerVorgaenger)
|
int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, int eval_vorgaenger, bool AnalogerVorgaenger, float digitalAnalogTransitionStart)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
int ergebnis_nachkomma = ((int) floor(zahl * 10)) % 10;
|
int ergebnis_nachkomma = ((int) floor(zahl * 10)) % 10;
|
||||||
@@ -147,7 +147,7 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
|
|||||||
|
|
||||||
if (AnalogerVorgaenger)
|
if (AnalogerVorgaenger)
|
||||||
{
|
{
|
||||||
result = ZeigerEvalAnalogToDigitNeu(zahl, zahl_vorgaenger, eval_vorgaenger);
|
result = ZeigerEvalAnalogToDigitNeu(zahl, zahl_vorgaenger, eval_vorgaenger, digitalAnalogTransitionStart);
|
||||||
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - Analoger Vorgänger, Bewertung über ZeigerEvalAnalogNeu = " + std::to_string(result) +
|
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - Analoger Vorgänger, Bewertung über ZeigerEvalAnalogNeu = " + 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));
|
" 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;
|
return result;
|
||||||
@@ -201,55 +201,49 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vorgaenger, int eval_vorgaenger)
|
int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vorgaenger, int eval_vorgaenger, float analogDigitalTransitionStart)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
int ergebnis_nachkomma = ((int) floor(zahl * 10)) % 10;
|
int ergebnis_nachkomma = ((int) floor(zahl * 10)) % 10;
|
||||||
int ergebnis_vorkomma = ((int) floor(zahl) + 10) % 10;
|
int ergebnis_vorkomma = ((int) floor(zahl) + 10) % 10;
|
||||||
|
bool roundedUp = false;
|
||||||
|
|
||||||
if (ziffer_vorgaenger < 0)
|
// Innerhalb der digitalen Unschaefe
|
||||||
{
|
if (ergebnis_nachkomma >= (10-DigitalUnschaerfe * 10)) { // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
|
||||||
result = (int) floor(zahl);
|
result = (int) (round(zahl) + 10) % 10;
|
||||||
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - kein Vorgänger - Ergebnis = " + std::to_string(result) +
|
roundedUp = true;
|
||||||
" zahl: " + std::to_string(zahl) + " ziffer_vorgaenger = " + std::to_string(ziffer_vorgaenger) + " AnalogFehler = " + std::to_string(AnalogFehler));
|
// vor/nachkomma neu berechnen, da wir anhand der Unschaefe die Zahl anpassen.
|
||||||
return result;
|
ergebnis_nachkomma = ((int) floor(result * 10)) % 10;
|
||||||
}
|
ergebnis_vorkomma = ((int) floor(result) + 10) % 10;
|
||||||
|
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - digitaleUnschaerfe - Ergebnis = " + std::to_string(result) +
|
||||||
if (ziffer_vorgaenger <= 3 && eval_vorgaenger<9) // Nulldurchgang hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
|
" zahl: " + std::to_string(zahl) + " ziffer_vorgaenger: " + std::to_string(ziffer_vorgaenger) +
|
||||||
// aber Sonderfall ziffer_vorgaeger = 0.1 vor_vorgaenger 9.9 => eval_vorgaenger ist 9, damit hat Nulldurchgang nicht stattgefunden.
|
" erg_vorkomma: " + std::to_string(ergebnis_vorkomma) +
|
||||||
{
|
" erg_nachkomma: " + std::to_string(ergebnis_nachkomma));
|
||||||
if (ergebnis_nachkomma > 5)
|
|
||||||
result = (ergebnis_vorkomma + 1) % 10;
|
|
||||||
else
|
|
||||||
result = ergebnis_vorkomma;
|
|
||||||
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - Nulldurchgang hat stattgefunden = " + std::to_string(result) +
|
|
||||||
" zahl: " + std::to_string(zahl) + " ziffer_vorgaenger = " + std::to_string(ziffer_vorgaenger) + " DigitalUnschaerfe = " + std::to_string(DigitalUnschaerfe));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vorlauf ziffer_vorgaenger <=9.9 und ergebnis_nachkomma >=0..1 (digits drehen nach umschalten nicht gleich weiter)
|
|
||||||
// Beispiel dig=4.0, ana=9.1 ==> dig=3
|
|
||||||
|
|
||||||
// Nachlauf ziffer_vorgaenger 0..2 und ergebnis_nachkomma 8..9
|
|
||||||
// Beispiel dig=6.8, ana=2.2 ==> dig=7
|
|
||||||
// dig=4.8, ana=5.5 => dig=4
|
|
||||||
|
|
||||||
// Vorlauf bei ergebnis_nachkomma >=0..1 und ziffer_vorgaenger 8..9
|
|
||||||
if (ergebnis_nachkomma <= 1 && ziffer_vorgaenger>=8) {
|
|
||||||
result = (ergebnis_vorkomma - 1 + 10) % 10;
|
|
||||||
} else {
|
} else {
|
||||||
// Ziffer bleibt bei x.8 oder x.9 "hängen", kommt also nicht richtig auf x.0
|
result = (int) ((int) trunc(zahl) + 10) % 10;
|
||||||
// muss eine Rundung erfolgen
|
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - KEINE digitaleUnschaerfe - Ergebnis = " + std::to_string(result) +
|
||||||
// jedoch nicht im während der Transition (ziffer_vorgaenger>=8)
|
" zahl: " + std::to_string(zahl) + " ziffer_vorgaenger = " + std::to_string(ziffer_vorgaenger));
|
||||||
if (eval_vorgaenger<9 && ziffer_vorgaenger<8 && ergebnis_nachkomma >= 8)
|
|
||||||
result = ((int) round(zahl) + 10) % 10;
|
|
||||||
else
|
|
||||||
result = ergebnis_vorkomma;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - 9.0 --> noch kein Nulldurchgang = " + std::to_string(result) +
|
// Kein Nulldurchgang hat stattgefunden.
|
||||||
" zahl: " + std::to_string(zahl) + " ziffer_vorgaenger = " + std::to_string(ziffer_vorgaenger) + " DigitalUnschaerfe = " + std::to_string(DigitalUnschaerfe));
|
// 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>=9 && (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))
|
||||||
|
|
||||||
|
{
|
||||||
|
result = ((ergebnis_vorkomma+10) - 1) % 10;
|
||||||
|
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - Nulldurchgang noch nicht stattgefunden = " + std::to_string(result) +
|
||||||
|
" zahl: " + std::to_string(zahl) +
|
||||||
|
" ziffer_vorgaenger = " + std::to_string(ziffer_vorgaenger) +
|
||||||
|
" erg_nachkomma = " + std::to_string(ergebnis_nachkomma));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ClassFlowCNNGeneral::ZeigerEvalAnalogNeu(float zahl, int ziffer_vorgaenger)
|
int ClassFlowCNNGeneral::ZeigerEvalAnalogNeu(float zahl, int ziffer_vorgaenger)
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class ClassFlowCNNGeneral :
|
|||||||
public ClassFlowImage
|
public ClassFlowImage
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
bool debugdetailgeneral = false;
|
||||||
t_CNNType CNNType;
|
t_CNNType CNNType;
|
||||||
std::vector<general*> GENERAL;
|
std::vector<general*> GENERAL;
|
||||||
float CNNGoodThreshold;
|
float CNNGoodThreshold;
|
||||||
@@ -28,7 +29,6 @@ protected:
|
|||||||
float DigitalUnschaerfe = 0.2;
|
float DigitalUnschaerfe = 0.2;
|
||||||
int DigitalBand = 3;
|
int DigitalBand = 3;
|
||||||
float DigitalAnalogerVorgaengerUebergangsbereich = 2;
|
float DigitalAnalogerVorgaengerUebergangsbereich = 2;
|
||||||
// nicht mehr benötigt float DigitalUebergangsbereichVorgaengerAnalogToDigit = 1; // war vorher 2
|
|
||||||
float DigitalUebergangsbereichVorgaenger = 0.7; // 9.3 - 0.7
|
float DigitalUebergangsbereichVorgaenger = 0.7; // 9.3 - 0.7
|
||||||
float DigitalUebergangsbereichVorlauf = 9.7; // Vorlauf-Nulldurchgang passiert erst ab ca. 9.7
|
float DigitalUebergangsbereichVorlauf = 9.7; // Vorlauf-Nulldurchgang passiert erst ab ca. 9.7
|
||||||
|
|
||||||
@@ -41,8 +41,8 @@ protected:
|
|||||||
bool SaveAllFiles;
|
bool SaveAllFiles;
|
||||||
|
|
||||||
int ZeigerEvalAnalogNeu(float zahl, int ziffer_vorgaenger);
|
int ZeigerEvalAnalogNeu(float zahl, int ziffer_vorgaenger);
|
||||||
int ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vorgaenger, int eval_vorgaenger);
|
int ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vorgaenger, int eval_vorgaenger, float analogDigitalTransitionStart);
|
||||||
int ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, int eval_vorgaenger, bool AnalogerVorgaenger = false);
|
int ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, int eval_vorgaenger, bool AnalogerVorgaenger = false, float analogDigitalTransitionStart=9.2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ public:
|
|||||||
bool doFlow(string time);
|
bool doFlow(string time);
|
||||||
|
|
||||||
string getHTMLSingleStep(string host);
|
string getHTMLSingleStep(string host);
|
||||||
string getReadout(int _analog, bool _extendedResolution = false, int prev = -1, float _vorgaengerAnalog = -1);
|
string getReadout(int _analog, bool _extendedResolution = false, int prev = -1, float _vorgaengerAnalog = -1, float analogDigitalTransitionStart=9.2);
|
||||||
|
|
||||||
void DrawROI(CImageBasis *_zw);
|
void DrawROI(CImageBasis *_zw);
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ struct NumberPost {
|
|||||||
int AnzahlDigital;
|
int AnzahlDigital;
|
||||||
int DecimalShift;
|
int DecimalShift;
|
||||||
int DecimalShiftInitial;
|
int DecimalShiftInitial;
|
||||||
|
float AnalogDigitalTransitionStart; // Wann ist das digit > x.1, also wann fängt es an zu kippen
|
||||||
int Nachkomma;
|
int Nachkomma;
|
||||||
|
|
||||||
bool isExtendedResolution;
|
bool isExtendedResolution;
|
||||||
|
|||||||
@@ -343,6 +343,29 @@ void ClassFlowPostProcessing::handleDecimalSeparator(string _decsep, string _val
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassFlowPostProcessing::handleAnalogDigitalTransitionStart(string _decsep, string _value)
|
||||||
|
{
|
||||||
|
string _digit, _decpos;
|
||||||
|
int _pospunkt = _decsep.find_first_of(".");
|
||||||
|
// printf("Name: %s, Pospunkt: %d\n", _decsep.c_str(), _pospunkt);
|
||||||
|
if (_pospunkt > -1)
|
||||||
|
_digit = _decsep.substr(0, _pospunkt);
|
||||||
|
else
|
||||||
|
_digit = "default";
|
||||||
|
|
||||||
|
for (int j = 0; j < NUMBERS.size(); ++j)
|
||||||
|
{
|
||||||
|
float _zwdc = 9.2;
|
||||||
|
{
|
||||||
|
_zwdc = stof(_value);
|
||||||
|
}
|
||||||
|
if (_digit == "default" || NUMBERS[j]->name == _digit) // erstmal auf default setzen (falls sonst nichts gesetzt)
|
||||||
|
{
|
||||||
|
NUMBERS[j]->AnalogDigitalTransitionStart = _zwdc;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ClassFlowPostProcessing::handleMaxRateType(string _decsep, string _value)
|
void ClassFlowPostProcessing::handleMaxRateType(string _decsep, string _value)
|
||||||
@@ -447,6 +470,10 @@ bool ClassFlowPostProcessing::ReadParameter(FILE* pfile, string& aktparamgraph)
|
|||||||
{
|
{
|
||||||
handleDecimalSeparator(zerlegt[0], zerlegt[1]);
|
handleDecimalSeparator(zerlegt[0], zerlegt[1]);
|
||||||
}
|
}
|
||||||
|
if ((toUpper(_param) == "ANALOG_DIGITAL_TRANSITION_START") && (zerlegt.size() > 1))
|
||||||
|
{
|
||||||
|
handleAnalogDigitalTransitionStart(zerlegt[0], zerlegt[1]);
|
||||||
|
}
|
||||||
if ((toUpper(_param) == "MAXRATEVALUE") && (zerlegt.size() > 1))
|
if ((toUpper(_param) == "MAXRATEVALUE") && (zerlegt.size() > 1))
|
||||||
{
|
{
|
||||||
handleMaxRateValue(zerlegt[0], zerlegt[1]);
|
handleMaxRateValue(zerlegt[0], zerlegt[1]);
|
||||||
@@ -674,7 +701,7 @@ bool ClassFlowPostProcessing::doFlow(string zwtime)
|
|||||||
if (NUMBERS[j]->digit_roi)
|
if (NUMBERS[j]->digit_roi)
|
||||||
{
|
{
|
||||||
if (NUMBERS[j]->analog_roi)
|
if (NUMBERS[j]->analog_roi)
|
||||||
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, false, previous_value, NUMBERS[j]->analog_roi->ROI[0]->result_float) + NUMBERS[j]->ReturnRawValue;
|
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, false, previous_value, NUMBERS[j]->analog_roi->ROI[0]->result_float, NUMBERS[j]->AnalogDigitalTransitionStart) + NUMBERS[j]->ReturnRawValue;
|
||||||
else
|
else
|
||||||
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, NUMBERS[j]->isExtendedResolution, previous_value); // Extended Resolution nur falls es keine analogen Ziffern gibt
|
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, NUMBERS[j]->isExtendedResolution, previous_value); // Extended Resolution nur falls es keine analogen Ziffern gibt
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ protected:
|
|||||||
void handleMaxRateValue(string _decsep, string _value);
|
void handleMaxRateValue(string _decsep, string _value);
|
||||||
void handleDecimalExtendedResolution(string _decsep, string _value);
|
void handleDecimalExtendedResolution(string _decsep, string _value);
|
||||||
void handleMaxRateType(string _decsep, string _value);
|
void handleMaxRateType(string _decsep, string _value);
|
||||||
|
void handleAnalogDigitalTransitionStart(string _decsep, string _value);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
#include <unity.h>
|
||||||
|
#include <ClassFlowCNNGeneral.h>
|
||||||
|
|
||||||
|
class UnderTestCNNGeneral : public ClassFlowCNNGeneral {
|
||||||
|
public:
|
||||||
|
UnderTestCNNGeneral( ClassFlowAlignment *_flowalign, t_CNNType _cnntype) :
|
||||||
|
ClassFlowCNNGeneral(_flowalign, _cnntype) {};
|
||||||
|
|
||||||
|
using ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* Transition = x.8 - x.2 hier keine Transition in den Testfaellen
|
||||||
|
* Versatz = dig=x.n, ana= n.y: kein Versatz, da beide "n" gleich
|
||||||
|
*/
|
||||||
|
void test_analogToDigit_Standard() {
|
||||||
|
|
||||||
|
UnderTestCNNGeneral* undertest = new UnderTestCNNGeneral(nullptr, Digital100);
|
||||||
|
|
||||||
|
// 4.8 ist eine "hängende" 5. Heißt sie ist nicht bis auf 5.0 umgesprungen.
|
||||||
|
// ab Transition sollte trotzdem ein "hängendes Digit" gerundet werden.
|
||||||
|
// Transition = ja
|
||||||
|
// Versatz = nein
|
||||||
|
TEST_ASSERT_EQUAL_INT(5, undertest->ZeigerEvalAnalogToDigitNeu(4.8, 8.0, 8, 9.2));
|
||||||
|
|
||||||
|
// https://github.com/jomjol/AI-on-the-edge-device/issues/921#issue-1344032217
|
||||||
|
// Standard: dig=9.6, ana=6.8 => erg=9
|
||||||
|
// Transition = nein
|
||||||
|
// Versatz = nein
|
||||||
|
TEST_ASSERT_EQUAL_INT(9, undertest->ZeigerEvalAnalogToDigitNeu( 9.6, 6.8, 6, 9.2));
|
||||||
|
|
||||||
|
|
||||||
|
// https://github.com/jomjol/AI-on-the-edge-device/issues/921#issuecomment-1220365920
|
||||||
|
// Standard: dig=4.6, ana=6.2 => erg=4
|
||||||
|
// Transition = nein
|
||||||
|
// Versatz = nein
|
||||||
|
TEST_ASSERT_EQUAL_INT(4, undertest->ZeigerEvalAnalogToDigitNeu( 4.6, 6.2, 6, 9.2));
|
||||||
|
|
||||||
|
// https://github.com/jomjol/AI-on-the-edge-device/issues/1143#issuecomment-1274434805
|
||||||
|
// Hängendes digit ()
|
||||||
|
// Standard: dig=6.8, ana=8.6 => erg=7
|
||||||
|
// Transition = nein
|
||||||
|
// Versatz = nein
|
||||||
|
TEST_ASSERT_EQUAL_INT(7, undertest->ZeigerEvalAnalogToDigitNeu( 6.8, 8.6, 6, 9.2));
|
||||||
|
|
||||||
|
// https://github.com/jomjol/AI-on-the-edge-device/issues/1143#issuecomment-1274434805
|
||||||
|
// Ebenfalls Hängendes digit () bei kleinem Zeiger nach 0-Durchlauf
|
||||||
|
// Standard: dig=6.8, ana=1.0 => erg=7
|
||||||
|
// Transition = nein
|
||||||
|
// Versatz = nein
|
||||||
|
TEST_ASSERT_EQUAL_INT(7, undertest->ZeigerEvalAnalogToDigitNeu( 6.8, 8.6, 6, 9.2));
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_analogToDigit_Transition() {
|
||||||
|
UnderTestCNNGeneral* undertest = new UnderTestCNNGeneral(nullptr, Digital100);
|
||||||
|
|
||||||
|
// https://github.com/jomjol/AI-on-the-edge-device/issues/921#issuecomment-1222672175
|
||||||
|
// Standard: dig=3.9, ana=9.7 => erg=3
|
||||||
|
// Transition = ja
|
||||||
|
// Nulldurchgang = nein
|
||||||
|
// Versatz = nein
|
||||||
|
TEST_ASSERT_EQUAL_INT(3, undertest->ZeigerEvalAnalogToDigitNeu( 3.9, 9.7, 9, 9.2));
|
||||||
|
|
||||||
|
// ohne Referenz
|
||||||
|
// Standard: dig=4.0, ana=9.1 => erg=4
|
||||||
|
// Transition = ja
|
||||||
|
// Nulldurchgang = nein
|
||||||
|
// Versatz = nein
|
||||||
|
// Besonderheit: Digit ist bei analog 9.1 noch nicht losgelaufen
|
||||||
|
TEST_ASSERT_EQUAL_INT(4, undertest->ZeigerEvalAnalogToDigitNeu( 4.0, 9.1, 9, 9.2));
|
||||||
|
|
||||||
|
// ohne Referenz
|
||||||
|
// Standard: dig=9.8, ana=0.1, ana_2=9.9 => erg=9
|
||||||
|
// Transition = ja
|
||||||
|
// Nulldurchgang = nein
|
||||||
|
// Versatz = nein
|
||||||
|
// Besonderheit: analog wird durch vorherigen analog wieder auf 9 gesetzt
|
||||||
|
TEST_ASSERT_EQUAL_INT(9, undertest->ZeigerEvalAnalogToDigitNeu( 9.8, 0.1, 9, 9.2));
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "test_flow.h"
|
#include "test_flow_postrocess_helper.h"
|
||||||
|
|
||||||
|
|
||||||
UnderTestPost* setUpClassFlowPostprocessing(t_CNNType digType, t_CNNType anaType)
|
UnderTestPost* setUpClassFlowPostprocessing(t_CNNType digType, t_CNNType anaType)
|
||||||
@@ -42,7 +42,9 @@ std::string process_doFlow(std::vector<float> analog, std::vector<float> digits,
|
|||||||
// run test
|
// run test
|
||||||
TEST_ASSERT_TRUE(_undertestPost->doFlow(time));
|
TEST_ASSERT_TRUE(_undertestPost->doFlow(time));
|
||||||
|
|
||||||
return _undertestPost->getReadout(0);
|
std::string result = _undertestPost->getReadout(0);
|
||||||
|
delete _undertestPost;
|
||||||
|
return result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "test_flow.h"
|
#include "test_flow_postrocess_helper.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
#include "test_flow.h"
|
#include "test_flow_postrocess_helper.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* ACHTUNG! Die Test laufen aktuell nur mit ausgeschaltetem Debug in ClassFlowCNNGeneral
|
||||||
|
*
|
||||||
|
*
|
||||||
* @brief Testet die doFlow-Methode von ClassFlowPostprocessing
|
* @brief Testet die doFlow-Methode von ClassFlowPostprocessing
|
||||||
* digits[] - enthält die liste der vom Model zurückgegebenen Ergebnisse (class100/cont) in der Reihenfolge von links nach rechts
|
* digits[] - enthält die liste der vom Model zurückgegebenen Ergebnisse (class100/cont) in der Reihenfolge von links nach rechts
|
||||||
* analog[] - enthält die Liste der Zeiger vom Model, wie bei den digits
|
* analog[] - enthält die Liste der Zeiger vom Model, wie bei den digits
|
||||||
@@ -29,7 +32,7 @@ void test_doFlow() {
|
|||||||
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* https://github.com/jomjol/AI-on-the-edge-device/issues/921
|
* https://github.com/jomjol/AI-on-the-edge-device/issues/921#issue-1344032217
|
||||||
*
|
*
|
||||||
* Das Ergebnis sollte "376529.6" sein.
|
* Das Ergebnis sollte "376529.6" sein.
|
||||||
*/
|
*/
|
||||||
@@ -40,7 +43,7 @@ void test_doFlow() {
|
|||||||
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* https://github.com/jomjol/AI-on-the-edge-device/issues/921
|
* https://github.com/jomjol/AI-on-the-edge-device/issues/921#issuecomment-1220365920
|
||||||
*
|
*
|
||||||
* Das Ergebnis sollte "167734.6" sein. Bzw. 16.98 ohne Extended true
|
* Das Ergebnis sollte "167734.6" sein. Bzw. 16.98 ohne Extended true
|
||||||
*/
|
*/
|
||||||
@@ -81,13 +84,13 @@ void test_doFlow() {
|
|||||||
|
|
||||||
digits = { 1.1, 9.0, 4.0};
|
digits = { 1.1, 9.0, 4.0};
|
||||||
analogs = { 8.1, 2.6, 6.25, 9.7};
|
analogs = { 8.1, 2.6, 6.25, 9.7};
|
||||||
expected = "193.8259";
|
expected = "194.8259";
|
||||||
result = process_doFlow(analogs, digits);
|
result = process_doFlow(analogs, digits);
|
||||||
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
||||||
|
|
||||||
digits = { 1.1, 9.0, 4.0};
|
digits = { 1.1, 9.0, 4.0};
|
||||||
analogs = { 9.1, 2.6, 6.25, 9.7};
|
analogs = { 9.1, 2.6, 6.25, 9.7};
|
||||||
expected = "193.9259";
|
expected = "194.9259";
|
||||||
result = process_doFlow(analogs, digits);
|
result = process_doFlow(analogs, digits);
|
||||||
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
||||||
|
|
||||||
@@ -346,10 +349,10 @@ void test_doFlow() {
|
|||||||
|
|
||||||
// Fehler bei V12.0.1
|
// Fehler bei V12.0.1
|
||||||
// https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issue-1391153343
|
// https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issue-1391153343
|
||||||
digits = { 1.0, 4.0, 2.0}; // 142.9269 als falsches Ergebnis
|
digits = { 1.0, 4.0, 2.0}; // 141.9269 als falsches Ergebnis
|
||||||
analogs = { 9.2, 2.5, 6.8, 9.0};
|
analogs = { 9.2, 2.5, 6.8, 9.0};
|
||||||
expected = "141.9269";
|
expected = "142.9269";
|
||||||
expected_extended= "141.92690";
|
expected_extended= "142.92690";
|
||||||
|
|
||||||
// extendResolution=false
|
// extendResolution=false
|
||||||
result = process_doFlow(analogs, digits, Digital100, false, false, 0);
|
result = process_doFlow(analogs, digits, Digital100, false, false, 0);
|
||||||
@@ -364,8 +367,11 @@ void test_doFlow() {
|
|||||||
// https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issuecomment-1262626388
|
// https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issuecomment-1262626388
|
||||||
digits = { 1.2, 6.8, 0.0, 0.0, 5.0, 2.8}; //170.05387 als falsches Ergebnis
|
digits = { 1.2, 6.8, 0.0, 0.0, 5.0, 2.8}; //170.05387 als falsches Ergebnis
|
||||||
analogs = { 8.7};
|
analogs = { 8.7};
|
||||||
expected = "170.0528";
|
// Aktuell nicht sicher, ob doch
|
||||||
expected_extended= "170.05287";
|
expected = "170.0538";
|
||||||
|
expected_extended= "170.05387";
|
||||||
|
//expected = "170.0528";
|
||||||
|
//expected_extended= "170.05287";
|
||||||
|
|
||||||
// extendResolution=false
|
// extendResolution=false
|
||||||
result = process_doFlow(analogs, digits, Digital100, false, false, -3);
|
result = process_doFlow(analogs, digits, Digital100, false, false, -3);
|
||||||
@@ -378,10 +384,10 @@ void test_doFlow() {
|
|||||||
|
|
||||||
// Fehler bei rolling post V12.0.1
|
// Fehler bei rolling post V12.0.1
|
||||||
// lokal watermeter1
|
// lokal watermeter1
|
||||||
digits = { 0.0, 0.0, 9.0, 1.0}; //91.88174 als falsches Ergebnis
|
digits = { 0.0, 0.0, 9.0, 1.0}; //90.88174 als falsches Ergebnis
|
||||||
analogs = {9.0, 8.0, 1.8, 7.4};
|
analogs = {9.0, 8.0, 1.8, 7.4};
|
||||||
expected = "90.8817";
|
expected = "91.8817";
|
||||||
expected_extended= "90.88174";
|
expected_extended= "91.88174";
|
||||||
|
|
||||||
// extendResolution=false
|
// extendResolution=false
|
||||||
result = process_doFlow(analogs, digits, Digital100, false, false, 0);
|
result = process_doFlow(analogs, digits, Digital100, false, false, 0);
|
||||||
@@ -426,9 +432,8 @@ void test_doFlow() {
|
|||||||
// https://github.com/jomjol/AI-on-the-edge-device/issues/1143#issuecomment-1274434805
|
// https://github.com/jomjol/AI-on-the-edge-device/issues/1143#issuecomment-1274434805
|
||||||
digits = { 4.9, 6.9, 6.8}; // 576.8649 als falsches Ergebnis
|
digits = { 4.9, 6.9, 6.8}; // 576.8649 als falsches Ergebnis
|
||||||
analogs = {8.6, 6.2, 5.0, 9.0};
|
analogs = {8.6, 6.2, 5.0, 9.0};
|
||||||
// fall unklar ob wirklich 577 oder 576, erst mal 577
|
expected = "577.8649";
|
||||||
expected = "576.8649";
|
expected_extended= "577.86490";
|
||||||
expected_extended= "576.86490";
|
|
||||||
|
|
||||||
// extendResolution=false
|
// extendResolution=false
|
||||||
result = process_doFlow(analogs, digits, Digital100, false, false, 0);
|
result = process_doFlow(analogs, digits, Digital100, false, false, 0);
|
||||||
@@ -440,19 +445,18 @@ void test_doFlow() {
|
|||||||
|
|
||||||
|
|
||||||
// Fehler V12.0.1 "TODO 00211.03480 vs 00211.03580"
|
// Fehler V12.0.1 "TODO 00211.03480 vs 00211.03580"
|
||||||
// Lokal
|
// Lokal "Hängendes Digit"
|
||||||
digits = { 4.9, 6.9, 6.8}; // 576.8649 als falsches Ergebnis
|
digits = { 2.0, 1.0, 1.0, 0.0, 3.0, 4.8}; // 00211.03480 als falsches Ergebnis
|
||||||
analogs = {8.6, 6.2, 5.0, 9.0};
|
analogs = {8.0};
|
||||||
// fall unklar ob wirklich 577 oder 576, erst mal 577
|
expected = "211.0358";
|
||||||
expected = "576.8649";
|
expected_extended= "211.03580";
|
||||||
expected_extended= "576.86490";
|
|
||||||
|
|
||||||
// extendResolution=false
|
// extendResolution=false
|
||||||
result = process_doFlow(analogs, digits, Digital100, false, false, 0);
|
result = process_doFlow(analogs, digits, Digital100, false, false, -3);
|
||||||
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
|
||||||
|
|
||||||
// checkConsistency=false und extendResolution=true
|
// checkConsistency=false und extendResolution=true
|
||||||
result = process_doFlow(analogs, digits, Digital100, false, true, 0);
|
result = process_doFlow(analogs, digits, Digital100, false, true, -3);
|
||||||
TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
|
TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
#include <unity.h>
|
#include <unity.h>
|
||||||
|
|
||||||
#include "components/jomjol-flowcontroll/test_flow.cpp"
|
#include "components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp"
|
||||||
#include "components/jomjol-flowcontroll/test_flowpostprocessing.cpp"
|
#include "components/jomjol-flowcontroll/test_flowpostprocessing.cpp"
|
||||||
#include "components/jomjol-flowcontroll/test_flow_pp_negative.cpp"
|
#include "components/jomjol-flowcontroll/test_flow_pp_negative.cpp"
|
||||||
|
#include "components/jomjol-flowcontroll/test_ZeigerEvalAnalogToDigitNeu.cpp"
|
||||||
// SD-Card ////////////////////
|
// SD-Card ////////////////////
|
||||||
#include "nvs_flash.h"
|
#include "nvs_flash.h"
|
||||||
#include "esp_vfs_fat.h"
|
#include "esp_vfs_fat.h"
|
||||||
@@ -104,8 +105,10 @@ extern "C" void app_main()
|
|||||||
Init_NVS_SDCard();
|
Init_NVS_SDCard();
|
||||||
UNITY_BEGIN();
|
UNITY_BEGIN();
|
||||||
|
|
||||||
RUN_TEST(testNegative);
|
RUN_TEST(test_analogToDigit_Standard);
|
||||||
RUN_TEST(test_doFlow);
|
RUN_TEST(test_analogToDigit_Transition);
|
||||||
|
//RUN_TEST(testNegative);
|
||||||
|
RUN_TEST(test_doFlow);
|
||||||
|
|
||||||
UNITY_END();
|
UNITY_END();
|
||||||
}
|
}
|
||||||
@@ -489,6 +489,20 @@ textarea {
|
|||||||
Shift the digit separator within the digital digits (positiv and negativ)
|
Shift the digit separator within the digital digits (positiv and negativ)
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="indent1">
|
||||||
|
<input type="checkbox" id="PostProcessing_AnalogDigitalTransitionStart_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "AnalogDigitalTransitionStart")' unchecked >
|
||||||
|
<label for=PostProcessing_AnalogDigitalTransitionStart_enabled><class id="PostProcessing_AnalogDigitalTransitionStart_text" style="color:black;">analogDigitalTransitionStart</class></label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="number" id="PostProcessing_AnalogDigitalTransitionStart_value1" step="0.1" value="9.2">
|
||||||
|
</td>
|
||||||
|
<td style="font-size: 80%;">
|
||||||
|
If you have false Values, but the recognition is correct. Look for the start of changing of the first digit and note the analog pointer value behind. Set it here.
|
||||||
|
Only used on combination of digits and analog pointers.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td class="indent1">
|
<td class="indent1">
|
||||||
<input type="checkbox" id="PostProcessing_MaxRateValue_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "MaxRateValue")' unchecked >
|
<input type="checkbox" id="PostProcessing_MaxRateValue_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "MaxRateValue")' unchecked >
|
||||||
|
|||||||
Reference in New Issue
Block a user