Compare commits

..

18 Commits

Author SHA1 Message Date
jomjol
a91f99faab update 2021-08-01 21:49:29 +02:00
jomjol
17a87b23a1 v8.0.5 2021-08-01 21:46:17 +02:00
jomjol
d4b5ec2ae2 v8.0.4 2021-07-29 20:18:53 +02:00
jomjol
1bcaf09855 v8.0.4 2021-07-29 20:14:36 +02:00
jomjol
fa3842b2b4 v8.0.3 2021-07-25 18:15:35 +02:00
jomjol
ea72256e56 Merge branch 'rolling' 2021-07-25 18:08:43 +02:00
jomjol
be5828cb3e v8.0.3 2021-07-25 18:07:50 +02:00
jomjol
104b72505c Rolling - 20210725 2021-07-25 13:44:22 +02:00
jomjol
23728a0686 Update README.md 2021-07-23 21:02:19 +02:00
jomjol
eaaa856b13 Update README.md 2021-07-23 21:01:50 +02:00
jomjol
01e81d02b5 v8.0.2 2021-07-23 20:57:42 +02:00
jomjol
9ae8d0a512 Merge branch 'rolling' 2021-07-23 20:48:28 +02:00
jomjol
da16322fb8 v8.0.2 2021-07-23 20:47:23 +02:00
jomjol
a6d39afc26 rolling 20210723 2021-07-23 07:44:59 +02:00
jomjol
1b6a124f54 Update FeatureRequest.md 2021-07-21 07:00:12 +02:00
jomjol
8aff6bf8f3 Rolling 20210719 2021-07-19 21:54:14 +02:00
jomjol
21115752aa Merge pull request #280 from jomjol/rolling
v8.0.1
2021-07-18 16:58:23 +02:00
jomjol
025c2b88b9 v8.0.1 2021-07-18 16:57:35 +02:00
22 changed files with 99 additions and 63 deletions

View File

@@ -11,6 +11,12 @@
____ ____
#### #9 Basic auth for the UI
* https://github.com/jomjol/AI-on-the-edge-device/issues/283
* Implementation of an authentication mechanism.
#### #8 MQTT configurable readout intervall #### #8 MQTT configurable readout intervall
Make the readout intervall configurable via MQTT. Make the readout intervall configurable via MQTT.
@@ -27,13 +33,13 @@ To do:
* Implement a checking algo * Implement a checking algo
* Extend the firmware and html page for the error handling * Extend the firmware and html page for the error handling
#### #6 Check for double ROI names #### ~~#6 Check for double ROI names~~ - implemented v8.0.0
Check during configuration, that ROI names are unique. ~~Check during configuration, that ROI names are unique.~~
To do: ~~To do:~~
* Implementation of ROI name checking in html code before saving analog or digital ROIs * ~~Implementation of ROI name checking in html code before saving analog or digital ROIs~~
@@ -49,31 +55,31 @@ To do:
#### #4 Initial Shifting and Rotation #### ~~#4 Initial Shifting and Rotation~~ - implemented v7.0.0
* https://github.com/jomjol/AI-on-the-edge-device/issues/123 * ~~https://github.com/jomjol/AI-on-the-edge-device/issues/123~~
Implementation of a shifting additional to the initial rotation of the raw camera input ~~Implementation of a shifting additional to the initial rotation of the raw camera input~~
To do: ~~To do:~~
* Implementation of shifting * ~~Implementation of shifting~~
* Extension of configuration * ~~Extension of configuration~~
* Adaption of the html configuration to implement shifting * ~~Adaption of the html configuration to implement shifting~~
#### #3 Allow grouping of digits to multiple reading values #### ~~#3 Allow grouping of digits to multiple reading values~~ - implemented v8.0.0
* https://github.com/jomjol/AI-on-the-edge-device/issues/123 * ~~https://github.com/jomjol/AI-on-the-edge-device/issues/123~~
Implementation of two different independent readouts in one setup ~~Implementation of two different independent readouts in one setup~~
To do: ~~To do:~~
* ~~Extend the configuration, setting and processing flow for two independend readouts~~
* Extend the configuration, setting and processing flow for two independend readouts
https://github.com/jomjol/AI-on-the-edge-device/issues/123
@@ -96,15 +102,16 @@ To do:
____ ____
#### #1 Optional GPIO for external flash/lighting #### ~~#1 Optional GPIO for external flash/lighting~~ - implemented (v8.0.0)
* https://github.com/jomjol/AI-on-the-edge-device/issues/133 * ~~https://github.com/jomjol/AI-on-the-edge-device/issues/133~~
Implementation of an an extrnal flash / lightning through GPIOs. ~~Implementation of an an extrnal flash / lightning through GPIOs.~~
* available GPIOs: 12 & 13 (currently in use for html switching)
To do: * ~~available GPIOs: 12 & 13 (currently in use for html switching)~~
* Implementation of a software module for external light source (e.g. WS8132 LED controller, ...) ~~To do:~~
* Update of the camera module to use the external light instead of the internal flash light
* Adopt the configuration algorithm with a configurable light source * ~~Implementation of a software module for external light source (e.g. WS8132 LED controller, ...)~~
* ~~Update of the camera module to use the external light instead of the internal flash light~~
* ~~Adopt the configuration algorithm with a configurable light source~~

