This commit is contained in:
michael
2026-01-20 23:43:45 +01:00
parent 6e1288dca0
commit 4cd8cad83d
41 changed files with 1184 additions and 1306 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -42,15 +42,15 @@ std::vector<double> ClassFlowCNNGeneral::getMeterValues(int _number = 0)
return meterValues;
}
for (int i = 0; i < GENERAL[_number]->ROI.size(); ++i)
for (int _roi = 0; _roi < GENERAL[_number]->ROI.size(); ++_roi)
{
if (CNNType == Digit)
{
meterValues.push_back(GENERAL[_number]->ROI[i]->result_klasse);
meterValues.push_back(GENERAL[_number]->ROI[_roi]->result_klasse);
}
else
{
meterValues.push_back(GENERAL[_number]->ROI[i]->result_float);
meterValues.push_back(GENERAL[_number]->ROI[_roi]->result_float);
}
}
@@ -81,9 +81,9 @@ std::string ClassFlowCNNGeneral::getReadout(int _number = 0, bool _extendedResol
result = result + std::to_string(result_after_decimal_point);
}
for (int i = GENERAL[_number]->ROI.size() - 2; i >= 0; --i)
for (int _roi = GENERAL[_number]->ROI.size() - 2; _roi >= 0; --_roi)
{
prev = PointerEvalAnalog(GENERAL[_number]->ROI[i]->result_float, prev);
prev = PointerEvalAnalog(GENERAL[_number]->ROI[_roi]->result_float, prev);
result = std::to_string(prev) + result;
}
return result;
@@ -91,11 +91,11 @@ std::string ClassFlowCNNGeneral::getReadout(int _number = 0, bool _extendedResol
if (CNNType == Digit)
{
for (int i = 0; i < GENERAL[_number]->ROI.size(); ++i)
for (int _roi = 0; _roi < GENERAL[_number]->ROI.size(); ++_roi)
{
if ((GENERAL[_number]->ROI[i]->result_klasse >= 0) && (GENERAL[_number]->ROI[i]->result_klasse < 10))
if ((GENERAL[_number]->ROI[_roi]->result_klasse >= 0) && (GENERAL[_number]->ROI[_roi]->result_klasse < 10))
{
result = result + std::to_string(GENERAL[_number]->ROI[i]->result_klasse);
result = result + std::to_string(GENERAL[_number]->ROI[_roi]->result_klasse);
}
else
{
@@ -153,20 +153,20 @@ std::string ClassFlowCNNGeneral::getReadout(int _number = 0, bool _extendedResol
}
}
for (int i = GENERAL[_number]->ROI.size() - 2; i >= 0; --i)
for (int _roi = GENERAL[_number]->ROI.size() - 2; _roi >= 0; --_roi)
{
if ((GENERAL[_number]->ROI[i]->result_float >= 0.0f) && (GENERAL[_number]->ROI[i]->result_float < 10.0f))
if ((GENERAL[_number]->ROI[_roi]->result_float >= 0.0f) && (GENERAL[_number]->ROI[_roi]->result_float < 10.0f))
{
prev = PointerEvalHybrid(GENERAL[_number]->ROI[i]->result_float, GENERAL[_number]->ROI[i + 1]->result_float, prev);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(DoubleHyprid10) - roi_" + std::to_string(i) + "prev= " + std::to_string(prev));
prev = PointerEvalHybrid(GENERAL[_number]->ROI[_roi]->result_float, GENERAL[_number]->ROI[_roi + 1]->result_float, prev);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(DoubleHyprid10) - roi_" + std::to_string(_roi) + "prev= " + std::to_string(prev));
result = std::to_string(prev) + result;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(DoubleHyprid10) - roi_" + std::to_string(i) + "result= " + result);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(DoubleHyprid10) - roi_" + std::to_string(_roi) + "result= " + result);
}
else
{
prev = -1;
result = "N" + result;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(result_float < 0 /'N') - roi_" + std::to_string(i) + "result_float=" + std::to_string(GENERAL[_number]->ROI[i]->result_float));
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "getReadout(result_float < 0 /'N') - roi_" + std::to_string(_roi) + "result_float=" + std::to_string(GENERAL[_number]->ROI[_roi]->result_float));
}
}
return result;
@@ -194,7 +194,7 @@ int ClassFlowCNNGeneral::PointerEvalHybrid(float number, float number_of_predece
{
int result = -1;
int result_after_decimal_point = ((int)floor(number * 10.0f)) % 10;
int result_before_decimal_point = ((int)floor(number) + 10) % 10;
int result_before_decimal_point = ((int)(floor(number) + 10.0f)) % 10;
if (eval_predecessors < 0)
{
@@ -203,7 +203,7 @@ int ClassFlowCNNGeneral::PointerEvalHybrid(float number, float number_of_predece
// add precisition of 2 digits and round before trunc
// a number greater than 9.994999 is returned as 10, this leads to an error during the decimal shift because the NUMBERS[j]->ReturnRawValue is one digit longer.
// To avoid this, an additional test must be carried out, see "if ((CNNType == DoubleHyprid10) || (CNNType == Digit100))" check in getReadout()
result = (int) (trunc(round((float)((int)(number + 10.0f) % 10) * 100.0f)) / 100.0f);
result = (int)(trunc(round((float)((int)(number + 10.0f) % 10) * 100.0f)) / 100.0f);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalHybrid - No predecessor - Result = " + 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) + " Digit_Uncertainty = " + std::to_string(Digit_Uncertainty));
return result;
@@ -216,17 +216,17 @@ int ClassFlowCNNGeneral::PointerEvalHybrid(float number, float number_of_predece
return result;
}
if ((number_of_predecessors >= Digit_Transition_Area_Predecessor) && (number_of_predecessors <= (10.0 - Digit_Transition_Area_Predecessor)))
if ((number_of_predecessors >= (float)Digit_Transition_Area_Predecessor) && (number_of_predecessors <= (10.0f - (float)Digit_Transition_Area_Predecessor)))
{
// no digit change, because predecessor is far enough away (0+/-DigitTransitionRangePredecessor) --> number is rounded
// Band around the digit --> Round off, as digit reaches inaccuracy in the frame
if ((result_after_decimal_point <= DigitBand) || (result_after_decimal_point >= (10 - DigitBand)))
{
result = ((int)round(number) + 10) % 10;
result = ((int)(round(number) + 10.0f)) % 10;
}
else
{
result = ((int)trunc(number) + 10) % 10;
result = ((int)(trunc(number) + 10.0f)) % 10;
}
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalHybrid - 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) + " Digit_Uncertainty = " + std::to_string(Digit_Uncertainty));
@@ -277,24 +277,24 @@ int ClassFlowCNNGeneral::PointerEvalAnalogToDigit(float number, float numeral_pr
{
int result = -1;
int result_after_decimal_point = ((int)floor(number * 10.0f)) % 10;
int result_before_decimal_point = ((int)floor(number) + 10) % 10;
int result_before_decimal_point = ((int)(floor(number) + 10.0f)) % 10;
bool roundedUp = false;
// Within the digit inequalities
// Band around the digit --> Round off, as digit reaches inaccuracy in the frame
if ((result_after_decimal_point >= (10 - (int)(Digit_Uncertainty * 10.0f))) || (eval_predecessors <= 4 && result_after_decimal_point >= 6))
if ((result_after_decimal_point >= (int)(10.0f - ((float)Digit_Uncertainty * 10.0f))) || (eval_predecessors <= 4 && result_after_decimal_point >= 6))
{
// or digit runs after (analogue =0..4, digit >=6)
result = (int)(round(number) + 10) % 10;
result = (int)(round(number) + 10.0f) % 10;
roundedUp = true;
// before/ after decimal point, because we adjust the number based on the uncertainty.
result_after_decimal_point = ((int)floor(result * 10)) % 10;
result_before_decimal_point = ((int)floor(result) + 10) % 10;
result_after_decimal_point = ((int)floor(result * 10.0f)) % 10;
result_before_decimal_point = ((int)(floor(result) + 10.0f)) % 10;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalogToDigit - Digit Uncertainty - Result = " + std::to_string(result) + " 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
{
result = (int)((int)trunc(number) + 10) % 10;
result = (int)((int)(trunc(number) + 10.0f)) % 10;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalogToDigit - NO digit Uncertainty - Result = " + std::to_string(result) + " number: " + std::to_string(number) + " numeral_preceder = " + std::to_string(numeral_preceder));
}
@@ -321,26 +321,26 @@ int ClassFlowCNNGeneral::PointerEvalAnalog(float number, int numeral_preceder)
return result;
}
float number_min = number - (float)Analog_error / 10.0f;
float number_max = number + (float)Analog_error / 10.0f;
float number_min = number - ((float)Analog_error / 10.0f);
float number_max = number + ((float)Analog_error / 10.0f);
if ((int)floor(number_max) - (int)floor(number_min) != 0)
{
if (numeral_preceder <= Analog_error)
if (numeral_preceder <= (int)Analog_error)
{
result = ((int)floor(number_max) + 10) % 10;
result = ((int)(floor(number_max) + 10.0f)) % 10;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalog - 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 - (int)Analog_error))
{
result = ((int)floor(number_min) + 10) % 10;
result = ((int)(floor(number_min) + 10.0f)) % 10;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalog - 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));
return result;
}
}
result = ((int)floor(number) + 10) % 10;
result = ((int)(floor(number) + 10.0f)) % 10;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "PointerEvalAnalog - 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));
return result;
@@ -455,12 +455,12 @@ bool ClassFlowCNNGeneral::ReadParameter(FILE *pfile, std::string &aktparamgraph)
return false;
}
for (int i = 0; i < GENERAL.size(); ++i)
for (int _number = 0; _number < GENERAL.size(); ++_number)
{
for (int j = 0; j < GENERAL[i]->ROI.size(); ++j)
for (int _roi = 0; _roi < GENERAL[_number]->ROI.size(); ++_roi)
{
GENERAL[i]->ROI[j]->image = new CImageBasis("ROI " + GENERAL[i]->ROI[j]->name, model_x_size, model_y_size, model_channel);
GENERAL[i]->ROI[j]->image_org = new CImageBasis("ROI " + GENERAL[i]->ROI[j]->name + " original", GENERAL[i]->ROI[j]->delta_x, GENERAL[i]->ROI[j]->delta_y, 3);
GENERAL[_number]->ROI[_roi]->image = new CImageBasis("ROI " + GENERAL[_number]->ROI[_roi]->name, model_x_size, model_y_size, model_channel);
GENERAL[_number]->ROI[_roi]->image_org = new CImageBasis("ROI " + GENERAL[_number]->ROI[_roi]->name + " original", GENERAL[_number]->ROI[_roi]->delta_x, GENERAL[_number]->ROI[_roi]->delta_y, 3);
}
}
@@ -469,11 +469,11 @@ bool ClassFlowCNNGeneral::ReadParameter(FILE *pfile, std::string &aktparamgraph)
general *ClassFlowCNNGeneral::FindGENERAL(std::string _name_number)
{
for (int i = 0; i < GENERAL.size(); ++i)
for (int _number = 0; _number < GENERAL.size(); ++_number)
{
if (GENERAL[i]->name == _name_number)
if (GENERAL[_number]->name == _name_number)
{
return GENERAL[i];
return GENERAL[_number];
}
}
@@ -773,34 +773,34 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _imagetime: " + std::to_string(_imagetime));
// For each NUMBER
for (int j = 0; j < GENERAL.size(); ++j)
for (int _number = 0; _number < GENERAL.size(); ++_number)
{
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Processing Number '" + GENERAL[j]->name + "'");
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Processing Number '" + GENERAL[_number]->name + "'");
int start_roi = 0;
if ((numbers[j]->useMaxFlowRate) && (numbers[j]->PreValueValid) && (numbers[j]->timeStampLastValue == numbers[j]->timeStampLastPreValue))
if ((numbers[_number]->useMaxFlowRate) && (numbers[_number]->PreValueValid) && (numbers[_number]->timeStampLastValue == numbers[_number]->timeStampLastPreValue))
{
int _AnzahlDigit = numbers[j]->AnzahlDigit;
int _AnzahlDigit = numbers[_number]->AnzahlDigit;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _AnzahlDigit: " + std::to_string(_AnzahlDigit));
int _AnzahlAnalog = numbers[j]->AnzahlAnalog;
int _AnzahlAnalog = numbers[_number]->AnzahlAnalog;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _AnzahlAnalog: " + std::to_string(_AnzahlAnalog));
float _MaxFlowRate = (numbers[j]->MaxFlowRate / 60); // in unit/minutes
float _MaxFlowRate = (numbers[_number]->MaxFlowRate / 60); // in unit/minutes
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _MaxFlowRate: " + std::to_string(_MaxFlowRate));
float _LastPreValueTimeDifference = (float)((difftime(_imagetime, numbers[j]->timeStampLastPreValue)) / 60); // in minutes
float _LastPreValueTimeDifference = (float)((difftime(_imagetime, numbers[_number]->timeStampLastPreValue)) / 60); // in minutes
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _LastPreValueTimeDifference: " + std::to_string(_LastPreValueTimeDifference) + " minutes");
std::string _PreValue_old = std::to_string((float)numbers[j]->PreValue);
std::string _PreValue_old = std::to_string((float)numbers[_number]->PreValue);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _PreValue_old: " + _PreValue_old);
////////////////////////////////////////////////////
std::string _PreValue_new1 = std::to_string((float)numbers[j]->PreValue + (_MaxFlowRate * _LastPreValueTimeDifference));
std::string _PreValue_new1 = std::to_string((float)numbers[_number]->PreValue + (_MaxFlowRate * _LastPreValueTimeDifference));
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _PreValue_new1: " + _PreValue_new1);
std::string _PreValue_new2 = std::to_string((float)numbers[j]->PreValue - (_MaxFlowRate * _LastPreValueTimeDifference));
std::string _PreValue_new2 = std::to_string((float)numbers[_number]->PreValue - (_MaxFlowRate * _LastPreValueTimeDifference));
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _PreValue_new2: " + _PreValue_new2);
////////////////////////////////////////////////////
@@ -810,12 +810,12 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
if (_pospunkt > -1)
{
_CorrectionValue = _PreValue_old.length() - _pospunkt;
_CorrectionValue = _CorrectionValue - numbers[j]->Nachkomma;
_CorrectionValue = _CorrectionValue - numbers[_number]->Nachkomma;
}
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "doNeuralNetwork, _CorrectionValue: " + std::to_string(_CorrectionValue));
int _PreValue_len = ((int)_PreValue_old.length() - _CorrectionValue);
if (numbers[j]->isExtendedResolution)
if (numbers[_number]->ExtendedResolution)
{
_PreValue_len = _PreValue_len - 1;
}
@@ -845,7 +845,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
////////////////////////////////////////////////////
// (-) Find out which Numbers should not change
int _NumbersNotChanged2 = _NumbersNotChanged1;
if (numbers[j]->AllowNegativeRates)
if (numbers[_number]->AllowNegativeRates)
{
int _DecimalPoint2 = 0;
while ((_PreValue_old.length() > _NumbersNotChanged2) && (_PreValue_old[_NumbersNotChanged2] == _PreValue_new2[_NumbersNotChanged2]))
@@ -898,9 +898,9 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
}
// For each ROI
for (int i = 0; i < GENERAL[j]->ROI.size(); ++i)
for (int _roi = 0; _roi < GENERAL[_number]->ROI.size(); ++_roi)
{
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ROI #" + std::to_string(i) + " - TfLite");
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ROI #" + std::to_string(_roi) + " - TfLite");
switch (CNNType)
{
@@ -908,7 +908,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
{
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Analogue");
tflite->LoadInputImageBasis(GENERAL[j]->ROI[i]->image);
tflite->LoadInputImageBasis(GENERAL[_number]->ROI[_roi]->image);
tflite->Invoke();
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Analogue - After Invoke");
@@ -918,7 +918,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
float _result = fmod((atan2(_value1, _value2) / (M_PI * 2.0f) + 2.0f), 1.0f);
if (GENERAL[j]->ROI[i]->ccw)
if (GENERAL[_number]->ROI[_roi]->ccw)
{
_result = 10.0f - (_result * 10.0f);
}
@@ -927,34 +927,34 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
_result = _result * 10.0f;
}
if (i >= start_roi)
if (_roi >= start_roi)
{
GENERAL[j]->ROI[i]->result_float = _result;
GENERAL[_number]->ROI[_roi]->result_float = _result;
}
GENERAL[j]->ROI[i]->raw_result_float = _result;
GENERAL[_number]->ROI[_roi]->raw_result_float = _result;
if ((_result < 0.0f) || (_result >= 10.0f))
{
GENERAL[j]->ROI[i]->isReject = true;
GENERAL[_number]->ROI[_roi]->isReject = true;
}
else
{
GENERAL[j]->ROI[i]->isReject = false;
GENERAL[_number]->ROI[_roi]->isReject = false;
}
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "General result (Analog) - roi_" + std::to_string(i) + ": " + std::to_string(GENERAL[j]->ROI[i]->raw_result_float));
ESP_LOGD(TAG, "General result (Analog) - roi_%i - ccw: %d - %f", i, GENERAL[j]->ROI[i]->ccw, GENERAL[j]->ROI[i]->raw_result_float);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "General result (Analog) - roi_" + std::to_string(_roi) + ": " + std::to_string(GENERAL[_number]->ROI[_roi]->raw_result_float));
ESP_LOGD(TAG, "General result (Analog) - roi_%i - ccw: %d - %f", _roi, GENERAL[_number]->ROI[_roi]->ccw, GENERAL[_number]->ROI[_roi]->raw_result_float);
if (isLogImage)
{
std::string _image_name = GENERAL[j]->name + "_" + GENERAL[j]->ROI[i]->name;
std::string _image_name = GENERAL[_number]->name + "_" + GENERAL[_number]->ROI[_roi]->name;
if (isLogImageSelect)
{
if (LogImageSelect.find(GENERAL[j]->ROI[i]->name) != std::string::npos)
if (LogImageSelect.find(GENERAL[_number]->ROI[_roi]->name) != std::string::npos)
{
LogImage(logPath, _image_name, &GENERAL[j]->ROI[i]->raw_result_float, NULL, time_value, GENERAL[j]->ROI[i]->image_org);
LogImage(logPath, _image_name, &GENERAL[_number]->ROI[_roi]->raw_result_float, NULL, time_value, GENERAL[_number]->ROI[_roi]->image_org);
}
}
}
@@ -965,36 +965,36 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
{
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Digit");
int _result = tflite->GetClassFromImageBasis(GENERAL[j]->ROI[i]->image);
int _result = tflite->GetClassFromImageBasis(GENERAL[_number]->ROI[_roi]->image);
if (i >= start_roi)
if (_roi >= start_roi)
{
GENERAL[j]->ROI[i]->result_klasse = _result;
GENERAL[_number]->ROI[_roi]->result_klasse = _result;
}
GENERAL[j]->ROI[i]->raw_result_klasse = _result;
GENERAL[_number]->ROI[_roi]->raw_result_klasse = _result;
if ((_result < 0) || (_result >= 10))
{
GENERAL[j]->ROI[i]->isReject = true;
GENERAL[_number]->ROI[_roi]->isReject = true;
}
else
{
GENERAL[j]->ROI[i]->isReject = false;
GENERAL[_number]->ROI[_roi]->isReject = false;
}
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "General result (Digit) - roi_" + std::to_string(i) + ": " + std::to_string(GENERAL[j]->ROI[i]->raw_result_klasse));
ESP_LOGD(TAG, "General result (Digit) - roi_%i: %d", i, GENERAL[j]->ROI[i]->raw_result_klasse);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "General result (Digit) - roi_" + std::to_string(_roi) + ": " + std::to_string(GENERAL[_number]->ROI[_roi]->raw_result_klasse));
ESP_LOGD(TAG, "General result (Digit) - roi_%i: %d", _roi, GENERAL[_number]->ROI[_roi]->raw_result_klasse);
if (isLogImage)
{
std::string _image_name = GENERAL[j]->name + "_" + GENERAL[j]->ROI[i]->name;
std::string _image_name = GENERAL[_number]->name + "_" + GENERAL[_number]->ROI[_roi]->name;
if (isLogImageSelect)
{
if (LogImageSelect.find(GENERAL[j]->ROI[i]->name) != std::string::npos)
if (LogImageSelect.find(GENERAL[_number]->ROI[_roi]->name) != std::string::npos)
{
LogImage(logPath, _image_name, NULL, &GENERAL[j]->ROI[i]->raw_result_klasse, time_value, GENERAL[j]->ROI[i]->image_org);
LogImage(logPath, _image_name, NULL, &GENERAL[_number]->ROI[_roi]->raw_result_klasse, time_value, GENERAL[_number]->ROI[_roi]->image_org);
}
}
}
@@ -1005,7 +1005,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
{
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: DoubleHyprid10");
tflite->LoadInputImageBasis(GENERAL[j]->ROI[i]->image);
tflite->LoadInputImageBasis(GENERAL[_number]->ROI[_roi]->image);
tflite->Invoke();
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "DoubleHyprid10 - After Invoke");
@@ -1040,39 +1040,39 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
if (_fit < CNNGoodThreshold)
{
GENERAL[j]->ROI[i]->isReject = true;
GENERAL[_number]->ROI[_roi]->isReject = true;
_result = -1;
temp_bufer = "DoubleHyprid10 - Value Rejected due to Threshold (Fit: " + std::to_string(_fit) + ", Threshold: " + std::to_string(CNNGoodThreshold) + ")";
LogFile.WriteToFile(ESP_LOG_WARN, TAG, temp_bufer);
}
else
{
GENERAL[j]->ROI[i]->isReject = false;
GENERAL[_number]->ROI[_roi]->isReject = false;
}
if (GENERAL[j]->ROI[i]->ccw)
if (GENERAL[_number]->ROI[_roi]->ccw)
{
}
if (i >= start_roi)
if (_roi >= start_roi)
{
GENERAL[j]->ROI[i]->result_float = _result;
GENERAL[_number]->ROI[_roi]->result_float = _result;
}
GENERAL[j]->ROI[i]->raw_result_float = _result;
GENERAL[_number]->ROI[_roi]->raw_result_float = _result;
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Result General(DoubleHyprid10) - roi_" + std::to_string(i) + ": " + std::to_string(GENERAL[j]->ROI[i]->raw_result_float));
ESP_LOGD(TAG, "Result General(DoubleHyprid10) - roi_%i: %f", i, GENERAL[j]->ROI[i]->raw_result_float);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Result General(DoubleHyprid10) - roi_" + std::to_string(_roi) + ": " + std::to_string(GENERAL[_number]->ROI[_roi]->raw_result_float));
ESP_LOGD(TAG, "Result General(DoubleHyprid10) - roi_%i: %f", _roi, GENERAL[_number]->ROI[_roi]->raw_result_float);
if (isLogImage)
{
std::string _image_name = GENERAL[j]->name + "_" + GENERAL[j]->ROI[i]->name;
std::string _image_name = GENERAL[_number]->name + "_" + GENERAL[_number]->ROI[_roi]->name;
if (isLogImageSelect)
{
if (LogImageSelect.find(GENERAL[j]->ROI[i]->name) != std::string::npos)
if (LogImageSelect.find(GENERAL[_number]->ROI[_roi]->name) != std::string::npos)
{
LogImage(logPath, _image_name, &_result_save_file, NULL, time_value, GENERAL[j]->ROI[i]->image_org);
LogImage(logPath, _image_name, &_result_save_file, NULL, time_value, GENERAL[_number]->ROI[_roi]->image_org);
}
}
}
@@ -1084,13 +1084,13 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
{
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Digit100 or Analogue100");
tflite->LoadInputImageBasis(GENERAL[j]->ROI[i]->image);
tflite->LoadInputImageBasis(GENERAL[_number]->ROI[_roi]->image);
tflite->Invoke();
int _num = tflite->GetOutClassification();
float _result = 0.0f;
if (GENERAL[j]->ROI[i]->ccw)
if (GENERAL[_number]->ROI[_roi]->ccw)
{
_result = 10.0f - ((float)_num / 10.0f);
}
@@ -1099,34 +1099,34 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(std::string time_value)
_result = (float)_num / 10.0f;
}
if (i >= start_roi)
if (_roi >= start_roi)
{
GENERAL[j]->ROI[i]->result_float = _result;
GENERAL[_number]->ROI[_roi]->result_float = _result;
}
GENERAL[j]->ROI[i]->raw_result_float = _result;
GENERAL[_number]->ROI[_roi]->raw_result_float = _result;
if ((_result < 0.0f) || (_result >= 10.0f))
{
GENERAL[j]->ROI[i]->isReject = true;
GENERAL[_number]->ROI[_roi]->isReject = true;
}
else
{
GENERAL[j]->ROI[i]->isReject = false;
GENERAL[_number]->ROI[_roi]->isReject = false;
}
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Result General(Digit100 or Analogue100) - roi_" + std::to_string(i) + ": " + std::to_string(GENERAL[j]->ROI[i]->raw_result_float));
ESP_LOGD(TAG, "Result General(Digit100 or Analogue100) - roi_%i - ccw: %d - %f", i, GENERAL[j]->ROI[i]->ccw, GENERAL[j]->ROI[i]->raw_result_float);
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Result General(Digit100 or Analogue100) - roi_" + std::to_string(_roi) + ": " + std::to_string(GENERAL[_number]->ROI[_roi]->raw_result_float));
ESP_LOGD(TAG, "Result General(Digit100 or Analogue100) - roi_%i - ccw: %d - %f", _roi, GENERAL[_number]->ROI[_roi]->ccw, GENERAL[_number]->ROI[_roi]->raw_result_float);
if (isLogImage)
{
std::string _image_name = GENERAL[j]->name + "_" + GENERAL[j]->ROI[i]->name;
std::string _image_name = GENERAL[_number]->name + "_" + GENERAL[_number]->ROI[_roi]->name;
if (isLogImageSelect)
{
if (LogImageSelect.find(GENERAL[j]->ROI[i]->name) != std::string::npos)
if (LogImageSelect.find(GENERAL[_number]->ROI[_roi]->name) != std::string::npos)
{
LogImage(logPath, _image_name, &GENERAL[j]->ROI[i]->raw_result_float, NULL, time_value, GENERAL[j]->ROI[i]->image_org);
LogImage(logPath, _image_name, &GENERAL[_number]->ROI[_roi]->raw_result_float, NULL, time_value, GENERAL[_number]->ROI[_roi]->image_org);
}
}
}

View File

@@ -312,11 +312,11 @@ void ClassFlowControll::InitFlow(std::string config)
flowpostprocessing = NULL;
ClassFlow *cfc;
config = format_filename(config);
FILE *pFile = fopen(config.c_str(), "r");
std::string line = "";
char temp_char[1024];
if (pFile != NULL)
@@ -632,7 +632,7 @@ bool ClassFlowControll::ReadParameter(FILE *pFile, std::string &aktparamgraph)
int RSSIThresholdTMP = atoi(splitted[1].c_str());
RSSIThresholdTMP = min(0, max(-100, RSSIThresholdTMP)); // Verify input limits (-100 - 0)
if (ChangeRSSIThreshold(NETWORK_CONFIG_FILE, RSSIThresholdTMP))
if ((ChangeRSSIThreshold(WLAN_CONFIG_FILE, RSSIThresholdTMP)) || (ChangeRSSIThreshold(NETWORK_CONFIG_FILE, RSSIThresholdTMP)))
{
// reboot necessary so that the new wlan.ini is also used !!!
fclose(pFile);
@@ -643,7 +643,7 @@ bool ClassFlowControll::ReadParameter(FILE *pFile, std::string &aktparamgraph)
#endif
else if (_param == "HOSTNAME")
{
if (ChangeHostName(NETWORK_CONFIG_FILE, splitted[1]))
if ((ChangeHostName(WLAN_CONFIG_FILE, splitted[1])) || (ChangeHostName(NETWORK_CONFIG_FILE, splitted[1])))
{
// reboot necessary so that the new wlan.ini is also used !!!
fclose(pFile);

View File

@@ -59,6 +59,7 @@ struct NumberPost
string ReturnPreValue; // lastValidValueStr; corrected return value without error message
bool ErrorMessage; //
string ErrorMessageText; // errorMessage; Error message for consistency checks
bool SkipErrorMessage;
int AnzahlAnalog; // numAnalogRoi; number of analog ROIs used in this sequence
int AnzahlDigit; // numDigitRoi; number of digit ROIs used in this sequence
int DecimalShift; // decimalShift; each increment shifts the decimal separator by one digit; value=value*10^decimalShift; pos. value shifts to the right
@@ -74,7 +75,7 @@ struct NumberPost
string FieldV2; // influxdbFieldName_v2; Name of the Field in InfluxDBv2
string MeasurementV2; // influxdbMeasurementName_v2; Name of the Measurement in InfluxDBv2
bool isExtendedResolution; // extendResolution; Adds the decimal place of the least significant analog ROI to the value
bool ExtendedResolution; // extendResolution; Adds the decimal place of the least significant analog ROI to the value
general *digit_roi; // digitRoi; set of digit ROIs for the sequence
general *analog_roi; // analogRoi; set of analog ROIs for the sequence

View File

@@ -13,36 +13,39 @@
static const char *TAG = "FLOWIMAGE";
ClassFlowImage::ClassFlowImage(const char *logTag)
ClassFlowImage::ClassFlowImage(const char *_logTag)
{
this->logTag = logTag;
logTag = _logTag;
isLogImage = false;
disabled = false;
this->imagesRetention = 5;
imagesRetention = 5;
}
ClassFlowImage::ClassFlowImage(std::vector<ClassFlow *> *lfc, const char *logTag) : ClassFlow(lfc)
ClassFlowImage::ClassFlowImage(std::vector<ClassFlow *> *_lfc, const char *_logTag) : ClassFlow(_lfc)
{
this->logTag = logTag;
logTag = _logTag;
isLogImage = false;
disabled = false;
this->imagesRetention = 5;
imagesRetention = 5;
}
ClassFlowImage::ClassFlowImage(std::vector<ClassFlow *> *lfc, ClassFlow *_prev, const char *logTag) : ClassFlow(lfc, _prev)
ClassFlowImage::ClassFlowImage(std::vector<ClassFlow *> *_lfc, ClassFlow *_prev, const char *_logTag) : ClassFlow(_lfc, _prev)
{
this->logTag = logTag;
logTag = _logTag;
isLogImage = false;
disabled = false;
this->imagesRetention = 5;
imagesRetention = 5;
}
string ClassFlowImage::CreateLogFolder(string time)
string ClassFlowImage::CreateLogFolder(string _time)
{
if (!isLogImage)
{
return "";
}
string logPath = imagesLocation + "/" + _time.LOGFILE_TIME_FORMAT_DATE_EXTR + "/" + _time.LOGFILE_TIME_FORMAT_HOUR_EXTR;
string logPath = imagesLocation + "/" + time.LOGFILE_TIME_FORMAT_DATE_EXTR + "/" + time.LOGFILE_TIME_FORMAT_HOUR_EXTR;
isLogImage = mkdir_r(logPath.c_str(), S_IRWXU) == 0;
if (!isLogImage)
{
@@ -52,42 +55,50 @@ string ClassFlowImage::CreateLogFolder(string time)
return logPath;
}
void ClassFlowImage::LogImage(string logPath, string name, float *resultFloat, int *resultInt, string time, CImageBasis *_img)
void ClassFlowImage::LogImage(string _logPath, string _name, float *_resultFloat, int *_resultInt, string _time, CImageBasis *_img)
{
if (!isLogImage)
{
return;
}
char buf[10];
if (resultFloat != NULL)
if (_resultFloat != NULL)
{
if (*resultFloat < 0)
if (*_resultFloat < 0)
{
sprintf(buf, "N.N_");
}
else
{
sprintf(buf, "%.1f_", *resultFloat);
sprintf(buf, "%.1f_", *_resultFloat);
if (strcmp(buf, "10.0_") == 0)
sprintf(buf, "0.0_");
{
sprintf(buf, "N.N_");
}
}
}
else if (resultInt != NULL)
else if (_resultInt != NULL)
{
sprintf(buf, "%d_", *resultInt);
sprintf(buf, "%d_", *_resultInt);
}
else
{
buf[0] = '\0';
}
string nm = logPath + "/" + buf + name + "_" + time + ".jpg";
string nm = _logPath + "/" + buf + _name + "_" + _time + ".jpg";
nm = format_filename(nm);
string output = "/sdcard/img_tmp/" + name + ".jpg";
string output = "/sdcard/img_tmp/" + _name + ".jpg";
output = format_filename(output);
ESP_LOGD(logTag, "save to file: %s", nm.c_str());
_img->SaveToFile(nm);
}
void ClassFlowImage::RemoveOldLogs()
void ClassFlowImage::RemoveOldLogs(void)
{
if (!isLogImage)
{
@@ -121,6 +132,7 @@ void ClassFlowImage::RemoveOldLogs()
struct dirent *entry;
int deleted = 0;
int notDeleted = 0;
while ((entry = readdir(dir)) != NULL)
{
string folderPath = imagesLocation + "/" + entry->d_name;
@@ -137,6 +149,7 @@ void ClassFlowImage::RemoveOldLogs()
}
}
}
ESP_LOGD(TAG, "Image folder deleted: %d | Image folder not deleted: %d", deleted, notDeleted);
closedir(dir);
}

View File

@@ -15,15 +15,15 @@ protected:
unsigned short imagesRetention;
const char *logTag;
string CreateLogFolder(string time);
void LogImage(string logPath, string name, float *resultFloat, int *resultInt, string time, CImageBasis *_img);
string CreateLogFolder(string _time);
void LogImage(string _logPath, string _name, float *_resultFloat, int *_resultInt, string _time, CImageBasis *_img);
public:
ClassFlowImage(const char *logTag);
ClassFlowImage(std::vector<ClassFlow *> *lfc, const char *logTag);
ClassFlowImage(std::vector<ClassFlow *> *lfc, ClassFlow *_prev, const char *logTag);
ClassFlowImage(const char *_logTag);
ClassFlowImage(std::vector<ClassFlow *> *_lfc, const char *_logTag);
ClassFlowImage(std::vector<ClassFlow *> *_lfc, ClassFlow *_prev, const char *_logTag);
void RemoveOldLogs();
void RemoveOldLogs(void);
};
#endif // CLASSFLOWIMAGE_H

View File

@@ -79,7 +79,7 @@ std::string ClassFlowPostProcessing::getJsonFromNumber(int i, std::string _linee
{
json += " \"rate\": \"\"," + _lineend;
}
if (NUMBERS[i]->ReturnChangeAbsolute.length() > 0)
{
json += " \"absrate\": \"" + NUMBERS[i]->ReturnChangeAbsolute + "\"," + _lineend;
@@ -351,7 +351,6 @@ ClassFlowPostProcessing::ClassFlowPostProcessing(std::vector<ClassFlow *> *lfc,
{
PreValueUse = false;
PreValueAgeStartup = 30;
SkipErrorMessage = false;
ListFlowControll = NULL;
FilePreValue = format_filename("/sdcard/config/prevalue.ini");
ListFlowControll = lfc;
@@ -369,7 +368,7 @@ ClassFlowPostProcessing::ClassFlowPostProcessing(std::vector<ClassFlow *> *lfc,
}
}
void ClassFlowPostProcessing::handleDecimalExtendedResolution(std::string _decsep, std::string _value)
void ClassFlowPostProcessing::handleExtendedResolution(std::string _decsep, std::string _value)
{
std::string _digit;
int _pospunkt = _decsep.find_first_of(".");
@@ -390,12 +389,12 @@ void ClassFlowPostProcessing::handleDecimalExtendedResolution(std::string _decse
// Set to default first (if nothing else is set)
if ((_digit == "default") || (NUMBERS[j]->name == _digit))
{
NUMBERS[j]->isExtendedResolution = temp_value;
NUMBERS[j]->ExtendedResolution = temp_value;
}
}
}
void ClassFlowPostProcessing::handleDecimalSeparator(std::string _decsep, std::string _value)
void ClassFlowPostProcessing::handleDecimalShift(std::string _decsep, std::string _value)
{
std::string _digit;
int _pospunkt = _decsep.find_first_of(".");
@@ -460,6 +459,32 @@ void ClassFlowPostProcessing::handleAnalogToDigitTransitionStart(std::string _de
}
}
void ClassFlowPostProcessing::handleSkipErrorMessage(std::string _decsep, std::string _value)
{
std::string _digit;
int _pospunkt = _decsep.find_first_of(".");
if (_pospunkt > -1)
{
_digit = _decsep.substr(0, _pospunkt);
}
else
{
_digit = "default";
}
for (int j = 0; j < NUMBERS.size(); ++j)
{
bool temp_value = alphanumeric_to_boolean(_value);
// Set to default first (if nothing else is set)
if ((_digit == "default") || (NUMBERS[j]->name == _digit))
{
NUMBERS[j]->SkipErrorMessage = temp_value;
}
}
}
void ClassFlowPostProcessing::handleAllowNegativeRate(std::string _decsep, std::string _value)
{
std::string _digit;
@@ -679,7 +704,7 @@ bool ClassFlowPostProcessing::ReadParameter(FILE *pFile, std::string &aktparamgr
}
else if (_param == "SKIPERRORMESSAGE")
{
SkipErrorMessage = alphanumeric_to_boolean(splitted[1]);
handleSkipErrorMessage(splitted[0], splitted[1]);
}
else if (_param == "ALLOWNEGATIVERATES")
{
@@ -687,7 +712,7 @@ bool ClassFlowPostProcessing::ReadParameter(FILE *pFile, std::string &aktparamgr
}
else if (_param == "DECIMALSHIFT")
{
handleDecimalSeparator(splitted[0], splitted[1]);
handleDecimalShift(splitted[0], splitted[1]);
}
else if (_param == "ANALOGTODIGITTRANSITIONSTART")
{
@@ -711,7 +736,7 @@ bool ClassFlowPostProcessing::ReadParameter(FILE *pFile, std::string &aktparamgr
}
else if (_param == "EXTENDEDRESOLUTION")
{
handleDecimalExtendedResolution(splitted[0], splitted[1]);
handleExtendedResolution(splitted[0], splitted[1]);
}
else if (_param == "IGNORELEADINGNAN")
{
@@ -788,6 +813,7 @@ void ClassFlowPostProcessing::InitNUMBERS()
_number->PreValueValid = false;
_number->ErrorMessage = false;
_number->ErrorMessageText = ""; // Error message for consistency check
_number->SkipErrorMessage = false;
_number->AllowNegativeRates = false;
_number->DecimalShift = 0;
_number->DecimalShiftInitial = 0;
@@ -798,13 +824,13 @@ void ClassFlowPostProcessing::InitNUMBERS()
_number->MaxRateType = AbsoluteChange;
_number->useMaxRateValue = false;
_number->ChangeRateThreshold = 2;
_number->isExtendedResolution = false;
_number->ExtendedResolution = false;
_number->IgnoreLeadingNaN = false;
_number->Value = 0.0f; // last value read out, incl. corrections
_number->Value = 0.0f; // last value read out, incl. corrections
_number->ReturnValue = ""; // corrected return value, possibly with error message
_number->ReturnRawValue = ""; // raw value (with N & leading 0)
_number->FlowRateAct = 0.0f; // m3 / min
_number->FlowRateAct = 0.0f; // m3 / min
_number->Nachkomma = _number->AnzahlAnalog;
@@ -884,7 +910,7 @@ bool ClassFlowPostProcessing::doFlow(std::string temp_time)
NUMBERS[j]->Value = -1;
if (SkipErrorMessage)
if (NUMBERS[j]->SkipErrorMessage)
{
NUMBERS[j]->ReturnValue = std::to_string(NUMBERS[j]->PreValue);
NUMBERS[j]->ReturnRawValue = NUMBERS[j]->ReturnValue;
@@ -923,11 +949,12 @@ bool ClassFlowPostProcessing::doFlow(std::string temp_time)
int previous_value = -1;
if (NUMBERS[j]->analog_roi)
{
NUMBERS[j]->ReturnRawValue = flowAnalog->getReadout(j, NUMBERS[j]->isExtendedResolution);
NUMBERS[j]->ReturnRawValue = flowAnalog->getReadout(j, NUMBERS[j]->ExtendedResolution);
if (NUMBERS[j]->ReturnRawValue.length() > 0)
{
char temp_char = NUMBERS[j]->ReturnRawValue[0];
if (temp_char >= 48 && temp_char <= 57)
{
previous_value = temp_char - 48;
@@ -948,7 +975,7 @@ bool ClassFlowPostProcessing::doFlow(std::string temp_time)
}
else
{
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, NUMBERS[j]->isExtendedResolution, previous_value); // Extended Resolution only if there are no analogue digits
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, NUMBERS[j]->ExtendedResolution, previous_value); // Extended Resolution only if there are no analogue digits
}
}
@@ -1143,7 +1170,7 @@ void ClassFlowPostProcessing::UpdateNachkommaDecimalShift()
NUMBERS[j]->DecimalShift = NUMBERS[j]->DecimalShiftInitial;
// Extended resolution is on and should also be used for this digit.
if (NUMBERS[j]->isExtendedResolution && flowDigit->isExtendedResolution())
if (NUMBERS[j]->ExtendedResolution && flowDigit->isExtendedResolution())
{
NUMBERS[j]->DecimalShift = NUMBERS[j]->DecimalShift - 1;
}
@@ -1156,7 +1183,7 @@ void ClassFlowPostProcessing::UpdateNachkommaDecimalShift()
// ESP_LOGD(TAG, "Nur analog");
NUMBERS[j]->DecimalShift = NUMBERS[j]->DecimalShiftInitial;
if (NUMBERS[j]->isExtendedResolution && flowAnalog->isExtendedResolution())
if (NUMBERS[j]->ExtendedResolution && flowAnalog->isExtendedResolution())
{
NUMBERS[j]->DecimalShift = NUMBERS[j]->DecimalShift - 1;
}
@@ -1173,7 +1200,7 @@ void ClassFlowPostProcessing::UpdateNachkommaDecimalShift()
NUMBERS[j]->Nachkomma = NUMBERS[j]->analog_roi->ROI.size() - NUMBERS[j]->DecimalShift;
// Extended resolution is on and should also be used for this digit.
if (NUMBERS[j]->isExtendedResolution && flowAnalog->isExtendedResolution())
if (NUMBERS[j]->ExtendedResolution && flowAnalog->isExtendedResolution())
{
NUMBERS[j]->Nachkomma = NUMBERS[j]->Nachkomma + 1;
}

View File

@@ -16,7 +16,6 @@ protected:
bool UpdatePreValueINI;
int PreValueAgeStartup;
bool SkipErrorMessage;
ClassFlowCNNGeneral *flowAnalog;
ClassFlowCNNGeneral *flowDigit;
@@ -32,11 +31,12 @@ protected:
void InitNUMBERS();
void handleDecimalSeparator(std::string _decsep, std::string _value);
void handleDecimalShift(std::string _decsep, std::string _value);
void handleMaxRateValue(std::string _decsep, std::string _value);
void handleDecimalExtendedResolution(std::string _decsep, std::string _value);
void handleExtendedResolution(std::string _decsep, std::string _value);
void handleMaxRateType(std::string _decsep, std::string _value);
void handleAnalogToDigitTransitionStart(std::string _decsep, std::string _value);
void handleSkipErrorMessage(std::string _decsep, std::string _value);
void handleAllowNegativeRate(std::string _decsep, std::string _value);
void handleIgnoreLeadingNaN(std::string _decsep, std::string _value);
void handleChangeRateThreshold(std::string _decsep, std::string _value);

View File

@@ -368,15 +368,8 @@ std::string decrypt_pw_string(std::string toDecrypt)
// Checks if all passwords on the SD are encrypted and if they are not encrypted, it encrypts them.
esp_err_t encrypt_decrypt_pw_on_sd(bool _encrypt, std::string filename)
{
std::string line = "";
std::vector<std::string> splitted;
std::vector<std::string> temp_file;
all_pw_were_encrypted = false;
std::string fn = format_filename(filename);
FILE *pFile = fopen(fn.c_str(), "r");
std::string _filename = format_filename(filename);
FILE *pFile = fopen(_filename.c_str(), "r");
if (pFile == NULL)
{
@@ -387,6 +380,7 @@ esp_err_t encrypt_decrypt_pw_on_sd(bool _encrypt, std::string filename)
ESP_LOGD(TAG, "EncryptDecryptConfigPwOnSD: config.ini opened");
std::string line = "";
char temp_line[256];
if (fgets(temp_line, sizeof(temp_line), pFile) == NULL)
@@ -401,6 +395,11 @@ esp_err_t encrypt_decrypt_pw_on_sd(bool _encrypt, std::string filename)
line = std::string(temp_line);
}
all_pw_were_encrypted = false;
std::vector<std::string> splitted;
std::vector<std::string> temp_file;
if (_encrypt)
{
while ((line.size() > 0) || !(feof(pFile)))
@@ -425,7 +424,7 @@ esp_err_t encrypt_decrypt_pw_on_sd(bool _encrypt, std::string filename)
line = "apikey = " + encrypt_pw_string(splitted[1]) + "\n";
}
}
else if (filename == NETWORK_CONFIG_FILE)
else if ((filename == WLAN_CONFIG_FILE) || (filename == NETWORK_CONFIG_FILE))
{
if (_param == "PASSWORD")
{
@@ -474,7 +473,7 @@ esp_err_t encrypt_decrypt_pw_on_sd(bool _encrypt, std::string filename)
line = "apikey = " + decrypt_pw_string(splitted[1]) + "\n";
}
}
else if (filename == NETWORK_CONFIG_FILE)
else if ((filename == WLAN_CONFIG_FILE) || (filename == NETWORK_CONFIG_FILE))
{
if (_param == "PASSWORD")
{
@@ -505,7 +504,7 @@ esp_err_t encrypt_decrypt_pw_on_sd(bool _encrypt, std::string filename)
// Only write to the SD if not all passwords are encrypted
if ((all_pw_were_encrypted == false && _encrypt == true) || (all_pw_were_encrypted == true && _encrypt == false))
{
pFile = fopen(fn.c_str(), "w+");
pFile = fopen(_filename.c_str(), "w+");
if (pFile == NULL)
{
@@ -1140,16 +1139,16 @@ size_t find_delimiter_pos(string input, string delimiter)
bool rename_file(string from, string to)
{
// ESP_LOGI(logTag, "Renaming File: %s", from.c_str());
FILE *fpSourceFile = fopen(from.c_str(), "rb");
FILE *pFile = fopen(from.c_str(), "rb");
// Sourcefile does not exist otherwise there is a mistake when renaming!
if (!fpSourceFile)
if (!pFile)
{
ESP_LOGE(TAG, "RenameFile: File %s does not exist!", from.c_str());
return false;
}
fclose(fpSourceFile);
fclose(pFile);
rename(from.c_str(), to.c_str());
return true;
@@ -1175,15 +1174,15 @@ bool rename_folder(string from, string to)
bool file_exists(string filename)
{
FILE *fpSourceFile = fopen(filename.c_str(), "rb");
FILE *pFile = fopen(filename.c_str(), "rb");
// Sourcefile does not exist
if (!fpSourceFile)
if (!pFile)
{
return false;
}
fclose(fpSourceFile);
fclose(pFile);
return true;
}
@@ -1207,16 +1206,16 @@ bool delete_file(string filename)
{
// ESP_LOGI(logTag, "Deleting file: %s", filename.c_str());
/* Delete file */
FILE *fpSourceFile = fopen(filename.c_str(), "rb");
FILE *pFile = fopen(filename.c_str(), "rb");
// Sourcefile does not exist otherwise there is a mistake in copying!
if (!fpSourceFile)
if (!pFile)
{
ESP_LOGD(TAG, "DeleteFile: File %s existiert nicht!", filename.c_str());
return false;
}
fclose(fpSourceFile);
fclose(pFile);
unlink(filename.c_str());
return true;
@@ -1227,13 +1226,12 @@ bool copy_file(string input, string output)
input = format_filename(input);
output = format_filename(output);
if (to_upper(input).compare(NETWORK_CONFIG_FILE) == 0)
if ((to_upper(input).compare(WLAN_CONFIG_FILE) == 0) || (to_upper(input).compare(NETWORK_CONFIG_FILE) == 0))
{
ESP_LOGD(TAG, "wlan.ini kann nicht kopiert werden!");
return false;
}
char cTemp;
FILE *fpSourceFile = fopen(input.c_str(), "rb");
// Sourcefile existiert nicht sonst gibt es einen Fehler beim Kopierversuch!
@@ -1245,18 +1243,19 @@ bool copy_file(string input, string output)
FILE *fpTargetFile = fopen(output.c_str(), "wb");
// Code Section
char temp_char[1024];
// Read From The Source File - "Copy"
while (fread(&cTemp, 1, 1, fpSourceFile) == 1)
while (fread(&temp_char, 1, 1, fpSourceFile) == 1)
{
// Write To The Target File - "Paste"
fwrite(&cTemp, 1, 1, fpTargetFile);
fwrite(&temp_char, 1, 1, fpTargetFile);
}
// Close The Files
fclose(fpSourceFile);
fclose(fpTargetFile);
ESP_LOGD(TAG, "File copied: %s to %s", input.c_str(), output.c_str());
return true;
@@ -1466,7 +1465,6 @@ string round_output(double _in, int _anzNachkomma)
{
std::stringstream stream;
int temp_value = _in;
// ESP_LOGD(TAG, "AnzNachkomma: %d", _anzNachkomma);
if (_anzNachkomma > 0)
{

View File

@@ -7,7 +7,7 @@
#include <inttypes.h>
#include <sys/stat.h>
#include "esp_rom_crc.h"
#include "esp_rom_crc.h"
#include "ClassLogFile.h"
static const char *TAG = "SDCARD";
@@ -15,52 +15,60 @@ static const char *TAG = "SDCARD";
int SDCardCheckRW(void)
{
LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Basic R/W check started...");
FILE* pFile = NULL;
int iCRCMessage = 0;
pFile = fopen("/sdcard/sdcheck.txt","w");
if (pFile == NULL) {
FILE *pFile = fopen("/sdcard/sdcheck.txt", "w");
if (pFile == NULL)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Basic R/W check: (E1) No able to open file to write");
return -1;
}
else {
}
else
{
std::string sMessage = "This message is used for a SD-Card basic check!";
iCRCMessage = esp_rom_crc16_le(0, (uint8_t*)sMessage.c_str(), sMessage.length());
if (fwrite(sMessage.c_str(), sMessage.length(), 1, pFile) == 0 ) {
iCRCMessage = esp_rom_crc16_le(0, (uint8_t *)sMessage.c_str(), sMessage.length());
if (fwrite(sMessage.c_str(), sMessage.length(), 1, pFile) == 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Basic R/W check: (E2) Not able to write file");
fclose(pFile);
unlink("/sdcard/sdcheck.txt");
return -2;
}
fclose(pFile);
fclose(pFile);
}
pFile = fopen("/sdcard/sdcheck.txt","r");
if (pFile == NULL) {
pFile = fopen("/sdcard/sdcheck.txt", "r");
if (pFile == NULL)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Basic R/W check: (E3) Not able to open file to read back");
unlink("/sdcard/sdcheck.txt");
return -3;
}
else {
}
else
{
char cReadBuf[50];
if (fgets(cReadBuf, sizeof(cReadBuf), pFile) == 0) {
if (fgets(cReadBuf, sizeof(cReadBuf), pFile) == 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Basic R/W check: (E4) Not able to read file back");
fclose(pFile);
unlink("/sdcard/sdcheck.txt");
return -4;
}
else {
if (esp_rom_crc16_le(0, (uint8_t*)cReadBuf, strlen(cReadBuf)) != iCRCMessage) {
else
{
if (esp_rom_crc16_le(0, (uint8_t *)cReadBuf, strlen(cReadBuf)) != iCRCMessage)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Basic R/W check: (E5) Read back, but wrong CRC");
fclose(pFile);
unlink("/sdcard/sdcheck.txt");
return -5;
}
}
}
fclose(pFile);
}
if (unlink("/sdcard/sdcheck.txt") != 0) {
if (unlink("/sdcard/sdcheck.txt") != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Basic R/W check: (E6) Unable to delete the file");
return -6;
}
@@ -76,86 +84,135 @@ bool SDCardCheckFolderFilePresence()
LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Folder/file presence check started...");
/* check if folder exists: config */
if (stat("/sdcard/config", &sb) != 0) {
if (stat("/sdcard/config", &sb) != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: Folder /config not found");
bRetval = false;
}
/* check if folder exists: html */
if (stat("/sdcard/html", &sb) != 0) {
if (stat("/sdcard/html", &sb) != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: Folder /html not found");
bRetval = false;
}
/* check if folder exists: firmware */
if (stat("/sdcard/firmware", &sb) != 0) {
if (stat("/sdcard/firmware", &sb) != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: Folder /firmware not found");
bRetval = false;
}
/* check if folder exists: img_tmp */
if (stat("/sdcard/img_tmp", &sb) != 0) {
if (stat("/sdcard/img_tmp", &sb) != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: Folder /img_tmp not found");
bRetval = false;
}
/* check if folder exists: log */
if (stat("/sdcard/log", &sb) != 0) {
if (stat("/sdcard/log", &sb) != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: Folder /log not found");
bRetval = false;
}
/* check if folder exists: demo */
if (stat("/sdcard/demo", &sb) != 0) {
if (stat("/sdcard/demo", &sb) != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: Folder /demo not found");
bRetval = false;
}
/* check if file exists: wlan.ini */
if (stat("/sdcard/wlan.ini", &sb) != 0) {
if ((stat("/sdcard/wlan.ini", &sb) != 0) && (stat("/sdcard/network.ini", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /wlan.ini not found");
bRetval = false;
}
/* check if file exists: config.ini */
if (stat("/sdcard/config/config.ini", &sb) != 0) {
if (stat("/sdcard/config/config.ini", &sb) != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /config/config.ini not found");
bRetval = false;
}
/* check if file exists: index.html */
if ((stat("/sdcard/html/index.html", &sb) != 0) && (stat("/sdcard/html/index.html.gz", &sb) != 0)) {
if ((stat("/sdcard/html/index.html", &sb) != 0) && (stat("/sdcard/html/index.html.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/index.html not found");
bRetval = false;
}
/* check if file exists: overview.html */
if ((stat("/sdcard/html/overview.html", &sb) != 0) && (stat("/sdcard/html/overview.html.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/overview.html not found");
bRetval = false;
}
/* check if file exists: ota.html */
if ((stat("/sdcard/html/ota_page.html", &sb) != 0) && (stat("/sdcard/html/ota_page.html.gz", &sb) != 0)) {
if ((stat("/sdcard/html/ota_page.html", &sb) != 0) && (stat("/sdcard/html/ota_page.html.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/ota.html not found");
bRetval = false;
}
/* check if file exists: log.html */
if ((stat("/sdcard/html/log.html", &sb) != 0) && (stat("/sdcard/html/log.html.gz", &sb) != 0)) {
if ((stat("/sdcard/html/log.html", &sb) != 0) && (stat("/sdcard/html/log.html.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/log.html not found");
bRetval = false;
}
/* check if file exists: common.js */
if ((stat("/sdcard/html/common.js", &sb) != 0) && (stat("/sdcard/html/common.js.gz", &sb) != 0)) {
if ((stat("/sdcard/html/common.js", &sb) != 0) && (stat("/sdcard/html/common.js.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/common.js not found");
bRetval = false;
}
/* check if file exists: version.txt */
if (stat("/sdcard/html/version.txt", &sb) != 0) {
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/version.txt not found");
/* check if file exists: readconfigcommon.js */
if ((stat("/sdcard/html/readconfigcommon.js", &sb) != 0) && (stat("/sdcard/html/readconfigcommon.js.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/readconfigcommon.js not found");
bRetval = false;
}
if (bRetval) {
/* check if file exists: readconfigparam.js */
if ((stat("/sdcard/html/readconfigparam.js", &sb) != 0) && (stat("/sdcard/html/readconfigparam.js.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/readconfigparam.js not found");
bRetval = false;
}
/* check if file exists: jquery-3.6.0.min.js */
if ((stat("/sdcard/html/jquery-3.6.0.min.js", &sb) != 0) && (stat("/sdcard/html/jquery-3.6.0.min.js.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/jquery-3.6.0.min.js not found");
bRetval = false;
}
/* check if file exists: firework.js */
if ((stat("/sdcard/html/firework.js", &sb) != 0) && (stat("/sdcard/html/firework.js.gz", &sb) != 0))
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/firework.js not found");
bRetval = false;
}
/* check if file exists: version.txt */
if (stat("/sdcard/html/version.txt", &sb) != 0)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Folder/file check: File /html/version.txt not found");
// bRetval = false;
}
if (bRetval)
{
LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Folder/file presence check successful");
}
return bRetval;
}

View File

@@ -14,7 +14,7 @@
#include "../stb/stb_image.h"
#include "../stb/stb_image_write.h"
#include "../stb/deprecated/stb_image_resize.h"
// #include "../stb/stb_image_resize.h"
// #include "../stb/stb_image_resize2.h"
#include "esp_heap_caps.h"

View File

@@ -25,4 +25,4 @@
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "../stb/deprecated/stb_image_resize.h"
// #include "../stb/stb_image_resize.h"
// #include "../stb/stb_image_resize2.h"

View File

@@ -56,7 +56,15 @@ esp_err_t init_network(void)
// Read Network parameter and start it
// ********************************************
int iNetworkStatus = LoadNetworkFromFile(NETWORK_CONFIG_FILE);
int iNetworkStatus = -1;
if (file_exists(WLAN_CONFIG_FILE))
{
iNetworkStatus = LoadNetworkFromFile(WLAN_CONFIG_FILE);
}
else
{
iNetworkStatus = LoadNetworkFromFile(NETWORK_CONFIG_FILE);
}
// Network config available (0) or SSID/password not configured (-2)
if (file_exists(CONFIG_FILE) && ((iNetworkStatus == 0) || (iNetworkStatus == -2)))
@@ -191,7 +199,7 @@ esp_err_t init_network(void)
return ESP_OK;
}
}
// network.ini not available (-1) and config.ini not available
// wlan.ini not available (-1) and config.ini not available
else
{
network_config.connection_type = NETWORK_CONNECTION_WIFI_AP_SETUP;

View File

@@ -244,7 +244,6 @@ bool ChangeHostName(std::string filename, std::string _newhostname)
filename = format_filename(filename);
FILE *pFile = fopen(filename.c_str(), "r");
if (pFile == NULL)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "ChangeHostName: unable to open wlan.ini (read)");
@@ -338,7 +337,6 @@ bool ChangeRSSIThreshold(std::string filename, int _newrssithreshold)
filename = format_filename(filename);
FILE *pFile = fopen(filename.c_str(), "r");
if (pFile == NULL)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "ChangeRSSIThreshold: unable to open wlan.ini (read)");
@@ -435,7 +433,6 @@ esp_err_t GetAuthWebUIConfig(std::string filename)
{
filename = format_filename(filename);
FILE *pFile = fopen(filename.c_str(), "r");
if (pFile == NULL)
{
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "GetAuthWebUIConfig: unable to open wlan.ini (read)");

View File

@@ -16,7 +16,7 @@ struct network_config_t
std::string eapid = "";
std::string username = "";
std::string password = "";
std::string hostname = "watermeter"; // Default: watermeter
std::string hostname = "watermeter";
std::string ipaddress = "";
std::string gateway = "";
std::string netmask = "";

View File

@@ -42,7 +42,7 @@ void remote_send_http_response(httpd_req_t *req)
message += "Please follow the below instructions.<p>";
httpd_resp_send_chunk(req, message.c_str(), strlen(message.c_str()));
is_wlan_ini = file_exists(NETWORK_CONFIG_FILE);
is_wlan_ini = (file_exists(WLAN_CONFIG_FILE) || file_exists(NETWORK_CONFIG_FILE));
if (!is_config_ini)
{
@@ -65,6 +65,7 @@ void remote_send_http_response(httpd_req_t *req)
message += "document.getElementById(\"doUpdate\").disabled = true;}";
message += "</script>";
httpd_resp_send_chunk(req, message.c_str(), strlen(message.c_str()));
return;
}
@@ -83,6 +84,7 @@ void remote_send_http_response(httpd_req_t *req)
message += "api = \"/config?\"+\"ssid=\"+document.getElementById(\"ssid\").value+\"&pwd=\"+document.getElementById(\"password\").value;";
message += "fetch(api);await new Promise(resolve => setTimeout(resolve, 1000));location.reload();}</script>";
httpd_resp_send_chunk(req, message.c_str(), strlen(message.c_str()));
return;
}
@@ -100,6 +102,7 @@ esp_err_t remote_test_handler(httpd_req_t *req)
{
remote_send_http_response(req);
httpd_resp_send_chunk(req, NULL, 0);
return ESP_OK;
}
@@ -107,25 +110,25 @@ esp_err_t remote_reboot_handler(httpd_req_t *req)
{
LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Trigger reboot due to firmware update.");
doRebootOTA();
return ESP_OK;
}
esp_err_t remote_config_ini_handler(httpd_req_t *req)
{
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "config_ini_handler");
char _query[400];
char _valuechar[100];
std::string fn = "/sdcard/firmware/";
std::string _task = "";
std::string ssid = "";
std::string pwd = "";
std::string hn = ""; // hostname
std::string ip = "";
std::string gw = ""; // gateway
std::string nm = ""; // netmask
std::string dns = "";
std::string rssithreshold = ""; // rssi threshold for WIFI roaming
std::string text = "";
std::string _ssid = "";
std::string _pwd = "";
std::string _hostname = "";
std::string _ip = "";
std::string _gateway = "";
std::string _netmask = "";
std::string _dns = "";
std::string _rssithreshold = ""; // rssi threshold for WIFI roaming
if (httpd_req_get_url_query_str(req, _query, 400) == ESP_OK)
{
@@ -134,150 +137,150 @@ esp_err_t remote_config_ini_handler(httpd_req_t *req)
if (httpd_query_key_value(_query, "ssid", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "ssid is found: %s", _valuechar);
ssid = url_decode(std::string(_valuechar));
_ssid = url_decode(std::string(_valuechar));
}
if (httpd_query_key_value(_query, "pwd", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "pwd is found: %s", _valuechar);
pwd = url_decode(std::string(_valuechar));
_pwd = url_decode(std::string(_valuechar));
}
if (httpd_query_key_value(_query, "ssid", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "ssid is found: %s", _valuechar);
ssid = url_decode(std::string(_valuechar));
_ssid = url_decode(std::string(_valuechar));
}
if (httpd_query_key_value(_query, "hn", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "hostname is found: %s", _valuechar);
hn = url_decode(std::string(_valuechar));
_hostname = url_decode(std::string(_valuechar));
}
if (httpd_query_key_value(_query, "ip", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "ip is found: %s", _valuechar);
ip = url_decode(std::string(_valuechar));
_ip = url_decode(std::string(_valuechar));
}
if (httpd_query_key_value(_query, "gw", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "gateway is found: %s", _valuechar);
gw = url_decode(std::string(_valuechar));
_gateway = url_decode(std::string(_valuechar));
}
if (httpd_query_key_value(_query, "nm", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "netmask is found: %s", _valuechar);
nm = url_decode(std::string(_valuechar));
_netmask = url_decode(std::string(_valuechar));
}
if (httpd_query_key_value(_query, "dns", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "dns is found: %s", _valuechar);
dns = url_decode(std::string(_valuechar));
_dns = url_decode(std::string(_valuechar));
}
if (httpd_query_key_value(_query, "rssithreshold", _valuechar, 100) == ESP_OK)
{
ESP_LOGD(TAG, "rssithreshold is found: %s", _valuechar);
rssithreshold = url_decode(std::string(_valuechar));
_rssithreshold = url_decode(std::string(_valuechar));
}
}
FILE *configfilehandle = fopen(NETWORK_CONFIG_FILE, "w");
FILE *pFile = fopen(NETWORK_CONFIG_FILE, "w");
text = ";++++++++++++++++++++++++++++++++++\n";
std::string text = ";++++++++++++++++++++++++++++++++++\n";
text += "; AI on the edge - WLAN configuration\n";
text += "; ssid: Name of WLAN network (mandatory), e.g. \"WLAN-SSID\"\n";
text += "; password: Password of WLAN network (mandatory), e.g. \"PASSWORD\"\n\n";
fputs(text.c_str(), configfilehandle);
fputs(text.c_str(), pFile);
if (ssid.length())
if (_ssid.length())
{
ssid = "ssid = \"" + ssid + "\"\n";
_ssid = "ssid = \"" + _ssid + "\"\n";
}
else
{
ssid = "ssid = \"\"\n";
_ssid = "ssid = \"\"\n";
}
fputs(ssid.c_str(), configfilehandle);
fputs(_ssid.c_str(), pFile);
if (pwd.length())
if (_pwd.length())
{
pwd = "password = \"" + pwd + "\"\n";
_pwd = "password = \"" + _pwd + "\"\n";
}
else
{
pwd = "password = \"\"\n";
_pwd = "password = \"\"\n";
}
fputs(pwd.c_str(), configfilehandle);
fputs(_pwd.c_str(), pFile);
text = "\n;++++++++++++++++++++++++++++++++++\n";
text += "; Hostname: Name of device in network\n";
text += "; This parameter can be configured via WebUI configuration\n";
text += "; Default: \"watermeter\", if nothing is configured\n\n";
fputs(text.c_str(), configfilehandle);
fputs(text.c_str(), pFile);
if (hn.length())
if (_hostname.length())
{
hn = "hostname = \"" + hn + "\"\n";
_hostname = "hostname = \"" + _hostname + "\"\n";
}
else
{
hn = ";hostname = \"watermeter\"\n";
_hostname = ";hostname = \"watermeter\"\n";
}
fputs(hn.c_str(), configfilehandle);
fputs(_hostname.c_str(), pFile);
text = "\n;++++++++++++++++++++++++++++++++++\n";
text += "; Fixed IP: If you like to use fixed IP instead of DHCP (default), the following\n";
text += "; parameters needs to be configured: ip, gateway, netmask are mandatory, dns optional\n\n";
fputs(text.c_str(), configfilehandle);
fputs(text.c_str(), pFile);
if (ip.length())
if (_ip.length())
{
ip = "ip = \"" + ip + "\"\n";
_ip = "ip = \"" + _ip + "\"\n";
}
else
{
ip = ";ip = \"xxx.xxx.xxx.xxx\"\n";
_ip = ";ip = \"xxx.xxx.xxx.xxx\"\n";
}
fputs(ip.c_str(), configfilehandle);
fputs(_ip.c_str(), pFile);
if (gw.length())
if (_gateway.length())
{
gw = "gateway = \"" + gw + "\"\n";
_gateway = "gateway = \"" + _gateway + "\"\n";
}
else
{
gw = ";gateway = \"xxx.xxx.xxx.xxx\"\n";
_gateway = ";gateway = \"xxx.xxx.xxx.xxx\"\n";
}
fputs(gw.c_str(), configfilehandle);
fputs(_gateway.c_str(), pFile);
if (nm.length())
if (_netmask.length())
{
nm = "netmask = \"" + nm + "\"\n";
_netmask = "netmask = \"" + _netmask + "\"\n";
}
else
{
nm = ";netmask = \"xxx.xxx.xxx.xxx\"\n";
_netmask = ";netmask = \"xxx.xxx.xxx.xxx\"\n";
}
fputs(nm.c_str(), configfilehandle);
fputs(_netmask.c_str(), pFile);
text = "\n;++++++++++++++++++++++++++++++++++\n";
text += "; DNS server (optional, if no DNS is configured, gateway address will be used)\n\n";
fputs(text.c_str(), configfilehandle);
fputs(text.c_str(), pFile);
if (dns.length())
if (_dns.length())
{
dns = "dns = \"" + dns + "\"\n";
_dns = "dns = \"" + _dns + "\"\n";
}
else
{
dns = ";dns = \"xxx.xxx.xxx.xxx\"\n";
_dns = ";dns = \"xxx.xxx.xxx.xxx\"\n";
}
fputs(dns.c_str(), configfilehandle);
fputs(_dns.c_str(), pFile);
text = "\n;++++++++++++++++++++++++++++++++++\n";
text += "; WIFI Roaming:\n";
@@ -288,20 +291,20 @@ esp_err_t remote_config_ini_handler(httpd_req_t *req)
text += "; RSSI Threshold for client requested roaming query (RSSI < RSSIThreshold)\n";
text += "; Note: This parameter can be configured via WebUI configuration\n";
text += "; Default: 0 = Disable client requested roaming query\n\n";
fputs(text.c_str(), configfilehandle);
fputs(text.c_str(), pFile);
if (rssithreshold.length())
if (_rssithreshold.length())
{
rssithreshold = "RSSIThreshold = " + rssithreshold + "\n";
_rssithreshold = "RSSIThreshold = " + _rssithreshold + "\n";
}
else
{
rssithreshold = "RSSIThreshold = 0\n";
_rssithreshold = "RSSIThreshold = 0\n";
}
fputs(rssithreshold.c_str(), configfilehandle);
fputs(_rssithreshold.c_str(), pFile);
fflush(configfilehandle);
fclose(configfilehandle);
fflush(pFile);
fclose(pFile);
std::string zw = "ota without parameter - should not be the case!";
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
@@ -325,7 +328,6 @@ esp_err_t remote_upload_post_handler(httpd_req_t *req)
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "remote_upload_post_handler");
char filepath[FILE_PATH_MAX];
FILE *fd = NULL;
const char *filename = get_path_from_uri(filepath, "/sdcard", req->uri + sizeof("/upload") - 1, sizeof(filepath));
if (!filename)
@@ -338,8 +340,8 @@ esp_err_t remote_upload_post_handler(httpd_req_t *req)
delete_file(std::string(filepath));
fd = fopen(filepath, "w");
if (!fd)
FILE *pFile = fopen(filepath, "w");
if (!pFile)
{
ESP_LOGE(TAG, "Failed to create file: %s", filepath);
httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Failed to create file");
@@ -365,7 +367,7 @@ esp_err_t remote_upload_post_handler(httpd_req_t *req)
continue;
}
fclose(fd);
fclose(pFile);
unlink(filepath);
ESP_LOGE(TAG, "File reception failed!");
@@ -373,9 +375,9 @@ esp_err_t remote_upload_post_handler(httpd_req_t *req)
return ESP_FAIL;
}
if (received && (received != fwrite(buf, 1, received, fd)))
if (received && (received != fwrite(buf, 1, received, pFile)))
{
fclose(fd);
fclose(pFile);
unlink(filepath);
ESP_LOGE(TAG, "File write failed!");
@@ -386,13 +388,13 @@ esp_err_t remote_upload_post_handler(httpd_req_t *req)
remaining -= received;
}
fclose(fd);
fclose(pFile);
is_config_ini = true;
FILE *pfile = fopen("/sdcard/update.txt", "w");
std::string _s_zw = "/sdcard" + std::string(filename);
fwrite(_s_zw.c_str(), strlen(_s_zw.c_str()), 1, pfile);
fclose(pfile);
pFile = fopen("/sdcard/update.txt", "w");
std::string temp_string = "/sdcard" + std::string(filename);
fwrite(temp_string.c_str(), strlen(temp_string.c_str()), 1, pFile);
fclose(pFile);
ESP_LOGI(TAG, "File reception complete");
httpd_resp_set_hdr(req, "Location", "/test");
@@ -424,6 +426,7 @@ httpd_handle_t start_remote_webserver(void)
}
ESP_LOGI(TAG, "Error starting ap server!");
return NULL;
}
@@ -435,27 +438,27 @@ void stop_remote_webserver(httpd_handle_t server)
httpd_handle_t remote_webserver_register_uri(httpd_handle_t server)
{
httpd_uri_t reboot_handle = {
.uri = "/reboot", // Match all URIs of type /path/to/file
.uri = "/reboot",
.method = HTTP_GET,
.handler = APPLY_BASIC_AUTH_FILTER(remote_reboot_handler),
.user_ctx = NULL // Pass server data as context
.user_ctx = NULL,
};
httpd_register_uri_handler(server, &reboot_handle);
httpd_uri_t config_ini_handle = {
.uri = "/config", // Match all URIs of type /path/to/file
.uri = "/config",
.method = HTTP_GET,
.handler = APPLY_BASIC_AUTH_FILTER(remote_config_ini_handler),
.user_ctx = NULL // Pass server data as context
.user_ctx = NULL,
};
httpd_register_uri_handler(server, &config_ini_handle);
/* URI handler for uploading files to server */
httpd_uri_t file_uploadAP = {
.uri = "/upload/*", // Match all URIs of type /upload/path/to/file
.uri = "/upload/*",
.method = HTTP_POST,
.handler = APPLY_BASIC_AUTH_FILTER(remote_upload_post_handler),
.user_ctx = NULL // Pass server data as context
.user_ctx = NULL,
};
httpd_register_uri_handler(server, &file_uploadAP);
@@ -463,7 +466,8 @@ httpd_handle_t remote_webserver_register_uri(httpd_handle_t server)
.uri = "*",
.method = HTTP_GET,
.handler = APPLY_BASIC_AUTH_FILTER(remote_test_handler),
.user_ctx = NULL};
.user_ctx = NULL,
};
httpd_register_uri_handler(server, &test_uri);
return NULL;