mirror of
https://github.com/jomjol/AI-on-the-edge-device.git
synced 2025-12-07 12:06:58 +03:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a3038eceb | ||
|
|
7d2f86b72e | ||
|
|
3aaa319505 | ||
|
|
f4075f0a51 | ||
|
|
59643a8d52 | ||
|
|
d71e8320c7 | ||
|
|
3b3d924f40 | ||
|
|
60701bc007 | ||
|
|
5ca3e184e0 | ||
|
|
2903d1a0a6 | ||
|
|
5f0f1802a4 | ||
|
|
5be56d9b00 | ||
|
|
d3fd1b5045 | ||
|
|
4615e87483 | ||
|
|
fb9b72deea | ||
|
|
5cc873a6bb | ||
|
|
26745496a5 |
126
Changelog.md
126
Changelog.md
@@ -1,6 +1,130 @@
|
||||
# Versions
|
||||
|
||||
##### 5.0.0 Setup Modus - (2020-12-06)
|
||||
|
||||
* Implementation of initial setup modus for fresh installation
|
||||
|
||||
* Code restructuring (full compatibility between pure ESP-IDF and Platformio w/ espressif)
|
||||
|
||||
|
||||
|
||||
##### 4.1.1 Configuration editor - (2020-12-02)
|
||||
|
||||
* Bug fixing: internal improvement of file handling (reduce not responding)
|
||||
|
||||
|
||||
##### 4.1.0 Configuration editor - (2020-11-30)
|
||||
|
||||
* Implementation of configuration editor (including basic and expert mode)
|
||||
|
||||
* Adjustable time zone to adjust to local time setting (incl. daylight saving time)
|
||||
|
||||
* MQTT: additional topic for error reporting
|
||||
|
||||
* standardized access to current logfile via `http://IP-ADRESS/logfileact`
|
||||
|
||||
* Update digital CNN to v7.2.0, analog CNN to 6.3.0
|
||||
|
||||
* Bug fixing: truncation error, CheckDigitConsistency & PreValue implementation
|
||||
|
||||
|
||||
|
||||
##### 4.0.0 Tflite Core - (2020-11-15)
|
||||
|
||||
* Implementation of rolling log-files
|
||||
|
||||
* Update Tflite-Core to master@20201108 (v2.4)
|
||||
|
||||
* Bug-fixing for reducing reboots
|
||||
|
||||
|
||||
|
||||
##### 3.1.0 MQTT-Client - (2020-10-26)
|
||||
|
||||
* Update digital CNN to v6.5.0 and HTML (Info to hostname, IP, ssid)
|
||||
|
||||
* New implementation of "checkDigitConsistency" also for digits
|
||||
* MQTT-Adapter: user and password for sign in MQTT-Broker
|
||||
|
||||
##### 3.0.0 MQTT-Client (2020-10-14)
|
||||
|
||||
* Implementation of MQTT Client
|
||||
* Improved Version Control
|
||||
* bug-fixing
|
||||
|
||||
|
||||
|
||||
##### 2.2.1 Version Control (2020-09-27)
|
||||
|
||||
* Bug-Fixing (hostname in wlan.ini and error handling inside flow)
|
||||
|
||||
|
||||
##### 2.2.0 Version Control (2020-09-27)
|
||||
|
||||
* Integrated automated versioning system (menu: SYSTEM --> INFO)
|
||||
* Update Build-System to PlatformIO - Espressif 32 v2.0.0 (ESP-IDF 4.1)
|
||||
|
||||
|
||||
##### 2.1.0 Decimal Shift, Chrome & Edge (2020-09-25)
|
||||
|
||||
* Implementation of Decimal Shift
|
||||
|
||||
* Update default CNN for digits to v6.4.0
|
||||
|
||||
* Improvement HTML
|
||||
|
||||
* Support for Chrome and Edge
|
||||
|
||||
* Reduce logging to minimum - extended logging on demand
|
||||
|
||||
* Implementation of hostname in wlan.ini (`hostname = "HOSTNAME")`
|
||||
|
||||
* Bug fixing, code corrections
|
||||
|
||||
|
||||
##### 2.0.0 Layout update (2020-09-12)
|
||||
|
||||
* Update to **new and modern layout**
|
||||
* Support for Chrome improved
|
||||
* Improved robustness: improved error handling in auto flow reduces spontaneous reboots
|
||||
* File server: Option for "DELETE ALL"
|
||||
* WLan: support of spaces in SSID and password
|
||||
* Reference Image: Option for mirror image, option for image update on the fly
|
||||
* additional parameter in `wasserzaehler.html?noerror=true` to suppress an potential error message
|
||||
* bug fixing
|
||||
|
||||
|
||||
|
||||
##### 1.1.3 (2020-09-09)
|
||||
|
||||
* **Bug in configuration of analog ROIs corrected** - correction in v.1.0.2 did not work properly
|
||||
* Improved update page for the web server (`/html` can be updated via a zip-file, which is provided in `/firmware/html.zip`)
|
||||
* Improved Chrome support
|
||||
|
||||
##### 1.1.0 (2020-09-06)
|
||||
|
||||
* Implementation of "delete complete directory"
|
||||
**Attention: beside the `firmware.bin`, also the content of `/html` needs to be updated!**
|
||||
|
||||
|
||||
|
||||
##### 1.0.2 (2020-09-06)
|
||||
|
||||
* Bug in configuration of analog ROIs corrected
|
||||
* minor bug correction
|
||||
|
||||
##### 1.0.1 (2020-09-05)
|
||||
|
||||
* preValue.ini Bug corrected
|
||||
* minor bug correction
|
||||
|
||||
##### 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)
|
||||
|
||||
* Initial Version
|
||||
|
||||
|
||||
61
FeatureRequest.md
Normal file
61
FeatureRequest.md
Normal file
@@ -0,0 +1,61 @@
|
||||
## Feature Requests
|
||||
|
||||
**There are a lot of ideas for further improvements, but only limited capacity on side of the developer. **Therefore I have created this page as a collection of ideas.
|
||||
|
||||
1. Who ever has a new idea can put it here, so it that it is not forgotten.
|
||||
|
||||
2. Who ever has time, capacity and passion to support, can take any of the ideas and implement them.
|
||||
I will support and help where ever I can!
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
#### #3 Allow grouping of digits to multiple reading values
|
||||
|
||||
* https://github.com/jomjol/AI-on-the-edge-device/issues/123
|
||||
|
||||
Implementation of two different independent readouts in one setup
|
||||
|
||||
To do:
|
||||
|
||||
* Extend the configuration, setting and processing flow for two independend readouts
|
||||
|
||||
|
||||
####
|
||||
|
||||
https://github.com/jomjol/AI-on-the-edge-device/issues/123
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
#### #2 MQTT-controll with callback
|
||||
* https://github.com/jomjol/AI-on-the-edge-device/issues/105
|
||||
|
||||
Extend the MQTT client to also enable callbacks for configuration setting
|
||||
|
||||
To do:
|
||||
|
||||
* implement callback for receiving information and override `config.ini` settings
|
||||
|
||||
* change configuration management to handle online updates (currently changes need a restart)
|
||||
|
||||
* think about the startup, as there the default config is loaded
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
#### #1 Optional GPIO for external flash/lighting
|
||||
|
||||
* https://github.com/jomjol/AI-on-the-edge-device/issues/133
|
||||
|
||||
Implementation of an an extrnal flash / lightning through GPIOs.
|
||||
* available GPIOs: 12 & 13 (currently in use for html switching)
|
||||
|
||||
To do:
|
||||
|
||||
* 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
|
||||
155
README.md
155
README.md
@@ -41,8 +41,21 @@ If you would like to support the developer with a cup of coffee you can do that
|
||||
|
||||
|
||||
|
||||
##### 6.2.0 Image Processing in Memory - (2021-03-08)
|
||||
##### 6.4.0 Image Processing in Memory - (2021-03-20)
|
||||
|
||||
* Additional alignment marks for settings the ROIs (analog and digit)
|
||||
* Upgrade analog CNN to v7.0.0 (added new type of pointer)
|
||||
|
||||
##### 6.3.1 Image Processing in Memory - (2021-03-16)
|
||||
|
||||
* NEW: 6.3.1: bug fixing in initial edit reference image and `config.ini` (Spelling error in `InitialRotate`)
|
||||
* Initial setup mode: bug fixing, error correction
|
||||
* Bug-fixing
|
||||
|
||||
##### 6.2.2 Image Processing in Memory - (2021-03-10)
|
||||
|
||||
* NEW 6.2.2: bug fixing
|
||||
* NEW 6.2.1: Changed brightness and contrast to default if not enabled (resolves to bright images)
|
||||
* Determination of fixed illumination settings during startup - speed up of 5s in each run
|
||||
* Update digital CNN to v8.1.1 (additional digital images trained)
|
||||
* Extended error message in MQTT error message
|
||||
@@ -68,151 +81,43 @@ If you would like to support the developer with a cup of coffee you can do that
|
||||
* **Major change**: image processing fully in memory - no need of SD card buffer anymore
|
||||
|
||||
* Need to limit camera resolution to VGA (due to memory limits)
|
||||
|
||||
* MQTT: Last Will Testament (LWT) implemented: "connection lost" in case of connection lost to `TopicError`
|
||||
|
||||
* Disabled `CheckDigitIncreaseConsistency` in default configuration - must now be explicit enabled if needed
|
||||
|
||||
* Update digital CNN to v7.2.1 (additional digital images trained)
|
||||
|
||||
* Setting of arbitrary time server in `config.ini`
|
||||
|
||||
* Option for fixed IP-, DNS-Settings in `wlan.ini`
|
||||
|
||||
* Increased stability (internal image and camera handling)
|
||||
|
||||
* Bug fixing: edit digits, handling PreValue, html-bugs
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Additional ideas
|
||||
|
||||
There are some ideas and feature request, which are not followed currently - mainly due to capacity reasons on side of the developer. They are collected here: [FeatureRequest.md](FeatureRequest.md)
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
## History
|
||||
|
||||
##### 5.0.0 Setup Modus - (2020-12-06)
|
||||
|
||||
* Implementation of initial setup modus for fresh installation
|
||||
|
||||
* Code restructuring (full compatibility between pure ESP-IDF and Platformio w/ espressif)
|
||||
|
||||
|
||||
|
||||
##### 4.1.1 Configuration editor - (2020-12-02)
|
||||
|
||||
* Bug fixing: internal improvement of file handling (reduce not responding)
|
||||
|
||||
|
||||
##### 4.1.0 Configuration editor - (2020-11-30)
|
||||
|
||||
* Implementation of configuration editor (including basic and expert mode)
|
||||
|
||||
* Adjustable time zone to adjust to local time setting (incl. daylight saving time)
|
||||
|
||||
* MQTT: additional topic for error reporting
|
||||
|
||||
* standardized access to current logfile via `http://IP-ADRESS/logfileact`
|
||||
|
||||
* Update digital CNN to v7.2.0, analog CNN to 6.3.0
|
||||
|
||||
* Bug fixing: truncation error, CheckDigitConsistency & PreValue implementation
|
||||
|
||||
|
||||
|
||||
##### 4.0.0 Tflite Core - (2020-11-15)
|
||||
* Implementation of rolling log-files
|
||||
|
||||
* Update Tflite-Core to master@20201108 (v2.4)
|
||||
|
||||
* Bug-fixing for reducing reboots
|
||||
|
||||
|
||||
|
||||
##### 3.1.0 MQTT-Client - (2020-10-26)
|
||||
|
||||
* Update digital CNN to v6.5.0 and HTML (Info to hostname, IP, ssid)
|
||||
|
||||
* New implementation of "checkDigitConsistency" also for digits
|
||||
* MQTT-Adapter: user and password for sign in MQTT-Broker
|
||||
|
||||
##### 3.0.0 MQTT-Client (2020-10-14)
|
||||
|
||||
* Implementation of MQTT Client
|
||||
* Improved Version Control
|
||||
* bug-fixing
|
||||
##### 2.2.1 Version Control - (2020-09-27)
|
||||
|
||||
|
||||
|
||||
##### 2.2.1 Version Control (2020-09-27)
|
||||
|
||||
* Bug-Fixing (hostname in wlan.ini and error handling inside flow)
|
||||
|
||||
##### 2.1.0 Decimal Shift, Chrome & Edge - (2020-09-25)
|
||||
|
||||
|
||||
##### 2.2.0 Version Control (2020-09-27)
|
||||
##### 2.0.0 Layout update - (2020-09-12)
|
||||
|
||||
* Integrated automated versioning system (menu: SYSTEM --> INFO)
|
||||
* Update Build-System to PlatformIO - Espressif 32 v2.0.0 (ESP-IDF 4.1)
|
||||
|
||||
|
||||
##### 2.1.0 Decimal Shift, Chrome & Edge (2020-09-25)
|
||||
|
||||
* Implementation of Decimal Shift
|
||||
|
||||
* Update default CNN for digits to v6.4.0
|
||||
|
||||
* Improvement HTML
|
||||
|
||||
* Support for Chrome and Edge
|
||||
|
||||
* Reduce logging to minimum - extended logging on demand
|
||||
|
||||
* Implementation of hostname in wlan.ini (`hostname = "HOSTNAME")`
|
||||
|
||||
* Bug fixing, code corrections
|
||||
|
||||
|
||||
##### 2.0.0 Layout update (2020-09-12)
|
||||
|
||||
* Update to **new and modern layout**
|
||||
* Support for Chrome improved
|
||||
* Improved robustness: improved error handling in auto flow reduces spontaneous reboots
|
||||
* File server: Option for "DELETE ALL"
|
||||
* WLan: support of spaces in SSID and password
|
||||
* Reference Image: Option for mirror image, option for image update on the fly
|
||||
* additional parameter in `wasserzaehler.html?noerror=true` to suppress an potential error message
|
||||
* bug fixing
|
||||
|
||||
|
||||
|
||||
##### 1.1.3 (2020-09-09)
|
||||
|
||||
* **Bug in configuration of analog ROIs corrected** - correction in v.1.0.2 did not work properly
|
||||
* Improved update page for the web server (`/html` can be updated via a zip-file, which is provided in `/firmware/html.zip`)
|
||||
* Improved Chrome support
|
||||
|
||||
##### 1.1.0 (2020-09-06)
|
||||
|
||||
* Implementation of "delete complete directory"
|
||||
**Attention: beside the `firmware.bin`, also the content of `/html` needs to be updated!**
|
||||
|
||||
|
||||
|
||||
##### 1.0.2 (2020-09-06)
|
||||
|
||||
* Bug in configuration of analog ROIs corrected
|
||||
* minor bug correction
|
||||
|
||||
##### 1.0.1 (2020-09-05)
|
||||
|
||||
* preValue.ini Bug corrected
|
||||
* minor bug correction
|
||||
|
||||
##### 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)
|
||||
|
||||
* Initial Version
|
||||
##### 1.1.3 Initial Version - (2020-09-09)
|
||||
|
||||
|
||||
#### [Full Changelog](Changelog.md)
|
||||
|
||||
@@ -140,24 +140,31 @@ bool CCamera::SetBrightnessContrastSaturation(int _brightness, int _contrast, in
|
||||
{
|
||||
bool result = false;
|
||||
sensor_t * s = esp_camera_sensor_get();
|
||||
_brightness = min(2, max(-2, _brightness));
|
||||
_contrast = min(2, max(-2, _contrast));
|
||||
if (_brightness > -100)
|
||||
_brightness = min(2, max(-2, _brightness));
|
||||
if (_contrast > -100)
|
||||
_contrast = min(2, max(-2, _contrast));
|
||||
// _saturation = min(2, max(-2, _saturation));
|
||||
|
||||
// s->set_saturation(s, _saturation);
|
||||
s->set_contrast(s, _contrast);
|
||||
s->set_brightness(s, _brightness);
|
||||
if (_contrast > -100)
|
||||
s->set_contrast(s, _contrast);
|
||||
if (_brightness > -100)
|
||||
s->set_brightness(s, _brightness);
|
||||
|
||||
if (_brightness != brightness)
|
||||
if ((_brightness != brightness) && (_brightness > -100))
|
||||
result = true;
|
||||
if (_contrast != contrast)
|
||||
if ((_contrast != contrast) && (_contrast > -100))
|
||||
result = true;
|
||||
if (_saturation != saturation)
|
||||
if ((_saturation != saturation) && (_saturation > -100))
|
||||
result = true;
|
||||
|
||||
brightness = _brightness;
|
||||
contrast = _contrast;
|
||||
saturation = _saturation;
|
||||
if (_brightness > -100)
|
||||
brightness = _brightness;
|
||||
if (_contrast > -100)
|
||||
contrast = _contrast;
|
||||
if (_saturation > -100)
|
||||
saturation = _saturation;
|
||||
|
||||
if (result && isFixedExposure)
|
||||
EnableAutoExposure(waitbeforepicture_org);
|
||||
|
||||
@@ -49,9 +49,9 @@ bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
|
||||
std::vector<string> zerlegt;
|
||||
|
||||
aktparamgraph = trim(aktparamgraph);
|
||||
int _brightness = 0;
|
||||
int _contrast = 0;
|
||||
int _saturation = 0;
|
||||
int _brightness = -100;
|
||||
int _contrast = -100;
|
||||
int _saturation = -100;
|
||||
|
||||
if (aktparamgraph.size() == 0)
|
||||
if (!this->GetNextParagraph(pfile, aktparamgraph))
|
||||
|
||||
@@ -368,7 +368,7 @@ bool ClassFlowPostProcessing::doFlow(string zwtime)
|
||||
|
||||
if (useMaxRateValue && (abs(Value - PreValue) > MaxRateValue))
|
||||
{
|
||||
ErrorMessageText = ErrorMessageText + "Rate too high - Returned old value - read value: " + zwvalue + " - checked value: " + std::to_string(Value) + " ";
|
||||
ErrorMessageText = ErrorMessageText + "Rate too high - Returned old value - read value: " + zwvalue + " - checked value: " + RundeOutput(Value, AnzahlAnalog - DecimalShift) + " ";
|
||||
Value = PreValue;
|
||||
zwvalue = RundeOutput(Value, AnzahlAnalog - DecimalShift);
|
||||
}
|
||||
|
||||
@@ -406,9 +406,9 @@ esp_err_t handler_editflow(httpd_req_t *req)
|
||||
std::string _bri = "";
|
||||
std::string _con = "";
|
||||
std::string _sat = "";
|
||||
int bri = 0;
|
||||
int sat = 0;
|
||||
int con = 0;
|
||||
int bri = -100;
|
||||
int sat = -100;
|
||||
int con = -100;
|
||||
|
||||
if (httpd_query_key_value(_query, "host", _valuechar, 30) == ESP_OK) {
|
||||
_host = std::string(_valuechar);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const char* GIT_REV="676bda2";
|
||||
const char* GIT_REV="3b3d924";
|
||||
const char* GIT_TAG="";
|
||||
const char* GIT_BRANCH="master";
|
||||
const char* BUILD_TIME="2021-03-08 20:30";
|
||||
const char* BUILD_TIME="2021-03-17 22:46";
|
||||
@@ -13,7 +13,7 @@ extern "C"
|
||||
#include "Helper.h"
|
||||
#include <fstream>
|
||||
|
||||
const char* GIT_BASE_BRANCH = "master - v6.2.0 - 2020-03-08";
|
||||
const char* GIT_BASE_BRANCH = "master - v6.3.1 - 2020-03-16";
|
||||
|
||||
|
||||
const char* git_base_branch(void)
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
|
||||
This directory is intended for PlatformIO Unit Testing and project tests.
|
||||
|
||||
Unit Testing is a software testing method by which individual units of
|
||||
source code, sets of one or more MCU program modules together with associated
|
||||
control data, usage procedures, and operating procedures, are tested to
|
||||
determine whether they are fit for use. Unit testing finds problems early
|
||||
in the development cycle.
|
||||
|
||||
More information about PlatformIO Unit Testing:
|
||||
- https://docs.platformio.org/page/plus/unit-testing.html
|
||||
@@ -1,4 +1,4 @@
|
||||
const char* GIT_REV="676bda2";
|
||||
const char* GIT_REV="3b3d924";
|
||||
const char* GIT_TAG="";
|
||||
const char* GIT_BRANCH="master";
|
||||
const char* BUILD_TIME="2021-03-08 20:30";
|
||||
const char* BUILD_TIME="2021-03-17 22:46";
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
sd-card/config/ana0700s1lq.tflite
Normal file
BIN
sd-card/config/ana0700s1lq.tflite
Normal file
Binary file not shown.
@@ -4,18 +4,18 @@
|
||||
WaitBeforeTakingPicture = 5
|
||||
ImageQuality = 5
|
||||
ImageSize = VGA
|
||||
Brightness = -2
|
||||
FixedExposure = true
|
||||
;Brightness = -2
|
||||
FixedExposure = false
|
||||
|
||||
[Alignment]
|
||||
InitalRotate=180
|
||||
InitialRotate=180
|
||||
/config/ref0.jpg 119 273
|
||||
/config/ref1.jpg 456 138
|
||||
SearchFieldX = 20
|
||||
SearchFieldY = 20
|
||||
InitialMirror= false
|
||||
AlignmentAlgo = Default
|
||||
|
||||
|
||||
[Digits]
|
||||
Model = /config/dig0811s1.tflite
|
||||
;LogImageLocation = /log/digit
|
||||
@@ -26,7 +26,7 @@ digit2 355 120 37 67
|
||||
digit3 404 120 37 67
|
||||
|
||||
[Analog]
|
||||
Model = /config/ana0630s2.tflite
|
||||
Model = /config/ana0700s1lq.tflite
|
||||
;LogImageLocation = /log/analog
|
||||
;LogfileRetentionInDays = 3
|
||||
ModelInputSize = 32 32
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -85,13 +85,14 @@ select {
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td colspan="2"><input class="button" type="submit" name="saveroi" onclick="SaveToConfig()" value="Save to Config.ini"></td>
|
||||
<td colspan="2"><input class="button" type="submit" name="saveroi" onclick="SaveToConfig()" value="Save all to Config.ini"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<script type="text/javascript" src="./gethost.js"></script>
|
||||
<script type="text/javascript" src="./readconfig.js"></script>
|
||||
<script type="text/javascript" src="./readconfigcommon.js"></script>
|
||||
<script type="text/javascript" src="./readconfigcommon.js"></script>
|
||||
|
||||
|
||||
<script language="JavaScript">
|
||||
var canvas = document.getElementById('canvas'),
|
||||
@@ -101,7 +102,8 @@ select {
|
||||
drag = false,
|
||||
aktindex = 0,
|
||||
refInfo,
|
||||
enhanceCon = false;
|
||||
enhanceCon = false,
|
||||
param;
|
||||
basepath = "http://192.168.178.26";
|
||||
basepath = "";
|
||||
|
||||
@@ -111,60 +113,60 @@ function ChangeSelection(){
|
||||
}
|
||||
|
||||
function SaveToConfig(){
|
||||
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;
|
||||
UpdateConfig(refInfo, aktindex, enhanceCon, basepath);
|
||||
/*
|
||||
refInfo[aktindex]["name"] = document.getElementById("name").value;
|
||||
refInfo[aktindex]["x"] = document.getElementById("refx").value;
|
||||
refInfo[aktindex]["y"] = document.getElementById("refy").value;
|
||||
refInfo[aktindex]["dx"] = document.getElementById("refdx").value;
|
||||
refInfo[aktindex]["dy"] = document.getElementById("refdy").value;
|
||||
*/
|
||||
UpdateConfigReference(refInfo, basepath);
|
||||
}
|
||||
|
||||
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;
|
||||
refInfo[aktindex]["name"] = document.getElementById("name").value;
|
||||
refInfo[aktindex]["x"] = document.getElementById("refx").value;
|
||||
refInfo[aktindex]["y"] = document.getElementById("refy").value;
|
||||
refInfo[aktindex]["dx"] = document.getElementById("refdx").value;
|
||||
refInfo[aktindex]["dy"] = document.getElementById("refdy").value;
|
||||
|
||||
enhanceCon = true;
|
||||
MakeContrastImageZW(refInfo, enhanceCon, basepath);
|
||||
var url = basepath + "/fileserver" + "/img_tmp/ref_zw.jpg?" + Date.now();
|
||||
document.getElementById("img_ref").src = url;
|
||||
var url = basepath + "/fileserver" + "/img_tmp/ref_zw_org.jpg?" + Date.now();
|
||||
document.getElementById("img_ref_org").src = url;
|
||||
MakeContrastImageZW(refInfo[aktindex], enhanceCon, basepath);
|
||||
UpdateReference();
|
||||
// var url = basepath + "/fileserver" + "/img_tmp/ref_zw.jpg?" + Date.now();
|
||||
// document.getElementById("img_ref").src = url;
|
||||
// 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;
|
||||
refInfo[aktindex]["dx"] = this.width;
|
||||
refInfo[aktindex]["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();
|
||||
document.getElementById("img_ref_org").src = url;
|
||||
var url = basepath + "/fileserver" + "/img_tmp/ref_zw.jpg?" + Date.now();
|
||||
_filenameurl = refInfo[aktindex]["name"].replace("/config/", "/img_tmp/");
|
||||
|
||||
var url = basepath + "/fileserver" + _filenameurl + "?" + Date.now();
|
||||
document.getElementById("img_ref").src = url;
|
||||
|
||||
document.getElementById("name").value = refInfo["name"];
|
||||
document.getElementById("refx").value = refInfo["x"];
|
||||
document.getElementById("refy").value = refInfo["y"];
|
||||
_filenameurl = _filenameurl.replace(".jpg", "_org.jpg");
|
||||
var url = basepath + "/fileserver" + _filenameurl + "?" + Date.now();
|
||||
document.getElementById("img_ref_org").src = url;
|
||||
|
||||
document.getElementById("name").value = refInfo[aktindex]["name"];
|
||||
document.getElementById("refx").value = refInfo[aktindex]["x"];
|
||||
document.getElementById("refy").value = refInfo[aktindex]["y"];
|
||||
rect.startX = document.getElementById("refx").value;
|
||||
rect.startY = document.getElementById("refy").value;
|
||||
document.getElementById("enhancecontrast").disabled = true;
|
||||
draw();
|
||||
}
|
||||
|
||||
function ParseIni(_basepath) {
|
||||
loadConfig(_basepath);
|
||||
ParseConfig();
|
||||
UpdateReference();
|
||||
}
|
||||
|
||||
function dataURLtoBlob(dataurl) {
|
||||
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
|
||||
@@ -205,13 +207,21 @@ function dataURLtoBlob(dataurl) {
|
||||
|
||||
|
||||
|
||||
function init() {
|
||||
function init() {
|
||||
basepath = getbasepath();
|
||||
loadConfig(basepath);
|
||||
ParseConfig();
|
||||
|
||||
canvas.addEventListener('mousedown', mouseDown, false);
|
||||
canvas.addEventListener('mouseup', mouseUp, false);
|
||||
canvas.addEventListener('mousemove', mouseMove, false);
|
||||
loadCanvas(basepath + "/fileserver/config/reference.jpg");
|
||||
ParseIni(basepath);
|
||||
|
||||
CopyReferenceToImgTmp(basepath);
|
||||
refInfo = GetReferencesInfo();
|
||||
|
||||
UpdateReference();
|
||||
|
||||
drawImage();
|
||||
}
|
||||
function drawImage(){
|
||||
@@ -226,17 +236,13 @@ 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;
|
||||
refInfo[aktindex]["x"] = document.getElementById("refx").value;
|
||||
refInfo[aktindex]["y"] = document.getElementById("refy").value;
|
||||
refInfo[aktindex]["dx"] = document.getElementById("refdx").value;
|
||||
refInfo[aktindex]["dy"] = document.getElementById("refdy").value;
|
||||
MakeRefZW(refInfo[aktindex], basepath);
|
||||
UpdateReference();
|
||||
document.getElementById("enhancecontrast").disabled = false;
|
||||
draw();
|
||||
}
|
||||
|
||||
function drawGrid(){
|
||||
|
||||
@@ -363,7 +363,15 @@ function ParseIni(_basepath) {
|
||||
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);
|
||||
context.strokeRect(x0, y0, dx, dy);
|
||||
context.lineWidth = 1;
|
||||
context.beginPath();
|
||||
context.arc(x0+dx/2, y0+dy/2, dx/2, 0, 2 * Math.PI);
|
||||
context.moveTo(x0+dx/2, y0);
|
||||
context.lineTo(x0+dx/2, y0+dy);
|
||||
context.moveTo(x0, y0+dy/2);
|
||||
context.lineTo(x0+dx, y0+dy/2);
|
||||
context.stroke();
|
||||
ROIInfo[aktindex]["x"] = rect.startX;
|
||||
ROIInfo[aktindex]["y"] = rect.startY;
|
||||
ROIInfo[aktindex]["dx"] = rect.w;
|
||||
|
||||
@@ -487,7 +487,7 @@ textarea {
|
||||
<input type="text" id="MQTT_Uri_value1">
|
||||
</td>
|
||||
<td style="font-size: 80%;">
|
||||
URI to the MQTT broker including port: http:\\IP-ADRESS:port
|
||||
URI to the MQTT broker including port e.g.: mqtt://IP-Address:Port
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -543,7 +543,7 @@ textarea {
|
||||
<input type="text" id="MQTT_user_value1">
|
||||
</td>
|
||||
<td style="font-size: 80%;">
|
||||
user for MQTT authenficiation
|
||||
user for MQTT authentication
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -557,7 +557,7 @@ textarea {
|
||||
<input type="text" id="MQTT_password_value1">
|
||||
</td>
|
||||
<td style="font-size: 80%;">
|
||||
password for MQTT authenficiation
|
||||
password for MQTT authentication
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
@@ -354,7 +354,9 @@ function draw() {
|
||||
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);
|
||||
context.strokeRect(x0, y0, dx, dy);
|
||||
context.lineWidth = 1;
|
||||
context.strokeRect(x0+dx*0.2, y0+dy*0.2, dx*0.6, dy*0.6);
|
||||
ROIInfo[aktindex]["x"] = rect.startX;
|
||||
ROIInfo[aktindex]["y"] = rect.startY;
|
||||
ROIInfo[aktindex]["dx"] = rect.w;
|
||||
|
||||
@@ -29,23 +29,21 @@ p {font-size: 1em;}
|
||||
</p>
|
||||
|
||||
<p>
|
||||
This is the first time you the digitizer. You have been automatically routed to the <b>initial setup procedure</b>.
|
||||
This procedure should adjust the setting to your local counter. Basically you can customize your settings in five steps.
|
||||
<br>
|
||||
In the final step the inital setup will be disabled and it will restart to the normal mode.
|
||||
This is the first time you started the digitizer after the initial installation. You have been automatically routed to the <b>initial setup procedure</b>.
|
||||
Here you adjust the setting to your local counter within five steps. In the final step the inital setup will be disabled and it will restart to the normal mode.
|
||||
<br>
|
||||
<br>
|
||||
Just use the buttons "Next" and "Previous" to nagivate through the process.
|
||||
You can navigate forward and backward during the setup with the buttons "Next" and "Previous". Do not forget to save in each step.
|
||||
<br>
|
||||
</p>
|
||||
<p>
|
||||
Follow the instructions:
|
||||
This is an overview over the five steps:
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<ol>
|
||||
<li>Create reference image <br>
|
||||
Basis for the position references and the marking of the digits and counters.</li>
|
||||
Base for the position referencing and the identification of the digits and counters.</li>
|
||||
<li>Define two unique references <br>
|
||||
Used to align the individual camera shot and identify the absolut positions</li>
|
||||
<li>Define the digits <br>
|
||||
@@ -53,7 +51,7 @@ p {font-size: 1em;}
|
||||
<li>Define the analog counters <br>
|
||||
Analog counters to be identified</li>
|
||||
<li>General settings <br>
|
||||
Most can stay to the default value - also MQTT connection can be specified here</li>
|
||||
Most settings can be used with default value at the beginning. MQTT connection can be specified here</li>
|
||||
</ol>
|
||||
<p>
|
||||
|
||||
|
||||
@@ -34,9 +34,9 @@ p {font-size: 1em;}
|
||||
<br>
|
||||
Once you have pushed below button, the setup modus will be left and the digitizer start to normal operation mode.
|
||||
<br>
|
||||
After a view seconds you can reload this page again and will go to normal operation mode.
|
||||
After a view seconds you can reload this page. It will take two to four minutes, until you get the first reading.
|
||||
<br>
|
||||
All settings can be changed later on as well in the configuration menue.
|
||||
All settings can be changed as well in the configuration menue in normal operation mode.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
||||
@@ -96,11 +96,18 @@ table {
|
||||
param;
|
||||
|
||||
function doTake(){
|
||||
_brightness = document.getElementById("MakeImage_Brightness_value1").value;
|
||||
var xhttp = new XMLHttpRequest();
|
||||
if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
|
||||
{
|
||||
_brightness = document.getElementById("MakeImage_Brightness_value1").value;
|
||||
// _contrast = document.getElementById("MakeImage_Contrast_value1").value;
|
||||
// _saturation = document.getElementById("MakeImage_Saturation_value1").value;
|
||||
var xhttp = new XMLHttpRequest();
|
||||
url = basepath + "/editflow.html?task=test_take&bri=" + _brightness;
|
||||
}
|
||||
else
|
||||
{
|
||||
url = basepath + "/editflow.html?task=test_take";
|
||||
}
|
||||
if (basepath.length > 0){
|
||||
url = url + "&host=" + basepath;
|
||||
}
|
||||
@@ -111,9 +118,6 @@ table {
|
||||
|
||||
function loadRawImage(){
|
||||
url = basepath + "/img_tmp/raw.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);
|
||||
// document.getElementById("finerotate").value = 0;
|
||||
// document.getElementById("prerotateangle").value = getPreRotate();
|
||||
// document.getElementById("mirror").checked = getMirror();
|
||||
document.getElementById("finerotate").disabled = false;
|
||||
document.getElementById("prerotateangle").disabled = false;
|
||||
document.getElementById("updatereferenceimage").disabled = false;
|
||||
@@ -121,10 +125,19 @@ table {
|
||||
if (param["Alignment"]["InitialMirror"].found)
|
||||
document.getElementById("mirror").disabled = false;
|
||||
else
|
||||
{
|
||||
document.getElementById("labelmirror").style = "color:lightgrey;";
|
||||
}
|
||||
|
||||
if (param["MakeImage"]["Brightness"].found)
|
||||
if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
|
||||
document.getElementById("MakeImage_Brightness_value1").disabled = false;
|
||||
else
|
||||
{
|
||||
document.getElementById("MakeImage_Brightness_value1").type = "hidden";
|
||||
document.getElementById("MakeImage_Brightness_text").style.visibility = "hidden";
|
||||
|
||||
}
|
||||
|
||||
// if (param["MakeImage"]["Saturation"].found)
|
||||
// document.getElementById("MakeImage_Saturation_value1").disabled = false;
|
||||
// if (param["MakeImage"]["Contrast"].found)
|
||||
@@ -150,6 +163,14 @@ table {
|
||||
document.getElementById("MakeImage_Brightness_value1").disabled = true;
|
||||
// document.getElementById("MakeImage_Saturation_value1").disabled = true;
|
||||
// document.getElementById("MakeImage_Contrast_value1").disabled = true;
|
||||
document.getElementById("mirror").disabled = false;
|
||||
if (!(param["MakeImage"]["Brightness"].found))
|
||||
{
|
||||
document.getElementById("MakeImage_Brightness_value1").type = "hidden";
|
||||
document.getElementById("MakeImage_Brightness_text").style.visibility = "hidden";
|
||||
}
|
||||
|
||||
|
||||
document.getElementById("mirror").disabled = true;
|
||||
|
||||
isActReference = true;
|
||||
@@ -174,17 +195,20 @@ table {
|
||||
else
|
||||
param["Alignment"]["InitialMirror"].value1 = "false";
|
||||
|
||||
ReadParameter(param, "MakeImage", "Brightness", false);
|
||||
// ReadParameter(param, "MakeImage", "Contrast", false);
|
||||
// ReadParameter(param, "MakeImage", "Saturation", false);
|
||||
|
||||
|
||||
var textToSave = setConfigParameters(param);
|
||||
FileDeleteOnServer("/config/config.ini", basepath);
|
||||
FileSendContent(textToSave, "/config/config.ini", basepath);
|
||||
if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
|
||||
{
|
||||
ReadParameter(param, "MakeImage", "Brightness", false);
|
||||
// ReadParameter(param, "MakeImage", "Contrast", false);
|
||||
// ReadParameter(param, "MakeImage", "Saturation", false);
|
||||
}
|
||||
|
||||
var canvas = document.getElementById("canvas");
|
||||
drawRotated(false);
|
||||
|
||||
var textToSave = setConfigParameters(param);
|
||||
FileDeleteOnServer("/config/config.ini", basepath);
|
||||
FileSendContent(textToSave, "/config/config.ini", basepath);
|
||||
|
||||
SaveCanvasToImage(canvas, "/config/reference.jpg", true, basepath);
|
||||
showReference();
|
||||
UpdatePage();
|
||||
|
||||
@@ -22,11 +22,11 @@ p {font-size: 1em;}
|
||||
<body style="font-family: arial">
|
||||
|
||||
<h4>Reference Image</h4>
|
||||
The reference image is needed to define the digits, counters and references for alignment.
|
||||
The reference image is the base to define the digits, counters and references positions.
|
||||
<p>
|
||||
The last taken raw image from the camera is taken. Use the Button "Create New Reference" to make your own reference.<br>
|
||||
Most important feature is a straight alignment of the image. Use the Pre roate Angle and the fine alignment to fine tune the rotation of the image<br>
|
||||
Finish the step by pushing <b>"Update Reference Image"</b>.
|
||||
Firstly you see the default image. Use the Button "Create New Reference" to start to create your own reference image.<br>
|
||||
Most important feature is a straight alignment of the image. Use the Pre-rotate angle and the fine alignment to adjust the rotation of the image<br>
|
||||
Store the reference image by pushing <b>"Update Reference Image"</b>.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
|
||||
@@ -14,7 +14,9 @@ var digitsEnabled = false;
|
||||
var posDigitsHeader;
|
||||
|
||||
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"];
|
||||
_filetarget = zw["name"].replace("/config/", "/img_tmp/");
|
||||
_filetarget = _filetarget.replace(".jpg", "_org.jpg");
|
||||
url = _basepath + "/editflow.html?task=cutref&in=/config/reference.jpg&out="+_filetarget+"&x=" + zw["x"] + "&y=" + zw["y"] + "&dx=" + zw["dx"] + "&dy=" + zw["dy"];
|
||||
var xhttp = new XMLHttpRequest();
|
||||
try {
|
||||
xhttp.open("GET", url, false);
|
||||
@@ -22,18 +24,30 @@ function MakeRefZW(zw, _basepath){
|
||||
catch (error)
|
||||
{
|
||||
// alert("Deleting Config.ini failed");
|
||||
}
|
||||
FileCopyOnServer("/img_tmp/ref_zw_org.jpg", "/img_tmp/ref_zw.jpg", _basepath);
|
||||
}
|
||||
_filetarget2 = zw["name"].replace("/config/", "/img_tmp/");
|
||||
// _filetarget2 = _filetarget2.replace(".jpg", "_org.jpg");
|
||||
FileCopyOnServer(_filetarget, _filetarget2, _basepath);
|
||||
}
|
||||
|
||||
function GetCoordinates(index, _basepath){
|
||||
FileCopyOnServer(ref[index]["name"], "/img_tmp/ref_zw.jpg", _basepath);
|
||||
function CopyReferenceToImgTmp(_basepath)
|
||||
{
|
||||
for (index = 0; index < 2; ++index)
|
||||
{
|
||||
_filenamevon = ref[index]["name"];
|
||||
_filenamenach = _filenamevon.replace("/config/", "/img_tmp/");
|
||||
FileDeleteOnServer(_filenamenach, _basepath);
|
||||
FileCopyOnServer(_filenamevon, _filenamenach, _basepath);
|
||||
|
||||
_filenamevon = _filenamevon.replace(".jpg", "_org.jpg");
|
||||
_filenamenach = _filenamenach.replace(".jpg", "_org.jpg");
|
||||
FileDeleteOnServer(_filenamenach, _basepath);
|
||||
FileCopyOnServer(_filenamevon, _filenamenach, _basepath);
|
||||
}
|
||||
}
|
||||
|
||||
FileDeleteOnServer("/img_tmp/ref_zw_org.jpg", _basepath);
|
||||
var namezw = ref[index]["name"].replace(".jpg", "_org.jpg");
|
||||
FileCopyOnServer(namezw, "/img_tmp/ref_zw_org.jpg", _basepath);
|
||||
|
||||
return ref[index];
|
||||
function GetReferencesInfo(){
|
||||
return ref;
|
||||
}
|
||||
|
||||
function ParseConfigAlignment(_aktline){
|
||||
@@ -321,21 +335,31 @@ function UpdateConfigFileReferenceChange(_basepath){
|
||||
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;
|
||||
function UpdateConfigReference(zw, _basepath){
|
||||
for (var index = 0; index < 2; ++index)
|
||||
{
|
||||
var zeile = zw[index]["name"] + " " + zw[index]["x"] + " " + zw[index]["y"];
|
||||
var _pos = zw[index]["pos_ref"];
|
||||
config_split[_pos] = zeile;
|
||||
|
||||
_filenamenach = ref[index]["name"];
|
||||
_filenamevon = _filenamenach.replace("/config/", "/img_tmp/");
|
||||
FileDeleteOnServer(_filenamenach, _basepath);
|
||||
FileCopyOnServer(_filenamevon, _filenamenach, _basepath);
|
||||
|
||||
_filenamenach = _filenamenach.replace(".jpg", "_org.jpg");
|
||||
_filenamevon = _filenamevon.replace(".jpg", "_org.jpg");
|
||||
FileDeleteOnServer(_filenamenach, _basepath);
|
||||
FileCopyOnServer(_filenamevon, _filenamenach, _basepath);
|
||||
|
||||
}
|
||||
|
||||
SaveConfigToServer(_basepath);
|
||||
|
||||
var namezw = zw["name"];
|
||||
FileCopyOnServer("/img_tmp/ref_zw.jpg", namezw, _basepath);
|
||||
var namezw = zw["name"].replace(".jpg", "_org.jpg");
|
||||
FileCopyOnServer("/img_tmp/ref_zw_org.jpg", namezw, _basepath);
|
||||
}
|
||||
|
||||
function MakeContrastImageZW(zw, _enhance, _basepath){
|
||||
url = _basepath + "/editflow.html?task=cutref&in=/config/reference.jpg&out=/img_tmp/ref_zw.jpg" + "&x=" + zw["x"] + "&y=" + zw["y"] + "&dx=" + zw["dx"] + "&dy=" + zw["dy"];
|
||||
_filename = zw["name"].replace("/config/", "/img_tmp/");
|
||||
url = _basepath + "/editflow.html?task=cutref&in=/config/reference.jpg&out=" + _filename + "&x=" + zw["x"] + "&y=" + zw["y"] + "&dx=" + zw["dx"] + "&dy=" + zw["dy"];
|
||||
if (_enhance == true){
|
||||
url = url + "&enhance=true";
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
5.3.0
|
||||
6.4.0
|
||||
|
||||
Reference in New Issue
Block a user