RC2 preparations (#3292)

* Create dig-cont_0640_s3_q.tflite

* Update edit_reference.html (#2924)

Zoom-Einstellungen ausblenden, wenn zoom deaktiviert ist

* Update edit_config_template.html (#2925)

Zoom-Einstellungen ausblenden, wenn zoom deaktiviert ist +
Kameraeinstellungen nicht nur in der config.ini speichern, sondern auch setzen

* The parameter "negative" is processed on the MCU

* Renamed menu entry Alignment -> References

* renamed model file to make naming consistent

* Fix test (#2933)

* always reset change absolute (#2956)

* Create dig-class11_1701_s2.tflite

* Update tflite

* Update tflite

* Camera settings (#3029)

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Fix minor typo and harmonize spaces (#3030)

* Update edit_digits.html

* Update edit_analog.html

* Update overview.html

* Update edit_reference.html

---------

Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>

* Source code formatting, ClassFlowPostProcessing.cpp

* fix edit_config_template.html

Unfortunately, I didn't take out some entries from other experiments because I overlooked/forgot them^^

* fix readconfigparam.js

Unfortunately, I didn't take out some entries from other experiments because I overlooked/forgot them^^

* fix edit_config_template.html

TakeImage_CamZoomMode_value1 was replaced by TakeImage_CamZoomSize_value1, but not deleted.
This caused problems when saving the camera settings.

* Update info.html

function loadWLANSSID() was present three times

* Update overview.html

CamFrameSize is no longer needed/used for zoom

* Update reply-bot.yaml

* homeassistant service discovery: derive node_id when using nested topics (#3088)

* derive correct node_id for homeassistant service discovery in nested topics (fixes #1792)

* explicit use of std::string

* move nodeId creation to separate function
add unit-tests

* add documentation about node_id generation for Home Assistant MQTT Service Discovery

* add Prometheus/OpenMetrics exporter (#3081)

* add prometheus endpoint

* refine metrics implementation

* move metrics generator to ClassFlowControll

* add more metrics
align prefix

* add more metrics
clean up

* refine documentation

* revert dependencies change

* sanitize labels

* create separate module for openmetrics

* move openmetrics to separate folder

* clean up

* add basic unit-tests

* work with const numbers
add replaceAll for string replacement
avoid opening std namespace
adapt unit-tests

* Update code/main/server_main.cpp

---------

Co-authored-by: CaCO3 <caco3@ruinelli.ch>

* Typo

* update platformIO to 6.7.0 (ESP IDF 5.2.1) (#3098)

* update to platformio/espressif32 @ 6.7.0

* remove unused getReadout() as it throws errors (error: 'virtual std::string ClassFlow::getReadout()' was hidden).

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Update reply-bot.yaml (#3107)

* Fix actions-label-commenter

* Update Helper.cpp

* Update Helper.h

* Update Helper.cpp

* Update readconfigparam.js

fix for:
In the selected field the value '1' in the section 'TakeImage' in the field 'CamGainceiling' is invalid. PLEASE CHECK BEFORE SAVING!

* proposal for renaming and documentation (#3115)

* Update server_camera.cpp

 Fix building with -D DEBUG_DETAIL_ON 

better alternative to:
https://github.com/jomjol/AI-on-the-edge-device/pull/3160

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowAlignment.cpp

* Fix building with `-D DEBUG_DETAIL_ON` (#3160)

Building with `-D DEBUG_DETAIL_ON` has been broken since #3029.

Co-authored-by: CaCO3 <caco3@ruinelli.ch>

* Handle empty prevalue.ini gracefully (#3162)

Fixes #2149.

* Bugfix for boot loop (#3175)

* Add files via upload

* Add files via upload

* Add files via upload

* Delete param-docs/parameter-pages/TakeImage/Aec2.md

has been replaced by CamAec2.md

* Delete param-docs/parameter-pages/TakeImage/AutoExposureLevel.md

has been replaced by CamAeLevel.md

* Delete param-docs/parameter-pages/TakeImage/Brightness.md

has been replaced by CamBrightness.md

* Delete param-docs/parameter-pages/TakeImage/Contrast.md

has been replaced by CamContrast.md

* Delete param-docs/parameter-pages/TakeImage/Grayscale.md

has been replaced by CamSpecialEffect.md

* Delete param-docs/parameter-pages/TakeImage/Negative.md

has been replaced by CamSpecialEffect.md

* Delete param-docs/parameter-pages/TakeImage/Saturation.md

has been replaced by CamSaturation.md

* Delete param-docs/parameter-pages/TakeImage/Sharpness.md

has been replaced by CamSharpness.md

* Delete param-docs/parameter-pages/TakeImage/ImageQuality.md

has been replaced by CamQuality.md

* Delete param-docs/parameter-pages/TakeImage/Zoom.md

has been replaced by CamZoom.md

* Delete param-docs/parameter-pages/TakeImage/ZoomMode.md

has been replaced by CamZoomSize.md

* Delete param-docs/parameter-pages/TakeImage/ZoomOffsetX.md

has been replaced by CamZoomOffsetX.md

* Delete param-docs/parameter-pages/TakeImage/ZoomOffsetY.md

has been replaced by CamZoomOffsetY.md

* Delete param-docs/parameter-pages/TakeImage/ImageSize.md

has been replaced by CamZoomSize.md

* Delete param-docs/parameter-pages/TakeImage/FixedExposure.md

has been replaced by CamAec.md

* Delete param-docs/parameter-pages/Alignment/FlipImageSize.md

has been replaced by CamVflip.md

* Delete param-docs/parameter-pages/Alignment/InitialMirror.md

has been replaced by CamHmirror.md

* CamParameter documentation update

https://github.com/jomjol/AI-on-the-edge-device/issues/3185

* typo

* add Webhook #3148 (#3163)

* WIP add Webhook

* fix config html for webhook
add tooltips for webhook

* webhook: fix not enabling webhook

* send webhook as json

* Update ApiKey.md

* webhook: fix only sending last "Number"

* webhook JSON is now closer to the data log in CSV format

* webhook: drop timeStampTimeUTC and switch from timeStamp to lastvalue like lokal csv to fix no timestamp on error

---------

Co-authored-by: CaCO3 <caco3@ruinelli.ch>

* Bugfix for time stamp (#3180)

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowDefineTypes.h

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowPostProcessing.cpp

* Update interface_webhook.cpp

* Update readconfigcommon.js

fix for: The same message("Image Contrast got enhanced") came up with "Update Marker" and "Enhance Image Contrast".

* fix svg favicon 

The svg one got added in 33893eb566 but does not work on Firefox

* Update platformIO to 6.8.1 (Contains ESP IDF 5.3) (#3196)

* Update platformIO to 6.8.1 (ESP IDF 5.3)

* removed now redundant typedef

* updated IDF manifest hash

* Add files via upload

so it should work now

* Update server_main.cpp

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: michael <Heinrich-Tuning@web.de>

* Update MainFlowControl.cpp

* Add support for OV5640 camera (#3063)

* Add support for OV5640 camera

* clean up sharpness handling

* limit sharpness range to -2 and +2

* refactor

* Fix OV3660 sharpness handling

* refactor sharpness handling

* fix OV3660 zoom mode

* reinstate aspect ratio via imageSize

* Changed OV5640 full frame size to match datasheet

* various fixes

* add denoise config and general clean up

* fix line endings to LF

* Support enabling red blue swap via web interface

* update jpeg quality limits

* remove color swap config; color swap workaround dependent on vflip

* fix missing commit

* fix gain ceiling

* Update cam vflip param page

* fix typo: camdenoise, not camsdenoise

* fix compile errors

* Update MainFlowControl.cpp

* Add rate threshold parameter (#3195)

* still needs to be tested

https://github.com/jomjol/AI-on-the-edge-device/issues/3143

* Update ClassFlowPostProcessing.cpp

code formatting

* Update ClassFlowDefineTypes.h

code formatting

* Update ClassFlowPostProcessing.h

code formatting

* Update edit_config_template.html

* fix

* Update config.ini

* Update edit_config_template.html

* Updated param doc

* Rename parameters

* Update edit_config_template.html

* Update NUMBER.ChangeRateThreshold.md

* Update NUMBER.ChangeRateThreshold.md

---------

Co-authored-by: CaCO3 <caco3@ruinelli.ch>

* Update main.cpp

* Update config.ini

Adjusted camera settings to make the image brighter.

* Update readconfigparam.js

Adjusted camera settings to make the image brighter.

* add optional ImageUpload for Webhook (#3174)

* WIP add Webhook

* fix config html for webhook
add tooltips for webhook

* webhook: fix not enabling webhook

* send webhook as json

* Update ApiKey.md

* webhook: fix only sending last "Number"

* webhook JSON is now closer to the data log in CSV format

* webhook: add img upload

* webhoop added config for imgupload

* webhook html fixes

* webhook: drop timeStampTimeUTC and switch from timeStamp to lastvalue like lokal csv to fix no timestamp on error

* add checkbox for Webhook_UploadImg

* Update sd-card/html/edit_config_template.html

* Update edit_config_template.html

* Update edit_config_template.html

* Update edit_config_template.html

* added a long timestamp to both webhook requests

---------

Co-authored-by: CaCO3 <caco3@ruinelli.ch>

* Add files via upload (#3207)

* Update ClassFlowPostProcessing.cpp

deleted some unnecessary double entries
RateType renamed to MaxRateType

* Update ClassFlowDefineTypes.h

RateType renamed to MaxRateType

* Update text on recognition page

* Update digital CNN

* add a Delay between the WiFi reconnections (#3068)

* add a Delay between the WiFi reconnections

* log the delay between the WiFi reconnections

move the delay after the log

* cleanup

* cleanup

* cleanup

* Update edit_alignment.html

* cleanup

* cleanup

* Update platformIO to 6.9.0 (Contains ESP IDF 5.3.1)

* Handle crash on corrupted model (#3220)

* Upgrade esp-tflite-micro to 1.3.1

* Added log message to hint in case it crashes on loading a corrupted model

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* new dig-class100-173-s2-q on 23.800 images (#3257)

* new dig-class100-173-s2-q on 23.800 images

* platformio/espressif32 @ 6.8.1 for esp32cam-dev

* Revert "platformio/espressif32 @ 6.8.1 for esp32cam-dev"

This reverts commit cc9297d483.

* not using platformio 6.1.16

* Revert "not using platformio 6.1.16"

This reverts commit ef18e4fae7.

* moved number edit box styles into new file edit_style.css (#3262)

changed input[type=number] from 60px to 3em, to show 3 digits with current font size.

* added note about only TLS 1.2 is supported (#3213)

* Renamed digital to digit (#3219)

* renamed Digital to Digit

* added param migration

* Update .github/label-commenter-config.yaml

* renamed AnalogDigitTransition* to AnalogToDigitTransition*

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Update Changelog.md

* Update Changelog.md

* Prepare next release (#3267) (#3270)

* Create dig-cont_0640_s3_q.tflite

* Update edit_reference.html (#2924)

Zoom-Einstellungen ausblenden, wenn zoom deaktiviert ist

* Update edit_config_template.html (#2925)

Zoom-Einstellungen ausblenden, wenn zoom deaktiviert ist +
Kameraeinstellungen nicht nur in der config.ini speichern, sondern auch setzen

* The parameter "negative" is processed on the MCU

* Renamed menu entry Alignment -> References

* renamed model file to make naming consistent

* Fix test (#2933)

* always reset change absolute (#2956)

* Create dig-class11_1701_s2.tflite

* Update tflite

* Update tflite

* Camera settings (#3029)

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Fix minor typo and harmonize spaces (#3030)

* Update edit_digits.html

* Update edit_analog.html

* Update overview.html

* Update edit_reference.html

---------



* Source code formatting, ClassFlowPostProcessing.cpp

* fix edit_config_template.html

Unfortunately, I didn't take out some entries from other experiments because I overlooked/forgot them^^

* fix readconfigparam.js

Unfortunately, I didn't take out some entries from other experiments because I overlooked/forgot them^^

* fix edit_config_template.html

TakeImage_CamZoomMode_value1 was replaced by TakeImage_CamZoomSize_value1, but not deleted.
This caused problems when saving the camera settings.

* Update info.html

function loadWLANSSID() was present three times

* Update overview.html

CamFrameSize is no longer needed/used for zoom

* Update reply-bot.yaml

* homeassistant service discovery: derive node_id when using nested topics (#3088)

* derive correct node_id for homeassistant service discovery in nested topics (fixes #1792)

* explicit use of std::string

* move nodeId creation to separate function
add unit-tests

* add documentation about node_id generation for Home Assistant MQTT Service Discovery

* add Prometheus/OpenMetrics exporter (#3081)

* add prometheus endpoint

* refine metrics implementation

* move metrics generator to ClassFlowControll

* add more metrics
align prefix

* add more metrics
clean up

* refine documentation

* revert dependencies change

* sanitize labels

* create separate module for openmetrics

* move openmetrics to separate folder

* clean up

* add basic unit-tests

* work with const numbers
add replaceAll for string replacement
avoid opening std namespace
adapt unit-tests

* Update code/main/server_main.cpp

---------



* Typo

* update platformIO to 6.7.0 (ESP IDF 5.2.1) (#3098)

* update to platformio/espressif32 @ 6.7.0

* remove unused getReadout() as it throws errors (error: 'virtual std::string ClassFlow::getReadout()' was hidden).

---------



* Update reply-bot.yaml (#3107)

* Fix actions-label-commenter

* Update Helper.cpp

* Update Helper.h

* Update Helper.cpp

* Update readconfigparam.js

fix for:
In the selected field the value '1' in the section 'TakeImage' in the field 'CamGainceiling' is invalid. PLEASE CHECK BEFORE SAVING!

* proposal for renaming and documentation (#3115)

* Update server_camera.cpp

 Fix building with -D DEBUG_DETAIL_ON 

better alternative to:
https://github.com/jomjol/AI-on-the-edge-device/pull/3160

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowAlignment.cpp

* Fix building with `-D DEBUG_DETAIL_ON` (#3160)

Building with `-D DEBUG_DETAIL_ON` has been broken since #3029.



* Handle empty prevalue.ini gracefully (#3162)

Fixes #2149.

* Bugfix for boot loop (#3175)

* Add files via upload

* Add files via upload

* Add files via upload

* Delete param-docs/parameter-pages/TakeImage/Aec2.md

has been replaced by CamAec2.md

* Delete param-docs/parameter-pages/TakeImage/AutoExposureLevel.md

has been replaced by CamAeLevel.md

* Delete param-docs/parameter-pages/TakeImage/Brightness.md

has been replaced by CamBrightness.md

* Delete param-docs/parameter-pages/TakeImage/Contrast.md

has been replaced by CamContrast.md

* Delete param-docs/parameter-pages/TakeImage/Grayscale.md

has been replaced by CamSpecialEffect.md

* Delete param-docs/parameter-pages/TakeImage/Negative.md

has been replaced by CamSpecialEffect.md

* Delete param-docs/parameter-pages/TakeImage/Saturation.md

has been replaced by CamSaturation.md

* Delete param-docs/parameter-pages/TakeImage/Sharpness.md

has been replaced by CamSharpness.md

* Delete param-docs/parameter-pages/TakeImage/ImageQuality.md

has been replaced by CamQuality.md

* Delete param-docs/parameter-pages/TakeImage/Zoom.md

has been replaced by CamZoom.md

* Delete param-docs/parameter-pages/TakeImage/ZoomMode.md

has been replaced by CamZoomSize.md

* Delete param-docs/parameter-pages/TakeImage/ZoomOffsetX.md

has been replaced by CamZoomOffsetX.md

* Delete param-docs/parameter-pages/TakeImage/ZoomOffsetY.md

has been replaced by CamZoomOffsetY.md

* Delete param-docs/parameter-pages/TakeImage/ImageSize.md

has been replaced by CamZoomSize.md

* Delete param-docs/parameter-pages/TakeImage/FixedExposure.md

has been replaced by CamAec.md

* Delete param-docs/parameter-pages/Alignment/FlipImageSize.md

has been replaced by CamVflip.md

* Delete param-docs/parameter-pages/Alignment/InitialMirror.md

has been replaced by CamHmirror.md

* CamParameter documentation update

https://github.com/jomjol/AI-on-the-edge-device/issues/3185

* typo

* add Webhook #3148 (#3163)

* WIP add Webhook

* fix config html for webhook
add tooltips for webhook

* webhook: fix not enabling webhook

* send webhook as json

* Update ApiKey.md

* webhook: fix only sending last "Number"

* webhook JSON is now closer to the data log in CSV format

* webhook: drop timeStampTimeUTC and switch from timeStamp to lastvalue like lokal csv to fix no timestamp on error

---------



* Bugfix for time stamp (#3180)

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowDefineTypes.h

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowPostProcessing.cpp

* Update ClassFlowPostProcessing.cpp

* Update interface_webhook.cpp

* Update readconfigcommon.js

fix for: The same message("Image Contrast got enhanced") came up with "Update Marker" and "Enhance Image Contrast".

* fix svg favicon 

The svg one got added in 33893eb566 but does not work on Firefox

* Update platformIO to 6.8.1 (Contains ESP IDF 5.3) (#3196)

* Update platformIO to 6.8.1 (ESP IDF 5.3)

* removed now redundant typedef

* updated IDF manifest hash

* Add files via upload

so it should work now

* Update server_main.cpp

---------




* Update MainFlowControl.cpp

* Add support for OV5640 camera (#3063)

* Add support for OV5640 camera

* clean up sharpness handling

* limit sharpness range to -2 and +2

* refactor

* Fix OV3660 sharpness handling

* refactor sharpness handling

* fix OV3660 zoom mode

* reinstate aspect ratio via imageSize

* Changed OV5640 full frame size to match datasheet

* various fixes

* add denoise config and general clean up

* fix line endings to LF

* Support enabling red blue swap via web interface

* update jpeg quality limits

* remove color swap config; color swap workaround dependent on vflip

* fix missing commit

* fix gain ceiling

* Update cam vflip param page

* fix typo: camdenoise, not camsdenoise

* fix compile errors

* Update MainFlowControl.cpp

* Add rate threshold parameter (#3195)

* still needs to be tested

https://github.com/jomjol/AI-on-the-edge-device/issues/3143

* Update ClassFlowPostProcessing.cpp

code formatting

* Update ClassFlowDefineTypes.h

code formatting

* Update ClassFlowPostProcessing.h

code formatting

* Update edit_config_template.html

* fix

* Update config.ini

* Update edit_config_template.html

* Updated param doc

* Rename parameters

* Update edit_config_template.html

* Update NUMBER.ChangeRateThreshold.md

* Update NUMBER.ChangeRateThreshold.md

---------



* Update main.cpp

* Update config.ini

Adjusted camera settings to make the image brighter.

* Update readconfigparam.js

Adjusted camera settings to make the image brighter.

* add optional ImageUpload for Webhook (#3174)

* WIP add Webhook

* fix config html for webhook
add tooltips for webhook

* webhook: fix not enabling webhook

* send webhook as json

* Update ApiKey.md

* webhook: fix only sending last "Number"

* webhook JSON is now closer to the data log in CSV format

* webhook: add img upload

* webhoop added config for imgupload

* webhook html fixes

* webhook: drop timeStampTimeUTC and switch from timeStamp to lastvalue like lokal csv to fix no timestamp on error

* add checkbox for Webhook_UploadImg

* Update sd-card/html/edit_config_template.html

* Update edit_config_template.html

* Update edit_config_template.html

* Update edit_config_template.html

* added a long timestamp to both webhook requests

---------



* Add files via upload (#3207)

* Update ClassFlowPostProcessing.cpp

deleted some unnecessary double entries
RateType renamed to MaxRateType

* Update ClassFlowDefineTypes.h

RateType renamed to MaxRateType

* Update text on recognition page

* Update digital CNN

* add a Delay between the WiFi reconnections (#3068)

* add a Delay between the WiFi reconnections

* log the delay between the WiFi reconnections

move the delay after the log

* cleanup

* cleanup

* cleanup

* Update edit_alignment.html

* cleanup

* cleanup

* Update platformIO to 6.9.0 (Contains ESP IDF 5.3.1)

* Handle crash on corrupted model (#3220)

* Upgrade esp-tflite-micro to 1.3.1

* Added log message to hint in case it crashes on loading a corrupted model

---------



* new dig-class100-173-s2-q on 23.800 images (#3257)

* new dig-class100-173-s2-q on 23.800 images

* platformio/espressif32 @ 6.8.1 for esp32cam-dev

* Revert "platformio/espressif32 @ 6.8.1 for esp32cam-dev"

This reverts commit cc9297d483.

* not using platformio 6.1.16

* Revert "not using platformio 6.1.16"

This reverts commit ef18e4fae7.

* moved number edit box styles into new file edit_style.css (#3262)

changed input[type=number] from 60px to 3em, to show 3 digits with current font size.

* added note about only TLS 1.2 is supported (#3213)

* Renamed digital to digit (#3219)

* renamed Digital to Digit

* added param migration

* Update .github/label-commenter-config.yaml

* renamed AnalogDigitTransition* to AnalogToDigitTransition*

---------



* Update Changelog.md

* Update Changelog.md

---------

Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
Co-authored-by: michael <Heinrich-Tuning@web.de>
Co-authored-by: Frank Haverland <fspapaping@googlemail.com>
Co-authored-by: kub3let <95883234+kub3let@users.noreply.github.com>
Co-authored-by: Marco H <myxor@users.noreply.github.com>
Co-authored-by: Henry Thasler <henrythasler@users.noreply.github.com>
Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: Sebastian Lövdahl <slovdahl@hibox.fi>
Co-authored-by: Raphael Hehl <raphael@rhehl.de>
Co-authored-by: jasaw <jasaw@dius.com.au>
Co-authored-by: Francesco Carnielli <hex7c0@gmail.com>
Co-authored-by: kalwados <kalwados@gmx.de>

* revert TFlite submodule update as certain modules crash with it, see https://github.com/jomjol/AI-on-the-edge-device/issues/3269

* Rename NUMBER.AnalogDigitTransitionStart.md to NUMBER.AnalogToDigitTransitionStart.md

* Update NUMBER.AnalogToDigitTransitionStart.md

* Update edit_config_template.html

* changed the webhook UploadImg to false

* changed the webhook UploadImg to false (#3279)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Show boolean option in settings page (#3285)

* changed the webhook UploadImg to false

* show boolean value on boolean drop down boxes

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* changed default value from boolean to numeric value in parameter camDenoise documentation

* Update edit_explain_7.html

https://github.com/jomjol/AI-on-the-edge-device/issues/3284?notification_referrer_id=NT_kwDOAAj1wbIxMjY3MDI1Njk3MDo1ODcyMDE#issuecomment-2387102786

* docs: update README.md (#3290)

prefered -> preferred

* rename/remove unused parameters (#3291)

* migrate-cam-parameters (#3288)

* Update main.cpp

* remove commented out code

---------

Co-authored-by: CaCO3 <caco3@ruinelli.ch>

* Update Changelog.md

* cleanup

---------

Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
Co-authored-by: michael <Heinrich-Tuning@web.de>
Co-authored-by: Frank Haverland <fspapaping@googlemail.com>
Co-authored-by: kub3let <95883234+kub3let@users.noreply.github.com>
Co-authored-by: Marco H <myxor@users.noreply.github.com>
Co-authored-by: Henry Thasler <henrythasler@users.noreply.github.com>
Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: Sebastian Lövdahl <slovdahl@hibox.fi>
Co-authored-by: Raphael Hehl <raphael@rhehl.de>
Co-authored-by: jasaw <jasaw@dius.com.au>
Co-authored-by: Francesco Carnielli <hex7c0@gmail.com>
Co-authored-by: kalwados <kalwados@gmx.de>
Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com>
This commit is contained in:
CaCO3
2024-10-04 22:05:15 +02:00
committed by GitHub
parent ca01f5a38f
commit 89c36374b3
9 changed files with 306 additions and 160 deletions

View File

@@ -1,3 +1,24 @@
## [16.0.0-RC2] - 2024-10-04
For a full list of changes see [Full list of changes](https://github.com/jomjol/AI-on-the-edge-device/compare/v15.7.0...v16.0.0-RC1)
#### Known issues
Please check the [issues](https://github.com/jomjol/AI-on-the-edge-device/issues) and
[discussions](https://github.com/jomjol/AI-on-the-edge-device/discussions) before reporting a new issue.
#### Core Changes
Only changes since RC1 are listed:
- Updated parameter documentation pages
- Rename/remove unused parameters (#3291)
- Migrate-cam-parameters (#3288)
#### Bug Fixes
Only changes since RC1 are listed:
- Reverted TFlite submodule update as certain modules crash with it (#3269)
- Changed the webhook UploadImg to false (#3279)
- Changed default value from boolean to numeric value in parameter camDenoise documentation
- Updated config page
## [16.0.0-RC1] - 2024-09-24 ## [16.0.0-RC1] - 2024-09-24
For a full list of changes see [Full list of changes](https://github.com/jomjol/AI-on-the-edge-device/compare/v15.7.0...v16.0.0-RC1) For a full list of changes see [Full list of changes](https://github.com/jomjol/AI-on-the-edge-device/compare/v15.7.0...v16.0.0-RC1)

View File

@@ -65,7 +65,7 @@ The latest available version can be found on the [Releases page](https://github.
Initially you will have to flash the ESP32 via a USB connection. Later updates are possible directly over the air (OTA using WIFI). Initially you will have to flash the ESP32 via a USB connection. Later updates are possible directly over the air (OTA using WIFI).
There are different ways to flash your ESP32: There are different ways to flash your ESP32:
- The prefered way is the [Web Installer and Console](https://jomjol.github.io/AI-on-the-edge-device/index.html) which is a browser-based tool to flash the ESP32 and extract the log over USB: - The preferred way is the [Web Installer and Console](https://jomjol.github.io/AI-on-the-edge-device/index.html) which is a browser-based tool to flash the ESP32 and extract the log over USB:
![](images/web-installer.png) ![](images/web-installer.png)
- Flash Tool from Espressif - Flash Tool from Espressif
- ESPtool (command-line tool) - ESPtool (command-line tool)

View File

@@ -528,10 +528,20 @@ extern "C" void app_main(void)
} }
} }
// FIXME: needs to be revised or removed!!!
void migrateConfiguration(void) { void migrateConfiguration(void) {
std::vector<string> splitted;
bool migrated = false; bool migrated = false;
bool CamZoom_found = false;
int CamZoom_lines = 0;
bool CamZoom_value = false;
int CamZoomSize_lines = 0;
int CamZoomSize_value = 0;
int CamZoomOffsetX_lines = 0;
int CamZoomOffsetX_value = 0;
int CamZoomOffsetY_lines = 0;
int CamZoomOffsetY_value = 0;
if (!FileExists(CONFIG_FILE)) { if (!FileExists(CONFIG_FILE)) {
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Config file seems to be missing!"); LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Config file seems to be missing!");
return; return;
@@ -548,11 +558,15 @@ void migrateConfiguration(void) {
for (int i = 0; i < configLines.size(); i++) { for (int i = 0; i < configLines.size(); i++) {
// ESP_LOGI(TAG, "Line %d: %s", i, configLines[i].c_str()); // ESP_LOGI(TAG, "Line %d: %s", i, configLines[i].c_str());
if (configLines[i].find("[") != std::string::npos) { // Start of new section if (configLines[i].find("[") != std::string::npos) {
// Start of new section
section = configLines[i]; section = configLines[i];
replaceString(section, ";", "", false); // Remove possible semicolon (just for the string comparison) replaceString(section, ";", "", false); // Remove possible semicolon (just for the string comparison)
// ESP_LOGI(TAG, "New section: %s", section.c_str()); // ESP_LOGI(TAG, "New section: %s", section.c_str());
} }
else {
splitted = ZerlegeZeile(configLines[i]);
}
/* Migrate parameters as needed /* Migrate parameters as needed
* For the boolean parameters, we make them enabled all the time now: * For the boolean parameters, we make them enabled all the time now:
@@ -569,69 +583,109 @@ void migrateConfiguration(void) {
} }
if (section == "[MakeImage]" || section == "[TakeImage]") { if (section == "[MakeImage]" || section == "[TakeImage]") {
if ((isInString(configLines[i], "Brightness")) && (!isInString(configLines[i], "CamBrightness"))) {
migrated = migrated | replaceString(configLines[i], "Brightness", "CamBrightness");
}
else if ((isInString(configLines[i], "Contrast")) && (!isInString(configLines[i], "CamContrast"))) {
migrated = migrated | replaceString(configLines[i], "Contrast", "CamContrast");
}
else if ((isInString(configLines[i], "Saturation")) && (!isInString(configLines[i], "CamSaturation"))) {
migrated = migrated | replaceString(configLines[i], "Saturation", "CamSaturation");
}
else if ((isInString(configLines[i], "Sharpness")) && (!isInString(configLines[i], "CamSharpness")) && (!isInString(configLines[i], "CamAutoSharpness"))) {
migrated = migrated | replaceString(configLines[i], "Sharpness", "CamSharpness");
}
else if ((isInString(configLines[i], "Aec2")) && (!isInString(configLines[i], "CamAec")) && (!isInString(configLines[i], "CamAec2"))) {
migrated = migrated | replaceString(configLines[i], "Aec2", "CamAec2");
}
else if ((isInString(configLines[i], "Zoom")) && (!isInString(configLines[i], "CamZoom")) && (!isInString(configLines[i], "ZoomMode")) && (!isInString(configLines[i], "ZoomOffsetX")) && (!isInString(configLines[i], "ZoomOffsetY"))) {
CamZoom_lines = i;
CamZoom_value = alphanumericToBoolean(splitted[1]);
CamZoom_found = true;
}
else if ((isInString(configLines[i], "ZoomMode")) && (!isInString(configLines[i], "CamZoom"))) {
CamZoomSize_lines = i;
if (isStringNumeric(splitted[1])) {
CamZoomSize_value = std::stof(splitted[1]);
}
CamZoom_found = true;
}
else if ((isInString(configLines[i], "ZoomOffsetX")) && (!isInString(configLines[i], "CamZoom")) && (!isInString(configLines[i], "ZoomOffsetY"))) {
CamZoomOffsetX_lines = i;
if (isStringNumeric(splitted[1])) {
CamZoomOffsetX_value = std::stof(splitted[1]);
}
CamZoom_found = true;
}
else if ((isInString(configLines[i], "ZoomOffsetY")) && (!isInString(configLines[i], "CamZoom")) && (!isInString(configLines[i], "ZoomOffsetX"))) {
CamZoomOffsetY_lines = i;
if (isStringNumeric(splitted[1])) {
CamZoomOffsetY_value = std::stof(splitted[1]);
}
CamZoom_found = true;
}
else {
migrated = migrated | replaceString(configLines[i], "LogImageLocation", "RawImagesLocation"); migrated = migrated | replaceString(configLines[i], "LogImageLocation", "RawImagesLocation");
migrated = migrated | replaceString(configLines[i], "LogfileRetentionInDays", "RawImagesRetention"); migrated = migrated | replaceString(configLines[i], "LogfileRetentionInDays", "RawImagesRetention");
migrated = migrated | replaceString(configLines[i], ";Demo = true", ";Demo = false"); // Set it to its default value migrated = migrated | replaceString(configLines[i], ";Demo = true", ";Demo = false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";Demo", "Demo"); // Enable it migrated = migrated | replaceString(configLines[i], ";Demo", "Demo"); // Enable it
// Parameter is no longer used migrated = migrated | replaceString(configLines[i], "ImageQuality", "CamQuality");
// migrated = migrated | replaceString(configLines[i], ";FixedExposure = true", ";FixedExposure = false"); // Set it to its default value migrated = migrated | replaceString(configLines[i], "AutoExposureLevel", "CamAeLevel");
// migrated = migrated | replaceString(configLines[i], ";FixedExposure", "FixedExposure"); // Enable it migrated = migrated | replaceString(configLines[i], "FixedExposure", "CamAec");
migrated = migrated | replaceString(configLines[i], "ImageSize", ";UNUSED_PARAMETER"); // This parameter is no longer used
migrated = migrated | replaceString(configLines[i], "Grayscale", ";UNUSED_PARAMETER"); // This parameter is no longer used
migrated = migrated | replaceString(configLines[i], "Negative", ";UNUSED_PARAMETER"); // This parameter is no longer used
} }
if (section == "[Alignment]") {
// Parameter is no longer used
// migrated = migrated | replaceString(configLines[i], ";InitialMirror = true", ";InitialMirror = false"); // Set it to its default value
// migrated = migrated | replaceString(configLines[i], ";InitialMirror", "InitialMirror"); // Enable it
// Parameter is no longer used
// migrated = migrated | replaceString(configLines[i], ";FlipImageSize = true", ";FlipImageSize = false"); // Set it to its default value
// migrated = migrated | replaceString(configLines[i], ";FlipImageSize", "FlipImageSize"); // Enable it
} }
else if (section == "[Alignment]") {
if (section == "[Digits]") { migrated = migrated | replaceString(configLines[i], "InitialMirror", ";UNUSED_PARAMETER"); // This parameter is no longer used
migrated = migrated | replaceString(configLines[i], ";InitialMirror", ";UNUSED_PARAMETER"); // This parameter is no longer used
migrated = migrated | replaceString(configLines[i], "FlipImageSize", ";UNUSED_PARAMETER"); // This parameter is no longer used
migrated = migrated | replaceString(configLines[i], ";FlipImageSize", ";UNUSED_PARAMETER"); // This parameter is no longer used
}
else if (section == "[Digits]") {
migrated = migrated | replaceString(configLines[i], "LogImageLocation", "ROIImagesLocation"); migrated = migrated | replaceString(configLines[i], "LogImageLocation", "ROIImagesLocation");
migrated = migrated | replaceString(configLines[i], "LogfileRetentionInDays", "ROIImagesRetention"); migrated = migrated | replaceString(configLines[i], "LogfileRetentionInDays", "ROIImagesRetention");
} }
else if (section == "[Analog]") {
if (section == "[Analog]") {
migrated = migrated | replaceString(configLines[i], "LogImageLocation", "ROIImagesLocation"); migrated = migrated | replaceString(configLines[i], "LogImageLocation", "ROIImagesLocation");
migrated = migrated | replaceString(configLines[i], "LogfileRetentionInDays", "ROIImagesRetention"); migrated = migrated | replaceString(configLines[i], "LogfileRetentionInDays", "ROIImagesRetention");
migrated = migrated | replaceString(configLines[i], "ExtendedResolution", ";UNUSED_PARAMETER"); // This parameter is no longer used migrated = migrated | replaceString(configLines[i], "ExtendedResolution", ";UNUSED_PARAMETER"); // This parameter is no longer used
} }
else if (section == "[PostProcessing]") {
if (section == "[PostProcessing]") { /* AllowNegativeRates has a <NUMBER> as prefix! */
migrated = migrated | replaceString(configLines[i], "AnalogDigitalTransitionStart", "AnalogToDigitTransitionStart"); // Rename it if (isInString(configLines[i], "AllowNegativeRates") && isInString(configLines[i], ";")) {
// It is the parameter "AllowNegativeRates" and it is commented out
migrated = migrated | replaceString(configLines[i], "true", "false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";", ""); // Enable it
}
/* IgnoreLeadingNaN has a <NUMBER> as prefix! */
else if (isInString(configLines[i], "IgnoreLeadingNaN") && isInString(configLines[i], ";")) {
// It is the parameter "IgnoreLeadingNaN" and it is commented out
migrated = migrated | replaceString(configLines[i], "true", "false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";", ""); // Enable it
}
/* ExtendedResolution has a <NUMBER> as prefix! */
else if (isInString(configLines[i], "ExtendedResolution") && isInString(configLines[i], ";")) {
// It is the parameter "ExtendedResolution" and it is commented out
migrated = migrated | replaceString(configLines[i], "true", "false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";", ""); // Enable it
}
else {
migrated = migrated | replaceString(configLines[i], ";PreValueUse = true", ";PreValueUse = false"); // Set it to its default value migrated = migrated | replaceString(configLines[i], ";PreValueUse = true", ";PreValueUse = false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";PreValueUse", "PreValueUse"); // Enable it migrated = migrated | replaceString(configLines[i], ";PreValueUse", "PreValueUse"); // Enable it
/* AllowNegativeRates has a <NUMBER> as prefix! */
if (isInString(configLines[i], "AllowNegativeRates") && isInString(configLines[i], ";")) { // It is the parameter "AllowNegativeRates" and it is commented out
migrated = migrated | replaceString(configLines[i], "true", "false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";", ""); // Enable it
}
/* IgnoreLeadingNaN has a <NUMBER> as prefix! */
if (isInString(configLines[i], "IgnoreLeadingNaN") && isInString(configLines[i], ";")) { // It is the parameter "IgnoreLeadingNaN" and it is commented out
migrated = migrated | replaceString(configLines[i], "true", "false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";", ""); // Enable it
}
/* ExtendedResolution has a <NUMBER> as prefix! */
if (isInString(configLines[i], "ExtendedResolution") && isInString(configLines[i], ";")) { // It is the parameter "ExtendedResolution" and it is commented out
migrated = migrated | replaceString(configLines[i], "true", "false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";", ""); // Enable it
}
migrated = migrated | replaceString(configLines[i], ";ErrorMessage = true", ";ErrorMessage = false"); // Set it to its default value migrated = migrated | replaceString(configLines[i], ";ErrorMessage = true", ";ErrorMessage = false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";ErrorMessage", "ErrorMessage"); // Enable it migrated = migrated | replaceString(configLines[i], ";ErrorMessage", "ErrorMessage"); // Enable it
migrated = migrated | replaceString(configLines[i], ";CheckDigitIncreaseConsistency = true", ";CheckDigitIncreaseConsistency = false"); // Set it to its default value migrated = migrated | replaceString(configLines[i], ";CheckDigitIncreaseConsistency = true", ";CheckDigitIncreaseConsistency = false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";CheckDigitIncreaseConsistency", "CheckDigitIncreaseConsistency"); // Enable it migrated = migrated | replaceString(configLines[i], ";CheckDigitIncreaseConsistency", "CheckDigitIncreaseConsistency"); // Enable it
} }
}
if (section == "[MQTT]") { else if (section == "[MQTT]") {
migrated = migrated | replaceString(configLines[i], "SetRetainFlag", "RetainMessages"); // First rename it, enable it with its default value migrated = migrated | replaceString(configLines[i], "SetRetainFlag", "RetainMessages"); // First rename it, enable it with its default value
migrated = migrated | replaceString(configLines[i], ";RetainMessages = true", ";RetainMessages = false"); // Set it to its default value migrated = migrated | replaceString(configLines[i], ";RetainMessages = true", ";RetainMessages = false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";RetainMessages", "RetainMessages"); // Enable it migrated = migrated | replaceString(configLines[i], ";RetainMessages", "RetainMessages"); // Enable it
@@ -639,49 +693,44 @@ void migrateConfiguration(void) {
migrated = migrated | replaceString(configLines[i], ";HomeassistantDiscovery = true", ";HomeassistantDiscovery = false"); // Set it to its default value migrated = migrated | replaceString(configLines[i], ";HomeassistantDiscovery = true", ";HomeassistantDiscovery = false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";HomeassistantDiscovery", "HomeassistantDiscovery"); // Enable it migrated = migrated | replaceString(configLines[i], ";HomeassistantDiscovery", "HomeassistantDiscovery"); // Enable it
if (configLines[i].rfind("Topic", 0) != std::string::npos) // only if string starts with "Topic" (Was the naming in very old version) // only if string starts with "Topic" (Was the naming in very old version)
{ if (configLines[i].rfind("Topic", 0) != std::string::npos) {
migrated = migrated | replaceString(configLines[i], "Topic", "MainTopic"); migrated = migrated | replaceString(configLines[i], "Topic", "MainTopic");
} }
} }
else if (section == "[InfluxDB]") {
if (section == "[InfluxDB]") {
/* Fieldname has a <NUMBER> as prefix! */ /* Fieldname has a <NUMBER> as prefix! */
if (isInString(configLines[i], "Fieldname")) { // It is the parameter "Fieldname" if (isInString(configLines[i], "Fieldname")) {
// It is the parameter "Fieldname"
migrated = migrated | replaceString(configLines[i], "Fieldname", "Field"); // Rename it to Field migrated = migrated | replaceString(configLines[i], "Fieldname", "Field"); // Rename it to Field
} }
} }
else if (section == "[InfluxDBv2]") {
if (section == "[InfluxDBv2]") {
/* Fieldname has a <NUMBER> as prefix! */ /* Fieldname has a <NUMBER> as prefix! */
if (isInString(configLines[i], "Fieldname")) { // It is the parameter "Fieldname" if (isInString(configLines[i], "Fieldname")) {
// It is the parameter "Fieldname"
migrated = migrated | replaceString(configLines[i], "Fieldname", "Field"); // Rename it to Field migrated = migrated | replaceString(configLines[i], "Fieldname", "Field"); // Rename it to Field
} }
/* Database got renamed to Bucket! */ /* Database got renamed to Bucket! */
if (isInString(configLines[i], "Database")) { // It is the parameter "Database" else if (isInString(configLines[i], "Database")) {
// It is the parameter "Database"
migrated = migrated | replaceString(configLines[i], "Database", "Bucket"); // Rename it to Bucket migrated = migrated | replaceString(configLines[i], "Database", "Bucket"); // Rename it to Bucket
} }
} }
else if (section == "[GPIO]") {
if (section == "[GPIO]") {
} }
else if (section == "[DataLogging]") {
if (section == "[DataLogging]") {
migrated = migrated | replaceString(configLines[i], "DataLogRetentionInDays", "DataFilesRetention"); migrated = migrated | replaceString(configLines[i], "DataLogRetentionInDays", "DataFilesRetention");
/* DataLogActive is true by default! */ /* DataLogActive is true by default! */
migrated = migrated | replaceString(configLines[i], ";DataLogActive = false", ";DataLogActive = true"); // Set it to its default value migrated = migrated | replaceString(configLines[i], ";DataLogActive = false", ";DataLogActive = true"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";DataLogActive", "DataLogActive"); // Enable it migrated = migrated | replaceString(configLines[i], ";DataLogActive", "DataLogActive"); // Enable it
} }
else if (section == "[AutoTimer]") {
if (section == "[AutoTimer]") {
migrated = migrated | replaceString(configLines[i], "Intervall", "Interval"); migrated = migrated | replaceString(configLines[i], "Intervall", "Interval");
migrated = migrated | replaceString(configLines[i], ";AutoStart = true", ";AutoStart = false"); // Set it to its default value migrated = migrated | replaceString(configLines[i], ";AutoStart = true", ";AutoStart = false"); // Set it to its default value
migrated = migrated | replaceString(configLines[i], ";AutoStart", "AutoStart"); // Enable it migrated = migrated | replaceString(configLines[i], ";AutoStart", "AutoStart"); // Enable it
} }
else if (section == "[Debug]") {
if (section == "[Debug]") {
migrated = migrated | replaceString(configLines[i], "Logfile ", "LogLevel "); // Whitespace needed so it does not match `LogfileRetentionInDays` migrated = migrated | replaceString(configLines[i], "Logfile ", "LogLevel "); // Whitespace needed so it does not match `LogfileRetentionInDays`
/* LogLevel (resp. LogFile) was originally a boolean, but we switched it to an int /* LogLevel (resp. LogFile) was originally a boolean, but we switched it to an int
* For both cases (true/false), we set it to level 2 (WARNING) */ * For both cases (true/false), we set it to level 2 (WARNING) */
@@ -689,8 +738,7 @@ void migrateConfiguration(void) {
migrated = migrated | replaceString(configLines[i], "LogLevel = false", "LogLevel = 2"); migrated = migrated | replaceString(configLines[i], "LogLevel = false", "LogLevel = 2");
migrated = migrated | replaceString(configLines[i], "LogfileRetentionInDays", "LogfilesRetention"); migrated = migrated | replaceString(configLines[i], "LogfileRetentionInDays", "LogfilesRetention");
} }
else if (section == "[System]") {
if (section == "[System]") {
migrated = migrated | replaceString(configLines[i], "RSSIThreashold", "RSSIThreshold"); migrated = migrated | replaceString(configLines[i], "RSSIThreashold", "RSSIThreshold");
migrated = migrated | replaceString(configLines[i], "AutoAdjustSummertime", ";UNUSED_PARAMETER"); // This parameter is no longer used migrated = migrated | replaceString(configLines[i], "AutoAdjustSummertime", ";UNUSED_PARAMETER"); // This parameter is no longer used
@@ -699,17 +747,93 @@ void migrateConfiguration(void) {
} }
} }
if (migrated) { // At least one replacement happened if (CamZoom_found == true) {
if (CamZoomSize_value == 0) {
// mode0
// 1600 - 640 = 960 / 2 = max-Offset (+/-) 480
// 1200 - 480 = 720 / 2 = max-Offset (+/-) 360
if (CamZoomOffsetX_value > 960) {
CamZoomOffsetX_value = 960;
}
else {
CamZoomOffsetX_value = (floor((CamZoomOffsetX_value - 480) / 8) * 8);
}
if (CamZoomOffsetY_value > 720) {
CamZoomOffsetY_value = 720;
}
else {
CamZoomOffsetY_value = (floor((CamZoomOffsetY_value - 360) / 8) * 8);
}
CamZoomSize_value = 29;
}
else {
// mode1
// 800 - 640 = 160 / 2 = max-Offset (+/-) 80
// 600 - 480 = 120 / 2 = max-Offset (+/-) 60
if (CamZoomOffsetX_value > 160) {
CamZoomOffsetX_value = 160;
}
else {
CamZoomOffsetX_value = (floor(((CamZoomOffsetX_value - 80) * 2) / 8) * 8);
}
if (CamZoomOffsetY_value > 120) {
CamZoomOffsetY_value = 120;
}
else {
CamZoomOffsetY_value = (floor(((CamZoomOffsetY_value - 60) * 2) / 8) * 8);
}
CamZoomSize_value = 9;
}
if (CamZoom_lines > 0) {
if (CamZoom_value) {
configLines[CamZoom_lines] = ("CamZoom = true");
}
else {
configLines[CamZoom_lines] = ("CamZoom = false");
}
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Migrated Configfile line 'Zoom' to 'CamZoom'");
migrated = true;
}
if (CamZoomSize_lines > 0) {
configLines[CamZoomSize_lines] = ("CamZoomSize = " + std::to_string(CamZoomSize_value));
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Migrated Configfile line 'ZoomMode' to 'CamZoomSize'");
migrated = true;
}
if (CamZoomOffsetX_lines > 0) {
configLines[CamZoomOffsetX_lines] = ("CamZoomOffsetX = " + std::to_string(CamZoomOffsetX_value));
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Migrated Configfile line 'ZoomOffsetX' to 'CamZoomOffsetX'");
migrated = true;
}
if (CamZoomOffsetY_lines > 0) {
configLines[CamZoomOffsetY_lines] = ("CamZoomOffsetY = " + std::to_string(CamZoomOffsetY_value));
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Migrated Configfile line 'ZoomOffsetY' to 'CamZoomOffsetY'");
migrated = true;
}
}
if (migrated) {
// At least one replacement happened
if (!RenameFile(CONFIG_FILE, CONFIG_FILE_BACKUP)) { if (!RenameFile(CONFIG_FILE, CONFIG_FILE_BACKUP)) {
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to create backup of Config file!"); LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to create backup of Config file!");
return; return;
} }
FILE *pfile = fopen(CONFIG_FILE, "w"); FILE *pfile = fopen(CONFIG_FILE, "w");
for (int i = 0; i < configLines.size(); i++) { for (int i = 0; i < configLines.size(); i++) {
if (!isInString(configLines[i], ";UNUSED_PARAMETER")) {
fwrite(configLines[i].c_str(), configLines[i].length(), 1, pfile); fwrite(configLines[i].c_str(), configLines[i].length(), 1, pfile);
fwrite("\n", 1, 1, pfile); fwrite("\n", 1, 1, pfile);
} }
}
fclose(pfile); fclose(pfile);
LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Config file migrated. Saved backup to " + string(CONFIG_FILE_BACKUP)); LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Config file migrated. Saved backup to " + string(CONFIG_FILE_BACKUP));
} }

View File

@@ -1,4 +1,4 @@
# Parameter `<NUMBER>.AnalogDigitTransitionStart` # Parameter `<NUMBER>.AnalogToDigitTransitionStart`
Default Value: `9.2` Default Value: `9.2`
This can be used if you have wrong values, but the recognition of the individual ROIs are correct. This can be used if you have wrong values, but the recognition of the individual ROIs are correct.

View File

@@ -6,7 +6,7 @@
range on OV3660 and OV5640 (0 .. 8) range on OV3660 and OV5640 (0 .. 8)
Default Value: `true` Default Value: `0`
See [here](../datasheets/Camera.ov2640_ds_1.8_.pdf) for the ov2640 camera datasheet.<br> See [here](../datasheets/Camera.ov2640_ds_1.8_.pdf) for the ov2640 camera datasheet.<br>
See [here](../datasheets/OV5640_datasheet.pdf) for the ov5640 camera datasheet. See [here](../datasheets/OV5640_datasheet.pdf) for the ov5640 camera datasheet.

View File

@@ -36,11 +36,9 @@ Demo = false
[Alignment] [Alignment]
InitialRotate = 0.0 InitialRotate = 0.0
InitialMirror = false
SearchFieldX = 20 SearchFieldX = 20
SearchFieldY = 20 SearchFieldY = 20
AlignmentAlgo = Default AlignmentAlgo = Default
FlipImageSize = false
/config/ref0.jpg 103 271 /config/ref0.jpg 103 271
/config/ref1.jpg 442 142 /config/ref1.jpg 442 142
@@ -103,7 +101,7 @@ HomeassistantDiscovery = false
;Measurement = undefined ;Measurement = undefined
;Org = undefined ;Org = undefined
;Token = undefined ;Token = undefined
;main.Fieldname = undefined ;main.Field = undefined
;[Webhook] ;[Webhook]
;Uri = undefined ;Uri = undefined

View File

@@ -363,8 +363,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAutoSharpness_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAutoSharpness_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAutoSharpness</td> <td>$TOOLTIP_TakeImage_CamAutoSharpness</td>
@@ -421,8 +421,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAwb_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAwb_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAwb</td> <td>$TOOLTIP_TakeImage_CamAwb</td>
@@ -434,8 +434,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAwbGain_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAwbGain_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAwbGain</td> <td>$TOOLTIP_TakeImage_CamAwbGain</td>
@@ -447,8 +447,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAec_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAec_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAec</td> <td>$TOOLTIP_TakeImage_CamAec</td>
@@ -460,8 +460,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAec2_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAec2_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAec2</td> <td>$TOOLTIP_TakeImage_CamAec2</td>
@@ -495,8 +495,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAgc_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAgc_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAgc</td> <td>$TOOLTIP_TakeImage_CamAgc</td>
@@ -520,8 +520,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamBpc_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamBpc_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamBpc</td> <td>$TOOLTIP_TakeImage_CamBpc</td>
@@ -533,8 +533,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamWpc_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamWpc_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamWpc</td> <td>$TOOLTIP_TakeImage_CamWpc</td>
@@ -546,8 +546,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamRawGma_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamRawGma_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamRawGma</td> <td>$TOOLTIP_TakeImage_CamRawGma</td>
@@ -559,8 +559,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamLenc_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamLenc_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamLenc</td> <td>$TOOLTIP_TakeImage_CamLenc</td>
@@ -572,8 +572,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamHmirror_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamHmirror_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamHmirror</td> <td>$TOOLTIP_TakeImage_CamHmirror</td>
@@ -585,8 +585,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamVflip_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamVflip_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamVflip</td> <td>$TOOLTIP_TakeImage_CamVflip</td>
@@ -598,8 +598,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamDcw_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamDcw_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamDcw</td> <td>$TOOLTIP_TakeImage_CamDcw</td>
@@ -622,8 +622,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamZoom_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamZoom_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamZoom</td> <td>$TOOLTIP_TakeImage_CamZoom</td>
@@ -681,8 +681,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_Demo_value1"> <select id="TakeImage_Demo_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_Demo</td> <td>$TOOLTIP_TakeImage_Demo</td>
@@ -850,8 +850,8 @@
</td> </td>
<td> <td>
<select id="PostProcessing_PreValueUse_value1"> <select id="PostProcessing_PreValueUse_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_PostProcessing_PreValueUse</td> <td>$TOOLTIP_PostProcessing_PreValueUse</td>
@@ -875,8 +875,8 @@
</td> </td>
<td> <td>
<select id="PostProcessing_ErrorMessage_value1"> <select id="PostProcessing_ErrorMessage_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_PostProcessing_ErrorMessage</td> <td>$TOOLTIP_PostProcessing_ErrorMessage</td>
@@ -888,8 +888,8 @@
</td> </td>
<td> <td>
<select id="PostProcessing_CheckDigitIncreaseConsistency_value1"> <select id="PostProcessing_CheckDigitIncreaseConsistency_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_PostProcessing_CheckDigitIncreaseConsistency</td> <td>$TOOLTIP_PostProcessing_CheckDigitIncreaseConsistency</td>
@@ -910,8 +910,8 @@
</td> </td>
<td> <td>
<select id="PostProcessing_AllowNegativeRates_value1"> <select id="PostProcessing_AllowNegativeRates_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_PostProcessing_NUMBER.AllowNegativeRates</td> <td>$TOOLTIP_PostProcessing_NUMBER.AllowNegativeRates</td>
@@ -933,7 +933,7 @@
<tr> <tr>
<td class="indent2"> <td class="indent2">
<input type="checkbox" id="PostProcessing_AnalogToDigitTransitionStart_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "AnalogToDigitTransitionStart")' unchecked > <input type="checkbox" id="PostProcessing_AnalogToDigitTransitionStart_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "AnalogToDigitTransitionStart")' unchecked >
<label for=PostProcessing_AnalogToDigitTransitionStart_enabled><class id="PostProcessing_AnalogToDigitTransitionStart_text" style="color:black;">Analog/Digital Transition Start</class></label> <label for=PostProcessing_AnalogToDigitTransitionStart_enabled><class id="PostProcessing_AnalogToDigitTransitionStart_text" style="color:black;">Analogto Digit Transition Start</class></label>
</td> </td>
<td> <td>
<input required type="number" id="PostProcessing_AnalogToDigitTransitionStart_value1" step="0.1" min="5.0" max="9.9" value="9.2" <input required type="number" id="PostProcessing_AnalogToDigitTransitionStart_value1" step="0.1" min="5.0" max="9.9" value="9.2"
@@ -988,8 +988,8 @@
</td> </td>
<td> <td>
<select id="PostProcessing_ExtendedResolution_value1"> <select id="PostProcessing_ExtendedResolution_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_PostProcessing_NUMBER.ExtendedResolution</td> <td>$TOOLTIP_PostProcessing_NUMBER.ExtendedResolution</td>
@@ -1001,8 +1001,8 @@
</td> </td>
<td> <td>
<select id="PostProcessing_IgnoreLeadingNaN_value1"> <select id="PostProcessing_IgnoreLeadingNaN_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_PostProcessing_NUMBER.IgnoreLeadingNaN</td> <td>$TOOLTIP_PostProcessing_NUMBER.IgnoreLeadingNaN</td>
@@ -1014,8 +1014,8 @@
</td> </td>
<td> <td>
<select id="PostProcessing_IgnoreAllNaN_value1"> <select id="PostProcessing_IgnoreAllNaN_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_PostProcessing_NUMBER.IgnoreAllNaN</td> <td>$TOOLTIP_PostProcessing_NUMBER.IgnoreAllNaN</td>
@@ -1126,8 +1126,8 @@
</td> </td>
<td> <td>
<select id="MQTT_RetainMessages_value1"> <select id="MQTT_RetainMessages_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_MQTT_RetainMessages</td> <td>$TOOLTIP_MQTT_RetainMessages</td>
@@ -1148,8 +1148,8 @@
</td> </td>
<td> <td>
<select id="MQTT_HomeassistantDiscovery_value1"> <select id="MQTT_HomeassistantDiscovery_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_MQTT_HomeassistantDiscovery</td> <td>$TOOLTIP_MQTT_HomeassistantDiscovery</td>
@@ -1900,8 +1900,8 @@
</td> </td>
<td> <td>
<select id="AutoTimer_AutoStart_value1"> <select id="AutoTimer_AutoStart_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_AutoTimer_AutoStart</td> <td>$TOOLTIP_AutoTimer_AutoStart</td>
@@ -1930,8 +1930,8 @@
</td> </td>
<td> <td>
<select id="DataLogging_DataLogActive_value1"> <select id="DataLogging_DataLogActive_value1">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_DataLogging_DataLogActive</td> <td>$TOOLTIP_DataLogging_DataLogActive</td>
@@ -2053,8 +2053,8 @@
</td> </td>
<td> <td>
<select id="System_Tooltip_value1" onchange="UpdateTooltipModus()"> <select id="System_Tooltip_value1" onchange="UpdateTooltipModus()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td></td> <td></td>
@@ -2323,7 +2323,7 @@ function UpdateInput() {
WriteParameter(param, category, "Webhook", "Uri", true); WriteParameter(param, category, "Webhook", "Uri", true);
WriteParameter(param, category, "Webhook", "ApiKey", true); WriteParameter(param, category, "Webhook", "ApiKey", true);
WriteParameter(param, category, "Webhook", "UploadImg", true); WriteParameter(param, category, "Webhook", "UploadImg", false);
WriteParameter(param, category, "GPIO", "IO0", true); WriteParameter(param, category, "GPIO", "IO0", true);
WriteParameter(param, category, "GPIO", "IO1", true); WriteParameter(param, category, "GPIO", "IO1", true);
@@ -2374,12 +2374,12 @@ function WriteModelFiles() {
var text = list_tflite[i].replace("/config/", ""); var text = list_tflite[i].replace("/config/", "");
if (list_tflite[i].includes("/dig")) { // Its a digital file, only show in the digital list box if (list_tflite[i].includes("/dig")) { // Its a digit file, only show in the digits list box
optionDig.text = text; optionDig.text = text;
optionDig.value = list_tflite[i]; optionDig.value = list_tflite[i];
_indexDig.add(optionDig); _indexDig.add(optionDig);
} }
else if (list_tflite[i].includes("/ana")) { // Its a digital file, only show in the analog list box else if (list_tflite[i].includes("/ana")) { // Its a digit file, only show in the analog list box
optionAna.text = text; optionAna.text = text;
optionAna.value = list_tflite[i]; optionAna.value = list_tflite[i];
_indexAna.add(optionAna); _indexAna.add(optionAna);
@@ -2489,7 +2489,7 @@ function ReadParameterAll() {
ReadParameter(param, "Webhook", "Uri", true); ReadParameter(param, "Webhook", "Uri", true);
ReadParameter(param, "Webhook", "ApiKey", true); ReadParameter(param, "Webhook", "ApiKey", true);
ReadParameter(param, "Webhook", "UploadImg", true); ReadParameter(param, "Webhook", "UploadImg", false);
ReadParameter(param, "GPIO", "IO0", true); ReadParameter(param, "GPIO", "IO0", true);
ReadParameter(param, "GPIO", "IO1", true); ReadParameter(param, "GPIO", "IO1", true);

View File

@@ -52,8 +52,11 @@ p {font-size: 1em;}
firework.launch('Setup mode could not be deactivated! Please try again!', 'danger', 30000); firework.launch('Setup mode could not be deactivated! Please try again!', 'danger', 30000);
return; return;
} }
ParseConfig();
param = getConfigParameters(); // ParseConfig();
// param = getConfigParameters();
param = getCamConfig();
param["System"]["SetupMode"]["enabled"] = true; param["System"]["SetupMode"]["enabled"] = true;
param["System"]["SetupMode"]["value1"] = "false"; param["System"]["SetupMode"]["value1"] = "false";

View File

@@ -174,8 +174,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamZoom_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamZoom_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamZoom</td> <td>$TOOLTIP_TakeImage_CamZoom</td>
@@ -232,8 +232,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAec2_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAec2_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAec2</td> <td>$TOOLTIP_TakeImage_CamAec2</td>
@@ -245,8 +245,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamHmirror_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamHmirror_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamHmirror</td> <td>$TOOLTIP_TakeImage_CamHmirror</td>
@@ -267,8 +267,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamVflip_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamVflip_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamVflip</td> <td>$TOOLTIP_TakeImage_CamVflip</td>
@@ -332,8 +332,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAec_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAec_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAec</td> <td>$TOOLTIP_TakeImage_CamAec</td>
@@ -355,8 +355,8 @@
</td> </td>
<td> <td>
<select id="TakeImage_CamAutoSharpness_value1" onchange="cameraParameterChanged()"> <select id="TakeImage_CamAutoSharpness_value1" onchange="cameraParameterChanged()">
<option value="true">enable</option> <option value="true">enable (true)</option>
<option value="false" selected>disable</option> <option value="false" selected>disable (false)</option>
</select> </select>
</td> </td>
<td>$TOOLTIP_TakeImage_CamAutoSharpness</td> <td>$TOOLTIP_TakeImage_CamAutoSharpness</td>