Update to v0.9.0

This commit is contained in:
jomjol
2020-09-04 18:59:00 +02:00
parent 78e3256493
commit d51eaa1428
48 changed files with 10625 additions and 633 deletions

6
Changelog.md Normal file
View File

@@ -0,0 +1,6 @@
# Versions
##### 0.1.0 (2020-08-07)
* Initial Version

View File

@@ -2,45 +2,45 @@
This is an example of Artificial Intelligence (AI) calculations on a very cheap hardware. This is an example of Artificial Intelligence (AI) calculations on a very cheap hardware.
Details on **function**, **installation** and **configuration** can be found on the **[Wiki Page](https://github.com/jomjol/AI-on-the-edge-device/wiki)** ### Details on **function**, **installation** and **configuration** can be found on the **[Wiki Page](https://github.com/jomjol/AI-on-the-edge-device/wiki)**
A 3d-printable housing can be found here: https://www.thingiverse.com/thing:4571627 A 3d-printable housing can be found here: https://www.thingiverse.com/thing:4571627
<img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/main.jpg" width="300"><img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/size.png" width="300"> <img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/watermeter_all.jpg" width="200"><img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/main.jpg" width="200"><img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/size.png" width="200">
<img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/index.png" width="600"> <img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/watermeter.jpg" width="600">
<img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/edit_reference.jpg" width="600">
## Change log - latest version ## Change log
##### Rolling (2020-08-23) ##### Rolling - based on 1.0.0 (2020-09-04)
* Preparation for web configuration * currently identical to 1.0.0
* work in progress version for testing of new features
* Security Issue: Remove access to "wlan.ini"
* Only editor for config.ini
* Implementation of Digital Consistency Check: check if Digit shows next number earlier, than previous number has gone through zero - Turn on/off - see updated config.ini `CheckDigitIncreaseConsistency = True`)
Not fully tested!
##### 1.0.0 (2020-09-04)
* **First usable version** - compatible to previous project (https://github.com/jomjol/water-meter-system-complete)
* NEW:
* no docker container for CNN calculation necessary
* web based configuration editor on board
##### 0.1.0 (2020-08-07) ##### 0.1.0 (2020-08-07)
* Initial Version * Initial Version
#### [Full Changelog](Changelog.md)
## Known Issues ## Known Issues
* spontaneous reboot, especially in case of intensive web server access * spontaneous reboot, especially in case of intensive web server access
* stopping automated tflite flow - Error teared down to alignment procedure (results in restart) - Image load fails
## Solved topics ## Solved topics
* stuck in reboot - Solved by modified startup sequence * n.a.
* Camera initialization stuck not often, but randomly 5s after reboot - Hard reboot (power on/off) necessary :-(
--> Next try: adopted reboot sequence with additional and extended camera reset --> seems working!

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -31,6 +31,7 @@
#include "server_help.h" #include "server_help.h"
#include "Helper.h" #include "Helper.h"
#include "miniz.h"
/* Max length a file path can have on storage */ /* Max length a file path can have on storage */
// #define FILE_PATH_MAX (ESP_VFS_PATH_MAX + CONFIG_SPIFFS_OBJ_NAME_LEN) // #define FILE_PATH_MAX (ESP_VFS_PATH_MAX + CONFIG_SPIFFS_OBJ_NAME_LEN)
@@ -487,6 +488,103 @@ static esp_err_t delete_post_handler(httpd_req_t *req)
} }
void delete_all_in_directory(std::string _directory)
{
struct dirent *entry;
DIR *dir = opendir(_directory.c_str());
std::string filename;
if (!dir) {
ESP_LOGE(TAG, "Failed to stat dir : %s", _directory.c_str());
return;
}
/* Iterate over all files / folders and fetch their names and sizes */
while ((entry = readdir(dir)) != NULL) {
if (!(entry->d_type == DT_DIR)){
filename = _directory + std::string(entry->d_name);
ESP_LOGI(TAG, "Deleting file : %s", filename.c_str());
/* Delete file */
unlink(filename.c_str());
};
}
closedir(dir);
}
void unzip(std::string _in_zip_file, std::string _target_directory){
int i, sort_iter;
mz_bool status;
size_t uncomp_size;
mz_zip_archive zip_archive;
void* p;
const int N = 50;
char data[2048];
char archive_filename[64];
std::string zw;
// static const char* s_Test_archive_filename = "testhtml.zip";
printf("miniz.c version: %s\n", MZ_VERSION);
// Now try to open the archive.
memset(&zip_archive, 0, sizeof(zip_archive));
status = mz_zip_reader_init_file(&zip_archive, _in_zip_file.c_str(), 0);
if (!status)
{
printf("mz_zip_reader_init_file() failed!\n");
return;
}
// Get and print information about each file in the archive.
int numberoffiles = (int)mz_zip_reader_get_num_files(&zip_archive);
for (sort_iter = 0; sort_iter < 2; sort_iter++)
{
memset(&zip_archive, 0, sizeof(zip_archive));
status = mz_zip_reader_init_file(&zip_archive, _in_zip_file.c_str(), sort_iter ? MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY : 0);
if (!status)
{
printf("mz_zip_reader_init_file() failed!\n");
return;
}
for (i = 0; i < numberoffiles; i++)
{
mz_zip_archive_file_stat file_stat;
mz_zip_reader_file_stat(&zip_archive, i, &file_stat);
sprintf(archive_filename, file_stat.m_filename);
// Try to extract all the files to the heap.
p = mz_zip_reader_extract_file_to_heap(&zip_archive, archive_filename, &uncomp_size, 0);
if (!p)
{
printf("mz_zip_reader_extract_file_to_heap() failed!\n");
mz_zip_reader_end(&zip_archive);
return;
}
// Save to File.
zw = std::string(archive_filename);
zw = _target_directory + zw;
printf("Filename to extract: %s", zw.c_str());
FILE* fpTargetFile = fopen(zw.c_str(), "wb");
fwrite(p, 1, (uint)uncomp_size, fpTargetFile);
fclose(fpTargetFile);
printf("Successfully extracted file \"%s\", size %u\n", archive_filename, (uint)uncomp_size);
// printf("File data: \"%s\"\n", (const char*)p);
// We're done.
mz_free(p);
}
// Close the archive, freeing any resources it was using
mz_zip_reader_end(&zip_archive);
}
printf("Success.\n");
}
void register_server_file_uri(httpd_handle_t server, const char *base_path) void register_server_file_uri(httpd_handle_t server, const char *base_path)
{ {
static struct file_server_data *server_data = NULL; static struct file_server_data *server_data = NULL;

View File

@@ -1,3 +1,8 @@
#include <esp_http_server.h> #include <esp_http_server.h>
#include <string>
void register_server_file_uri(httpd_handle_t server, const char *base_path); void register_server_file_uri(httpd_handle_t server, const char *base_path);
void unzip(std::string _in_zip_file, std::string _target_directory);
void delete_all_in_directory(std::string _directory);

View File

@@ -27,6 +27,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include "server_tflite.h" #include "server_tflite.h"
#include "server_file.h"
#include "ClassLogFile.h" #include "ClassLogFile.h"
@@ -301,14 +302,23 @@ void CheckOTAUpdate(void)
esp_err_t handler_ota_update(httpd_req_t *req) esp_err_t handler_ota_update(httpd_req_t *req)
{ {
LogFile.WriteToFile("handler_ota_update"); LogFile.WriteToFile("handler_ota_update");
char _query[100]; char _query[200];
char _filename[30]; char _filename[30];
char _valuechar[30];
std::string fn = "/sdcard/firmware/"; std::string fn = "/sdcard/firmware/";
bool _file_del = false; bool _file_del = false;
std::string _task;
if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK) if (httpd_req_get_url_query_str(req, _query, 200) == ESP_OK)
{ {
printf("Query: "); printf(_query); printf("\n"); printf("Query: "); printf(_query); printf("\n");
if (httpd_query_key_value(_query, "task", _valuechar, 30) == ESP_OK)
{
printf("task is found"); printf(_valuechar); printf("\n");
_task = std::string(_valuechar);
}
if (httpd_query_key_value(_query, "file", _filename, 30) == ESP_OK) if (httpd_query_key_value(_query, "file", _filename, 30) == ESP_OK)
{ {
fn.append(_filename); fn.append(_filename);
@@ -323,6 +333,20 @@ esp_err_t handler_ota_update(httpd_req_t *req)
}; };
if (_task.compare("unziphtml") == 0)
{
std::string in, out, zw;
in = "/sdcard/firmware/html.zip";
out = "/sdcard/html/";
unzip(in, out);
zw = "Unzip html Done";
httpd_resp_sendstr_chunk(req, zw.c_str());
}
if (_file_del) if (_file_del)
{ {
struct stat file_stat; struct stat file_stat;

View File

@@ -72,6 +72,10 @@ bool ClassFlow::doFlow(string time)
return false; return false;
} }
string ClassFlow::getHTMLSingleStep(string host){
return "";
}
string ClassFlow::getReadout() string ClassFlow::getReadout()
{ {
return string(); return string();

View File

@@ -33,6 +33,7 @@ public:
ClassFlow(std::vector<ClassFlow*> * lfc); ClassFlow(std::vector<ClassFlow*> * lfc);
virtual bool ReadParameter(FILE* pfile, string &aktparamgraph); virtual bool ReadParameter(FILE* pfile, string &aktparamgraph);
virtual bool doFlow(string time); virtual bool doFlow(string time);
virtual string getHTMLSingleStep(string host);
virtual string getReadout(); virtual string getReadout();
virtual string name(){return "ClassFlow";}; virtual string name(){return "ClassFlow";};

View File

@@ -60,6 +60,17 @@ bool ClassFlowAlignment::ReadParameter(FILE* pfile, string& aktparamgraph)
} }
string ClassFlowAlignment::getHTMLSingleStep(string host)
{
string result;
result = "<p>Rotated Image: </p> <p><img src=\"" + host + "/img_tmp/rot.jpg\"></p>\n";
result = result + "<p>Found Alignment: </p> <p><img src=\"" + host + "/img_tmp/rot_roi.jpg\"></p>\n";
result = result + "<p>Aligned Image: </p> <p><img src=\"" + host + "/img_tmp/alg.jpg\"></p>\n";
return result;
}
bool ClassFlowAlignment::doFlow(string time) bool ClassFlowAlignment::doFlow(string time)
{ {
string input = namerawimage; string input = namerawimage;

View File

@@ -23,6 +23,7 @@ public:
ClassFlowAlignment(std::vector<ClassFlow*>* lfc); ClassFlowAlignment(std::vector<ClassFlow*>* lfc);
bool ReadParameter(FILE* pfile, string& aktparamgraph); bool ReadParameter(FILE* pfile, string& aktparamgraph);
bool doFlow(string time); bool doFlow(string time);
string getHTMLSingleStep(string host);
string name(){return "ClassFlowAlignment";}; string name(){return "ClassFlowAlignment";};
}; };

View File

@@ -113,6 +113,31 @@ bool ClassFlowAnalog::ReadParameter(FILE* pfile, string& aktparamgraph)
} }
string ClassFlowAnalog::getHTMLSingleStep(string host)
{
string result, zw;
std::vector<HTMLInfo*> htmlinfo;
result = "<p>Found ROIs: </p> <p><img src=\"" + host + "/img_tmp/alg_roi.jpg\"></p>\n";
result = result + "Analog Pointers: <p> ";
htmlinfo = GetHTMLInfo();
for (int i = 0; i < htmlinfo.size(); ++i)
{
std::stringstream stream;
stream << std::fixed << std::setprecision(1) << htmlinfo[i]->val;
zw = stream.str();
result = result + "<img src=\"" + host + "/img_tmp/" + htmlinfo[i]->filename + "\"> " + zw;
delete htmlinfo[i];
}
htmlinfo.clear();
return result;
}
bool ClassFlowAnalog::doFlow(string time) bool ClassFlowAnalog::doFlow(string time)
{ {
doAlignAndCut(time); doAlignAndCut(time);

View File

@@ -25,6 +25,7 @@ public:
ClassFlowAnalog(std::vector<ClassFlow*>* lfc); ClassFlowAnalog(std::vector<ClassFlow*>* lfc);
bool ReadParameter(FILE* pfile, string& aktparamgraph); bool ReadParameter(FILE* pfile, string& aktparamgraph);
bool doFlow(string time); bool doFlow(string time);
string getHTMLSingleStep(string host);
string getReadout(); string getReadout();
bool doNeuralNetwork(string time); bool doNeuralNetwork(string time);

View File

@@ -1,8 +1,39 @@
#include "ClassFlowControll.h" #include "ClassFlowControll.h"
#include "ClassLogFile.h" #include "ClassLogFile.h"
#include "time_sntp.h"
#include "Helper.h" #include "Helper.h"
std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _host){
bool found = false;
std::string _classname = "";
std::string result = "";
if (_stepname.compare("[MakeImage]") == 0){
_classname = "ClassFlowMakeImage";
}
if (_stepname.compare("[Alignment]") == 0){
_classname = "ClassFlowAlignment";
}
if (_stepname.compare("[Digits]") == 0){
_classname = "ClassFlowDigit";
}
if (_stepname.compare("[Analog]") == 0){
_classname = "ClassFlowAnalog";
}
// std::string zw = "Classname: " + _classname + "\n";
// printf(zw.c_str());
for (int i = 0; i < FlowControll.size(); ++i)
if (FlowControll[i]->name().compare(_classname) == 0){
// printf(FlowControll[i]->name().c_str()); printf("\n");
FlowControll[i]->doFlow("");
result = FlowControll[i]->getHTMLSingleStep(_host);
found = true;
}
return result;
}
std::vector<HTMLInfo*> ClassFlowControll::GetAllDigital() std::vector<HTMLInfo*> ClassFlowControll::GetAllDigital()
{ {
for (int i = 0; i < FlowControll.size(); ++i) for (int i = 0; i < FlowControll.size(); ++i)
@@ -67,8 +98,6 @@ ClassFlow* ClassFlowControll::CreateClassFlow(std::string _type)
void ClassFlowControll::InitFlow(std::string config) void ClassFlowControll::InitFlow(std::string config)
{ {
int aktFlow;
bool handeled;
string line; string line;
flowpostprocessing = NULL; flowpostprocessing = NULL;
@@ -79,8 +108,6 @@ void ClassFlowControll::InitFlow(std::string config)
pFile = fopen(config.c_str(), "r"); pFile = fopen(config.c_str(), "r");
line = ""; line = "";
handeled = true;
char zw[1024]; char zw[1024];
if (pFile != NULL) if (pFile != NULL)
@@ -109,15 +136,24 @@ void ClassFlowControll::InitFlow(std::string config)
} }
std::string ClassFlowControll::getActStatus(){
return aktstatus;
}
bool ClassFlowControll::doFlow(string time) bool ClassFlowControll::doFlow(string time)
{ {
bool result = true; bool result = true;
std::string zw_time;
for (int i = 0; i < FlowControll.size(); ++i) for (int i = 0; i < FlowControll.size(); ++i)
{ {
zw_time = gettimestring("%Y%m%d-%H%M%S");
aktstatus = zw_time + ": " + FlowControll[i]->name();
string zw = "FlowControll.doFlow - " + FlowControll[i]->name(); string zw = "FlowControll.doFlow - " + FlowControll[i]->name();
LogFile.WriteToFile(zw); LogFile.WriteToFile(zw);
result = result && FlowControll[i]->doFlow(time); result = result && FlowControll[i]->doFlow(time);
} }
zw_time = gettimestring("%Y%m%d-%H%M%S");
aktstatus = zw_time + ": Flow is done";
return result; return result;
} }

View File

@@ -21,6 +21,7 @@ protected:
bool AutoStart; bool AutoStart;
float AutoIntervall; float AutoIntervall;
void SetInitialParameter(void); void SetInitialParameter(void);
std::string aktstatus;
public: public:
@@ -31,8 +32,12 @@ public:
string GetPrevalue(); string GetPrevalue();
bool ReadParameter(FILE* pfile, string& aktparamgraph); bool ReadParameter(FILE* pfile, string& aktparamgraph);
std::string doSingleStep(std::string _stepname, std::string _host);
bool isAutoStart(long &_intervall); bool isAutoStart(long &_intervall);
std::string getActStatus();
std::vector<HTMLInfo*> GetAllDigital(); std::vector<HTMLInfo*> GetAllDigital();
std::vector<HTMLInfo*> GetAllAnalog(); std::vector<HTMLInfo*> GetAllAnalog();

View File

@@ -91,6 +91,32 @@ bool ClassFlowDigit::ReadParameter(FILE* pfile, string& aktparamgraph)
} }
string ClassFlowDigit::getHTMLSingleStep(string host)
{
string result, zw;
std::vector<HTMLInfo*> htmlinfo;
result = "<p>Found ROIs: </p> <p><img src=\"" + host + "/img_tmp/alg_roi.jpg\"></p>\n";
result = result + "Digital Counter: <p> ";
htmlinfo = GetHTMLInfo();
for (int i = 0; i < htmlinfo.size(); ++i)
{
if (htmlinfo[i]->val == 10)
zw = "NaN";
else
{
zw = to_string((int) htmlinfo[i]->val);
}
result = result + "<img src=\"" + host + "/img_tmp/" + htmlinfo[i]->filename + "\"> " + zw;
delete htmlinfo[i];
}
htmlinfo.clear();
return result;
}
bool ClassFlowDigit::doFlow(string time) bool ClassFlowDigit::doFlow(string time)
{ {
doAlignAndCut(time); doAlignAndCut(time);

View File

@@ -29,6 +29,7 @@ public:
ClassFlowDigit(std::vector<ClassFlow*>* lfc); ClassFlowDigit(std::vector<ClassFlow*>* lfc);
bool ReadParameter(FILE* pfile, string& aktparamgraph); bool ReadParameter(FILE* pfile, string& aktparamgraph);
bool doFlow(string time); bool doFlow(string time);
string getHTMLSingleStep(string host);
string getReadout(); string getReadout();
std::vector<HTMLInfo*> GetHTMLInfo(); std::vector<HTMLInfo*> GetHTMLInfo();

View File

@@ -120,6 +120,12 @@ void ClassFlowMakeImage::CopyFile(string input, string output)
printf("Copy done\n"); printf("Copy done\n");
} }
string ClassFlowMakeImage::getHTMLSingleStep(string host)
{
string result;
result = "Raw Image: <br>\n<img src=\"" + host + "/img_tmp/raw.jpg\">\n";
return result;
}
bool ClassFlowMakeImage::doFlow(string zwtime) bool ClassFlowMakeImage::doFlow(string zwtime)
{ {

View File

@@ -35,6 +35,7 @@ public:
ClassFlowMakeImage(std::vector<ClassFlow*>* lfc); ClassFlowMakeImage(std::vector<ClassFlow*>* lfc);
bool ReadParameter(FILE* pfile, string& aktparamgraph); bool ReadParameter(FILE* pfile, string& aktparamgraph);
bool doFlow(string time); bool doFlow(string time);
string getHTMLSingleStep(string host);
time_t getTimeImageTaken(); time_t getTimeImageTaken();
string name(){return "ClassFlowMakeImage";}; string name(){return "ClassFlowMakeImage";};
}; };

View File

@@ -18,10 +18,14 @@ float CTfLiteClass::GetOutputValue(int nr)
int CTfLiteClass::GetClassFromImage(std::string _fn) int CTfLiteClass::GetClassFromImage(std::string _fn)
{ {
// printf("Before Load image %s\n", _fn.c_str());
if (!LoadInputImage(_fn)) if (!LoadInputImage(_fn))
return -1000; return -1000;
// printf("After Load image %s\n", _fn.c_str());
Invoke(); Invoke();
printf("After Invoke %s\n", _fn.c_str());
return GetOutClassification(); return GetOutClassification();
// return 0; // return 0;
} }
@@ -102,46 +106,6 @@ void CTfLiteClass::Invoke()
// printf("Invoke Done.\n"); // printf("Invoke Done.\n");
} }
/* mit CImageBasis --> funktioniert nicht, keine Ahnung warum !!!
bool CTfLiteClass::LoadInputImage(std::string _fn)
{
CImageBasis *cib = new CImageBasis(_fn);
GetInputDimension(true);
printf("TFlite load image size: %d x %d x %d\n", cib->getWidth(), cib->getHeight(), cib->getChannels());
// printf("TFlite expected image size: %d x %d x %d\n", im_width, im_height, im_channel);
if ((cib->getWidth() != im_width) || (cib->getHeight() != im_height) || (cib->getChannels() != im_channel))
{
printf("Input Imagesize Wrong.\n");
return false;
}
input_i = 0;
float* input_data_ptr = (interpreter->input(0))->data.f;
uint8_t ui8;
unsigned char zw;
for (int y = 0; y < cib->getHeight(); ++y)
for (int x = 0; x < cib->getWidth(); ++x)
{
printf("CIB: ");
for (int ch = 0; ch < cib->getChannels(); ++ch)
{
ui8 = cib->GetPixelColor(x, y, ch);
printf("%f ", (float) ui8);
*(input_data_ptr) = (float) ui8;
input_data_ptr++;
}
printf("\n");
}
delete cib;
return true;
}
*/
bool CTfLiteClass::LoadInputImage(std::string _fn) bool CTfLiteClass::LoadInputImage(std::string _fn)
{ {

View File

@@ -233,7 +233,7 @@ httpd_handle_t start_webserver(void)
httpd_config_t config = { }; httpd_config_t config = { };
config.task_priority = tskIDLE_PRIORITY+5; config.task_priority = tskIDLE_PRIORITY+5;
config.stack_size = 16384; config.stack_size = 16384; // bei 32k stürzt das Programm beim Bilderaufnehmen ab
config.core_id = tskNO_AFFINITY; config.core_id = tskNO_AFFINITY;
config.server_port = 80; config.server_port = 80;
config.ctrl_port = 32768; config.ctrl_port = 32768;

View File

@@ -196,21 +196,6 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req)
} }
htmlinfo.clear(); htmlinfo.clear();
/*
for i in range(len(resultdigital)):
if resultdigital[i] == 'NaN':
zw = 'NaN'
else:
zw = str(int(resultdigital[i]))
txt += '<img src=/image_tmp/'+ str(resultcut[1][i][0]) + '.jpg></img>' + zw
txt = txt + '<p>'
if self.AnalogReadOutEnabled:
txt = txt + 'Analog Meter: <p>'
for i in range(len(resultanalog)):
txt += '<img src=/image_tmp/'+ str(resultcut[0][i][0]) + '.jpg></img>' + "{:.1f}".format(resultanalog[i])
txt = txt + '<p>'
*/
} }
@@ -232,7 +217,7 @@ esp_err_t handler_editflow(httpd_req_t *req)
string zw; string zw;
bool _rawValue = false; bool _rawValue = false;
printf("handler_editflow uri:\n"); printf(req->uri); printf("\n"); printf("handler_editflow uri: "); printf(req->uri); printf("\n");
char _query[200]; char _query[200];
char _valuechar[30]; char _valuechar[30];
@@ -242,7 +227,7 @@ esp_err_t handler_editflow(httpd_req_t *req)
{ {
if (httpd_query_key_value(_query, "task", _valuechar, 30) == ESP_OK) if (httpd_query_key_value(_query, "task", _valuechar, 30) == ESP_OK)
{ {
printf("task is found"); printf(_valuechar); printf("\n"); printf("task is found: %s\n", _valuechar);
_task = string(_valuechar); _task = string(_valuechar);
} }
} }
@@ -333,6 +318,56 @@ esp_err_t handler_editflow(httpd_req_t *req)
httpd_resp_sendstr_chunk(req, zw.c_str()); httpd_resp_sendstr_chunk(req, zw.c_str());
} }
if (_task.compare("test_take") == 0)
{
std::string _host = "";
if (httpd_query_key_value(_query, "host", _valuechar, 30) == ESP_OK) {
_host = std::string(_valuechar);
}
// printf("Parameter host: "); printf(_host.c_str()); printf("\n");
// string zwzw = "Do " + _task + " start\n"; printf(zwzw.c_str());
std::string zw = tfliteflow.doSingleStep("[MakeImage]", _host);
httpd_resp_sendstr_chunk(req, zw.c_str());
}
if (_task.compare("test_align") == 0)
{
std::string _host = "";
if (httpd_query_key_value(_query, "host", _valuechar, 30) == ESP_OK) {
_host = std::string(_valuechar);
}
// printf("Parameter host: "); printf(_host.c_str()); printf("\n");
// string zwzw = "Do " + _task + " start\n"; printf(zwzw.c_str());
std::string zw = tfliteflow.doSingleStep("[Alignment]", _host);
httpd_resp_sendstr_chunk(req, zw.c_str());
}
if (_task.compare("test_analog") == 0)
{
std::string _host = "";
if (httpd_query_key_value(_query, "host", _valuechar, 30) == ESP_OK) {
_host = std::string(_valuechar);
}
// printf("Parameter host: "); printf(_host.c_str()); printf("\n");
// string zwzw = "Do " + _task + " start\n"; printf(zwzw.c_str());
std::string zw = tfliteflow.doSingleStep("[Analog]", _host);
httpd_resp_sendstr_chunk(req, zw.c_str());
}
if (_task.compare("test_digits") == 0)
{
std::string _host = "";
if (httpd_query_key_value(_query, "host", _valuechar, 30) == ESP_OK) {
_host = std::string(_valuechar);
}
// printf("Parameter host: "); printf(_host.c_str()); printf("\n");
// string zwzw = "Do " + _task + " start\n"; printf(zwzw.c_str());
std::string zw = tfliteflow.doSingleStep("[Digits]", _host);
httpd_resp_sendstr_chunk(req, zw.c_str());
}
/* Respond with an empty chunk to signal HTTP response completion */ /* Respond with an empty chunk to signal HTTP response completion */
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);