View File

@@ -47,8 +47,13 @@ In other cases you can contact the developer via email: <img src="https://raw.gi
##### 8.0.0 - Multi Meter Support (2021-07-14) ##### 8.0.5 - Multi Meter Support (2021-07-29)
* NEW 8.0.5: bug fix: saving prevalue
* NEW 8.0.4: bug fix: load config.ini after upgrade
* NEW 8.0.3: bug fix: reboot during `config.ini` handling, html error
* NEW 8.0.2: saving roundes prevalue, bug fix html server
* NEW 8.0.1: bug fix: html handling of parameter `FixedExposure` and `ImageSize`
* Dual / multi meter support (more than 1 number to be recognized) * Dual / multi meter support (more than 1 number to be recognized)
This is implemented with the feature "number" on the ROI definition as well as selected options This is implemented with the feature "number" on the ROI definition as well as selected options
* MQTT: standardization of the naming - including new topics (`json`, `freeMem `, `uptime`)c * MQTT: standardization of the naming - including new topics (`json`, `freeMem `, `uptime`)c

View File

@@ -39,18 +39,27 @@ bool ConfigFile::GetNextParagraph(std::string& aktparamgraph, bool &disabled, bo
bool ConfigFile::getNextLine(std::string *rt, bool &disabled, bool &eof) bool ConfigFile::getNextLine(std::string *rt, bool &disabled, bool &eof)
{ {
eof = false; eof = false;
char zw[1024]; char zw[1024] = "";
if (pFile == NULL) if (pFile == NULL)
{ {
*rt = ""; *rt = "";
return false; return false;
} }
fgets(zw, 1024, pFile);
printf("%s", zw); if (fgets(zw, 1024, pFile))
if ((strlen(zw) == 0) && feof(pFile)) {
printf("%s", zw);
if ((strlen(zw) == 0) && feof(pFile))
{
*rt = "";
eof = true;
return false;
}
}
else
{ {
*rt = ""; *rt = "";
eof = true; eof = true;
return false; return false;
} }
*rt = zw; *rt = zw;

View File

@@ -216,6 +216,7 @@ void GpioHandler::init()
clear(); clear();
} }
ESP_LOGI(TAG_SERVERGPIO, "read GPIO config and init GPIO"); ESP_LOGI(TAG_SERVERGPIO, "read GPIO config and init GPIO");
if (!readConfig()) { if (!readConfig()) {
clear(); clear();
@@ -225,6 +226,7 @@ void GpioHandler::init()
return; return;
} }
for(std::map<gpio_num_t, GpioPin*>::iterator it = gpioMap->begin(); it != gpioMap->end(); ++it) { for(std::map<gpio_num_t, GpioPin*>::iterator it = gpioMap->begin(); it != gpioMap->end(); ++it) {
it->second->init(); it->second->init();
} }

View File

@@ -486,10 +486,10 @@ static esp_err_t upload_post_handler(httpd_req_t *req)
int start_fn = strlen(((struct file_server_data *)req->user_ctx)->base_path); int start_fn = strlen(((struct file_server_data *)req->user_ctx)->base_path);
printf("Directory: %s, start_fn: %d, found: %d\n", directory.c_str(), start_fn, found); printf("Directory: %s, start_fn: %d, found: %d\n", directory.c_str(), start_fn, found);
directory = directory.substr(start_fn, found - start_fn + 1); directory = directory.substr(start_fn, found - start_fn + 1);
printf("Directory danach: %s\n", directory.c_str()); printf("Directory danach 1: %s\n", directory.c_str());
directory = "/fileserver" + directory; directory = "/fileserver" + directory;
printf("Directory danach: %s\n", directory.c_str()); printf("Directory danach 2: %s\n", directory.c_str());
/* Redirect onto root to see the updated file list */ /* Redirect onto root to see the updated file list */
httpd_resp_set_status(req, "303 See Other"); httpd_resp_set_status(req, "303 See Other");
@@ -500,11 +500,13 @@ static esp_err_t upload_post_handler(httpd_req_t *req)
httpd_resp_set_hdr(req, "Location", directory.c_str()); httpd_resp_set_hdr(req, "Location", directory.c_str());
httpd_resp_sendstr(req, "File uploaded successfully"); httpd_resp_sendstr(req, "File uploaded successfully");
/*
if (strcmp(filepath, CONFIG_FILE) == 0) { if (strcmp(filepath, CONFIG_FILE) == 0) {
printf("New config foung. Reload handler."); printf("New config found. Reload handler.");
gpio_handler_deinit(); gpio_handler_deinit();
MQTTdestroy(); MQTTdestroy();
} }
*/
return ESP_OK; return ESP_OK;
} }
@@ -606,10 +608,10 @@ static esp_err_t delete_post_handler(httpd_req_t *req)
int start_fn = strlen(((struct file_server_data *)req->user_ctx)->base_path); int start_fn = strlen(((struct file_server_data *)req->user_ctx)->base_path);
printf("Directory: %s, start_fn: %d, found: %d\n", directory.c_str(), start_fn, found); printf("Directory: %s, start_fn: %d, found: %d\n", directory.c_str(), start_fn, found);
directory = directory.substr(start_fn, found - start_fn + 1); directory = directory.substr(start_fn, found - start_fn + 1);
printf("Directory danach: %s\n", directory.c_str()); printf("Directory danach 3: %s\n", directory.c_str());
directory = "/fileserver" + directory; directory = "/fileserver" + directory;
printf("Directory danach: %s\n", directory.c_str()); printf("Directory danach 4: %s\n", directory.c_str());
} }

View File

@@ -107,6 +107,8 @@ esp_err_t set_content_type_from_file(httpd_req_t *req, const char *filename)
return httpd_resp_set_type(req, "text/html"); return httpd_resp_set_type(req, "text/html");
} else if (IS_FILE_EXT(filename, ".jpeg")) { } else if (IS_FILE_EXT(filename, ".jpeg")) {
return httpd_resp_set_type(req, "image/jpeg"); return httpd_resp_set_type(req, "image/jpeg");
} else if (IS_FILE_EXT(filename, ".jpg")) {
return httpd_resp_set_type(req, "image/jpeg");
} else if (IS_FILE_EXT(filename, ".ico")) { } else if (IS_FILE_EXT(filename, ".ico")) {
return httpd_resp_set_type(req, "image/x-icon"); return httpd_resp_set_type(req, "image/x-icon");
} }

View File

@@ -130,11 +130,9 @@ bool ClassFlow::getNextLine(FILE* pfile, string *rt)
*rt = trim(*rt); *rt = trim(*rt);
while ((zw[0] == ';' || zw[0] == '#' || (rt->size() == 0)) && !(zw[1] == '[')) // Kommentarzeilen (; oder #) und Leerzeilen überspringen, es sei denn es ist ein neuer auskommentierter Paragraph while ((zw[0] == ';' || zw[0] == '#' || (rt->size() == 0)) && !(zw[1] == '[')) // Kommentarzeilen (; oder #) und Leerzeilen überspringen, es sei denn es ist ein neuer auskommentierter Paragraph
{ {
*rt = "";
if (!fgets(zw, 1024, pfile)) if (!fgets(zw, 1024, pfile))
{
*rt = "";
return false; return false;
}
printf("%s", zw); printf("%s", zw);
*rt = zw; *rt = zw;
*rt = trim(*rt); *rt = trim(*rt);

View File

@@ -173,9 +173,12 @@ void ClassFlowControll::InitFlow(std::string config)
} }
else else
{ {
fgets(zw, 1024, pFile); line = "";
printf("%s", zw); if (fgets(zw, 1024, pFile) && !feof(pFile))
line = std::string(zw); {
printf("Read: %s", zw);
line = std::string(zw);
}
} }
} }
@@ -328,7 +331,7 @@ string ClassFlowControll::GetPrevalue(std::string _number)
return std::string(); return std::string();
} }
std::string ClassFlowControll::UpdatePrevalue(std::string _newvalue, std::string _numbers) std::string ClassFlowControll::UpdatePrevalue(std::string _newvalue, std::string _numbers, bool _extern)
{ {
float zw; float zw;
char* p; char* p;
@@ -350,7 +353,7 @@ std::string ClassFlowControll::UpdatePrevalue(std::string _newvalue, std::string
if (flowpostprocessing) if (flowpostprocessing)
{ {
flowpostprocessing->SetPreValue(zw, _numbers); flowpostprocessing->SetPreValue(zw, _numbers, _extern);
return _newvalue; return _newvalue;
} }

View File

@@ -45,7 +45,7 @@ public:
bool getStatusSetupModus(){return SetupModeActive;}; bool getStatusSetupModus(){return SetupModeActive;};
string getReadout(bool _rawvalue, bool _noerror); string getReadout(bool _rawvalue, bool _noerror);
string getReadoutAll(int _type); string getReadoutAll(int _type);
string UpdatePrevalue(std::string _newvalue, std::string _numbers); string UpdatePrevalue(std::string _newvalue, std::string _numbers, bool _extern);
string GetPrevalue(std::string _number = ""); string GetPrevalue(std::string _number = "");
bool ReadParameter(FILE* pfile, string& aktparamgraph); bool ReadParameter(FILE* pfile, string& aktparamgraph);

View File

@@ -152,7 +152,7 @@ bool ClassFlowMQTT::doFlow(string zwtime)
for (int i = 0; i < NUMBERS.size(); ++i) for (int i = 0; i < NUMBERS.size(); ++i)
{ {
result = NUMBERS[i]->ReturnValueNoError; result = NUMBERS[i]->ReturnValue;
resulterror = NUMBERS[i]->ErrorMessageText; resulterror = NUMBERS[i]->ErrorMessageText;
resultrate = std::to_string(NUMBERS[i]->FlowRateAct); resultrate = std::to_string(NUMBERS[i]->FlowRateAct);
resulttimestamp = NUMBERS[i]->timeStamp; resulttimestamp = NUMBERS[i]->timeStamp;

View File

@@ -37,12 +37,22 @@ string ClassFlowPostProcessing::GetPreValue(std::string _number)
return result; return result;
} }
void ClassFlowPostProcessing::SetPreValue(float zw, string _numbers) void ClassFlowPostProcessing::SetPreValue(float zw, string _numbers, bool _extern)
{ {
printf("SetPrevalue: %f, %s\n", zw, _numbers.c_str());
for (int j = 0; j < NUMBERS.size(); ++j) for (int j = 0; j < NUMBERS.size(); ++j)
{ {
// printf("Number %d, %s\n", j, NUMBERS[j]->name.c_str());
if (NUMBERS[j]->name == _numbers) if (NUMBERS[j]->name == _numbers)
{
NUMBERS[j]->PreValue = zw; NUMBERS[j]->PreValue = zw;
if (_extern)
{
time(&(NUMBERS[j]->lastvalue));
localtime(&(NUMBERS[j]->lastvalue));
}
// printf("Found %d! - set to %f\n", j, NUMBERS[j]->PreValue);
}
} }
UpdatePreValueINI = true; UpdatePreValueINI = true;
SavePreValue(); SavePreValue();
@@ -207,8 +217,9 @@ void ClassFlowPostProcessing::SavePreValue()
struct tm* timeinfo = localtime(&NUMBERS[j]->lastvalue); struct tm* timeinfo = localtime(&NUMBERS[j]->lastvalue);
strftime(buffer, 80, PREVALUE_TIME_FORMAT_OUTPUT, timeinfo); strftime(buffer, 80, PREVALUE_TIME_FORMAT_OUTPUT, timeinfo);
NUMBERS[j]->timeStamp = std::string(buffer); NUMBERS[j]->timeStamp = std::string(buffer);
// printf("SaverPreValue %d, Value: %f, Nachkomma %d\n", j, NUMBERS[j]->PreValue, NUMBERS[j]->Nachkomma);
_zw = NUMBERS[j]->name + "\t" + NUMBERS[j]->timeStamp + "\t" + to_string(NUMBERS[j]->PreValue) + "\n"; _zw = NUMBERS[j]->name + "\t" + NUMBERS[j]->timeStamp + "\t" + RundeOutput(NUMBERS[j]->PreValue, NUMBERS[j]->Nachkomma) + "\n";
printf("Write PreValue Zeile: %s\n", _zw.c_str()); printf("Write PreValue Zeile: %s\n", _zw.c_str());
fputs(_zw.c_str(), pFile); fputs(_zw.c_str(), pFile);
@@ -594,7 +605,7 @@ bool ClassFlowPostProcessing::doFlow(string zwtime)
if ((!NUMBERS[j]->AllowNegativeRates) && (NUMBERS[j]->Value < NUMBERS[j]->PreValue)) if ((!NUMBERS[j]->AllowNegativeRates) && (NUMBERS[j]->Value < NUMBERS[j]->PreValue))
{ {
NUMBERS[j]->ErrorMessageText = NUMBERS[j]->ErrorMessageText + "Neg. Rate - Read: " + zwvalue + " - Raw: " + NUMBERS[j]->ReturnRawValue + " - Pre: " + std::to_string(NUMBERS[j]->Value) + " "; NUMBERS[j]->ErrorMessageText = NUMBERS[j]->ErrorMessageText + "Neg. Rate - Read: " + zwvalue + " - Raw: " + NUMBERS[j]->ReturnRawValue + " - Pre: " + RundeOutput(NUMBERS[j]->PreValue, NUMBERS[j]->Nachkomma) + " ";
NUMBERS[j]->Value = NUMBERS[j]->PreValue; NUMBERS[j]->Value = NUMBERS[j]->PreValue;
zwvalue = RundeOutput(NUMBERS[j]->Value, NUMBERS[j]->AnzahlAnalog - NUMBERS[j]->DecimalShift); zwvalue = RundeOutput(NUMBERS[j]->Value, NUMBERS[j]->AnzahlAnalog - NUMBERS[j]->DecimalShift);
} }

View File

@@ -87,7 +87,7 @@ public:
string getReadoutTimeStamp(int _number = 0); string getReadoutTimeStamp(int _number = 0);
void SavePreValue(); void SavePreValue();
string GetPreValue(std::string _number = ""); string GetPreValue(std::string _number = "");
void SetPreValue(float zw, string _numbers); void SetPreValue(float zw, string _numbers, bool _extern = false);
std::vector<NumberPost*> GetNumbers(){return NUMBERS;}; std::vector<NumberPost*> GetNumbers(){return NUMBERS;};
string name(){return "ClassFlowPostProcessing";}; string name(){return "ClassFlowPostProcessing";};

View File

@@ -569,7 +569,7 @@ esp_err_t handler_prevalue(httpd_req_t *req)
} }
else else
{ {
zw = "SetPrevalue to " + tfliteflow.UpdatePrevalue(_size, _numbers); zw = "SetPrevalue to " + tfliteflow.UpdatePrevalue(_size, _numbers, true);
} }
resp_str = zw.c_str(); resp_str = zw.c_str();

View File

@@ -1,4 +1,4 @@
const char* GIT_REV="03b5e36"; const char* GIT_REV="17a87b2";
const char* GIT_TAG=""; const char* GIT_TAG="";
const char* GIT_BRANCH="master"; const char* GIT_BRANCH="master";
const char* BUILD_TIME="2021-07-14 19:54"; const char* BUILD_TIME="2021-08-01 21:47";

View File

@@ -13,7 +13,7 @@ extern "C"
#include "Helper.h" #include "Helper.h"
#include <fstream> #include <fstream>
const char* GIT_BASE_BRANCH = "master - v8.0.0 - 2021-07-14"; const char* GIT_BASE_BRANCH = "master - v8.0.5 - 2021-08-01";
const char* git_base_branch(void) const char* git_base_branch(void)

View File

@@ -1,4 +1,4 @@
const char* GIT_REV="03b5e36"; const char* GIT_REV="17a87b2";
const char* GIT_TAG=""; const char* GIT_TAG="";
const char* GIT_BRANCH="master"; const char* GIT_BRANCH="master";
const char* BUILD_TIME="2021-07-14 19:53"; const char* BUILD_TIME="2021-08-01 21:47";

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -367,9 +367,6 @@ textarea {
</td> </td>
</tr> </tr>
ExtendedResolution
<tr class="expert" id="ex10"> <tr class="expert" id="ex10">
<td width="20px" style="padding-left: 40px;"> </td> <td width="20px" style="padding-left: 40px;"> </td>
<td> <class id="Analog_ModelInputSize_text" style="color:black;">ModelInputSize</class> </td> <td> <class id="Analog_ModelInputSize_text" style="color:black;">ModelInputSize</class> </td>
@@ -1659,12 +1656,12 @@ function UpdateInput() {
WriteParameter(param, category, "MakeImage", "Brightness", false); WriteParameter(param, category, "MakeImage", "Brightness", false);
// WriteParameter(param, category, "MakeImage", "Contrast", false); // WriteParameter(param, category, "MakeImage", "Contrast", false);
// WriteParameter(param, category, "MakeImage", "Saturation", false); // WriteParameter(param, category, "MakeImage", "Saturation", false);
WriteParameter(param, category, "MakeImage", "ImageSize", false, true); WriteParameter(param, category, "MakeImage", "ImageSize", false);
WriteParameter(param, category, "MakeImage", "FixedExposure", false, true); WriteParameter(param, category, "MakeImage", "FixedExposure", false);
WriteParameter(param, category, "Alignment", "SearchFieldX", false); WriteParameter(param, category, "Alignment", "SearchFieldX", false);
WriteParameter(param, category, "Alignment", "SearchFieldY", false); WriteParameter(param, category, "Alignment", "SearchFieldY", false);
WriteParameter(param, category, "Alignment", "AlignmentAlgo", true, true); WriteParameter(param, category, "Alignment", "AlignmentAlgo", true);
WriteParameter(param, category, "Digits", "Model", false); WriteParameter(param, category, "Digits", "Model", false);
WriteParameter(param, category, "Digits", "LogImageLocation", true); WriteParameter(param, category, "Digits", "LogImageLocation", true);

View File

@@ -1 +1 @@
9.5.0 9.5.2