0
code/src/zip._c Normal file
View File

Binary file not shown.

Binary file not shown.

BIN
images/edit_reference.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
images/watermeter.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

BIN
images/watermeter_all.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

View File

@@ -12,17 +12,19 @@ SearchFieldX = 20
SearchFieldY = 20 SearchFieldY = 20
[Digits] [Digits]
Model=/config/dig0622.tfl ;Model=/config/dig0622.tfl
ModelInputSize 20, 32 Model=/config/dig0630s3.tflite
LogImageLocation = /log/digit LogImageLocation = /log/digit
ModelInputSize 20, 32
digit1, 306, 120, 37, 67 digit1, 306, 120, 37, 67
digit2, 355, 120, 37, 67 digit2, 355, 120, 37, 67
digit3, 404, 120, 37, 67 digit3, 404, 120, 37, 67
[Analog] [Analog]
Model=/config/ana0622.tfl ;Model=/config/ana0622.tfl
ModelInputSize 32, 32 Model=/config/ana0630s2.tflite
LogImageLocation = /log/analog LogImageLocation = /log/analog
ModelInputSize 32, 32
analog1, 444, 225, 92, 92 analog1, 444, 225, 92, 92
analog2, 391, 329, 92, 92 analog2, 391, 329, 92, 92
analog3, 294, 369, 92, 92 analog3, 294, 369, 92, 92

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -92,6 +92,7 @@
</div> </div>
</div> </div>
<script type="text/javascript" src="./gethost.js"></script>
<script type="text/javascript" src="./readconfig.js"></script> <script type="text/javascript" src="./readconfig.js"></script>
<script language="JavaScript"> <script language="JavaScript">
@@ -162,8 +163,8 @@ function UpdateReference(){
} }
function ParseIni(_basepath) { function ParseIni(_basepath) {
loadConfigJS(_basepath); loadConfig(_basepath);
ParseReference(); ParseConfig();
UpdateReference(); UpdateReference();
} }
@@ -259,6 +260,7 @@ function dataURLtoBlob(dataurl) {
function init() { function init() {
basepath = getbasepath();
canvas.addEventListener('mousedown', mouseDown, false); canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false); canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false); canvas.addEventListener('mousemove', mouseMove, false);

View File

@@ -9,7 +9,7 @@
<div id="createrefernce"> <div id="createrefernce">
<div style="padding-left: 30px"> <div style="padding-left: 30px">
<h3>Define Alignment Structure in Reference Image</h3> <h3>Edit Analog</h3>
<div style="padding-left: 30px"> <div style="padding-left: 30px">
<table> <table>
@@ -21,14 +21,23 @@
<tr> <tr>
<td> <td>
<table> <table>
<tr>
<td>
<input type="submit" name="newROI" onclick="newROI()" value="New ROI (after current)">
<input type="submit" name="deleteROI" onclick="deleteROI()" value="Delete ROI">
</td>
</tr>
<tr> <tr>
<tr> <tr>
<td> <td>
<select id="index" name="reference" onchange="ChangeSelection()"> <select id="index" name="index" onchange="ChangeSelection()">
<option value="0" selected>Reference 0</option> <option value="0" selected>ROI 0</option>
<option value="1" >Reference 1</option> <option value="1" >ROI 1</option>
</select> </select>
Storage path/name: <input type="text" name="name" id="name"> name: <input type="text" name="name" id="name" onchange="onNameChange()">
<input type="submit" id="moveNext" onclick="moveNext()" value="move Next">
<input type="submit" id="movePrevious" onclick="movePrevious()" value="move Previous">
</td> </td>
</tr> </tr>
@@ -39,7 +48,11 @@
x: <input type="number" name="refx" id="refx" step=1 onchange="valuemanualchanged()"> x: <input type="number" name="refx" id="refx" step=1 onchange="valuemanualchanged()">
</td> </td>
<td> <td>
dx: <input type="number" name="refdx" id="refdx" step=1 onchange="valuemanualchanged()"> dx: <input type="number" name="refdx" id="refdx" step=1 onchange="valuemanualchangeddx()">
</td>
<td>
<input type="checkbox" id="lockAR" name="lockAR" value="1" onclick="changelockAR()" checked>
<label for="lockAR"> lock aspect ratio</label><br>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -50,39 +63,12 @@
dy: <input type="number" name="refdy" id="refdy" step=1 onchange="valuemanualchanged()"> dy: <input type="number" name="refdy" id="refdy" step=1 onchange="valuemanualchanged()">
</td> </td>
</tr> </tr>
<tr>
<td>
<input type="button" value="Update Reference" onclick="CutOutReference()">
</td>
</tr>
</table> </table>
</td> </td>
</tr> </tr>
<table>
<tr> <tr>
<td> <td>
Original Image <input type="submit" name="saveroi" onclick="SaveToConfig()" value="Save all to Config.ini">
</td>
<td>
Reference Image
</td>
</tr>
<tr>
<td>
<img id="img_ref_org" src = "/img_tmp/ref_zw_org.jpg">
</td>
<td>
<img id="img_ref" src = "/img_tmp/ref_zw.jpg">
</td>
<td>
<input type="button" value="Enhance Contrast" onclick="EnhanceContrast()">
</td>
</tr>
</table>
<tr>
<td>
<input type="submit" name="saveroi" onclick="SaveToConfig()" value="Save to Config.ini">
</td> </td>
</tr> </tr>
</table> </table>
@@ -92,6 +78,7 @@
</div> </div>
</div> </div>
<script type="text/javascript" src="./gethost.js"></script>
<script type="text/javascript" src="./readconfig.js"></script> <script type="text/javascript" src="./readconfig.js"></script>
<script language="JavaScript"> <script language="JavaScript">
@@ -101,132 +88,126 @@
rect = {}, rect = {},
drag = false, drag = false,
aktindex = 0, aktindex = 0,
refInfo, ROIInfo,
enhanceCon = false; enhanceCon = false;
lockAR = true;
basepath = "http://192.168.178.26"; basepath = "http://192.168.178.26";
function onNameChange(){
ROIInfo[aktindex]["name"] = document.getElementById("name").value;
UpdateROIs();
}
function deleteROI(){
ROIInfo.splice(aktindex, 1);
if (aktindex > ROIInfo.length - 1){
aktindex = ROIInfo.length - 1;
}
UpdateROIs();
}
function newROI(){
var zw = ROIInfo[ROIInfo.length-1];
ROIInfo.push(zw);
for (var i = ROIInfo.length-2; i > aktindex + 1; --i){
ROIInfo[i] = ROIInfo[i-1];
}
aktindex++;
ROIInfo[aktindex] = new Object;
ROIInfo[aktindex]["pos_ref"] = -1;
ROIInfo[aktindex]["name"] = "ROI" + aktindex;
ROIInfo[aktindex]["x"] = 1;
ROIInfo[aktindex]["y"] = 1;
ROIInfo[aktindex]["dx"] = ROIInfo[aktindex-1]["dx"];
ROIInfo[aktindex]["dy"] = ROIInfo[aktindex-1]["dy"];
ROIInfo[aktindex]["ar"] = ROIInfo[aktindex-1]["ar"];
UpdateROIs();
}
function movePrevious(){
var zw = ROIInfo[aktindex];
ROIInfo[aktindex] = ROIInfo[aktindex-1];
ROIInfo[aktindex-1] = zw;
aktindex--;
UpdateROIs();
}
function moveNext(){
var zw = ROIInfo[aktindex];
ROIInfo[aktindex] = ROIInfo[aktindex+1];
ROIInfo[aktindex+1] = zw;
aktindex++;
UpdateROIs();
}
function changelockAR(){
lockAR = document.getElementById("lockAR").checked;
}
function ChangeSelection(){ function ChangeSelection(){
aktindex = parseInt(document.getElementById("index").value); aktindex = parseInt(document.getElementById("index").value);
UpdateReference(); // lockAR = true;
UpdateROIs();
} }
function SaveToConfig(){ function SaveToConfig(){
refInfo["name"] = document.getElementById("name").value; SaveROIToConfig(ROIInfo, "[Analog]", basepath);
refInfo["x"] = document.getElementById("refx").value; location.reload();
refInfo["y"] = document.getElementById("refy").value;
refInfo["dx"] = document.getElementById("refdx").value;
refInfo["dy"] = document.getElementById("refdy").value;
UpdateConfig(refInfo, aktindex, enhanceCon, basepath);
// location.reload();
} }
function EnhanceContrast(){
refInfo["name"] = document.getElementById("name").value;
refInfo["x"] = document.getElementById("refx").value;
refInfo["y"] = document.getElementById("refy").value;
refInfo["dx"] = document.getElementById("refdx").value;
refInfo["dy"] = document.getElementById("refdy").value;
enhanceCon = true; function UpdateROIs(){
MakeContrastImageZW(refInfo, enhanceCon, basepath); if (ROIInfo.length == 0){
var url = basepath + "/fileserver" + "/img_tmp/ref_zw.jpg?" + Date.now(); alert("There are no ROIs defined.\nPlease first define minimum one ROI in the config.ini by hand.\n");
document.getElementById("img_ref").src = url; return;
var url = basepath + "/fileserver" + "/img_tmp/ref_zw_org.jpg?" + Date.now();
document.getElementById("img_ref_org").src = url;
}
function UpdateReference(){
refInfo = GetCoordinates(aktindex, basepath);
document.getElementById("img_ref").onload = function () {
document.getElementById("refdx").value = this.width;
document.getElementById("refdy").value = this.height;
refInfo["dx"] = this.width;
refInfo["dy"] = this.height;
rect.w = document.getElementById("refdx").value;
rect.h = document.getElementById("refdy").value;
draw();
} }
var url = basepath + "/fileserver" + "/img_tmp/ref_zw_org.jpg?" + Date.now(); var _index = document.getElementById("index");
document.getElementById("img_ref_org").src = url; while (_index.length){
var url = basepath + "/fileserver" + "/img_tmp/ref_zw.jpg?" + Date.now(); _index.remove(0);
document.getElementById("img_ref").src = url; }
document.getElementById("name").value = refInfo["name"]; for (var i = 0; i < ROIInfo.length; ++i){
document.getElementById("refx").value = refInfo["x"]; var option = document.createElement("option");
document.getElementById("refy").value = refInfo["y"]; option.text = "ROI " + (i + 1);
rect.startX = document.getElementById("refx").value; option.value = i;
rect.startY = document.getElementById("refy").value; _index.add(option);
}
_index.selectedIndex = aktindex;
document.getElementById("movePrevious").disabled = false;
if (aktindex == 0){
document.getElementById("movePrevious").disabled = true;
}
document.getElementById("moveNext").disabled = false;
if (aktindex == (ROIInfo.length-1)){
document.getElementById("moveNext").disabled = true;
}
document.getElementById("lockAR").checked = lockAR;
document.getElementById("name").value = ROIInfo[aktindex]["name"];
document.getElementById("refx").value = ROIInfo[aktindex]["x"];
document.getElementById("refy").value = ROIInfo[aktindex]["y"];
document.getElementById("refdx").value = ROIInfo[aktindex]["dx"];
document.getElementById("refdy").value = ROIInfo[aktindex]["dy"];
rect.startX = ROIInfo[aktindex]["x"];
rect.startY = ROIInfo[aktindex]["y"];
rect.w = ROIInfo[aktindex]["dx"];
rect.h = ROIInfo[aktindex]["dy"];
draw(); draw();
} }
function ParseIni(_basepath) { function ParseIni(_basepath) {
loadConfigJS(_basepath); loadConfig(_basepath);
ParseReference(); ParseConfig();
UpdateReference(); ROIInfo = getROIInfo("[Analog]");
UpdateROIs();
} }
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
function SaveReference()
{
if (confirm("Are you sure you want to update \"reference.jpg\"?")) {
var xhttp = new XMLHttpRequest();
/* first delete the old firmware */
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
/* keine Reaktion, damit sich das Dokument nicht ändert */
} else if (xhttp.status == 0) {
alert("Server closed the connection abruptly!");
location.reload()
} else {
alert(xhttp.status + " Error!\n" + xhttp.responseText);
location.reload()
}
}
};
xhttp.open("POST", basepath + "/delete/config/reference.jpg", false);
xhttp.send();
/* ----------------------------- */
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
alert("Update \"reference.jpg\" successfull!\n\nTo make it active you need to reboot.")
document.reload();
} else if (xhttp.status == 0) {
alert("Server closed the connection abruptly!");
location.reload()
} else {
alert(xhttp.status + " Error!\n" + xhttp.responseText);
location.reload()
}
}
};
upload_path = basepath + "/upload/config/reference.jpg";
var canvas = document.getElementById("canvas");
var JPEG_QUALITY=0.5;
var dataUrl = canvas.toDataURL('image/jpeg', JPEG_QUALITY);
var rtn = dataURLtoBlob(dataUrl);
xhttp.open("POST", upload_path, true);
xhttp.send(rtn);
}
}
function loadCanvas(dataURL) { function loadCanvas(dataURL) {
var canvas = document.getElementById('canvas'); var canvas = document.getElementById('canvas');
@@ -258,6 +239,7 @@ function dataURLtoBlob(dataurl) {
function init() { function init() {
basepath = getbasepath();
canvas.addEventListener('mousedown', mouseDown, false); canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false); canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false); canvas.addEventListener('mousemove', mouseMove, false);
@@ -276,48 +258,6 @@ function dataURLtoBlob(dataurl) {
} }
function CutOutReference(){
refInfo["x"] = document.getElementById("refx").value;
refInfo["y"] = document.getElementById("refy").value;
refInfo["dx"] = document.getElementById("refdx").value;
refInfo["dy"] = document.getElementById("refdy").value;
MakeRefZW(refInfo, basepath);
var url = basepath + "/fileserver" + "/img_tmp/ref_zw.jpg?" + Date.now();
document.getElementById("img_ref_org").src = url;
var url = basepath + "/fileserver" + "/img_tmp/ref_zw_org.jpg?" + Date.now();
document.getElementById("img_ref").src = url;
draw();
}
function drawGrid(){
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
w = canvas.width;
h = canvas.height;
ctx.save();
ctx.strokeStyle = '#00FF00';
for (i = h/2; i < h; i += 100)
{
ctx.moveTo(0, i);
ctx.lineTo(w, i);
ctx.stroke();
ctx.moveTo(0, h-i);
ctx.lineTo(w, h-i);
ctx.stroke();
}
for (i = w/2; i < w; i += 100)
{
ctx.moveTo(i, 0);
ctx.lineTo(i, h);
ctx.stroke();
ctx.moveTo(w-i, 0);
ctx.lineTo(w-i, h);
ctx.stroke(); }
// ctx.restore();
}
function draw() { function draw() {
var canvas = document.getElementById('canvas'); var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d'); var context = canvas.getContext('2d');
@@ -330,6 +270,10 @@ function dataURLtoBlob(dataurl) {
var dx = parseInt(rect.w) + parseInt(lw); var dx = parseInt(rect.w) + parseInt(lw);
var dy = parseInt(rect.h) + parseInt(lw); var dy = parseInt(rect.h) + parseInt(lw);
context.strokeRect(x0, y0, dx, dy); context.strokeRect(x0, y0, dx, dy);
ROIInfo[aktindex]["x"] = rect.startX;
ROIInfo[aktindex]["y"] = rect.startY;
ROIInfo[aktindex]["dx"] = rect.w;
ROIInfo[aktindex]["dy"] = rect.h;
} }
function getCoords(elem) { // crossbrowser version function getCoords(elem) { // crossbrowser version
@@ -373,8 +317,15 @@ function dataURLtoBlob(dataurl) {
function mouseMove(e) { function mouseMove(e) {
if (drag) { if (drag) {
zw = getCoords(this) zw = getCoords(this)
if (lockAR) {
rect.h = (e.pageY - zw.top) - rect.startY;
rect.w = Math.round(rect.h * ROIInfo[aktindex]["ar"]); }
else {
rect.w = (e.pageX - zw.left) - rect.startX; rect.w = (e.pageX - zw.left) - rect.startX;
rect.h = (e.pageY - zw.top) - rect.startY ; rect.h = (e.pageY - zw.top) - rect.startY;
}
document.getElementById("refdx").value = rect.w; document.getElementById("refdx").value = rect.w;
document.getElementById("refdy").value = rect.h; document.getElementById("refdy").value = rect.h;
draw(); draw();
@@ -403,6 +354,26 @@ function dataURLtoBlob(dataurl) {
if (!drag) { if (!drag) {
rect.w = document.getElementById("refdx").value; rect.w = document.getElementById("refdx").value;
rect.h = document.getElementById("refdy").value; rect.h = document.getElementById("refdy").value;
if (lockAR) {
rect.w = Math.round(rect.h * ROIInfo[aktindex]["ar"]);
document.getElementById("refdx").value = rect.w;
}
rect.startX = document.getElementById("refx").value;
rect.startY = document.getElementById("refy").value;
draw();
}
}
function valuemanualchangeddx(){
if (!drag) {
rect.w = document.getElementById("refdx").value;
rect.h = document.getElementById("refdy").value;
if (lockAR) {
rect.h = Math.round(rect.w / ROIInfo[aktindex]["ar"]);
document.getElementById("refdy").value = rect.h;
}
rect.startX = document.getElementById("refx").value; rect.startX = document.getElementById("refx").value;
rect.startY = document.getElementById("refy").value; rect.startY = document.getElementById("refy").value;
draw(); draw();

View File

@@ -0,0 +1,112 @@
<html>
<body>
<table>
<tr><td>Result:</td></tr>
<tr>
<td>
<iframe name="maincontent" id ="maincontent" width="800px" height="800px"></iframe>
</td>
<td>
<p>
<input type="submit" id="take" onclick="doTake()" value="1. Take Picture">
</p>
<p>
<input type="submit" id="align" onclick="doAlign()" value="2. Align Image"><br>
Takes up to 2 Minutes!
</p>
Digits and Analog recognition not yet implemented.
<p>
<input type="submit" id="digits" onclick="doDigits()" value="3a. Analyse Digits">
</p>
<p>
<input type="submit" id="analog" onclick="doAnalog()" value="3b Analyse Analog">
</p>
</td>
</tr>
</table>
<script type="text/javascript" src="./gethost.js"></script>
<script type="text/javascript" src="./readconfig.js"></script>
<script type="text/javascript">
var basepath = "http://192.168.178.26";
function doAnalog(){
var xhttp = new XMLHttpRequest();
url = basepath + "/editflow.html?task=test_analog";
if (basepath.length > 0){
url = url + "&host=" + basepath;
}
xhttp.open("GET", url, false);
xhttp.send();
var html = xhttp.responseText;
html = html.replace("src=\"/", "src=\"" + basepath + "/");
document.getElementById("maincontent").src = 'data:text/html,' + encodeURIComponent(html);
}
function doDigits(){
var xhttp = new XMLHttpRequest();
url = basepath + "/editflow.html?task=test_digits";
if (basepath.length > 0){
url = url + "&host=" + basepath;
}
xhttp.open("GET", url, false);
xhttp.send();
var html = xhttp.responseText;
html = html.replace("src=\"/", "src=\"" + basepath + "/");
document.getElementById("maincontent").src = 'data:text/html,' + encodeURIComponent(html);
}
function doAlign(){
var xhttp = new XMLHttpRequest();
url = basepath + "/editflow.html?task=test_align";
if (basepath.length > 0){
url = url + "&host=" + basepath;
}
xhttp.open("GET", url, false);
xhttp.send();
var html = xhttp.responseText;
html = html.replace("src=\"/", "src=\"" + basepath + "/");
document.getElementById("maincontent").src = 'data:text/html,' + encodeURIComponent(html);
document.getElementById("align").disabled = false;
// document.getElementById("digits").disabled = false;
// document.getElementById("analog").disabled = false;
}
function doTake(){
var xhttp = new XMLHttpRequest();
url = basepath + "/editflow.html?task=test_take";
if (basepath.length > 0){
url = url + "&host=" + basepath;
}
xhttp.open("GET", url, false);
xhttp.send();
var html = xhttp.responseText;
document.getElementById("maincontent").src = 'data:text/html,' + encodeURIComponent(html);
document.getElementById("align").disabled = false;
document.getElementById("digits").disabled = true;
document.getElementById("analog").disabled = true;
}
function Init(){
basepath = getbasepath();
document.getElementById("align").disabled = true;
document.getElementById("digits").disabled = true;
document.getElementById("analog").disabled = true;
}
Init();
</script>
</body>
</html>

View File

@@ -13,68 +13,30 @@
</tr> </tr>
</table> </table>
<script type="text/javascript" src="./gethost.js"></script>
<script type="text/javascript" src="./readconfig.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var canvas = document.getElementById('canvas'),
basepath = "http://192.168.178.26";
function loadConfig() {
var xhr = new XMLHttpRequest(); function LoadConfigNeu() {
xhr.onload = function () { basepath = getbasepath();
// alert(this.responseText); loadConfig(basepath);
document.getElementById("inputTextToSave").value = this.responseText; document.getElementById("inputTextToSave").value = getConfig();
};
url = '/fileserver/config/config.ini';
xhr.open('GET', url);
xhr.send();
} }
function saveTextAsFile() function saveTextAsFile()
{ {
if (confirm("Are you sure you want to update \"config.ini\"?")) { if (confirm("Are you sure you want to update \"config.ini\"?")) {
var xhttp = new XMLHttpRequest(); FileDeleteOnServer("/config/config.ini", basepath);
/* first delete the old firmware */
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
/* keine Reaktion, damit sich das Dokument nicht ändert */
} else if (xhttp.status == 0) {
alert("Server closed the connection abruptly!");
location.reload()
} else {
alert(xhttp.status + " Error!\n" + xhttp.responseText);
location.reload()
}
}
};
xhttp.open("POST", "/delete/config/config.ini", false);
xhttp.send();
/* ----------------------------- */
var textToSave = document.getElementById("inputTextToSave").value; var textToSave = document.getElementById("inputTextToSave").value;
FileSendContent(textToSave, "/config/config.ini", basepath);
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
alert("Update \"config.ini\" successfull!\n\nTo make it active you need to reboot.")
document.reload();
} else if (xhttp.status == 0) {
alert("Server closed the connection abruptly!");
location.reload()
} else {
alert(xhttp.status + " Error!\n" + xhttp.responseText);
location.reload()
}
}
};
upload_path = "/upload/config/config.ini";
xhttp.open("POST", upload_path, true);
xhttp.send(textToSave);
} }
} }
loadConfig(); LoadConfigNeu();
</script> </script>

View File

@@ -13,16 +13,20 @@
</tr> </tr>
</table> </table>
<script type="text/javascript" src="./readconfig.js"></script>
<script type="text/javascript"> <script type="text/javascript">
function loadConfig() {
function LoadConfigNeu() { var xhr = new XMLHttpRequest();
loadConfigJS(); xhr.onload = function () {
document.getElementById("inputTextToSave").value = getConfig(); // alert(this.responseText);
document.getElementById("inputTextToSave").value = this.responseText;
};
url = '/fileserver/config/config.ini';
xhr.open('GET', url);
xhr.send();
} }
function saveTextAsFile() function saveTextAsFile()
{ {
if (confirm("Are you sure you want to update \"config.ini\"?")) { if (confirm("Are you sure you want to update \"config.ini\"?")) {
@@ -70,7 +74,7 @@ function saveTextAsFile()
} }
} }
LoadConfigNeu(); loadConfig();
</script> </script>

View File

@@ -0,0 +1,389 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Make Alignment</title>
</head>
<div class="body-content">
<div id="createrefernce">
<div style="padding-left: 30px">
<h3>Edit Digits</h3>
<div style="padding-left: 30px">
<table>
<tr>
<td>
<canvas id="canvas" crossorigin></canvas>
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td>
<input type="submit" name="newROI" onclick="newROI()" value="New ROI (after current)">
<input type="submit" name="deleteROI" onclick="deleteROI()" value="Delete ROI">
</td>
</tr>
<tr>
<tr>
<td>
<select id="index" name="index" onchange="ChangeSelection()">
<option value="0" selected>ROI 0</option>
<option value="1" >ROI 1</option>
</select>
name: <input type="text" name="name" id="name" onchange="onNameChange()">
<input type="submit" id="moveNext" onclick="moveNext()" value="move Next">
<input type="submit" id="movePrevious" onclick="movePrevious()" value="move Previous">
</td>
</tr>
<td>
<table>
<tr>
<td>
x: <input type="number" name="refx" id="refx" step=1 onchange="valuemanualchanged()">
</td>
<td>
dx: <input type="number" name="refdx" id="refdx" step=1 onchange="valuemanualchangeddx()">
</td>
<td>
<input type="checkbox" id="lockAR" name="lockAR" value="1" onclick="changelockAR()" checked>
<label for="lockAR"> lock aspect ratio</label><br>
</td>
</tr>
<tr>
<td>
y: <input type="number" name="refy" id="refy" step=1 onchange="valuemanualchanged()">
</td>
<td>
dy: <input type="number" name="refdy" id="refdy" step=1 onchange="valuemanualchanged()">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<input type="submit" name="saveroi" onclick="SaveToConfig()" value="Save all to Config.ini">
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</div>
<script type="text/javascript" src="./gethost.js"></script>
<script type="text/javascript" src="./readconfig.js"></script>
<script language="JavaScript">
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
imageObj = new Image(),
rect = {},
drag = false,
aktindex = 0,
ROIInfo,
enhanceCon = false;
lockAR = true;
basepath = "http://192.168.178.26";
function onNameChange(){
ROIInfo[aktindex]["name"] = document.getElementById("name").value;
UpdateROIs();
}
function deleteROI(){
ROIInfo.splice(aktindex, 1);
if (aktindex > ROIInfo.length - 1){
aktindex = ROIInfo.length - 1;
}
UpdateROIs();
}
function newROI(){
var zw = ROIInfo[ROIInfo.length-1];
ROIInfo.push(zw);
for (var i = ROIInfo.length-2; i > aktindex + 1; --i){
ROIInfo[i] = ROIInfo[i-1];
}
aktindex++;
ROIInfo[aktindex] = new Object;
ROIInfo[aktindex]["pos_ref"] = -1;
ROIInfo[aktindex]["name"] = "ROI" + aktindex;
ROIInfo[aktindex]["x"] = 1;
ROIInfo[aktindex]["y"] = 1;
ROIInfo[aktindex]["dx"] = ROIInfo[aktindex-1]["dx"];
ROIInfo[aktindex]["dy"] = ROIInfo[aktindex-1]["dy"];
ROIInfo[aktindex]["ar"] = ROIInfo[aktindex-1]["ar"];
UpdateROIs();
}
function movePrevious(){
var zw = ROIInfo[aktindex];
ROIInfo[aktindex] = ROIInfo[aktindex-1];
ROIInfo[aktindex-1] = zw;
aktindex--;
UpdateROIs();
}
function moveNext(){
var zw = ROIInfo[aktindex];
ROIInfo[aktindex] = ROIInfo[aktindex+1];
ROIInfo[aktindex+1] = zw;
aktindex++;
UpdateROIs();
}
function changelockAR(){
lockAR = document.getElementById("lockAR").checked;
}
function ChangeSelection(){
aktindex = parseInt(document.getElementById("index").value);
// lockAR = true;
UpdateROIs();
}
function SaveToConfig(){
SaveROIToConfig(ROIInfo, "[Digits]", basepath);
location.reload();
}
function UpdateROIs(){
if (ROIInfo.length == 0){
alert("There are no ROIs defined.\nPlease first define minimum one ROI in the config.ini by hand.\n");
return;
}
var _index = document.getElementById("index");
while (_index.length){
_index.remove(0);
}
for (var i = 0; i < ROIInfo.length; ++i){
var option = document.createElement("option");
option.text = "ROI " + (i + 1);
option.value = i;
_index.add(option);
}
_index.selectedIndex = aktindex;
document.getElementById("movePrevious").disabled = false;
if (aktindex == 0){
document.getElementById("movePrevious").disabled = true;
}
document.getElementById("moveNext").disabled = false;
if (aktindex == (ROIInfo.length-1)){
document.getElementById("moveNext").disabled = true;
}
document.getElementById("lockAR").checked = lockAR;
document.getElementById("name").value = ROIInfo[aktindex]["name"];
document.getElementById("refx").value = ROIInfo[aktindex]["x"];
document.getElementById("refy").value = ROIInfo[aktindex]["y"];
document.getElementById("refdx").value = ROIInfo[aktindex]["dx"];
document.getElementById("refdy").value = ROIInfo[aktindex]["dy"];
rect.startX = ROIInfo[aktindex]["x"];
rect.startY = ROIInfo[aktindex]["y"];
rect.w = ROIInfo[aktindex]["dx"];
rect.h = ROIInfo[aktindex]["dy"];
draw();
}
function ParseIni(_basepath) {
loadConfig(_basepath);
ParseConfig();
ROIInfo = getROIInfo("[Digits]");
UpdateROIs();
}
function loadCanvas(dataURL) {
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
imageObj.onload = function() {
canvas.width = this.width;
canvas.height = this.height;
drawImage();
};
imageObj.src = dataURL;
}
function getCoords(elem) { // crossbrowser version
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
function init() {
basepath = getbasepath();
canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false);
loadCanvas(basepath + "/fileserver/config/reference.jpg");
ParseIni(basepath);
drawImage();
}
function drawImage(){
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.clearRect(0,0,imageObj.width,imageObj.height);
context.save();
context.drawImage(imageObj, 0, 0);
// context.restore();
}
function draw() {
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.drawImage(imageObj, 0, 0);
lw = 4
context.lineWidth = lw;
context.strokeStyle = "#FF0000";
var x0 = parseInt(rect.startX) - parseInt(lw/2);
var y0 = parseInt(rect.startY) - parseInt(lw/2);
var dx = parseInt(rect.w) + parseInt(lw);
var dy = parseInt(rect.h) + parseInt(lw);
context.strokeRect(x0, y0, dx, dy);
ROIInfo[aktindex]["x"] = rect.startX;
ROIInfo[aktindex]["y"] = rect.startY;
ROIInfo[aktindex]["dx"] = rect.w;
ROIInfo[aktindex]["dy"] = rect.h;
}
function getCoords(elem) { // crossbrowser version
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
function mouseDown(e) {
zw = getCoords(this)
rect.startX = e.pageX - zw.left;
rect.startY = e.pageY - zw.top;
document.getElementById("refx").value = rect.startX;
document.getElementById("refy").value = rect.startY;
drag = true;
}
function mouseUp() {
drag = false;
if (rect.w < 0) {
rect.w = -rect.w
rect.startX-=rect.w
}
if (rect.h < 0) {
rect.h = -rect.h
rect.startY-=rect.h
}
document.getElementById("refdx").value = rect.w;
document.getElementById("refdy").value = rect.h;
document.getElementById("refx").value = rect.startX;
document.getElementById("refy").value = rect.startY;
}
function mouseMove(e) {
if (drag) {
zw = getCoords(this)
if (lockAR) {
rect.h = (e.pageY - zw.top) - rect.startY;
rect.w = Math.round(rect.h * ROIInfo[aktindex]["ar"]); }
else {
rect.w = (e.pageX - zw.left) - rect.startX;
rect.h = (e.pageY - zw.top) - rect.startY;
}
document.getElementById("refdx").value = rect.w;
document.getElementById("refdy").value = rect.h;
draw();
}
else {
draw();
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
zw = getCoords(this);
x = e.pageX - zw.left;
y = e.pageY - zw.top;
context.lineWidth = 2;
context.strokeStyle = "#00FF00";
context.beginPath();
context.moveTo(0,y);
context.lineTo(canvas.width, y);
context.moveTo(x, 0);
context.lineTo(x, canvas.height);
context.stroke();
}
}
function valuemanualchanged(){
if (!drag) {
rect.w = document.getElementById("refdx").value;
rect.h = document.getElementById("refdy").value;
if (lockAR) {
rect.w = Math.round(rect.h * ROIInfo[aktindex]["ar"]);
document.getElementById("refdx").value = rect.w;
}
rect.startX = document.getElementById("refx").value;
rect.startY = document.getElementById("refy").value;
draw();
}
}
function valuemanualchangeddx(){
if (!drag) {
rect.w = document.getElementById("refdx").value;
rect.h = document.getElementById("refdy").value;
if (lockAR) {
rect.h = Math.round(rect.w / ROIInfo[aktindex]["ar"]);
document.getElementById("refdy").value = rect.h;
}
rect.startX = document.getElementById("refx").value;
rect.startY = document.getElementById("refy").value;
draw();
}
}
init();
</script>
</div>
</body>
</html>

View File

@@ -0,0 +1,226 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Make refernce</title>
</head>
<body>
<h3>Create Reference out of Raw Image</h3>
<div style="padding-left: 30px">
<table>
<tr>
<td>
<input type="button" value="Show acutual Reference" onclick="showReference()">
</td>
<td>
<input type="button" value="Create new Reference" onclick="loadRawImage()">
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td>
Pre-rotate Angle
</td>
<td>
<input type="number" id="prerotateangle" name="prerotateangle" value=0 min="-360" max="360" onchange="drawRotated()">°
</td>
</tr>
<tr>
<td>
Fine Alignment
</td>
<td>
<input type="number" id="finerotate" name="finerotate" value=0.0 min="-1" max="1" step="0.2" onchange="drawRotated()">°
</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>
<canvas id="canvas"></canvas>
</td>
</tr>
<tr>
<td>
<input type="button" value="Update Reference Image" onclick="SaveReference()">
</td>
</tr>
</table>
</div>
<script type="text/javascript" src="./gethost.js"></script>
<script type="text/javascript" src="./readconfig.js"></script>
<script language="JavaScript">
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
imageObj = new Image()
basepath = "http://192.168.178.26";
function loadRawImage(){
url = basepath + "/fileserver/img_tmp/raw.jpg";
document.getElementById("finerotate").value = 0;
document.getElementById("prerotateangle").value = getPreRotate();
document.getElementById("finerotate").disabled = false;
document.getElementById("prerotateangle").disabled = false;
// document.getElementById("ButtonRotate").disabled = false;
drawRotated();
}
function showReference(){
url = basepath + "/fileserver/config/reference.jpg";
document.getElementById("finerotate").value = 0;
document.getElementById("prerotateangle").value = 0;
document.getElementById("finerotate").disabled = true;
document.getElementById("prerotateangle").disabled = true;
// document.getElementById("ButtonRotate").disabled = true;
loadCanvas(url);
ParseConfig();
drawRotated();
}
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
function SaveReference(){
if (confirm("Are you sure you want to update the reference image?")) {
setPreRotate(document.getElementById("prerotateangle").value);
UpdateConfigFile(basepath);
var canvas = document.getElementById("canvas");
var okay = SaveCanvasToImage(canvas, "/config/reference.jpg", true, basepath);
if (okay) {
alert("Update \"reference.jpg\" successfull!")
}
else {
alert("Error on update \"reference.jpg\"!")
}
}
}
function loadCanvas(dataURL) {
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
imageObj.onload = function() {
canvas.width = this.width;
canvas.height = this.height;
drawRotated();
};
imageObj.src = dataURL;
}
function getCoords(elem) { // crossbrowser version
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
function init() {
canvas.addEventListener('mousemove', mouseMove, false);
basepath = getbasepath();
loadConfig(basepath);
showReference();
}
function drawRotated(){
finerot= parseFloat(document.getElementById("finerotate").value);
prerot = parseFloat(document.getElementById("prerotateangle").value);
if (finerot == 1) {
prerot+=1
finerot = 0
}
if (finerot == -1) {
prerot-=1
finerot = 0
}
degrees = finerot + prerot;
document.getElementById("finerotate").value = finerot;
document.getElementById("prerotateangle").value = prerot;
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.clearRect(0,0,imageObj.width,imageObj.height);
context.save();
context.translate(imageObj.width/2,imageObj.height/2);
context.rotate(degrees*Math.PI/180);
context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
context.restore();
drawGrid();
}
function drawGrid(){
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
w = canvas.width;
h = canvas.height;
ctx.save();
ctx.strokeStyle = '#00FF00';
for (i = h/2; i < h; i += 100)
{
ctx.moveTo(0, i);
ctx.lineTo(w, i);
ctx.stroke();
ctx.moveTo(0, h-i);
ctx.lineTo(w, h-i);
ctx.stroke();
}
for (i = w/2; i < w; i += 100)
{
ctx.moveTo(i, 0);
ctx.lineTo(i, h);
ctx.stroke();
ctx.moveTo(w-i, 0);
ctx.lineTo(w-i, h);
ctx.stroke(); }
ctx.restore();
}
function mouseMove(e) {
drawRotated();
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
zw = getCoords(this);
x = e.pageX - zw.left;
y = e.pageY - zw.top;
context.lineWidth = 2;
context.strokeStyle = "#00FF00";
context.beginPath();
context.moveTo(0,y);
context.lineTo(canvas.width, y);
context.moveTo(x, 0);
context.lineTo(x, canvas.height);
context.stroke();
}
init();
</script>
</body>
</html>

View File

@@ -0,0 +1,56 @@
[MakeImage]
;LogImageLocation = /log/source
WaitBeforeTakingPicture=5
ImageQuality = 5
ImageSize = VGA
[Alignment]
InitalRotate=180
/config/ref0.jpg 86, 253
/config/ref1.jpg 446, 113
SearchFieldX = 20
SearchFieldY = 20
[Digits]
Model=/config/dig0622.tfl
LogImageLocation = /log/digit
ModelInputSize 20, 32
digit1, 306, 120, 37, 67
digit2, 355, 120, 37, 67
digit3, 404, 120, 37, 67
[Analog]
Model=/config/ana0622.tfl
LogImageLocation = /log/analog
ModelInputSize 32, 32
analog1, 444, 225, 92, 92
analog2, 391, 329, 92, 92
analog3, 294, 369, 92, 92
analog4, 168, 326, 92, 92
[PostProcessing]
PreValueUse = True
PreValueAgeStartup = 30
AllowNegativeRates = False
MaxRateValue = 0.1
ErrorMessage = True
CheckDigitIncreaseConsistency = True
[AutoTimer]
AutoStart= True
Intervall = 4.85
[Ende]

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

15
sd-card/html/gethost.js Normal file
View File

@@ -0,0 +1,15 @@
function getbasepath(){
var host = window.location.hostname;
if (host == "127.0.0.1")
{
host = "http://192.168.178.26"; // jomjol interner test
// host = "http://192.168.178.22"; // jomjol interner Real
// host = "."; // jomjol interner localhost
}
else
{
host = "http://" + host;
}
return host;
}

View File

@@ -1,249 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Make refernce</title>
<link rel="stylesheet" type="text/css" href="/static/configurator/site.css"/>
</head>
<body onScroll="document.cookie='ypos=' + window.pageYOffset">
<div class="body-content">
<div id="createrefernce">
<script language="JavaScript">
function createscroll(){
var zw = document.cookie
var n1 = zw.indexOf('ypos=')
var n2 = zw.indexOf(";", n1)
var a = zw.substr(n1+5, n2-n1-5)
//window.alert(zw + " -- "+ a + " -- " + + n1 + " -- " + n2)
window.scrollTo(0, a)
}
</script>
<div style="padding-left: 30px">
<h3>Create Reference out of Raw Image</h3>
<div style="padding-left: 30px">
<form method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="lxUFaiYFqzjTUDz63phwtZsErDkz9WjIHPsw56IM1nOYkkvljkwbA2TuKvP97GJy">
<table>
<tr>
<td>
<table>
<tr>
<td>
<h4>Pre-rotate Angle</h4>
</td>
<td>
<input type="number" id="prerotateangle" name="prerotateangle" value=179.0 min="-360" max="360">°
<input type="button" value="Rotate" onclick="drawRotated()">
</td>
</tr>
<tr>
<td>
<h4>Fine Alignment</h4>
</td>
<td>
<input type="number" id="finerotate" name="finerotate" value=0.0 min="-1" max="1" step="0.2" onchange="drawRotated()">°
</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>
<canvas id="canvas"></canvas>
</td>
<td>
<input type="hidden" name="degree" id="degree" value="0">
<input type="button" value="Save Reference Image" onclick="SaveReference()">
</td>
</tr>
</table>
</form>
</div>
</div>
<script language="JavaScript">
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
imageObj = new Image();
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
function SaveReference()
{
if (confirm("Are you sure you want to update \"reference2.jpg\"?")) {
var xhttp = new XMLHttpRequest();
/* first delete the old firmware */
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
/* keine Reaktion, damit sich das Dokument nicht ändert */
} else if (xhttp.status == 0) {
alert("Server closed the connection abruptly!");
location.reload()
} else {
alert(xhttp.status + " Error!\n" + xhttp.responseText);
location.reload()
}
}
};
xhttp.open("POST", "http://192.168.178.22/delete/config/reference2.jpg", false);
xhttp.send();
/* ----------------------------- */
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
alert("Update \"reference2.jpg\" successfull!\n\nTo make it active you need to reboot.")
document.reload();
} else if (xhttp.status == 0) {
alert("Server closed the connection abruptly!");
location.reload()
} else {
alert(xhttp.status + " Error!\n" + xhttp.responseText);
location.reload()
}
}
};
upload_path = "http://192.168.178.22/upload/config/reference2.jpg";
var canvas = document.getElementById("canvas");
var JPEG_QUALITY=0.5;
var dataUrl = canvas.toDataURL('image/jpeg', JPEG_QUALITY);
var rtn = dataURLtoBlob(dataUrl);
xhttp.open("POST", upload_path, true);
xhttp.send(rtn);
}
}
function loadCanvas(dataURL) {
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
imageObj.onload = function() {
canvas.width = this.width;
canvas.height = this.height;
drawRotated();
createscroll();
};
imageObj.src = dataURL;
}
function getCoords(elem) { // crossbrowser version
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
function init() {
// alert("load image");
loadCanvas("http://192.168.178.22/fileserver/img_tmp/raw.jpg");
drawRotated();
}
function drawRotated(){
finerot= parseFloat(document.getElementById("finerotate").value);
prerot = parseFloat(document.getElementById("prerotateangle").value);
if (finerot == 1) {
prerot+=1
finerot = 0
}
if (finerot == -1) {
prerot-=1
finerot = 0
}
degrees = finerot + prerot;
document.getElementById("finerotate").value = finerot;
document.getElementById("prerotateangle").value = prerot;
document.getElementById("degree").value = degrees;
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.clearRect(0,0,imageObj.width,imageObj.height);
context.save();
context.translate(imageObj.width/2,imageObj.height/2);
context.rotate(degrees*Math.PI/180);
context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
context.restore();
drawGrid();
}
function drawGrid(){
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
w = canvas.width;
h = canvas.height;
ctx.save();
ctx.strokeStyle = '#00FF00';
for (i = h/2; i < h; i += 100)
{
ctx.moveTo(0, i);
ctx.lineTo(w, i);
ctx.stroke();
ctx.moveTo(0, h-i);
ctx.lineTo(w, h-i);
ctx.stroke();
}
for (i = w/2; i < w; i += 100)
{
ctx.moveTo(i, 0);
ctx.lineTo(i, h);
ctx.stroke();
ctx.moveTo(w-i, 0);
ctx.lineTo(w-i, h);
ctx.stroke(); }
ctx.restore();
}
init();
</script>
<hr/>
</div>
</body onScroll="document.cookie='ypos=' + window.pageYOffset">
</html>

View File

@@ -78,32 +78,19 @@
</head> </head>
<body> <body>
<h1>AI on the edge - an integrated water meter example</h1> <h1>Watermeter - AI on the edge - an ESP32 all in neural network recognition system</h1>
<nav> <nav>
<ul> <ul>
<li aria-current="page"><a href="#"onclick="document.getElementById('maincontent').src = '/wasserzaehler_roi.html';">wasserzaehler</a> <li aria-current="page"><a href="#"onclick="document.getElementById('maincontent').src = '/wasserzaehler_roi.html';">wasserzaehler</a>
<ul class="submenu"> <ul class="submenu">
<li><a href="#"onclick="document.getElementById('maincontent').src = '/prevalue_set.html';">PreValue</a> </li> <li><a href="#"onclick="document.getElementById('maincontent').src = '/prevalue_set.html';">Set preValue</a> </li>
<li><a href="#"onclick="document.getElementById('maincontent').src = '/edit_config.html';">Edit Configuration</a> </li> <li><a href="index_configure.html">Edit Configuration</a> </li>
<li><a href="#"onclick="document.getElementById('maincontent').src = '/wasserzaehler.html?full';">wasserzaehler full</a> </li> <li><a href="#"onclick="document.getElementById('maincontent').src = '/wasserzaehler.html?full';">/wasserzaehler.html?full</a> </li>
</ul> </ul>
</li> </li>
<li><a href="#" onclick="document.getElementById('maincontent').src = '/fileserver/';">File Server</a> </li> <li><a href="#" onclick="document.getElementById('maincontent').src = '/fileserver/';">File Server</a> </li>
<li><a href="#">Manuel Mode</a>
<ul class="submenu">
<li><a href="#"onclick="document.getElementById('maincontent').src = '/doinit';">Init</a> </li>
<li><a href="#"onclick="document.getElementById('maincontent').src = '/doflow';">Recognize</a> </li>
</ul>
</li>
<li><a href="#">Image</a>
<ul class="submenu">
<li><a href="#"onclick="document.getElementById('maincontent').src = '/img_tmp/raw.jpg';">Raw</a> </li>
<li><a href="#"onclick="document.getElementById('maincontent').src = '/img_tmp/rot.jpg';">Rotated</a> </li>
<li><a href="#"onclick="document.getElementById('maincontent').src = '/img_tmp/alg.jpg';">Aligned</a> </li>
</ul>
</li>
<li><a href="#">System</a> <li><a href="#">System</a>
<ul class="submenu"> <ul class="submenu">
<li><a href="#"onclick="document.getElementById('maincontent').src = '/starttime';">Start time</a> </li> <li><a href="#"onclick="document.getElementById('maincontent').src = '/starttime';">Start time</a> </li>

View File

@@ -0,0 +1,116 @@
<html><head>
<title>jomjol - AI on the edge</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css" media="screen">
nav > ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
}
nav li {
margin: 0.5em;
padding: 0;
font-size: 1.5em;
flex: 1 1 0%;
}
@media (min-width: 45em) {
nav > ul {
flex-direction: row;
}
nav li {
flex: 1;
font-size: 1em;
}
}
nav a {
display: block;
padding: 0.4em;
text-decoration: none;
font-weight: bold;
text-align: center;
border: 1px solid darkblue;
border-radius: 10px;
box-shadow: 0 5px 10px white inset;
color: gold;
background-color: darkblue;
transition: all .25s ease-in;
}
nav li[aria-current] a {
background-color: firebrick;
color: gold;
}
nav a:focus,
nav a:hover,
nav li[aria-current] a:focus,
nav li[aria-current] a:hover {
color: darkblue;
background-color: gold;
}
html, body {
height:100%;
width:100%;
margin:0;
}
.h_iframe iframe {
width:98%;
height:150%;
}
.h_iframe {
height: 150%;
width:98%;
}
</style>
<script type="text/javascript">
//<![CDATA[
//]]>
</script>
</head>
<body>
<h1>Configure watermeter</h1>
<nav>
<ul>
<li><a href="#" onclick="document.getElementById('maincontent').src = 'edit_config.html';">CONFIG.INI direct</a> </li>
<li><a href="#">Alignment</a>
<ul class="submenu">
<li><a href="#"onclick="document.getElementById('maincontent').src = 'edit_reference.html';">Reference Image</a> </li>
<li><a href="#"onclick="document.getElementById('maincontent').src = 'edit_alignment.html';">Alignment Marks</a> </li>
</ul>
</li>
<li><a href="#">Regions of interest</a>
<ul class="submenu">
<li><a href="#"onclick="document.getElementById('maincontent').src = 'edit_digits.html';">Digital ROIs</a> </li>
<li><a href="#"onclick="document.getElementById('maincontent').src = 'edit_analog.html';">Analog ROIs</a> </li>
</ul>
</li>
<li><a href="#" onclick="document.getElementById('maincontent').src = 'edit_check.html';">Check</a> </li>
<li aria-current="page"><a href="index.html">Main</a>
</li>
</ul>
</nav>
<p>
<div class="h_iframe">
<iframe name="maincontent" id="maincontent" src="edit_config.html" title="fileserver"></iframe>
</div>
</body></html>

View File

@@ -1,6 +1,9 @@
var config_gesamt; var config_gesamt;
var config_split; var config_split;
var ref = new Array(2); var ref = new Array(2);
var digit = new Array(0);
var analog = new Array(0);
var initalrotate = new Object();
function MakeRefZW(zw, _basepath){ function MakeRefZW(zw, _basepath){
url = _basepath + "/editflow.html?task=cutref&in=/config/reference.jpg&out=/img_tmp/ref_zw_org.jpg&x=" + zw["x"] + "&y=" + zw["y"] + "&dx=" + zw["dx"] + "&dy=" + zw["dy"]; url = _basepath + "/editflow.html?task=cutref&in=/config/reference.jpg&out=/img_tmp/ref_zw_org.jpg&x=" + zw["x"] + "&y=" + zw["y"] + "&dx=" + zw["dx"] + "&dy=" + zw["dy"];
@@ -25,41 +28,172 @@ function GetCoordinates(index, _basepath){
return ref[index]; return ref[index];
} }
function ParseReference() { function ParseConfigAlignment(_aktline){
config_split = config_gesamt.split("\n");
var i = 0;
for (var i in config_split) {
if (config_split[i].trim() == "[Alignment]")
break;
}
if (i >= config_split.length){
return;
}
var akt_ref = 0; var akt_ref = 0;
++i; ++_aktline;
while ((akt_ref < 2) && (i < config_split.length) && (config_split[i][0] != "[")) { while ((akt_ref < 2) && (_aktline < config_split.length) && (config_split[_aktline][0] != "[")) {
var linesplit = ZerlegeZeile(config_split[i]); var linesplit = ZerlegeZeile(config_split[_aktline]);
if ((linesplit[0] == "InitalRotate") && (linesplit.length > 1))
{
initalrotate["angle"] = parseInt(linesplit[1]);
initalrotate["pos_config"] = _aktline;
}
if (linesplit.length == 3) if (linesplit.length == 3)
{ {
ref[akt_ref] = new Object(); ref[akt_ref] = new Object();
ref[akt_ref]["pos_ref"] = i; ref[akt_ref]["pos_ref"] = _aktline;
ref[akt_ref]["name"] = linesplit[0]; ref[akt_ref]["name"] = linesplit[0];
ref[akt_ref]["x"] = linesplit[1]; ref[akt_ref]["x"] = linesplit[1];
ref[akt_ref]["y"] = linesplit[2]; ref[akt_ref]["y"] = linesplit[2];
akt_ref++; akt_ref++;
} }
++i; ++_aktline;
}
return _aktline;
}
function ParseConfigDigit(_aktline){
++_aktline;
digit.length = 0;
while ((_aktline < config_split.length) && (config_split[_aktline][0] != "[")) {
var linesplit = ZerlegeZeile(config_split[_aktline]);
if (linesplit.length >= 5)
{
zw = new Object();
zw["pos_ref"] = _aktline;
zw["name"] = linesplit[0];
zw["x"] = linesplit[1];
zw["y"] = linesplit[2];
zw["dx"] = linesplit[3];
zw["dy"] = linesplit[4];
zw["ar"] = parseFloat(linesplit[3]) / parseFloat(linesplit[4]);
digit.push(zw);
}
++_aktline;
}
return _aktline;
}
function ParseConfigAnalog(_aktline){
++_aktline;
analog.length = 0;
while ((_aktline < config_split.length) && (config_split[_aktline][0] != "[")) {
var linesplit = ZerlegeZeile(config_split[_aktline]);
if (linesplit.length >= 5)
{
zw = new Object();
zw["pos_ref"] = _aktline;
zw["name"] = linesplit[0];
zw["x"] = linesplit[1];
zw["y"] = linesplit[2];
zw["dx"] = linesplit[3];
zw["dy"] = linesplit[4];
zw["ar"] = parseFloat(linesplit[3]) / parseFloat(linesplit[4]);
analog.push(zw);
}
++_aktline;
}
return _aktline;
}
function getROIInfo(_typeROI){
if (_typeROI == "[Digits]"){
targetROI = digit;
}
if (_typeROI == "[Analog]"){
targetROI = analog;
}
return targetROI.slice(); // Kopie senden, nicht orginal!!!
}
function SaveROIToConfig(_ROIInfo, _typeROI, _basepath){
if (_typeROI == "[Digits]"){
targetROI = digit;
}
if (_typeROI == "[Analog]"){
targetROI = analog;
}
// Abstimmen Anzahl ROIs:
var _pos = targetROI[targetROI.length-1]["pos_ref"];
for (var i = targetROI.length; i < _ROIInfo.length; ++i){
var zw = config_split[config_split.length-1];
config_split.push(zw);
for (var j = config_split.length-2; j > _pos + 1; --j){
config_split[j] = config_split[j-1];
}
}
for (i = targetROI.length-1; i > _ROIInfo.length-1; --i){
var _zwpos = targetROI[i]["pos_ref"];
config_split.splice(_zwpos, 1);
}
var linewrite = 0;
for (i = 0; i < _ROIInfo.length; ++i){
if (i < digit.length){
linewrite = digit[i]["pos_ref"];
}
else {
linewrite++;
}
config_split[linewrite] = _ROIInfo[i]["name"] + ", " + _ROIInfo[i]["x"] + ", " + _ROIInfo[i]["y"] + ", " + _ROIInfo[i]["dx"] + ", " + _ROIInfo[i]["dy"];
}
SaveConfigToServer(_basepath);
}
function ParseConfig() {
config_split = config_gesamt.split("\n");
var aktline = 0;
while (aktline < config_split.length){
if (config_split[aktline].trim() == "[Alignment]") {
aktline = ParseConfigAlignment(aktline);
continue;
}
if (config_split[aktline].trim() == "[Digits]") {
aktline = ParseConfigDigit(aktline);
continue;
}
if (config_split[aktline].trim() == "[Analog]") {
aktline = ParseConfigAnalog(aktline);
continue;
}
aktline++;
} }
} }
function UpdateConfig(zw, _index, _enhance, _basepath){ function getPreRotate(){
var zeile = zw["name"] + " " + zw["x"] + ", " + zw["y"]; return initalrotate["angle"];
var _pos = ref[_index]["pos_ref"]; }
config_split[_pos] = zeile;
function setPreRotate(_prerotate){
initalrotate["angle"] = _prerotate;
}
function SaveCanvasToImage(_canvas, _filename, _delete = true, _basepath = ""){
var JPEG_QUALITY=0.8;
var dataUrl = _canvas.toDataURL('image/jpeg', JPEG_QUALITY);
var rtn = dataURLtoBlob(dataUrl);
if (_delete) {
FileDeleteOnServer(_filename, _basepath);
}
FileSendContent(rtn, _filename, _basepath);
}
function SaveConfigToServer(_basepath){
FileDeleteOnServer("/config/config.ini", _basepath); FileDeleteOnServer("/config/config.ini", _basepath);
var config_gesamt = ""; var config_gesamt = "";
@@ -68,9 +202,29 @@ function UpdateConfig(zw, _index, _enhance, _basepath){
config_gesamt = config_gesamt + config_split[i] + "\n"; config_gesamt = config_gesamt + config_split[i] + "\n";
} }
var rtn = new Blob([config_gesamt], {type: 'mime'});
FileSendContent(config_gesamt, "/config/config.ini", _basepath); FileSendContent(config_gesamt, "/config/config.ini", _basepath);
}
function UpdateConfigFile(_basepath){
for (var _index = 0; _index < ref.length; ++_index){
var zeile = ref[_index]["name"] + " " + ref[_index]["x"] + ", " + ref[_index]["y"];
var _pos = ref[_index]["pos_ref"];
config_split[_pos] = zeile;
}
zeile = "InitalRotate=" + initalrotate["angle"];
var _pos = initalrotate["pos_config"];
config_split[_pos] = zeile;
SaveConfigToServer(_basepath);
}
function UpdateConfig(zw, _index, _enhance, _basepath){
var zeile = zw["name"] + " " + zw["x"] + ", " + zw["y"];
var _pos = ref[_index]["pos_ref"];
config_split[_pos] = zeile;
SaveConfigToServer(_basepath);
var namezw = zw["name"]; var namezw = zw["name"];
FileCopyOnServer("/img_tmp/ref_zw.jpg", namezw, _basepath); FileCopyOnServer("/img_tmp/ref_zw.jpg", namezw, _basepath);
@@ -191,7 +345,7 @@ function trim(istring, adddelimiter)
function loadConfigJS(_basepath) { function loadConfig(_basepath) {
var xhttp = new XMLHttpRequest(); var xhttp = new XMLHttpRequest();
try { try {
url = _basepath + '/fileserver/config/config.ini'; url = _basepath + '/fileserver/config/config.ini';
@@ -206,7 +360,7 @@ function loadConfigJS(_basepath) {
} }
function getConfig() { function getConfig() {
return config_txt; return config_gesamt;
} }
@@ -242,10 +396,10 @@ function FileDeleteOnServer(_filename, _basepath = ""){
okay = true; okay = true;
} else if (xhttp.status == 0) { } else if (xhttp.status == 0) {
// alert("Server closed the connection on delete abruptly!"); // alert("Server closed the connection on delete abruptly!");
location.reload() // location.reload()
} else { } else {
// alert(xhttp.status + " Error!\n" + xhttp.responseText); // alert(xhttp.status + " Error!\n" + xhttp.responseText);
location.reload() // location.reload()
} }
} }
}; };