From da9d3a1f39268c177cd3cfa5f18aa74099fc7461 Mon Sep 17 00:00:00 2001 From: willem Date: Mon, 1 Jul 2024 23:05:02 +0200 Subject: [PATCH] clean-up --- .../.github/ISSUE_TEMPLATE/bug_report.md | 28 - .../.github/ISSUE_TEMPLATE/feature_request.md | 21 - SmartEVSE-3/.github/workflows/pio-build.yaml | 130 - .../.github/workflows/pio-release.yaml | 62 - SmartEVSE-3/.gitignore | 11 - SmartEVSE-3/LICENSE | 21 - SmartEVSE-3/README.md | 65 - SmartEVSE-3/SmartEVSE-3/.gitignore | 5 - SmartEVSE-3/SmartEVSE-3/CMakeLists.txt | 3 - SmartEVSE-3/SmartEVSE-3/HowToFlash.txt | 5 - SmartEVSE-3/SmartEVSE-3/data/cert.pem | 13 - SmartEVSE-3/SmartEVSE-3/data/favicon.ico | Bin 12838 -> 0 bytes SmartEVSE-3/SmartEVSE-3/data/index.html | 1035 - SmartEVSE-3/SmartEVSE-3/data/key.pem | 5 - SmartEVSE-3/SmartEVSE-3/data/rsa_key.pub | 14 - SmartEVSE-3/SmartEVSE-3/data/styling.css | 10 - SmartEVSE-3/SmartEVSE-3/data/update2.html | 173 - SmartEVSE-3/SmartEVSE-3/data/update3.html | 43 - SmartEVSE-3/SmartEVSE-3/include/OneWire.h | 36 - SmartEVSE-3/SmartEVSE-3/include/README | 39 - SmartEVSE-3/SmartEVSE-3/include/evse.h | 592 - SmartEVSE-3/SmartEVSE-3/include/glcd.h | 42 - SmartEVSE-3/SmartEVSE-3/include/modbus.h | 71 - SmartEVSE-3/SmartEVSE-3/include/mongoose.h | 2930 --- SmartEVSE-3/SmartEVSE-3/include/utils.h | 40 - SmartEVSE-3/SmartEVSE-3/lib/README | 45 - .../.github/ISSUE_TEMPLATE/bug_report.md | 29 - .../.github/ISSUE_TEMPLATE/feature_request.md | 17 - .../SmartEVSE-3/lib/RemoteDebug/.gitignore | 1 - .../SmartEVSE-3/lib/RemoteDebug/LICENSE.txt | 21 - .../SmartEVSE-3/lib/RemoteDebug/README.md | 737 - .../RemoteDebug_Advanced.ino | 634 - .../RemoteDebug_Basic/RemoteDebug_Basic.ino | 244 - .../RemoteDebug_Debugger.ino | 893 - .../extras/readme_media/install.png | Bin 352092 -> 0 bytes .../RemoteDebug/extras/readme_media/logo.png | Bin 17365 -> 0 bytes .../readme_media/remotedebug_telnet.png | Bin 167307 -> 0 bytes .../extras/readme_media/remotedebug_v2.png | Bin 91432 -> 0 bytes .../readme_media/remotedebug_webapp.png | Bin 276379 -> 0 bytes .../extras/readme_media/remotedebugapp.png | Bin 472745 -> 0 bytes .../SmartEVSE-3/lib/RemoteDebug/library.json | 14 - .../lib/RemoteDebug/library.properties | 9 - .../lib/RemoteDebug/src/RemoteDebug.cpp | 2015 -- .../lib/RemoteDebug/src/RemoteDebug.h | 459 - .../lib/RemoteDebug/src/RemoteDebugCfg.h | 135 - .../SmartEVSE-3/lib/RemoteDebug/src/telnet.h | 88 - SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/LICENSE | 24 - .../SmartEVSE-3/lib/esp32FOTA/README.md | 518 - .../lib/esp32FOTA/examples/HTTP/HTTP/HTTP.ino | 60 - .../esp32FOTA/examples/HTTP/HTTPS/HTTPS.ino | 71 - .../HTTPS_without_root_cert.ino | 65 - .../HTTP_signature_check.ino | 70 - .../lib/esp32FOTA/examples/anyFS/anyFS.ino | 129 - .../esp32FOTA/examples/anyFS/data/root_ca.pem | 22 - .../test/1.1.nosecurity/1.1.nosecurity.ino | 84 - .../1.2.nosecurity.gz/1.2.nosecurity.gz.ino | 88 - .../1.3.nosecurity.zz/1.3.nosecurity.zz.ino | 87 - .../2.cert-in-spiffs/2.cert-in-spiffs.ino | 99 - .../test/2.cert-in-spiffs/data/root_ca.pem | 22 - .../3.cert-in-progmem/3.cert-in-progmem.ino | 93 - .../anyFS/test/3.cert-in-progmem/root_ca.h | 25 - .../4.cert-in-littlefs/4.cert-in-littlefs.ino | 99 - .../test/4.cert-in-littlefs/data/root_ca.pem | 22 - .../5.sig-in-progmem/5.sig-in-progmem.ino | 93 - .../anyFS/test/5.sig-in-progmem/pub_key.h | 25 - .../anyFS/test/5.sig-in-progmem/root_ca.h | 25 - .../test/99.final-stage/99.final-stage.ino | 20 - .../examples/forceUpdate/forceUpdate.ino | 61 - .../examples/withDeviceID/withDeviceID.ino | 62 - .../lib/esp32FOTA/fota/firmware.json | 7 - .../SmartEVSE-3/lib/esp32FOTA/keywords.txt | 22 - .../SmartEVSE-3/lib/esp32FOTA/library.json | 30 - .../lib/esp32FOTA/library.properties | 11 - .../SmartEVSE-3/lib/esp32FOTA/platformio.ini | 52 - .../esp32FOTA/src/debug/test_fota_common.h | 50 - .../lib/esp32FOTA/src/esp32FOTA.cpp | 1081 -- .../lib/esp32FOTA/src/esp32FOTA.hpp | 395 - .../SmartEVSE-3/lib/esp32FOTA/src/esp32fota.h | 14 - .../lib/esp32FOTA/src/semver/README.md | 233 - .../lib/esp32FOTA/src/semver/semver.c | 638 - .../lib/esp32FOTA/src/semver/semver.h | 62 - SmartEVSE-3/SmartEVSE-3/pack.py | 117 - SmartEVSE-3/SmartEVSE-3/packfs.py | 34 - .../partitions_custom.csv.coredump | 8 - SmartEVSE-3/SmartEVSE-3/platformio.ini | 42 - SmartEVSE-3/SmartEVSE-3/release | 1 - SmartEVSE-3/SmartEVSE-3/src/CMakeLists.txt | 6 - SmartEVSE-3/SmartEVSE-3/src/OneWire.cpp | 341 - SmartEVSE-3/SmartEVSE-3/src/evse.cpp | 5359 ------ SmartEVSE-3/SmartEVSE-3/src/font.cpp | 266 - SmartEVSE-3/SmartEVSE-3/src/font2.cpp | 270 - SmartEVSE-3/SmartEVSE-3/src/glcd.cpp | 1215 -- SmartEVSE-3/SmartEVSE-3/src/modbus.cpp | 690 - SmartEVSE-3/SmartEVSE-3/src/mongoose.c | 15692 ---------------- SmartEVSE-3/SmartEVSE-3/src/utils.cpp | 150 - SmartEVSE-3/SmartEVSE-3/test/README | 11 - SmartEVSE-3/SmartEVSE-3/test/feed_bat.sh | 19 - SmartEVSE-3/SmartEVSE-3/test/feed_ev.sh | 22 - SmartEVSE-3/SmartEVSE-3/test/feed_mains.sh | 20 - SmartEVSE-3/SmartEVSE-3/test/tests.sh | 743 - SmartEVSE-3/coredumping.txt | 26 - SmartEVSE-3/docs/REST_API.md | 185 - SmartEVSE-3/docs/SmartEVSEv3_build.pdf | Bin 253035 -> 0 bytes SmartEVSE-3/docs/configuration.md | 256 - SmartEVSE-3/docs/installation.md | 67 - SmartEVSE-3/docs/operation.md | 80 - SmartEVSE-3/integrations/README.md | 10 - .../home-assistant/HASS-Node-RED.json | 442 - .../home-assistant/configuration.yaml | 148 - .../esphome/ET-SM01 smart meter module.yaml | 164 - .../home-assistant/mqtt-configuration.yaml | 44 - .../p1_dsmr_to_SmartEVSE_API/automations.yaml | 11 - .../configuration.yaml | 38 - SmartEVSE-3/pictures/SmartEVSEv3.png | Bin 317134 -> 0 bytes SmartEVSE-3/schematic/SmartEVSEv3.pdf | Bin 104057 -> 0 bytes SmartEVSE-3/sign_firmware/check_rsa_verify.sh | 9 - SmartEVSE-3/sign_firmware/rsa_key.pub | 14 - 117 files changed, 41694 deletions(-) delete mode 100644 SmartEVSE-3/.github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 SmartEVSE-3/.github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 SmartEVSE-3/.github/workflows/pio-build.yaml delete mode 100644 SmartEVSE-3/.github/workflows/pio-release.yaml delete mode 100644 SmartEVSE-3/.gitignore delete mode 100644 SmartEVSE-3/LICENSE delete mode 100644 SmartEVSE-3/README.md delete mode 100644 SmartEVSE-3/SmartEVSE-3/.gitignore delete mode 100644 SmartEVSE-3/SmartEVSE-3/CMakeLists.txt delete mode 100644 SmartEVSE-3/SmartEVSE-3/HowToFlash.txt delete mode 100644 SmartEVSE-3/SmartEVSE-3/data/cert.pem delete mode 100644 SmartEVSE-3/SmartEVSE-3/data/favicon.ico delete mode 100644 SmartEVSE-3/SmartEVSE-3/data/index.html delete mode 100644 SmartEVSE-3/SmartEVSE-3/data/key.pem delete mode 100644 SmartEVSE-3/SmartEVSE-3/data/rsa_key.pub delete mode 100644 SmartEVSE-3/SmartEVSE-3/data/styling.css delete mode 100644 SmartEVSE-3/SmartEVSE-3/data/update2.html delete mode 100644 SmartEVSE-3/SmartEVSE-3/data/update3.html delete mode 100644 SmartEVSE-3/SmartEVSE-3/include/OneWire.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/include/README delete mode 100644 SmartEVSE-3/SmartEVSE-3/include/evse.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/include/glcd.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/include/modbus.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/include/mongoose.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/include/utils.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/README delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.gitignore delete mode 100755 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/LICENSE.txt delete mode 100755 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/README.md delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Advanced/RemoteDebug_Advanced.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Basic/RemoteDebug_Basic.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Debugger/RemoteDebug_Debugger.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/install.png delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/logo.png delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebug_telnet.png delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebug_v2.png delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebug_webapp.png delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebugapp.png delete mode 100755 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/library.json delete mode 100755 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/library.properties delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebug.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebug.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebugCfg.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/telnet.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/LICENSE delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/README.md delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTP/HTTP.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTPS/HTTPS.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTPS_without_root_cert/HTTPS_without_root_cert.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTP_signature_check/HTTP_signature_check.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/anyFS.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/data/root_ca.pem delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.1.nosecurity/1.1.nosecurity.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.2.nosecurity.gz/1.2.nosecurity.gz.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.3.nosecurity.zz/1.3.nosecurity.zz.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/2.cert-in-spiffs/2.cert-in-spiffs.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/2.cert-in-spiffs/data/root_ca.pem delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/3.cert-in-progmem/3.cert-in-progmem.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/3.cert-in-progmem/root_ca.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/4.cert-in-littlefs/4.cert-in-littlefs.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/4.cert-in-littlefs/data/root_ca.pem delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/5.sig-in-progmem.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/pub_key.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/root_ca.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/99.final-stage/99.final-stage.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/forceUpdate/forceUpdate.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/withDeviceID/withDeviceID.ino delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/fota/firmware.json delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/keywords.txt delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/library.json delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/library.properties delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/platformio.ini delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/debug/test_fota_common.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32FOTA.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32FOTA.hpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32fota.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/README.md delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/semver.c delete mode 100644 SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/semver.h delete mode 100644 SmartEVSE-3/SmartEVSE-3/pack.py delete mode 100644 SmartEVSE-3/SmartEVSE-3/packfs.py delete mode 100644 SmartEVSE-3/SmartEVSE-3/partitions_custom.csv.coredump delete mode 100644 SmartEVSE-3/SmartEVSE-3/platformio.ini delete mode 120000 SmartEVSE-3/SmartEVSE-3/release delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/CMakeLists.txt delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/OneWire.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/evse.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/font.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/font2.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/glcd.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/modbus.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/mongoose.c delete mode 100644 SmartEVSE-3/SmartEVSE-3/src/utils.cpp delete mode 100644 SmartEVSE-3/SmartEVSE-3/test/README delete mode 100755 SmartEVSE-3/SmartEVSE-3/test/feed_bat.sh delete mode 100755 SmartEVSE-3/SmartEVSE-3/test/feed_ev.sh delete mode 100755 SmartEVSE-3/SmartEVSE-3/test/feed_mains.sh delete mode 100755 SmartEVSE-3/SmartEVSE-3/test/tests.sh delete mode 100755 SmartEVSE-3/coredumping.txt delete mode 100644 SmartEVSE-3/docs/REST_API.md delete mode 100644 SmartEVSE-3/docs/SmartEVSEv3_build.pdf delete mode 100644 SmartEVSE-3/docs/configuration.md delete mode 100644 SmartEVSE-3/docs/installation.md delete mode 100644 SmartEVSE-3/docs/operation.md delete mode 100644 SmartEVSE-3/integrations/README.md delete mode 100644 SmartEVSE-3/integrations/home-assistant/HASS-Node-RED.json delete mode 100644 SmartEVSE-3/integrations/home-assistant/configuration.yaml delete mode 100644 SmartEVSE-3/integrations/home-assistant/esphome/ET-SM01 smart meter module.yaml delete mode 100644 SmartEVSE-3/integrations/home-assistant/mqtt-configuration.yaml delete mode 100644 SmartEVSE-3/integrations/home-assistant/p1_dsmr_to_SmartEVSE_API/automations.yaml delete mode 100644 SmartEVSE-3/integrations/home-assistant/p1_dsmr_to_SmartEVSE_API/configuration.yaml delete mode 100644 SmartEVSE-3/pictures/SmartEVSEv3.png delete mode 100644 SmartEVSE-3/schematic/SmartEVSEv3.pdf delete mode 100755 SmartEVSE-3/sign_firmware/check_rsa_verify.sh delete mode 100644 SmartEVSE-3/sign_firmware/rsa_key.pub diff --git a/SmartEVSE-3/.github/ISSUE_TEMPLATE/bug_report.md b/SmartEVSE-3/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 19620f9..0000000 --- a/SmartEVSE-3/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**Upload your config** -Press the "raw" button in the SmartEVSE webserver and upload the json settings file, so we can look at your configuration. - -**Upload a debug log** -Flash the debug version of the firmware (see https://github.com/dingo35/SmartEVSE-3.5/blob/master/SmartEVSE-3/HowToFlash.txt), telnet to your device, capture the debug log, cut it so that it shows JUST BEFORE and JUST AFTER the problem arises, and upload it here. - -**To Reproduce** -Steps to reproduce the behavior: -1. What Mode are you in? Normal, Smart or Solar? -2. What steps do you take so the problem arises? - -**Expected behavior** -A clear and concise description of what you expected to happen; expected Charging Current? - -**Screenshots** -Only add screenshots if it adds any information, e.g. when you are reporting a problem on the webserver screen. diff --git a/SmartEVSE-3/.github/ISSUE_TEMPLATE/feature_request.md b/SmartEVSE-3/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 1b87256..0000000 --- a/SmartEVSE-3/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -ALSO, if your feature request relates to any reported issues previously, please LINK them here! - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/SmartEVSE-3/.github/workflows/pio-build.yaml b/SmartEVSE-3/.github/workflows/pio-build.yaml deleted file mode 100644 index 198a913..0000000 --- a/SmartEVSE-3/.github/workflows/pio-build.yaml +++ /dev/null @@ -1,130 +0,0 @@ -name: PlatformIO CI -on: - workflow_call: - inputs: - major: - required: true - type: string - minor: - required: true - type: string - patch: - required: true - type: string - prerelease: - required: false - type: string - outputs: - artifact: - description: "The first output string" - value: ${{ jobs.build.outputs.artifact }} - push: - branches: - - master - - release/* -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Get current branch - id: branch - run: echo "branch=${GITHUB_REF##*/}" >> $GITHUB_OUTPUT - - name: Get current datetime - id: datetime - run: echo "datetime=$(date +'%Y%m%dT%H%M%S')" >> $GITHUB_OUTPUT - - name: Get current time - id: time - run: echo "time=$(date +'%H%M%S')" >> $GITHUB_OUTPUT - - name: Get version - id: version - shell: bash - run: | - if [ -z "${{ inputs.major }}" ] - then - echo "version=${{ steps.time.outputs.time }}" >> $GITHUB_OUTPUT - else - if [ -z "${{ inputs.prerelease }}" ] - then - echo "version=${{ inputs.major }}.${{ inputs.minor }}.${{ inputs.patch }}" >> $GITHUB_OUTPUT - else - echo "version=${{ inputs.major }}.${{ inputs.minor }}.${{ inputs.patch }}-${{ inputs.prerelease }}" >> $GITHUB_OUTPUT - fi - fi - - uses: actions/checkout@v3 - - name: Cache pip - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: '${{ runner.os }}-pip-${{ hashFiles(''**/requirements.txt'') }}' - restore-keys: | - ${{ runner.os }}-pip- - - name: Cache PlatformIO - uses: actions/cache@v3 - with: - path: ~/.platformio - key: '${{ runner.os }}-${{ hashFiles(''**/lockfiles'') }}' - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - name: Install PlatformIO - run: | - python -m pip install --upgrade pip - pip install --upgrade platformio - - name: Install libs - run: | - cd SmartEVSE-3 - pio lib install - - name: Build normal version - env: - super_secret: ${{ secrets.SECRET_RSA_KEY }} - run: | - PLATFORMIO_BUILD_FLAGS='-DVERSION=\"v${{ steps.version.outputs.version }}\" -DDBG=0' pio run -d SmartEVSE-3/ - # Create a temporary file - secret_file=$(mktemp) - # Write the secret to the temporary file, because passing it as command line argument might reveal it for users using ps -a - echo "$super_secret" > "$secret_file" - # Create signature file - openssl dgst -sign "$secret_file" -keyform PEM -sha256 -out firmware.sign -binary ./SmartEVSE-3/.pio/build/release/firmware.bin - # throw it all in one file - cat firmware.sign ./SmartEVSE-3/.pio/build/release/firmware.bin > ./SmartEVSE-3/.pio/build/release/firmware.signed.bin - # Remove the temporary file - rm -f "$secret_file" - - name: Upload firmware.bin - uses: actions/upload-artifact@v3 - with: - name: dists_zip - path: ./SmartEVSE-3/.pio/build/release/*.bin - retention-days: 10 - - name: Upload HowToFlash.txt - uses: actions/upload-artifact@v3 - with: - name: dists_zip - path: ./SmartEVSE-3/HowToFlash.txt - retention-days: 10 - - name: Build debug version - env: - super_secret: ${{ secrets.SECRET_RSA_KEY }} - run: | - PLATFORMIO_BUILD_FLAGS='-DVERSION=\"v${{ steps.version.outputs.version }}\" -DDBG=1' pio run -d SmartEVSE-3/ - # Create a temporary file - secret_file=$(mktemp) - # Write the secret to the temporary file, because passing it as command line argument might reveal it for users using ps -a - echo "$super_secret" > "$secret_file" - # Create signature file - openssl dgst -sign "$secret_file" -keyform PEM -sha256 -out firmware.sign -binary ./SmartEVSE-3/.pio/build/release/firmware.bin - # throw it all in one file - cat firmware.sign ./SmartEVSE-3/.pio/build/release/firmware.bin > ./SmartEVSE-3/.pio/build/release/firmware.signed.bin - # Remove the temporary file - rm -f "$secret_file" - mv ./SmartEVSE-3/.pio/build/release/firmware.bin ./SmartEVSE-3/.pio/build/release/firmware.debug.bin - mv ./SmartEVSE-3/.pio/build/release/firmware.signed.bin ./SmartEVSE-3/.pio/build/release/firmware.debug.signed.bin - - name: Upload Artifact debug firmware - uses: actions/upload-artifact@v3 - with: - name: dists_zip - path: ./SmartEVSE-3/.pio/build/release/*.bin - retention-days: 10 - - outputs: - artifact: dists_zip diff --git a/SmartEVSE-3/.github/workflows/pio-release.yaml b/SmartEVSE-3/.github/workflows/pio-release.yaml deleted file mode 100644 index 680cb4f..0000000 --- a/SmartEVSE-3/.github/workflows/pio-release.yaml +++ /dev/null @@ -1,62 +0,0 @@ -on: - push: - tags: - - 'v*' - -name: Create Release -jobs: - version: - runs-on: ubuntu-latest - steps: - - id: get_version - uses: battila7/get-version-action@v2 - outputs: - major: ${{ steps.get_version.outputs.major }} - minor: ${{ steps.get_version.outputs.minor }} - patch: ${{ steps.get_version.outputs.patch }} - prerelease: ${{ steps.get_version.outputs.prerelease }} - build: - needs: version - uses: ./.github/workflows/pio-build.yaml - with: - major: ${{ needs.version.outputs.major }} - minor: ${{ needs.version.outputs.minor }} - patch: ${{ needs.version.outputs.patch }} - prerelease: ${{ needs.version.outputs.prerelease }} - secrets: inherit - release: - permissions: write-all - needs: build - name: Upload Release Asset - runs-on: ubuntu-latest - steps: - - name: Get current tag - id: tag - run: echo "tag=${GITHUB_REF##*/}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v3 - - uses: actions/download-artifact@v3 - id: download - with: - path: dist - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: Release ${{ github.ref }} - draft: false - prerelease: true - - name: Zip - run: zip -j ${{ steps.tag.outputs.tag }}-dist.zip ./dist/${{ needs.build.outputs.artifact }}/* - - name: Upload Release Asset - id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./${{ steps.tag.outputs.tag }}-dist.zip - asset_name: ${{ steps.tag.outputs.tag }}-dist.zip - asset_content_type: application/zip diff --git a/SmartEVSE-3/.gitignore b/SmartEVSE-3/.gitignore deleted file mode 100644 index add810d..0000000 --- a/SmartEVSE-3/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.pio -.log -sdkconfig.* -*/.vscode/.browse.c_cpp.db* -*/.vscode/c_cpp_properties.json -*/.vscode/launch.json -*/.vscode/ipch - -.DS_Store -*/.DS_Store -.idea diff --git a/SmartEVSE-3/LICENSE b/SmartEVSE-3/LICENSE deleted file mode 100644 index 99ea426..0000000 --- a/SmartEVSE-3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 SmartEVSE - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/SmartEVSE-3/README.md b/SmartEVSE-3/README.md deleted file mode 100644 index bae3886..0000000 --- a/SmartEVSE-3/README.md +++ /dev/null @@ -1,65 +0,0 @@ -SmartEVSE v3 -========= - -Smart Electric Vehicle Charge Controller - -![Image of SmartEVSE](/pictures/SmartEVSEv3.png) - -# What is it? - -It's an open source EVSE (Electric Vehicle Supply Equipment). It supports 1-3 phase charging, fixed charging cable or charging socket. Locking actuator support (5 different types). And it can directly drive a mains contactor for supplying power to the EV. It features a display from which all module parameters can be configured.
-Up to 8 modules can be connected together to charge up to eight EV's from one mains connection without overloading it.
-The mains connection can be monitored by the (optional) sensorbox or a modbus kWh meter. This allows smart charging. -Communication between the SmartEVSE(s) / Sensorbox or kWh meters is done over RS485(modbus). - - -# Features - -- Fits into a standard DIN rail enclosure. -- Measures the current consumption of other appliances, and automatically lowers or increases the charging current to the EV. (sensorbox required) -- The load balancing feature let's you connect up to 8 SmartEVSE's to one mains supply. -- Two switched 230VAC outputs, for contactors. -- Powered RS485 communication bus for sensorbox / Modbus kWh Meters. -- Can be used with fixed cable, or socket and charging cable. -- Automatically selects current capacity of the connected cable (13/16/32A) -- Locking actuator support, locks the charging cable in the socket. -- RFID reader support, restrict the use of the charging station to max 20 RFID cards. -- An optional modbus kWh meter will measure power and charged energy, and display this on the LCD. -- Built-in temperature sensor. -- RGB led output for status information while charging. -- All module parameters can be configured using the display and buttons. -- WiFi status page. -- Firmware upgradable through USB-C port or through the built in webserver. -- REST API for communication with external software (e.g. HomeAssistant) -- MQTT API -- Rudimentary support for home batteries -- Supporting delayed charging - -# Connecting the SmartESVE to WiFi - -In order to connect the SmartEVSE to your local WiFi network, a temporarily hotspot is created by the SmartESVE to which you can connect using a phone/tablet. -Here you can then scan for your local WiFi, and enter your Wifi network password. Then the SmartEVSE will use this information to connect to your local Wifi network. - -The steps to connect the SmartEVSE to Wifi are as follows: -- in the SmartEVSE menu, go to the option WIFI, then select SetupWiFi. -- after 10 seconds, a hotspot/access point SmartESVE-xxxx is started. (xxxx is the serial nr of your SmartEVSE) -- Using a phone or tablet, connect to this access point. -- You will be asked to enter a password. This password is visible on the top right corner of the SmartEVSE's display. (PW:xxxxxxxx) -- Once connected you will be able to select your local WiFi network, and enter the password for this network. -- click SAVE, the SmartEVSE will try to connect to your local WiFi network. -- Enter the menu of your SmartEVSE again. The SmartEVSE should now display the IP address on the top row of the display. -- use this IP address in a webbrowser to connect to the webserver of the controller. You can also use http://smartevse-xxxx.local (replace xxxx with the serial nr of your controller) - -# Updating Firmware - -Connect the SmartEVSE controller to your WiFi network (using the menu of the SmartEVSE), and then browse to http://IPaddress/update where IPaddress is the IP which is shown on the display. -You can also use http://smartevse-xxxx.local/update where xxxx is the serial nr of your controller.
-Here you can select the firmware.bin and press update to update the firmware.
-It's also possible to update the spiffs partition from this page. (for v3.0.1 this is not needed)
-After updating the firmware, you can access the status page again using the normal url: http://smartevse-xxxx.local (replace xxxx with the serial nr of your controller)
- -# Documentation - -[Hardware installation](docs/installation.md)
-[Configuration](docs/configuration.md)
-[Operation](docs/operation.md)
diff --git a/SmartEVSE-3/SmartEVSE-3/.gitignore b/SmartEVSE-3/SmartEVSE-3/.gitignore deleted file mode 100644 index 89cc49c..0000000 --- a/SmartEVSE-3/SmartEVSE-3/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.pio -.vscode/.browse.c_cpp.db* -.vscode/c_cpp_properties.json -.vscode/launch.json -.vscode/ipch diff --git a/SmartEVSE-3/SmartEVSE-3/CMakeLists.txt b/SmartEVSE-3/SmartEVSE-3/CMakeLists.txt deleted file mode 100644 index 73d6dae..0000000 --- a/SmartEVSE-3/SmartEVSE-3/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -cmake_minimum_required(VERSION 3.16.0) -include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(SmartEVSE32) diff --git a/SmartEVSE-3/SmartEVSE-3/HowToFlash.txt b/SmartEVSE-3/SmartEVSE-3/HowToFlash.txt deleted file mode 100644 index 0587456..0000000 --- a/SmartEVSE-3/SmartEVSE-3/HowToFlash.txt +++ /dev/null @@ -1,5 +0,0 @@ --surf to http://your-smartevse/update --select the firmware.bin from this archive, OR if you want the debug version (via telnet over your wifi), - rename firmware.debug.bin to firmware.bin and select that. YOU CANNOT FLASH A FILE WITH ANOTHER NAME! --if you get FAIL, check your wifi connection and try again; --after OK, wait 10-30 seconds and your new firmware including the webserver should be online! diff --git a/SmartEVSE-3/SmartEVSE-3/data/cert.pem b/SmartEVSE-3/SmartEVSE-3/data/cert.pem deleted file mode 100644 index b6fa7a5..0000000 --- a/SmartEVSE-3/SmartEVSE-3/data/cert.pem +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIB4DCCAYWgAwIBAgIUZNoNpf/c2H+t54PnIoe4PgiahV0wCgYIKoZIzj0EAwIw -RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu -dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA1MDQwNjEyMDNaFw0yNDA2MDMw -NjEyMDNaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD -VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjO -PQMBBwNCAAQLQqPNIgyYn4J8SE3LRBVhkDyLAT6cumGL73QGB+OzEsj6cv2B0kGs -jpvUrsclwmCVLVo0T6FxHR4Pw/Fy3qgvo1MwUTAdBgNVHQ4EFgQUpqjPZrPqhA23 -ghR5bdmj0gceVRgwHwYDVR0jBBgwFoAUpqjPZrPqhA23ghR5bdmj0gceVRgwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNJADBGAiEA2IitVasCjmRsbz9ZcG4U -jn3tudAVCXs9Fet7AVLNvDkCIQDJGRWuWmctvD/7DBPUra822bIlWhwFKljWpNTW -wZAdFg== ------END CERTIFICATE----- diff --git a/SmartEVSE-3/SmartEVSE-3/data/favicon.ico b/SmartEVSE-3/SmartEVSE-3/data/favicon.ico deleted file mode 100644 index 0c6b9475c3e18fa21a787f22fdf81b735e0725c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12838 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 diff --git a/SmartEVSE-3/SmartEVSE-3/data/index.html b/SmartEVSE-3/SmartEVSE-3/data/index.html deleted file mode 100644 index 26f051f..0000000 --- a/SmartEVSE-3/SmartEVSE-3/data/index.html +++ /dev/null @@ -1,1035 +0,0 @@ - - - - Smart EVSE V3 - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
-
-
-
-

Smart EVSE V3

-

Version:

-

SmartEVSE-

-
-
-
- -
- - -
-
-
-
-
-
EVSE
-
-
- Mode: -
-
-
-
-
-
-
- Power Sharing: -
-
-
-
-
-
-
- Duty cycle: -
-
-
-
-
-
-
- Connected: -
-
-
-
-
-
-
- State: -
-
-
-
-
-
-
- Error: -
-
-
-
-
-
-
- RFID: -
-
-
-
-
-
-
- Charge: -
-
-
-
-
-
-
- Temp: -
-
-
-
-
-
-
- MQTT: -
-
-
-
-
-
-
- Contactor 2: -
-
-
-
-
-
-
- StartTime: -
-
-
-
-
-
-
-
-
-
- StopTime: -
-
-
-
-
-
-
-
-
-
- Repeat: -
-
-
-
-
-
- -
-
-
-
- - - -
- -
- -
-
-
-
-
-
EV State
-
-
- EVCCID -
-
-
-
-
-
-
- Current SoC -
-
-
-
-
-
-
- Initial SoC -
-
-
-
-
-
-
- Full SoC -
-
-
-
-
-
-
- Est. full at -
-
-
-
-
-
-
- Capacity -
-
-
-
-
-
-
- - - - - -
-
-
-
-
- -
-
-
-
-
-
Current Details
-
-
- Override: -
-
-
-
-
-
-
- Min: -
-
-
-
-
-
-
- Max: -
-
-
-
-
-
-
- - - - - -
-
-
-
-
- - - -
-
-
-
-
-
Phase Details (Original)
-
-
- Total: -
-
-
-
-
-
-
- L1: -
-
-
-
-
-
-
- L2: -
-
-
-
-
-
-
- L3: -
-
-
-
-
-
-
- - - - - -
-
-
-
- -
- - - - - - - - -
- -
- - - - -
-
-
-
-
-
Control
- -
-
- Mode: -
-
-
- - -
- - -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
- Current: -
-
- -
-
-
-
- Actions: -
-
- - - -
-
-
-
- Override PWM: -
-
-
- - - - -
-
-
-
-
- AutoCharge: -
-
-
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
Config
-
-
- MQTT: -
-
- - -
-
-
-
-
-
-
-
-
-
-
-
- - - diff --git a/SmartEVSE-3/SmartEVSE-3/data/key.pem b/SmartEVSE-3/SmartEVSE-3/data/key.pem deleted file mode 100644 index d37ec4c..0000000 --- a/SmartEVSE-3/SmartEVSE-3/data/key.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEICtA0BJEavg6pVMl6lcPOA5I7qqm4W/CoFbJSP/osM3poAoGCCqGSM49 -AwEHoUQDQgAEC0KjzSIMmJ+CfEhNy0QVYZA8iwE+nLphi+90BgfjsxLI+nL9gdJB -rI6b1K7HJcJglS1aNE+hcR0eD8Pxct6oLw== ------END EC PRIVATE KEY----- diff --git a/SmartEVSE-3/SmartEVSE-3/data/rsa_key.pub b/SmartEVSE-3/SmartEVSE-3/data/rsa_key.pub deleted file mode 100644 index dad4fb1..0000000 --- a/SmartEVSE-3/SmartEVSE-3/data/rsa_key.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtjEWhkfKPAUrtX1GueYq -JmDp4qSHBG6ndwikAHvteKgWQABDpwaemZdxh7xVCuEdjEkaecinNOZ0LpSCF3QO -qflnXkvpYVxjdTpKBxo7vP5QEa3I6keJfwpoMzGuT8XOK7id6FHJhtYEXcaufALi -mR/NXT11ikHLtluATymPdoSscMiwry0qX03yIek91lDypBNl5uvD2jxn9smlijfq -9j0lwtpLBWJPU8vsU0uzuj7Qq5pWZFKsjiNWfbvNJXuLsupOazf5sh0yeQzL1CBL -RUsBlYVoChTmSOyvi6kO5vW/6GLOafJF0FTdOQ+Gf3/IB6M1ErSxlqxQhHq0pb7Y -INl7+aFCmlRjyLlMjb8xdtuedlZKv8mLd37AyPAihrq9gV74xq6c7w2y+h9213p8 -jgcmo/HvOlGaXEIOVCUu102teOckXjTni2yhEtFISCaWuaIdb5P9e0uBIy1e+Bi6 -/7A3aut5MQP07DO99BFETXyFF6EixhTF8fpwVZ5vXeIDvKKEDUGuzAziUEGIZpic -UQ2fmTzIaTBbNlCMeTQFIpZCosM947aGKNBp672wdf996SRwg9E2VWzW2Z1UuwWV -BPVQkHb1Hsy7C9fg5JcLKB9zEfyUH0Tm9Iur1vsuA5++JNl2+T55192wqyF0R9sb -YtSTUJNSiSwqWt1m0FLOJD0CAwEAAQ== ------END PUBLIC KEY----- diff --git a/SmartEVSE-3/SmartEVSE-3/data/styling.css b/SmartEVSE-3/SmartEVSE-3/data/styling.css deleted file mode 100644 index 903c9d1..0000000 --- a/SmartEVSE-3/SmartEVSE-3/data/styling.css +++ /dev/null @@ -1,10 +0,0 @@ -/*! - * Start Bootstrap - SB Admin 2 v4.1.3 (https://startbootstrap.com/theme/sb-admin-2) - * Copyright 2013-2021 Start Bootstrap - * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin-2/blob/master/LICENSE) - *//*! - * Bootstrap v4.6.0 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue:#4e73df;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#e74a3b;--orange:#fd7e14;--yellow:#f6c23e;--green:#1cc88a;--teal:#20c9a6;--cyan:#36b9cc;--white:#fff;--gray:#858796;--gray-dark:#5a5c69;--primary:#4e73df;--secondary:#858796;--success:#1cc88a;--info:#36b9cc;--warning:#f6c23e;--danger:#e74a3b;--light:#f8f9fc;--dark:#5a5c69;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nunito",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:Nunito,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#858796;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#4e73df;text-decoration:none;background-color:transparent}a:hover{color:#224abe;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#858796;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:400;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#858796}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dddfeb;border-radius:.35rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#858796}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#3a3b45;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#3a3b45}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:.75rem;padding-left:.75rem;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-.75rem;margin-left:-.75rem}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:.75rem;padding-left:.75rem}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;color:#858796}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #e3e6f0}.table thead th{vertical-align:bottom;border-bottom:2px solid #e3e6f0}.table tbody+tbody{border-top:2px solid #e3e6f0}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #e3e6f0}.table-bordered td,.table-bordered th{border:1px solid #e3e6f0}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#858796;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#cdd8f6}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#a3b6ee}.table-hover .table-primary:hover{background-color:#b7c7f2}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b7c7f2}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#dddde2}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#c0c1c8}.table-hover .table-secondary:hover{background-color:#cfcfd6}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#cfcfd6}.table-success,.table-success>td,.table-success>th{background-color:#bff0de}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#89e2c2}.table-hover .table-success:hover{background-color:#aaebd3}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aaebd3}.table-info,.table-info>td,.table-info>th{background-color:#c7ebf1}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#96dbe4}.table-hover .table-info:hover{background-color:#b3e4ec}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#b3e4ec}.table-warning,.table-warning>td,.table-warning>th{background-color:#fceec9}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#fadf9b}.table-hover .table-warning:hover{background-color:#fbe6b1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fbe6b1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f8ccc8}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#f3a199}.table-hover .table-danger:hover{background-color:#f5b7b1}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f5b7b1}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfd}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#d1d1d5}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#a9aab1}.table-hover .table-dark:hover{background-color:#c4c4c9}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#c4c4c9}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#5a5c69;border-color:#6c6e7e}.table .thead-light th{color:#6e707e;background-color:#eaecf4;border-color:#e3e6f0}.table-dark{color:#fff;background-color:#5a5c69}.table-dark td,.table-dark th,.table-dark thead th{border-color:#6c6e7e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#6e707e;background-color:#fff;background-clip:padding-box;border:1px solid #d1d3e2;border-radius:.35rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #6e707e}.form-control:focus{color:#6e707e;background-color:#fff;border-color:#bac8f3;outline:0;box-shadow:0 0 0 .2rem rgba(78,115,223,.25)}.form-control::-webkit-input-placeholder{color:#858796;opacity:1}.form-control::-moz-placeholder{color:#858796;opacity:1}.form-control:-ms-input-placeholder{color:#858796;opacity:1}.form-control::-ms-input-placeholder{color:#858796;opacity:1}.form-control::placeholder{color:#858796;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eaecf4;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#6e707e;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#858796;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#858796}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#1cc88a}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(28,200,138,.9);border-radius:.35rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#1cc88a;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%231cc88a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#1cc88a;box-shadow:0 0 0 .2rem rgba(28,200,138,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#1cc88a;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%231cc88a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#1cc88a;box-shadow:0 0 0 .2rem rgba(28,200,138,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#1cc88a}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#1cc88a}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#1cc88a}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34e3a4;background-color:#34e3a4}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(28,200,138,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#1cc88a}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#1cc88a}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#1cc88a;box-shadow:0 0 0 .2rem rgba(28,200,138,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#e74a3b}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(231,74,59,.9);border-radius:.35rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#e74a3b;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e74a3b' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74a3b' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#e74a3b;box-shadow:0 0 0 .2rem rgba(231,74,59,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#e74a3b;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e74a3b' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74a3b' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#e74a3b;box-shadow:0 0 0 .2rem rgba(231,74,59,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#e74a3b}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#e74a3b}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#e74a3b}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#ed7468;background-color:#ed7468}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(231,74,59,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#e74a3b}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#e74a3b}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#e74a3b;box-shadow:0 0 0 .2rem rgba(231,74,59,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#858796;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.35rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#858796;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(78,115,223,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#4e73df;border-color:#4e73df}.btn-primary:hover{color:#fff;background-color:#2e59d9;border-color:#2653d4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#2e59d9;border-color:#2653d4;box-shadow:0 0 0 .2rem rgba(105,136,228,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#4e73df;border-color:#4e73df}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2653d4;border-color:#244ec9}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(105,136,228,.5)}.btn-secondary{color:#fff;background-color:#858796;border-color:#858796}.btn-secondary:hover{color:#fff;background-color:#717384;border-color:#6b6d7d}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#717384;border-color:#6b6d7d;box-shadow:0 0 0 .2rem rgba(151,153,166,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#858796;border-color:#858796}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#6b6d7d;border-color:#656776}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(151,153,166,.5)}.btn-success{color:#fff;background-color:#1cc88a;border-color:#1cc88a}.btn-success:hover{color:#fff;background-color:#17a673;border-color:#169b6b}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#17a673;border-color:#169b6b;box-shadow:0 0 0 .2rem rgba(62,208,156,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#1cc88a;border-color:#1cc88a}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#169b6b;border-color:#149063}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(62,208,156,.5)}.btn-info{color:#fff;background-color:#36b9cc;border-color:#36b9cc}.btn-info:hover{color:#fff;background-color:#2c9faf;border-color:#2a96a5}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#2c9faf;border-color:#2a96a5;box-shadow:0 0 0 .2rem rgba(84,196,212,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#36b9cc;border-color:#36b9cc}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#2a96a5;border-color:#278c9b}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(84,196,212,.5)}.btn-warning{color:#fff;background-color:#f6c23e;border-color:#f6c23e}.btn-warning:hover{color:#fff;background-color:#f4b619;border-color:#f4b30d}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#f4b619;border-color:#f4b30d;box-shadow:0 0 0 .2rem rgba(247,203,91,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#f6c23e;border-color:#f6c23e}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#f4b30d;border-color:#e9aa0b}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(247,203,91,.5)}.btn-danger{color:#fff;background-color:#e74a3b;border-color:#e74a3b}.btn-danger:hover{color:#fff;background-color:#e02d1b;border-color:#d52a1a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#e02d1b;border-color:#d52a1a;box-shadow:0 0 0 .2rem rgba(235,101,88,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#e74a3b;border-color:#e74a3b}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#d52a1a;border-color:#ca2819}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(235,101,88,.5)}.btn-light{color:#3a3b45;background-color:#f8f9fc;border-color:#f8f9fc}.btn-light:hover{color:#3a3b45;background-color:#dde2f1;border-color:#d4daed}.btn-light.focus,.btn-light:focus{color:#3a3b45;background-color:#dde2f1;border-color:#d4daed;box-shadow:0 0 0 .2rem rgba(220,221,225,.5)}.btn-light.disabled,.btn-light:disabled{color:#3a3b45;background-color:#f8f9fc;border-color:#f8f9fc}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#3a3b45;background-color:#d4daed;border-color:#cbd3e9}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,221,225,.5)}.btn-dark{color:#fff;background-color:#5a5c69;border-color:#5a5c69}.btn-dark:hover{color:#fff;background-color:#484a54;border-color:#42444e}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#484a54;border-color:#42444e;box-shadow:0 0 0 .2rem rgba(115,116,128,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#5a5c69;border-color:#5a5c69}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#42444e;border-color:#3d3e47}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(115,116,128,.5)}.btn-outline-primary{color:#4e73df;border-color:#4e73df}.btn-outline-primary:hover{color:#fff;background-color:#4e73df;border-color:#4e73df}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(78,115,223,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#4e73df;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#4e73df;border-color:#4e73df}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(78,115,223,.5)}.btn-outline-secondary{color:#858796;border-color:#858796}.btn-outline-secondary:hover{color:#fff;background-color:#858796;border-color:#858796}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(133,135,150,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#858796;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#858796;border-color:#858796}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(133,135,150,.5)}.btn-outline-success{color:#1cc88a;border-color:#1cc88a}.btn-outline-success:hover{color:#fff;background-color:#1cc88a;border-color:#1cc88a}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(28,200,138,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#1cc88a;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#1cc88a;border-color:#1cc88a}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(28,200,138,.5)}.btn-outline-info{color:#36b9cc;border-color:#36b9cc}.btn-outline-info:hover{color:#fff;background-color:#36b9cc;border-color:#36b9cc}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(54,185,204,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#36b9cc;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#36b9cc;border-color:#36b9cc}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(54,185,204,.5)}.btn-outline-warning{color:#f6c23e;border-color:#f6c23e}.btn-outline-warning:hover{color:#fff;background-color:#f6c23e;border-color:#f6c23e}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(246,194,62,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f6c23e;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f6c23e;border-color:#f6c23e}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(246,194,62,.5)}.btn-outline-danger{color:#e74a3b;border-color:#e74a3b}.btn-outline-danger:hover{color:#fff;background-color:#e74a3b;border-color:#e74a3b}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(231,74,59,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#e74a3b;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#e74a3b;border-color:#e74a3b}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(231,74,59,.5)}.btn-outline-light{color:#f8f9fc;border-color:#f8f9fc}.btn-outline-light:hover{color:#3a3b45;background-color:#f8f9fc;border-color:#f8f9fc}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,252,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fc;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#3a3b45;background-color:#f8f9fc;border-color:#f8f9fc}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,252,.5)}.btn-outline-dark{color:#5a5c69;border-color:#5a5c69}.btn-outline-dark:hover{color:#fff;background-color:#5a5c69;border-color:#5a5c69}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(90,92,105,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#5a5c69;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#5a5c69;border-color:#5a5c69}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(90,92,105,.5)}.btn-link{font-weight:400;color:#4e73df;text-decoration:none}.btn-link:hover{color:#224abe;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#858796;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .15s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:.85rem;color:#858796;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #e3e6f0;border-radius:.35rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #eaecf4}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#3a3b45;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#2e2f37;text-decoration:none;background-color:#eaecf4}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#4e73df}.dropdown-item.disabled,.dropdown-item:disabled{color:#b7b9cc;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#858796;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#3a3b45}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#6e707e;text-align:center;white-space:nowrap;background-color:#eaecf4;border:1px solid #d1d3e2;border-radius:.35rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#4e73df;background-color:#4e73df}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(78,115,223,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#bac8f3}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#e5ebfa;border-color:#e5ebfa}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#858796}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#eaecf4}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#b7b9cc solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.35rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#4e73df;background-color:#4e73df}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(78,115,223,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(78,115,223,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(78,115,223,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#b7b9cc;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(78,115,223,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#6e707e;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #d1d3e2;border-radius:.35rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#bac8f3;outline:0;box-shadow:0 0 0 .2rem rgba(78,115,223,.25)}.custom-select:focus::-ms-value{color:#6e707e;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#858796;background-color:#eaecf4}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #6e707e}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#bac8f3;box-shadow:0 0 0 .2rem rgba(78,115,223,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#eaecf4}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#6e707e;background-color:#fff;border:1px solid #d1d3e2;border-radius:.35rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#6e707e;content:"Browse";background-color:#eaecf4;border-left:inherit;border-radius:0 .35rem .35rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(78,115,223,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(78,115,223,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(78,115,223,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#4e73df;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#e5ebfa}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dddfeb;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#4e73df;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#e5ebfa}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dddfeb;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#4e73df;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#e5ebfa}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dddfeb;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dddfeb;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#b7b9cc}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#b7b9cc}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#b7b9cc}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#858796;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dddfeb}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eaecf4 #eaecf4 #dddfeb}.nav-tabs .nav-link.disabled{color:#858796;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#6e707e;background-color:#fff;border-color:#dddfeb #dddfeb #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.35rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#4e73df}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.35rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid #e3e6f0;border-radius:.35rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.35rem - 1px);border-top-right-radius:calc(.35rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.35rem - 1px);border-bottom-left-radius:calc(.35rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0}.card-header:first-child{border-radius:calc(.35rem - 1px) calc(.35rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f8f9fc;border-top:1px solid #e3e6f0}.card-footer:last-child{border-radius:0 0 calc(.35rem - 1px) calc(.35rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.35rem - 1px)}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.35rem - 1px);border-top-right-radius:calc(.35rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.35rem - 1px);border-bottom-left-radius:calc(.35rem - 1px)}.card-deck .card{margin-bottom:.75rem}@media (min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-.75rem;margin-left:-.75rem}.card-deck .card{flex:1 0 0%;margin-right:.75rem;margin-bottom:0;margin-left:.75rem}}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eaecf4;border-radius:.35rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#858796;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#858796}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.35rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#4e73df;background-color:#fff;border:1px solid #dddfeb}.page-link:hover{z-index:2;color:#224abe;text-decoration:none;background-color:#eaecf4;border-color:#dddfeb}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(78,115,223,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.35rem;border-bottom-left-radius:.35rem}.page-item:last-child .page-link{border-top-right-radius:.35rem;border-bottom-right-radius:.35rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#4e73df;border-color:#4e73df}.page-item.disabled .page-link{color:#858796;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dddfeb}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.35rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#4e73df}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#2653d4}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(78,115,223,.5)}.badge-secondary{color:#fff;background-color:#858796}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#6b6d7d}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(133,135,150,.5)}.badge-success{color:#fff;background-color:#1cc88a}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#169b6b}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(28,200,138,.5)}.badge-info{color:#fff;background-color:#36b9cc}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#2a96a5}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(54,185,204,.5)}.badge-warning{color:#fff;background-color:#f6c23e}a.badge-warning:focus,a.badge-warning:hover{color:#fff;background-color:#f4b30d}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(246,194,62,.5)}.badge-danger{color:#fff;background-color:#e74a3b}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#d52a1a}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(231,74,59,.5)}.badge-light{color:#3a3b45;background-color:#f8f9fc}a.badge-light:focus,a.badge-light:hover{color:#3a3b45;background-color:#d4daed}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,252,.5)}.badge-dark{color:#fff;background-color:#5a5c69}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#42444e}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(90,92,105,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eaecf4;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.35rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#293c74;background-color:#dce3f9;border-color:#cdd8f6}.alert-primary hr{border-top-color:#b7c7f2}.alert-primary .alert-link{color:#1c294e}.alert-secondary{color:#45464e;background-color:#e7e7ea;border-color:#dddde2}.alert-secondary hr{border-top-color:#cfcfd6}.alert-secondary .alert-link{color:#2d2e33}.alert-success{color:#0f6848;background-color:#d2f4e8;border-color:#bff0de}.alert-success hr{border-top-color:#aaebd3}.alert-success .alert-link{color:#093b29}.alert-info{color:#1c606a;background-color:#d7f1f5;border-color:#c7ebf1}.alert-info hr{border-top-color:#b3e4ec}.alert-info .alert-link{color:#113b42}.alert-warning{color:#806520;background-color:#fdf3d8;border-color:#fceec9}.alert-warning hr{border-top-color:#fbe6b1}.alert-warning .alert-link{color:#574516}.alert-danger{color:#78261f;background-color:#fadbd8;border-color:#f8ccc8}.alert-danger hr{border-top-color:#f5b7b1}.alert-danger .alert-link{color:#4f1915}.alert-light{color:#818183;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686869}.alert-dark{color:#2f3037;background-color:#dedee1;border-color:#d1d1d5}.alert-dark hr{border-top-color:#c4c4c9}.alert-dark .alert-link{color:#18181c}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#eaecf4;border-radius:.35rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#4e73df;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.35rem}.list-group-item-action{width:100%;color:#6e707e;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#6e707e;text-decoration:none;background-color:#f8f9fc}.list-group-item-action:active{color:#858796;background-color:#eaecf4}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#858796;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#4e73df;border-color:#4e73df}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.35rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.35rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.35rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.35rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.35rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.35rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.35rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.35rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.35rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.35rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#293c74;background-color:#cdd8f6}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#293c74;background-color:#b7c7f2}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#293c74;border-color:#293c74}.list-group-item-secondary{color:#45464e;background-color:#dddde2}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#45464e;background-color:#cfcfd6}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#45464e;border-color:#45464e}.list-group-item-success{color:#0f6848;background-color:#bff0de}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f6848;background-color:#aaebd3}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f6848;border-color:#0f6848}.list-group-item-info{color:#1c606a;background-color:#c7ebf1}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#1c606a;background-color:#b3e4ec}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#1c606a;border-color:#1c606a}.list-group-item-warning{color:#806520;background-color:#fceec9}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#806520;background-color:#fbe6b1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#806520;border-color:#806520}.list-group-item-danger{color:#78261f;background-color:#f8ccc8}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#78261f;background-color:#f5b7b1}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#78261f;border-color:#78261f}.list-group-item-light{color:#818183;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818183;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818183;border-color:#818183}.list-group-item-dark{color:#2f3037;background-color:#d1d1d5}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#2f3037;background-color:#c4c4c9}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#2f3037;border-color:#2f3037}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#858796;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #e3e6f0;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #e3e6f0;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:Nunito,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.35rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:Nunito,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#858796}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#4e73df!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#2653d4!important}.bg-secondary{background-color:#858796!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#6b6d7d!important}.bg-success{background-color:#1cc88a!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#169b6b!important}.bg-info{background-color:#36b9cc!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#2a96a5!important}.bg-warning{background-color:#f6c23e!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#f4b30d!important}.bg-danger{background-color:#e74a3b!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#d52a1a!important}.bg-light{background-color:#f8f9fc!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#d4daed!important}.bg-dark{background-color:#5a5c69!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#42444e!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #e3e6f0!important}.border-top{border-top:1px solid #e3e6f0!important}.border-right{border-right:1px solid #e3e6f0!important}.border-bottom{border-bottom:1px solid #e3e6f0!important}.border-left{border-left:1px solid #e3e6f0!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#4e73df!important}.border-secondary{border-color:#858796!important}.border-success{border-color:#1cc88a!important}.border-info{border-color:#36b9cc!important}.border-warning{border-color:#f6c23e!important}.border-danger{border-color:#e74a3b!important}.border-light{border-color:#f8f9fc!important}.border-dark{border-color:#5a5c69!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.35rem!important}.rounded-top{border-top-left-radius:.35rem!important;border-top-right-radius:.35rem!important}.rounded-right{border-top-right-radius:.35rem!important;border-bottom-right-radius:.35rem!important}.rounded-bottom{border-bottom-right-radius:.35rem!important;border-bottom-left-radius:.35rem!important}.rounded-left{border-top-left-radius:.35rem!important;border-bottom-left-radius:.35rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem 0 rgba(58,59,69,.2)!important}.shadow{box-shadow:0 .15rem 1.75rem 0 rgba(58,59,69,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.dropdown .dropdown-menu .dropdown-header,.sidebar .sidebar-heading,.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#4e73df!important}a.text-primary:focus,a.text-primary:hover{color:#224abe!important}.text-secondary{color:#858796!important}a.text-secondary:focus,a.text-secondary:hover{color:#60616f!important}.text-success{color:#1cc88a!important}a.text-success:focus,a.text-success:hover{color:#13855c!important}.text-info{color:#36b9cc!important}a.text-info:focus,a.text-info:hover{color:#258391!important}.text-warning{color:#f6c23e!important}a.text-warning:focus,a.text-warning:hover{color:#dda20a!important}.text-danger{color:#e74a3b!important}a.text-danger:focus,a.text-danger:hover{color:#be2617!important}.text-light{color:#f8f9fc!important}a.text-light:focus,a.text-light:hover{color:#c2cbe5!important}.text-dark{color:#5a5c69!important}a.text-dark:focus,a.text-dark:hover{color:#373840!important}.text-body{color:#858796!important}.text-muted{color:#858796!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #b7b9cc;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dddfeb!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#e3e6f0}.table .thead-dark th{color:inherit;border-color:#e3e6f0}}html{position:relative;min-height:100%}body{height:100%}a:focus{outline:0}#wrapper{display:flex}#wrapper #content-wrapper{background-color:#f8f9fc;width:100%;overflow-x:hidden}#wrapper #content-wrapper #content{flex:1 0 auto}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{padding-left:1.5rem;padding-right:1.5rem}.scroll-to-top{position:fixed;right:1rem;bottom:1rem;display:none;width:2.75rem;height:2.75rem;text-align:center;color:#fff;background:rgba(90,92,105,.5);line-height:46px}.scroll-to-top:focus,.scroll-to-top:hover{color:#fff}.scroll-to-top:hover{background:#5a5c69}.scroll-to-top i{font-weight:800}@-webkit-keyframes growIn{0%{transform:scale(.9);opacity:0}100%{transform:scale(1);opacity:1}}@keyframes growIn{0%{transform:scale(.9);opacity:0}100%{transform:scale(1);opacity:1}}.animated--grow-in,.sidebar .nav-item .collapse{-webkit-animation-name:growIn;animation-name:growIn;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:transform cubic-bezier(.18,1.25,.4,1),opacity cubic-bezier(0,1,.4,1);animation-timing-function:transform cubic-bezier(.18,1.25,.4,1),opacity cubic-bezier(0,1,.4,1)}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.animated--fade-in{-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:opacity cubic-bezier(0,1,.4,1);animation-timing-function:opacity cubic-bezier(0,1,.4,1)}.bg-gradient-primary{background-color:#4e73df;background-image:linear-gradient(180deg,#4e73df 10%,#224abe 100%);background-size:cover}.bg-gradient-secondary{background-color:#858796;background-image:linear-gradient(180deg,#858796 10%,#60616f 100%);background-size:cover}.bg-gradient-success{background-color:#1cc88a;background-image:linear-gradient(180deg,#1cc88a 10%,#13855c 100%);background-size:cover}.bg-gradient-info{background-color:#36b9cc;background-image:linear-gradient(180deg,#36b9cc 10%,#258391 100%);background-size:cover}.bg-gradient-warning{background-color:#f6c23e;background-image:linear-gradient(180deg,#f6c23e 10%,#dda20a 100%);background-size:cover}.bg-gradient-danger{background-color:#e74a3b;background-image:linear-gradient(180deg,#e74a3b 10%,#be2617 100%);background-size:cover}.bg-gradient-light{background-color:#f8f9fc;background-image:linear-gradient(180deg,#f8f9fc 10%,#c2cbe5 100%);background-size:cover}.bg-gradient-dark{background-color:#5a5c69;background-image:linear-gradient(180deg,#5a5c69 10%,#373840 100%);background-size:cover}.bg-gray-100{background-color:#f8f9fc!important}.bg-gray-200{background-color:#eaecf4!important}.bg-gray-300{background-color:#dddfeb!important}.bg-gray-400{background-color:#d1d3e2!important}.bg-gray-500{background-color:#b7b9cc!important}.bg-gray-600{background-color:#858796!important}.bg-gray-700{background-color:#6e707e!important}.bg-gray-800{background-color:#5a5c69!important}.bg-gray-900{background-color:#3a3b45!important}.o-hidden{overflow:hidden!important}.text-xs{font-size:.7rem}.text-lg{font-size:1.2rem}.text-gray-100{color:#f8f9fc!important}.text-gray-200{color:#eaecf4!important}.text-gray-300{color:#dddfeb!important}.text-gray-400{color:#d1d3e2!important}.text-gray-500{color:#b7b9cc!important}.text-gray-600{color:#858796!important}.text-gray-700{color:#6e707e!important}.text-gray-800{color:#5a5c69!important}.text-gray-900{color:#3a3b45!important}.icon-circle{height:2.5rem;width:2.5rem;border-radius:100%;display:flex;align-items:center;justify-content:center}.border-left-primary{border-left:.25rem solid #4e73df!important}.border-bottom-primary{border-bottom:.25rem solid #4e73df!important}.border-left-secondary{border-left:.25rem solid #858796!important}.border-bottom-secondary{border-bottom:.25rem solid #858796!important}.border-left-success{border-left:.25rem solid #1cc88a!important}.border-bottom-success{border-bottom:.25rem solid #1cc88a!important}.border-left-info{border-left:.25rem solid #36b9cc!important}.border-bottom-info{border-bottom:.25rem solid #36b9cc!important}.border-left-warning{border-left:.25rem solid #f6c23e!important}.border-bottom-warning{border-bottom:.25rem solid #f6c23e!important}.border-left-danger{border-left:.25rem solid #e74a3b!important}.border-bottom-danger{border-bottom:.25rem solid #e74a3b!important}.border-left-light{border-left:.25rem solid #f8f9fc!important}.border-bottom-light{border-bottom:.25rem solid #f8f9fc!important}.border-left-dark{border-left:.25rem solid #5a5c69!important}.border-bottom-dark{border-bottom:.25rem solid #5a5c69!important}.progress-sm{height:.5rem}.rotate-15{transform:rotate(15deg)}.rotate-n-15{transform:rotate(-15deg)}.dropdown .dropdown-menu{font-size:.85rem}.dropdown .dropdown-menu .dropdown-header{font-weight:800;font-size:.65rem;color:#b7b9cc}.dropdown.no-arrow .dropdown-toggle::after{display:none}.sidebar .nav-item.dropdown .dropdown-toggle::after,.topbar .nav-item.dropdown .dropdown-toggle::after{width:1rem;text-align:center;float:right;vertical-align:0;border:0;font-weight:900;content:'\f105';font-family:'Font Awesome 5 Free'}.sidebar .nav-item.dropdown.show .dropdown-toggle::after,.topbar .nav-item.dropdown.show .dropdown-toggle::after{content:'\f107'}.sidebar .nav-item .nav-link,.topbar .nav-item .nav-link{position:relative}.sidebar .nav-item .nav-link .badge-counter,.topbar .nav-item .nav-link .badge-counter{position:absolute;transform:scale(.7);transform-origin:top right;right:.25rem;margin-top:-.25rem}.sidebar .nav-item .nav-link .img-profile,.topbar .nav-item .nav-link .img-profile{height:2rem;width:2rem}.topbar{height:4.375rem}.topbar #sidebarToggleTop{height:2.5rem;width:2.5rem}.topbar #sidebarToggleTop:hover{background-color:#eaecf4}.topbar #sidebarToggleTop:active{background-color:#dddfeb}.topbar .navbar-search{width:25rem}.topbar .navbar-search input{font-size:.85rem;height:auto}.topbar .topbar-divider{width:0;border-right:1px solid #e3e6f0;height:calc(4.375rem - 2rem);margin:auto 1rem}.topbar .nav-item .nav-link{height:4.375rem;display:flex;align-items:center;padding:0 .75rem}.topbar .nav-item .nav-link:focus{outline:0}.topbar .nav-item:focus{outline:0}.topbar .dropdown{position:static}.topbar .dropdown .dropdown-menu{width:calc(100% - 1.5rem);right:.75rem}.topbar .dropdown-list{padding:0;border:none;overflow:hidden}.topbar .dropdown-list .dropdown-header{background-color:#4e73df;border:1px solid #4e73df;padding-top:.75rem;padding-bottom:.75rem;color:#fff}.topbar .dropdown-list .dropdown-item{white-space:normal;padding-top:.5rem;padding-bottom:.5rem;border-left:1px solid #e3e6f0;border-right:1px solid #e3e6f0;border-bottom:1px solid #e3e6f0;line-height:1.3rem}.topbar .dropdown-list .dropdown-item .dropdown-list-image{position:relative;height:2.5rem;width:2.5rem}.topbar .dropdown-list .dropdown-item .dropdown-list-image img{height:2.5rem;width:2.5rem}.topbar .dropdown-list .dropdown-item .dropdown-list-image .status-indicator{background-color:#eaecf4;height:.75rem;width:.75rem;border-radius:100%;position:absolute;bottom:0;right:0;border:.125rem solid #fff}.topbar .dropdown-list .dropdown-item .text-truncate{max-width:10rem}.topbar .dropdown-list .dropdown-item:active{background-color:#eaecf4;color:#3a3b45}@media (min-width:576px){.topbar .dropdown{position:relative}.topbar .dropdown .dropdown-menu{width:auto;right:0}.topbar .dropdown-list{width:20rem!important}.topbar .dropdown-list .dropdown-item .text-truncate{max-width:13.375rem}}.topbar.navbar-dark .navbar-nav .nav-item .nav-link{color:rgba(255,255,255,.8)}.topbar.navbar-dark .navbar-nav .nav-item .nav-link:hover{color:#fff}.topbar.navbar-dark .navbar-nav .nav-item .nav-link:active{color:#fff}.topbar.navbar-light .navbar-nav .nav-item .nav-link{color:#d1d3e2}.topbar.navbar-light .navbar-nav .nav-item .nav-link:hover{color:#b7b9cc}.topbar.navbar-light .navbar-nav .nav-item .nav-link:active{color:#858796}.sidebar{width:6.5rem;min-height:100vh}.sidebar .nav-item{position:relative}.sidebar .nav-item:last-child{margin-bottom:1rem}.sidebar .nav-item .nav-link{text-align:center;padding:.75rem 1rem;width:6.5rem}.sidebar .nav-item .nav-link span{font-size:.65rem;display:block}.sidebar .nav-item.active .nav-link{font-weight:700}.sidebar .nav-item .collapse{position:absolute;left:calc(6.5rem + 1.5rem / 2);z-index:1;top:2px}.sidebar .nav-item .collapse .collapse-inner{border-radius:.35rem;box-shadow:0 .15rem 1.75rem 0 rgba(58,59,69,.15)}.sidebar .nav-item .collapsing{display:none;transition:none}.sidebar .nav-item .collapse .collapse-inner,.sidebar .nav-item .collapsing .collapse-inner{padding:.5rem 0;min-width:10rem;font-size:.85rem;margin:0 0 1rem 0}.sidebar .nav-item .collapse .collapse-inner .collapse-header,.sidebar .nav-item .collapsing .collapse-inner .collapse-header{margin:0;white-space:nowrap;padding:.5rem 1.5rem;text-transform:uppercase;font-weight:800;font-size:.65rem;color:#b7b9cc}.sidebar .nav-item .collapse .collapse-inner .collapse-item,.sidebar .nav-item .collapsing .collapse-inner .collapse-item{padding:.5rem 1rem;margin:0 .5rem;display:block;color:#3a3b45;text-decoration:none;border-radius:.35rem;white-space:nowrap}.sidebar .nav-item .collapse .collapse-inner .collapse-item:hover,.sidebar .nav-item .collapsing .collapse-inner .collapse-item:hover{background-color:#eaecf4}.sidebar .nav-item .collapse .collapse-inner .collapse-item:active,.sidebar .nav-item .collapsing .collapse-inner .collapse-item:active{background-color:#dddfeb}.sidebar .nav-item .collapse .collapse-inner .collapse-item.active,.sidebar .nav-item .collapsing .collapse-inner .collapse-item.active{color:#4e73df;font-weight:700}.sidebar #sidebarToggle{width:2.5rem;height:2.5rem;text-align:center;margin-bottom:1rem;cursor:pointer}.sidebar #sidebarToggle::after{font-weight:900;content:'\f104';font-family:'Font Awesome 5 Free';margin-right:.1rem}.sidebar #sidebarToggle:hover{text-decoration:none}.sidebar #sidebarToggle:focus{outline:0}.sidebar.toggled{width:0!important;overflow:hidden}.sidebar.toggled #sidebarToggle::after{content:'\f105';font-family:'Font Awesome 5 Free';margin-left:.25rem}.sidebar.toggled .sidebar-card{display:none}.sidebar .sidebar-brand{height:4.375rem;text-decoration:none;font-size:1rem;font-weight:800;padding:1.5rem 1rem;text-align:center;text-transform:uppercase;letter-spacing:.05rem;z-index:1}.sidebar .sidebar-brand .sidebar-brand-icon i{font-size:2rem}.sidebar .sidebar-brand .sidebar-brand-text{display:none}.sidebar hr.sidebar-divider{margin:0 1rem 1rem}.sidebar .sidebar-heading{text-align:center;padding:0 1rem;font-weight:800;font-size:.65rem}.sidebar .sidebar-card{display:flex;flex-direction:column;align-items:center;font-size:.875rem;border-radius:.35rem;color:rgba(255,255,255,.8);margin-left:1rem;margin-right:1rem;margin-bottom:1rem;padding:1rem;background-color:rgba(0,0,0,.1)}.sidebar .sidebar-card .sidebar-card-illustration{height:3rem;display:block}.sidebar .sidebar-card .sidebar-card-title{font-weight:700}.sidebar .sidebar-card p{font-size:.75rem;color:rgba(255,255,255,.5)}@media (min-width:768px){.sidebar{width:14rem!important}.sidebar .nav-item .collapse{position:relative;left:0;z-index:1;top:0;-webkit-animation:none;animation:none}.sidebar .nav-item .collapse .collapse-inner{border-radius:0;box-shadow:none}.sidebar .nav-item .collapsing{display:block;transition:height .15s ease}.sidebar .nav-item .collapse,.sidebar .nav-item .collapsing{margin:0 1rem}.sidebar .nav-item .nav-link{display:block;width:100%;text-align:left;padding:1rem;width:14rem}.sidebar .nav-item .nav-link i{font-size:.85rem;margin-right:.25rem}.sidebar .nav-item .nav-link span{font-size:.85rem;display:inline}.sidebar .nav-item .nav-link[data-toggle=collapse]::after{width:1rem;text-align:center;float:right;vertical-align:0;border:0;font-weight:900;content:'\f107';font-family:'Font Awesome 5 Free'}.sidebar .nav-item .nav-link[data-toggle=collapse].collapsed::after{content:'\f105'}.sidebar .sidebar-brand .sidebar-brand-icon i{font-size:2rem}.sidebar .sidebar-brand .sidebar-brand-text{display:inline}.sidebar .sidebar-heading{text-align:left}.sidebar.toggled{overflow:visible;width:6.5rem!important}.sidebar.toggled .nav-item .collapse{position:absolute;left:calc(6.5rem + 1.5rem / 2);z-index:1;top:2px;-webkit-animation-name:growIn;animation-name:growIn;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:transform cubic-bezier(.18,1.25,.4,1),opacity cubic-bezier(0,1,.4,1);animation-timing-function:transform cubic-bezier(.18,1.25,.4,1),opacity cubic-bezier(0,1,.4,1)}.sidebar.toggled .nav-item .collapse .collapse-inner{box-shadow:0 .15rem 1.75rem 0 rgba(58,59,69,.15);border-radius:.35rem}.sidebar.toggled .nav-item .collapsing{display:none;transition:none}.sidebar.toggled .nav-item .collapse,.sidebar.toggled .nav-item .collapsing{margin:0}.sidebar.toggled .nav-item:last-child{margin-bottom:1rem}.sidebar.toggled .nav-item .nav-link{text-align:center;padding:.75rem 1rem;width:6.5rem}.sidebar.toggled .nav-item .nav-link span{font-size:.65rem;display:block}.sidebar.toggled .nav-item .nav-link i{margin-right:0}.sidebar.toggled .nav-item .nav-link[data-toggle=collapse]::after{display:none}.sidebar.toggled .sidebar-brand .sidebar-brand-icon i{font-size:2rem}.sidebar.toggled .sidebar-brand .sidebar-brand-text{display:none}.sidebar.toggled .sidebar-heading{text-align:center}}.sidebar-light .sidebar-brand{color:#6e707e}.sidebar-light hr.sidebar-divider{border-top:1px solid #eaecf4}.sidebar-light .sidebar-heading{color:#b7b9cc}.sidebar-light .nav-item .nav-link{color:#858796}.sidebar-light .nav-item .nav-link i{color:#d1d3e2}.sidebar-light .nav-item .nav-link:active,.sidebar-light .nav-item .nav-link:focus,.sidebar-light .nav-item .nav-link:hover{color:#6e707e}.sidebar-light .nav-item .nav-link:active i,.sidebar-light .nav-item .nav-link:focus i,.sidebar-light .nav-item .nav-link:hover i{color:#6e707e}.sidebar-light .nav-item .nav-link[data-toggle=collapse]::after{color:#b7b9cc}.sidebar-light .nav-item.active .nav-link{color:#6e707e}.sidebar-light .nav-item.active .nav-link i{color:#6e707e}.sidebar-light #sidebarToggle{background-color:#eaecf4}.sidebar-light #sidebarToggle::after{color:#b7b9cc}.sidebar-light #sidebarToggle:hover{background-color:#dddfeb}.sidebar-dark .sidebar-brand{color:#fff}.sidebar-dark hr.sidebar-divider{border-top:1px solid rgba(255,255,255,.15)}.sidebar-dark .sidebar-heading{color:rgba(255,255,255,.4)}.sidebar-dark .nav-item .nav-link{color:rgba(255,255,255,.8)}.sidebar-dark .nav-item .nav-link i{color:rgba(255,255,255,.3)}.sidebar-dark .nav-item .nav-link:active,.sidebar-dark .nav-item .nav-link:focus,.sidebar-dark .nav-item .nav-link:hover{color:#fff}.sidebar-dark .nav-item .nav-link:active i,.sidebar-dark .nav-item .nav-link:focus i,.sidebar-dark .nav-item .nav-link:hover i{color:#fff}.sidebar-dark .nav-item .nav-link[data-toggle=collapse]::after{color:rgba(255,255,255,.5)}.sidebar-dark .nav-item.active .nav-link{color:#fff}.sidebar-dark .nav-item.active .nav-link i{color:#fff}.sidebar-dark #sidebarToggle{background-color:rgba(255,255,255,.2)}.sidebar-dark #sidebarToggle::after{color:rgba(255,255,255,.5)}.sidebar-dark #sidebarToggle:hover{background-color:rgba(255,255,255,.25)}.sidebar-dark.toggled #sidebarToggle::after{color:rgba(255,255,255,.5)}.btn-circle{border-radius:100%;height:2.5rem;width:2.5rem;font-size:1rem;display:inline-flex;align-items:center;justify-content:center}.btn-circle.btn-sm,.btn-group-sm>.btn-circle.btn{height:1.8rem;width:1.8rem;font-size:.75rem}.btn-circle.btn-lg,.btn-group-lg>.btn-circle.btn{height:3.5rem;width:3.5rem;font-size:1.35rem}.btn-icon-split{padding:0;overflow:hidden;display:inline-flex;align-items:stretch;justify-content:center}.btn-icon-split .icon{background:rgba(0,0,0,.15);display:inline-block;padding:.375rem .75rem}.btn-icon-split .text{display:inline-block;padding:.375rem .75rem}.btn-group-sm>.btn-icon-split.btn .icon,.btn-icon-split.btn-sm .icon{padding:.25rem .5rem}.btn-group-sm>.btn-icon-split.btn .text,.btn-icon-split.btn-sm .text{padding:.25rem .5rem}.btn-group-lg>.btn-icon-split.btn .icon,.btn-icon-split.btn-lg .icon{padding:.5rem 1rem}.btn-group-lg>.btn-icon-split.btn .text,.btn-icon-split.btn-lg .text{padding:.5rem 1rem}.card .card-header .dropdown{line-height:1}.card .card-header .dropdown .dropdown-menu{line-height:1.5}.card .card-header[data-toggle=collapse]{text-decoration:none;position:relative;padding:.75rem 3.25rem .75rem 1.25rem}.card .card-header[data-toggle=collapse]::after{position:absolute;right:0;top:0;padding-right:1.725rem;line-height:51px;font-weight:900;content:'\f107';font-family:'Font Awesome 5 Free';color:#d1d3e2}.card .card-header[data-toggle=collapse].collapsed{border-radius:.35rem}.card .card-header[data-toggle=collapse].collapsed::after{content:'\f105'}.chart-area{position:relative;height:10rem;width:100%}@media (min-width:768px){.chart-area{height:20rem}}.chart-bar{position:relative;height:10rem;width:100%}@media (min-width:768px){.chart-bar{height:20rem}}.chart-pie{position:relative;height:15rem;width:100%}@media (min-width:768px){.chart-pie{height:calc(20rem - 43px)!important}}.bg-login-image{background:url(https://source.unsplash.com/K4mSJ7kc0As/600x800);background-position:center;background-size:cover}.bg-register-image{background:url(https://source.unsplash.com/Mv9hjnEUHR4/600x800);background-position:center;background-size:cover}.bg-password-image{background:url(https://source.unsplash.com/oWTW-jNGl9I/600x800);background-position:center;background-size:cover}form.user .custom-checkbox.small label{line-height:1.5rem}form.user .form-control-user{font-size:.8rem;border-radius:10rem;padding:1.5rem 1rem}form.user .btn-user{font-size:.8rem;border-radius:10rem;padding:.75rem 1rem}.btn-google{color:#fff;background-color:#ea4335;border-color:#fff}.btn-google:hover{color:#fff;background-color:#e12717;border-color:#e6e6e6}.btn-google.focus,.btn-google:focus{color:#fff;background-color:#e12717;border-color:#e6e6e6;box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.btn-google.disabled,.btn-google:disabled{color:#fff;background-color:#ea4335;border-color:#fff}.btn-google:not(:disabled):not(.disabled).active,.btn-google:not(:disabled):not(.disabled):active,.show>.btn-google.dropdown-toggle{color:#fff;background-color:#d62516;border-color:#dfdfdf}.btn-google:not(:disabled):not(.disabled).active:focus,.btn-google:not(:disabled):not(.disabled):active:focus,.show>.btn-google.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.btn-facebook{color:#fff;background-color:#3b5998;border-color:#fff}.btn-facebook:hover{color:#fff;background-color:#30497c;border-color:#e6e6e6}.btn-facebook.focus,.btn-facebook:focus{color:#fff;background-color:#30497c;border-color:#e6e6e6;box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.btn-facebook.disabled,.btn-facebook:disabled{color:#fff;background-color:#3b5998;border-color:#fff}.btn-facebook:not(:disabled):not(.disabled).active,.btn-facebook:not(:disabled):not(.disabled):active,.show>.btn-facebook.dropdown-toggle{color:#fff;background-color:#2d4373;border-color:#dfdfdf}.btn-facebook:not(:disabled):not(.disabled).active:focus,.btn-facebook:not(:disabled):not(.disabled):active:focus,.show>.btn-facebook.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.error{color:#5a5c69;font-size:7rem;position:relative;line-height:1;width:12.5rem}@-webkit-keyframes noise-anim{0%{clip:rect(49px,9999px,40px,0)}5%{clip:rect(75px,9999px,72px,0)}10%{clip:rect(97px,9999px,93px,0)}15%{clip:rect(15px,9999px,9px,0)}20%{clip:rect(14px,9999px,92px,0)}25%{clip:rect(18px,9999px,94px,0)}30%{clip:rect(17px,9999px,20px,0)}35%{clip:rect(71px,9999px,59px,0)}40%{clip:rect(42px,9999px,84px,0)}45%{clip:rect(56px,9999px,25px,0)}50%{clip:rect(46px,9999px,14px,0)}55%{clip:rect(47px,9999px,1px,0)}60%{clip:rect(64px,9999px,58px,0)}65%{clip:rect(89px,9999px,92px,0)}70%{clip:rect(56px,9999px,39px,0)}75%{clip:rect(80px,9999px,71px,0)}80%{clip:rect(8px,9999px,13px,0)}85%{clip:rect(66px,9999px,68px,0)}90%{clip:rect(68px,9999px,4px,0)}95%{clip:rect(56px,9999px,14px,0)}100%{clip:rect(28px,9999px,53px,0)}}@keyframes noise-anim{0%{clip:rect(49px,9999px,40px,0)}5%{clip:rect(75px,9999px,72px,0)}10%{clip:rect(97px,9999px,93px,0)}15%{clip:rect(15px,9999px,9px,0)}20%{clip:rect(14px,9999px,92px,0)}25%{clip:rect(18px,9999px,94px,0)}30%{clip:rect(17px,9999px,20px,0)}35%{clip:rect(71px,9999px,59px,0)}40%{clip:rect(42px,9999px,84px,0)}45%{clip:rect(56px,9999px,25px,0)}50%{clip:rect(46px,9999px,14px,0)}55%{clip:rect(47px,9999px,1px,0)}60%{clip:rect(64px,9999px,58px,0)}65%{clip:rect(89px,9999px,92px,0)}70%{clip:rect(56px,9999px,39px,0)}75%{clip:rect(80px,9999px,71px,0)}80%{clip:rect(8px,9999px,13px,0)}85%{clip:rect(66px,9999px,68px,0)}90%{clip:rect(68px,9999px,4px,0)}95%{clip:rect(56px,9999px,14px,0)}100%{clip:rect(28px,9999px,53px,0)}}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:#f8f9fc;overflow:hidden;clip:rect(0,900px,0,0);animation:noise-anim 2s infinite linear alternate-reverse}@-webkit-keyframes noise-anim-2{0%{clip:rect(16px,9999px,10px,0)}5%{clip:rect(22px,9999px,29px,0)}10%{clip:rect(6px,9999px,68px,0)}15%{clip:rect(85px,9999px,95px,0)}20%{clip:rect(65px,9999px,91px,0)}25%{clip:rect(93px,9999px,68px,0)}30%{clip:rect(10px,9999px,27px,0)}35%{clip:rect(37px,9999px,25px,0)}40%{clip:rect(12px,9999px,23px,0)}45%{clip:rect(40px,9999px,18px,0)}50%{clip:rect(19px,9999px,71px,0)}55%{clip:rect(2px,9999px,35px,0)}60%{clip:rect(16px,9999px,69px,0)}65%{clip:rect(8px,9999px,65px,0)}70%{clip:rect(30px,9999px,57px,0)}75%{clip:rect(14px,9999px,4px,0)}80%{clip:rect(39px,9999px,30px,0)}85%{clip:rect(22px,9999px,35px,0)}90%{clip:rect(58px,9999px,71px,0)}95%{clip:rect(34px,9999px,90px,0)}100%{clip:rect(67px,9999px,68px,0)}}@keyframes noise-anim-2{0%{clip:rect(16px,9999px,10px,0)}5%{clip:rect(22px,9999px,29px,0)}10%{clip:rect(6px,9999px,68px,0)}15%{clip:rect(85px,9999px,95px,0)}20%{clip:rect(65px,9999px,91px,0)}25%{clip:rect(93px,9999px,68px,0)}30%{clip:rect(10px,9999px,27px,0)}35%{clip:rect(37px,9999px,25px,0)}40%{clip:rect(12px,9999px,23px,0)}45%{clip:rect(40px,9999px,18px,0)}50%{clip:rect(19px,9999px,71px,0)}55%{clip:rect(2px,9999px,35px,0)}60%{clip:rect(16px,9999px,69px,0)}65%{clip:rect(8px,9999px,65px,0)}70%{clip:rect(30px,9999px,57px,0)}75%{clip:rect(14px,9999px,4px,0)}80%{clip:rect(39px,9999px,30px,0)}85%{clip:rect(22px,9999px,35px,0)}90%{clip:rect(58px,9999px,71px,0)}95%{clip:rect(34px,9999px,90px,0)}100%{clip:rect(67px,9999px,68px,0)}}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:#f8f9fc;overflow:hidden;clip:rect(0,900px,0,0);animation:noise-anim-2 3s infinite linear alternate-reverse}footer.sticky-footer{padding:2rem 0;flex-shrink:0}footer.sticky-footer .copyright{line-height:1;font-size:.8rem}body.sidebar-toggled footer.sticky-footer{width:100%} \ No newline at end of file diff --git a/SmartEVSE-3/SmartEVSE-3/data/update2.html b/SmartEVSE-3/SmartEVSE-3/data/update2.html deleted file mode 100644 index 7c2099f..0000000 --- a/SmartEVSE-3/SmartEVSE-3/data/update2.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - SmartEVSEv3 - - - - - - - -
-
- Current version: - ======================================================= - DOWNLOADING -

- - - - - - - - - - - - - - - - - - - - -
Distribution:Status:Github repo:Latest version:Flash:
Factorystable
- -
Community          bleeding edge       
- -
-
- ======================================================= -
- FLASHING -

- Flash one of:
    -
  • firmware.bin or firmware.signed.bin (to update the firmware);
  • -
  • firmware.debug.bin or firmware.debug.signed.bin (if you want to telnet to your SmartEVSE to see debug messages);
  • -
  • rfix.txt (if you want to bulk upload allowed NFC tags for the RFID reader);
  • -
- You should only flash files with those exact names.
No need to flash spiffs.bin for versions 3.6.0-RC1 and newer!
No need to rename firmware.debug.bin anymore for versions 3.6.0-RC2 and newer!
Signed firmware is verified to be original and can be handled by versions 3.6.2 and newer. -
-
- - -
-
-
- - - - diff --git a/SmartEVSE-3/SmartEVSE-3/data/update3.html b/SmartEVSE-3/SmartEVSE-3/data/update3.html deleted file mode 100644 index 21ef75d..0000000 --- a/SmartEVSE-3/SmartEVSE-3/data/update3.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - SmartEVSEv3 - - - - - -
- - diff --git a/SmartEVSE-3/SmartEVSE-3/include/OneWire.h b/SmartEVSE-3/SmartEVSE-3/include/OneWire.h deleted file mode 100644 index 6a8e944..0000000 --- a/SmartEVSE-3/SmartEVSE-3/include/OneWire.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -; Project: Smart EVSE -; -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. -*/ - - -#ifndef __ONEWIRE_H -#define __ONEWIRE_H - -extern Preferences preferences; - -void ReadRFIDlist(void); -void DeleteAllRFID(void); -void CheckRFID(void); -void LoadandStoreRFID(unsigned int *RFIDparam); - -#endif // #ifndef __ONEWIRE_H diff --git a/SmartEVSE-3/SmartEVSE-3/include/README b/SmartEVSE-3/SmartEVSE-3/include/README deleted file mode 100644 index 194dcd4..0000000 --- a/SmartEVSE-3/SmartEVSE-3/include/README +++ /dev/null @@ -1,39 +0,0 @@ - -This directory is intended for project header files. - -A header file is a file containing C declarations and macro definitions -to be shared between several project source files. You request the use of a -header file in your project source file (C, C++, etc) located in `src` folder -by including it, with the C preprocessing directive `#include'. - -```src/main.c - -#include "header.h" - -int main (void) -{ - ... -} -``` - -Including a header file produces the same results as copying the header file -into each source file that needs it. Such copying would be time-consuming -and error-prone. With a header file, the related declarations appear -in only one place. If they need to be changed, they can be changed in one -place, and programs that include the header file will automatically use the -new version when next recompiled. The header file eliminates the labor of -finding and changing all the copies as well as the risk that a failure to -find one copy will result in inconsistencies within a program. - -In C, the usual convention is to give header files names that end with `.h'. -It is most portable to use only letters, digits, dashes, and underscores in -header file names, and at most one dot. - -Read more about using header files in official GCC documentation: - -* Include Syntax -* Include Operation -* Once-Only Headers -* Computed Includes - -https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/SmartEVSE-3/SmartEVSE-3/include/evse.h b/SmartEVSE-3/SmartEVSE-3/include/evse.h deleted file mode 100644 index b60d73f..0000000 --- a/SmartEVSE-3/SmartEVSE-3/include/evse.h +++ /dev/null @@ -1,592 +0,0 @@ -/* -; Project: Smart EVSE v3 -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. - */ - -#ifndef __EVSE_MAIN - -#define __EVSE_MAIN - -#ifndef DBG -//the wifi-debugger is available by telnetting to your SmartEVSE device -#define DBG 0 //comment or set to 0 for production release, 0 = no debug 1 = debug over telnet, 2 = debug over usb serial -#endif - -#ifndef FAKE_RFID -//set FAKE_RFID to 1 to emulate an rfid reader with rfid of card = 123456 -//showing the rfid card is simulated by executing http://smartevse-xxx.lan/debug?showrfid=1 -//don't forget to first store the card before it can activate charging -#define FAKE_RFID 0 -#endif - -#ifndef AUTOMATED_TESTING -//set AUTOMATED_TESTING to 1 to make hardware-related paramaters like MaxCurrent and MaxCircuit updatable via REST API -//e.g. by executing curl -X POST http://smartevse-xxx.lan/automated_testing?maxcurrent=100 -#define AUTOMATED_TESTING 0 -#endif - -#ifndef FAKE_SUNNY_DAY -//set this to 1 to emulate a sunny day where your solar charger is injecting current in the grid: -#define FAKE_SUNNY_DAY 0 -//disclaimer: might not work for CT1 calibration/uncalibration stuff, since I can't test that -//the number of Amperes you want to have fake injected into Lx -#endif - -#if FAKE_SUNNY_DAY -#define INJECT_CURRENT_L1 10 -#define INJECT_CURRENT_L2 0 -#define INJECT_CURRENT_L3 0 -#endif - -#ifndef MQTT -#define MQTT 1 // Uncomment or set to 0 to disable MQTT support in code -#endif - -#ifndef MODEM -//the wifi-debugger is available by telnetting to your SmartEVSE device -#define MODEM 0 //0 = no modem 1 = modem -#endif - -#ifndef VERSION -//please note that this version will only be displayed with the correct time/date if the program is recompiled -//so the webserver will show correct version if evse.cpp is recompiled -//the lcd display will show correct version if glcd.cpp is recompiled -#define VERSION (__TIME__ " @" __DATE__) -#endif - - -#if DBG == 0 -//used to steer RemoteDebug -#define DEBUG_DISABLED 1 -#define _LOG_W( ... ) //dummy -#define _LOG_I( ... ) //dummy -#define _LOG_D( ... ) //dummy -#define _LOG_V( ... ) //dummy -#define _LOG_A( ... ) //dummy -#define _LOG_W_NO_FUNC( ... ) //dummy -#define _LOG_I_NO_FUNC( ... ) //dummy -#define _LOG_D_NO_FUNC( ... ) //dummy -#define _LOG_V_NO_FUNC( ... ) //dummy -#define _LOG_A_NO_FUNC( ... ) //dummy -#endif - -#if DBG == 1 -#define _LOG_A(fmt, ...) if (Debug.isActive(Debug.ANY)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) //Always = Errors!!! -#define _LOG_P(fmt, ...) if (Debug.isActive(Debug.PROFILER)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) -#define _LOG_V(fmt, ...) if (Debug.isActive(Debug.VERBOSE)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) //Verbose -#define _LOG_D(fmt, ...) if (Debug.isActive(Debug.DEBUG)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) //Debug -#define _LOG_I(fmt, ...) if (Debug.isActive(Debug.INFO)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) //Info -#define _LOG_W(fmt, ...) if (Debug.isActive(Debug.WARNING)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) //Warning -#define _LOG_E(fmt, ...) if (Debug.isActive(Debug.ERROR)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) //Error not used! -#define _LOG_A_NO_FUNC(fmt, ...) if (Debug.isActive(Debug.ANY)) Debug.printf(fmt, ##__VA_ARGS__) -#define _LOG_P_NO_FUNC(fmt, ...) if (Debug.isActive(Debug.PROFILER)) Debug.printf(fmt, ##__VA_ARGS__) -#define _LOG_V_NO_FUNC(fmt, ...) if (Debug.isActive(Debug.VERBOSE)) Debug.printf(fmt, ##__VA_ARGS__) -#define _LOG_D_NO_FUNC(fmt, ...) if (Debug.isActive(Debug.DEBUG)) Debug.printf(fmt, ##__VA_ARGS__) -#define _LOG_I_NO_FUNC(fmt, ...) if (Debug.isActive(Debug.INFO)) Debug.printf(fmt, ##__VA_ARGS__) -#define _LOG_W_NO_FUNC(fmt, ...) if (Debug.isActive(Debug.WARNING)) Debug.printf(fmt, ##__VA_ARGS__) -#define _LOG_E_NO_FUNC(fmt, ...) if (Debug.isActive(Debug.ERROR)) Debug.printf(fmt, ##__VA_ARGS__) -#include "RemoteDebug.h" //https://github.com/JoaoLopesF/RemoteDebug -extern RemoteDebug Debug; -#endif - -#if DBG == 2 -#define DEBUG_DISABLED 1 -#define _LOG_W( ... ) log_w ( __VA_ARGS__ ) -#define _LOG_I( ... ) log_i ( __VA_ARGS__ ) -#define _LOG_D( ... ) log_d ( __VA_ARGS__ ) -#define _LOG_V( ... ) log_v ( __VA_ARGS__ ) -#define _LOG_A( ... ) log_n ( __VA_ARGS__ ) -#define _LOG_W_NO_FUNC( ... ) Serial.printf ( __VA_ARGS__ ) -#define _LOG_I_NO_FUNC( ... ) Serial.printf ( __VA_ARGS__ ) -#define _LOG_D_NO_FUNC( ... ) Serial.printf ( __VA_ARGS__ ) -#define _LOG_V_NO_FUNC( ... ) Serial.printf ( __VA_ARGS__ ) -#define _LOG_A_NO_FUNC( ... ) Serial.printf ( __VA_ARGS__ ) -#endif - -// Pin definitions left side ESP32 -#define PIN_TEMP 36 -#define PIN_CP_IN 39 -#define PIN_PP_IN 34 -#define PIN_LOCK_IN 35 -#define PIN_SSR 32 -#define PIN_LCD_SDO_B3 33 // = SPI_MOSI -#define PIN_LCD_A0_B2 25 -#define PIN_LCD_CLK 26 // = SPI_SCK -#define PIN_SSR2 27 -#define PIN_LCD_LED 14 -#define PIN_LEDB 12 -#define PIN_RCM_FAULT 13 - -// Pin definitions right side ESP32 -#define PIN_RS485_RX 23 -#define PIN_RS485_DIR 22 -//#define PIN_RXD -//#define PIN_TXD -#define PIN_RS485_TX 21 -#define PIN_CP_OUT 19 -#define PIN_ACTB 18 -#define PIN_LCD_RST 5 -#define PIN_ACTA 17 -#define PIN_SW_IN 16 -#define PIN_LEDG 4 -#define PIN_IO0_B1 0 -#define PIN_LEDR 2 -#define PIN_CPOFF 15 - -#define SPI_MOSI 33 // SPI connections to LCD -#define SPI_MISO -1 -#define SPI_SCK 26 -#define SPI_SS -1 - -#define CP_CHANNEL 0 -#define RED_CHANNEL 2 // PWM channel 2 (0 and 1 are used by CP signal) -#define GREEN_CHANNEL 3 -#define BLUE_CHANNEL 4 -#define LCD_CHANNEL 5 // LED Backlight LCD - -#define PWM_5 50 // 5% of PWM -#define PWM_95 950 // 95% of PWM -#define PWM_100 1000 // 100% of PWM - -#define ICAL 1024 // Irms Calibration value (for Current transformers) -#define MAX_MAINS 25 // max Current the Mains connection can supply -#define MAX_SUMMAINS 600 // only used for capacity rate limiting, max current over the sum of all phases -#define MAX_CURRENT 13 // max charging Current for the EV -#ifndef MIN_CURRENT -#define MIN_CURRENT 6 // minimum Current the EV will accept -#endif -#define MODE 0 // Normal EVSE mode -#define LOCK 0 // No Cable lock -#define MAX_CIRCUIT 16 // Max current of the EVSE circuit breaker -#define CONFIG 0 // Configuration: 0= TYPE 2 socket, 1= Fixed Cable -#define LOADBL 0 // Load Balancing disabled -#define SWITCH 0 // 0= Charge on plugin, 1= (Push)Button on IO2 is used to Start/Stop charging. -#define RC_MON 0 // Residual Current Monitoring on IO3. Disabled=0, RCM14=1 -#define CHARGEDELAY 60 // Seconds to wait after overcurrent, before trying again -#define BACKLIGHT 120 // Seconds delay for the LCD backlight to turn off. -#define RFIDLOCKTIME 60 // Seconds delay for the EVSE to lock again (RFIDreader = EnableOne) -#define START_CURRENT 4 // Start charging when surplus current on sum of all phases exceeds 4A (Solar) -#define STOP_TIME 10 // Stop charging after 10 minutes at MIN charge current (Solar) -#define IMPORT_CURRENT 0 // Allow the use of grid power when solar charging (Amps) -#define MAINS_METER 0 // Mains Meter, 0=Disabled, 1= Sensorbox, 2=Phoenix, 3= Finder, 4= Eastron, 5=Custom -#define GRID 0 // Grid, 0= 4-Wire CW, 1= 4-Wire CCW, 2= 3-Wire CW, 3= 3-Wire CCW -#define MAINS_METER_ADDRESS 10 -#define PV_METER 0 -#define PV_METER_ADDRESS 11 -#define EV_METER 0 -#define EV_METER_ADDRESS 12 -#define MIN_METER_ADDRESS 10 -#define MAX_METER_ADDRESS 247 -#define EMCUSTOM_ENDIANESS 0 -#define EMCUSTOM_DATATYPE 0 -#define EMCUSTOM_FUNCTION 4 -#define EMCUSTOM_UREGISTER 0 -#define EMCUSTOM_UDIVISOR 8 -#define EMCUSTOM_IREGISTER 0 -#define EMCUSTOM_IDIVISOR 8 -#define EMCUSTOM_PREGISTER 0 -#define EMCUSTOM_PDIVISOR 8 -#define EMCUSTOM_EREGISTER 0 -#define EMCUSTOM_EDIVISOR 8 -#define RFID_READER 0 -#define ACCESS_BIT 1 -#define WIFI_MODE 0 -#define AP_PASSWORD "00000000" -#define CARD_OFFSET 0 -#define INITIALIZED 0 -#define ENABLE_C2 ALWAYS_ON -#define MAX_TEMPERATURE 65 -#define DELAYEDSTARTTIME 0 // The default StartTime for delayed charged, 0 = not delaying -#define DELAYEDSTOPTIME 0 // The default StopTime for delayed charged, 0 = not stopping -#define SOLARSTARTTIME 40 // Seconds to keep chargecurrent at 6A -#define PUBLIC_KEY "5c7a848c3445793002487608a65fa259cefb16790f7c2f4a1d10af702393f7db\0"; - - -// Mode settings -#define MODE_NORMAL 0 -#define MODE_SMART 1 -#define MODE_SOLAR 2 - -#define MODBUS_BAUDRATE 9600 -#define MODBUS_TIMEOUT 4 -#define ACK_TIMEOUT 1000 // 1000ms timeout -#define NR_EVSES 8 -#define BROADCAST_ADR 0x09 -#define COMM_TIMEOUT 11 // Timeout for MainsMeter -#define COMM_EVTIMEOUT 8*NR_EVSES // Timeout for EV Energy Meters - -#define STATE_A 0 // A Vehicle not connected -#define STATE_B 1 // B Vehicle connected / not ready to accept energy -#define STATE_C 2 // C Vehicle connected / ready to accept energy / ventilation not required -#define STATE_D 3 // D Vehicle connected / ready to accept energy / ventilation required (not implemented) -#define STATE_COMM_B 4 // E State change request A->B (set by node) -#define STATE_COMM_B_OK 5 // F State change A->B OK (set by master) -#define STATE_COMM_C 6 // G State change request B->C (set by node) -#define STATE_COMM_C_OK 7 // H State change B->C OK (set by master) -#define STATE_ACTSTART 8 // I Activation mode in progress -#define STATE_B1 9 // J Vehicle connected / EVSE not ready to deliver energy: no PWM signal -#define STATE_C1 10 // K Vehicle charging / EVSE not ready to deliver energy: no PWM signal (temp state when stopping charge from EVSE) -#define STATE_MODEM_REQUEST 11 // L Vehicle connected / requesting ISO15118 communication, 0% duty -#define STATE_MODEM_WAIT 12 // M Vehicle connected / requesting ISO15118 communication, 5% duty -#define STATE_MODEM_DONE 13 // Modem communication succesful, SoCs extracted. Here, re-plug vehicle -#define STATE_MODEM_DENIED 14 // Modem access denied based on EVCCID, re-plug vehicle and try again - -#define NOSTATE 255 - -#define PILOT_12V 1 // State A - vehicle disconnected -#define PILOT_9V 2 // State B - vehicle connected -#define PILOT_6V 3 // State C - EV charge -#define PILOT_3V 4 -#define PILOT_DIODE 5 -#define PILOT_NOK 0 - - -#define NO_ERROR 0 -#define LESS_6A 1 -#define CT_NOCOMM 2 -#define TEMP_HIGH 4 -#define EV_NOCOMM 8 -#define RCM_TRIPPED 16 // RCM tripped. >6mA DC residual current detected. -#define NO_SUN 32 -#define Test_IO 64 -#define BL_FLASH 128 - -#define STATE_A_LED_BRIGHTNESS 40 -#define STATE_B_LED_BRIGHTNESS 255 -#define ERROR_LED_BRIGHTNESS 255 -#define WAITING_LED_BRIGHTNESS 255 -#define LCD_BRIGHTNESS 255 - - -#define CP_ON digitalWrite(PIN_CPOFF, LOW); -#define CP_OFF digitalWrite(PIN_CPOFF, HIGH); - -#define PILOT_CONNECTED digitalWrite(PIN_CPOFF, LOW); -#define PILOT_DISCONNECTED digitalWrite(PIN_CPOFF, HIGH); - -#define CONTACTOR1_ON _LOG_A("Switching Contactor1 ON.\n"); digitalWrite(PIN_SSR, HIGH); -#define CONTACTOR1_OFF _LOG_A("Switching Contactor1 OFF.\n"); digitalWrite(PIN_SSR, LOW); - -#define CONTACTOR2_ON _LOG_A("Switching Contactor2 ON.\n"); digitalWrite(PIN_SSR2, HIGH); -#define CONTACTOR2_OFF _LOG_A("Switching Contactor2 OFF.\n"); digitalWrite(PIN_SSR2, LOW); - -#define BACKLIGHT_ON digitalWrite(PIN_LCD_LED, HIGH); -#define BACKLIGHT_OFF digitalWrite(PIN_LCD_LED, LOW); - -#define ACTUATOR_LOCK { _LOG_A("Locking Actuator.\n"); digitalWrite(PIN_ACTB, HIGH); digitalWrite(PIN_ACTA, LOW); } -#define ACTUATOR_UNLOCK { _LOG_A("Unlocking Actuator.\n"); digitalWrite(PIN_ACTB, LOW); digitalWrite(PIN_ACTA, HIGH); } -#define ACTUATOR_OFF { digitalWrite(PIN_ACTB, HIGH); digitalWrite(PIN_ACTA, HIGH); } - -#define ONEWIRE_LOW { digitalWrite(PIN_SW_IN, LOW); pinMode(PIN_SW_IN, OUTPUT); } // SW set to 0, set to output (driven low) -#define ONEWIRE_HIGH { digitalWrite(PIN_SW_IN, HIGH); pinMode(PIN_SW_IN, OUTPUT); } // SW set to 1, set to output (driven high) -#define ONEWIRE_FLOATHIGH pinMode(PIN_SW_IN, INPUT_PULLUP ); // SW input (floating high) - -#define RCMFAULT digitalRead(PIN_RCM_FAULT) -#define FREE(x) free(x); x = NULL; -#define FW_DOWNLOAD_PATH "http://smartevse-3.s3.eu-west-2.amazonaws.com" - -#define MODBUS_INVALID 0 -#define MODBUS_OK 1 -#define MODBUS_REQUEST 2 -#define MODBUS_RESPONSE 3 -#define MODBUS_EXCEPTION 4 - -#define MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS 0x02 -#define MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE 0x03 - -#define MODBUS_EVSE_STATUS_START 0x0000 -#define MODBUS_EVSE_STATUS_COUNT 12 -#define MODBUS_EVSE_CONFIG_START 0x0100 -#define MODBUS_EVSE_CONFIG_COUNT 10 -#define MODBUS_SYS_CONFIG_START 0x0200 -#define MODBUS_SYS_CONFIG_COUNT 26 - -#define MODBUS_MAX_REGISTER_READ MODBUS_SYS_CONFIG_COUNT -#define MODBUS_BUFFER_SIZE MODBUS_MAX_REGISTER_READ * 2 + 10 - -// EVSE status -#define STATUS_STATE 64 // 0x0000: State -#define STATUS_ERROR 65 // 0x0001: Error -#define STATUS_CURRENT 66 // 0x0002: Charging current (A * 10) -#define STATUS_MODE 67 // 0x0003: EVSE Mode -#define STATUS_SOLAR_TIMER 68 // 0x0004: Solar Timer -#define STATUS_ACCESS 69 // 0x0005: Access bit -#define STATUS_CONFIG_CHANGED 70 // 0x0006: Configuration changed -#define STATUS_MAX 71 // 0x0007: Maximum charging current (RO) -#define STATUS_PHASE_COUNT 72 // 0x0008: Number of used phases (RO) (ToDo) -#define STATUS_REAL_CURRENT 73 // 0x0009: Real charging current (RO) (ToDo) -#define STATUS_TEMP 74 // 0x000A: Temperature (RO) -#define STATUS_SERIAL 75 // 0x000B: Serial number (RO) - -// Node specific configuration -#define MENU_ENTER 1 -#define MENU_CONFIG 2 // 0x0100: Configuration -#define MENU_LOCK 3 // 0x0101: Cable lock -#define MENU_MIN 4 // 0x0102: MIN Charge Current the EV will accept -#define MENU_MAX 5 // 0x0103: MAX Charge Current for this EVSE -#define MENU_LOADBL 6 // 0x0104: Load Balance -#define MENU_SWITCH 7 // 0x0105: External Start/Stop button -#define MENU_RCMON 8 // 0x0106: Residual Current Monitor -#define MENU_RFIDREADER 9 // 0x0107: Use RFID reader -#define MENU_EVMETER 10 // 0x0108: Type of EV electric meter -#define MENU_EVMETERADDRESS 11 // 0x0109: Address of EV electric meter - -// System configuration (same on all SmartEVSE in a LoadBalancing setup) -#define MENU_MODE 12 // 0x0200: EVSE mode -#define MENU_CIRCUIT 13 // 0x0201: EVSE Circuit max Current -#define MENU_GRID 14 // 0x0202: Grid type to which the Sensorbox is connected -#define MENU_CAL 15 // 0x0203: CT calibration value -#define MENU_MAINS 16 // 0x0204: Max Mains Current -#define MENU_START 17 // 0x0205: Surplus energy start Current -#define MENU_STOP 18 // 0x0206: Stop solar charging at 6A after this time -#define MENU_IMPORT 19 // 0x0207: Allow grid power when solar charging -#define MENU_MAINSMETER 20 // 0x0208: Type of Mains electric meter -#define MENU_MAINSMETERADDRESS 21 // 0x0209: Address of Mains electric meter -#define MENU_EMCUSTOM_ENDIANESS 22 // 0x020D: Byte order of custom electric meter -#define MENU_EMCUSTOM_DATATYPE 23 // 0x020E: Data type of custom electric meter -#define MENU_EMCUSTOM_FUNCTION 24 // 0x020F: Modbus Function (3/4) of custom electric meter -#define MENU_EMCUSTOM_UREGISTER 25 // 0x0210: Register for Voltage (V) of custom electric meter -#define MENU_EMCUSTOM_UDIVISOR 26 // 0x0211: Divisor for Voltage (V) of custom electric meter (10^x) -#define MENU_EMCUSTOM_IREGISTER 27 // 0x0212: Register for Current (A) of custom electric meter -#define MENU_EMCUSTOM_IDIVISOR 28 // 0x0213: Divisor for Current (A) of custom electric meter (10^x) -#define MENU_EMCUSTOM_PREGISTER 29 // 0x0214: Register for Power (W) of custom electric meter -#define MENU_EMCUSTOM_PDIVISOR 30 // 0x0215: Divisor for Power (W) of custom electric meter (10^x) -#define MENU_EMCUSTOM_EREGISTER 31 // 0x0216: Register for Energy (kWh) of custom electric meter -#define MENU_EMCUSTOM_EDIVISOR 32 // 0x0217: Divisor for Energy (kWh) of custom electric meter (10^x) -#define MENU_EMCUSTOM_READMAX 33 // 0x0218: Maximum register read (ToDo) -#define MENU_WIFI 34 // 0x0219: WiFi mode -#define MENU_C2 35 -#define MENU_MAX_TEMP 36 -#define MENU_SUMMAINS 37 -#define MENU_OFF 38 // so access bit is reset and charging stops when pressing < button 2 seconds -#define MENU_ON 39 // so access bit is set and charging starts when pressing > button 2 seconds -#define MENU_EXIT 40 - -#define MENU_STATE 50 - -#define _RSTB_0 digitalWrite(PIN_LCD_RST, LOW); -#define _RSTB_1 digitalWrite(PIN_LCD_RST, HIGH); -#define _A0_0 digitalWrite(PIN_LCD_A0_B2, LOW); -#define _A0_1 digitalWrite(PIN_LCD_A0_B2, HIGH); - -#define EM_SENSORBOX 1 // Mains meter types -#define EM_PHOENIX_CONTACT 2 -#define EM_FINDER_7E 3 -#define EM_EASTRON3P 4 -#define EM_EASTRON3P_INV 5 -#define EM_ABB 6 -#define EM_SOLAREDGE 7 -#define EM_WAGO 8 -#define EM_API 9 -#define EM_EASTRON1P 10 -#define EM_FINDER_7M 11 -#define EM_UNUSED_SLOT1 12 -#define EM_UNUSED_SLOT2 13 -#define EM_UNUSED_SLOT3 14 -#define EM_UNUSED_SLOT4 15 -#define EM_CUSTOM 16 - -#define ENDIANESS_LBF_LWF 0 -#define ENDIANESS_LBF_HWF 1 -#define ENDIANESS_HBF_LWF 2 -#define ENDIANESS_HBF_HWF 3 - -#define OWNER_FACT "SmartEVSE" -#define REPO_FACT "SmartEVSE-3" -#define OWNER_COMM "dingo35" -#define REPO_COMM "SmartEVSE-3.5" - -typedef enum mb_datatype { - MB_DATATYPE_INT32 = 0, - MB_DATATYPE_FLOAT32 = 1, - MB_DATATYPE_INT16 = 2, - MB_DATATYPE_MAX, -} MBDataType; - - -extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished. - -#define RTC_ENTER_CRITICAL() portENTER_CRITICAL(&rtc_spinlock) -#define RTC_EXIT_CRITICAL() portEXIT_CRITICAL(&rtc_spinlock) - - -extern String APpassword; -extern struct tm timeinfo; - - -extern uint16_t ICal; // CT calibration value -extern uint8_t Mode; // EVSE mode -extern uint8_t LoadBl; // Load Balance Setting (Disable, Master or Node) -extern uint8_t Grid; -extern uint8_t MainsMeterAddress; -extern uint8_t EVMeter; // Type of EV electric meter (0: Disabled / Constants EM_*) -extern uint8_t EVMeterAddress; -#if FAKE_RFID -extern uint8_t Show_RFID; -#endif - -extern int16_t Irms[3]; // Momentary current per Phase (Amps *10) (23 = 2.3A) -extern int16_t Irms_EV[3]; // Momentary current per Phase (Amps *10) (23 = 2.3A) - -extern uint8_t State; -extern uint8_t ErrorFlags; -extern uint8_t NextState; - -extern int16_t Isum; -extern uint16_t Balanced[NR_EVSES]; // Amps value per EVSE - -extern uint8_t LCDTimer; -extern uint16_t BacklightTimer; // remaining seconds the LCD backlight is active -extern uint8_t ButtonState; // Holds latest push Buttons state (LSB 2:0) -extern uint8_t OldButtonState; // Holds previous push Buttons state (LSB 2:0) -extern uint8_t LCDNav; -extern uint8_t LCDupdate; -extern uint8_t SubMenu; -extern uint32_t ScrollTimer; -extern uint8_t ChargeDelay; // Delays charging in seconds. -extern uint8_t TestState; -extern uint8_t Access_bit; -extern uint16_t CardOffset; - -extern uint8_t GridActive; // When the CT's are used on Sensorbox2, it enables the GRID menu option. -extern uint8_t CalActive; // When the CT's are used on Sensorbox(1.5 or 2), it enables the CAL menu option. -extern uint16_t Iuncal; -extern uint16_t SolarStopTimer; -extern int32_t EnergyCharged; -extern int32_t EnergyCapacity; -extern int16_t PowerMeasured; -extern uint8_t RFIDstatus; -extern bool LocalTimeSet; -extern uint32_t serialnr; - -extern uint8_t MenuItems[MENU_EXIT]; - -enum EnableC2_t { NOT_PRESENT, ALWAYS_OFF, SOLAR_OFF, ALWAYS_ON, AUTO }; -enum Modem_t { NOTPRESENT, EXPERIMENT }; -const static char StrEnableC2[][12] = { "Not present", "Always Off", "Solar Off", "Always On", "Auto" }; -const static char StrModem[][12] = { "Not present", "Experiment" }; -enum Single_Phase_t { FALSE, GOING_TO_SWITCH, AFTER_SWITCH }; -extern Single_Phase_t Switching_To_Single_Phase; -extern uint8_t Nr_Of_Phases_Charging; - -const struct { - char LCD[10]; - char Desc[52]; - uint16_t Min; - uint16_t Max; - uint16_t Default; -} MenuStr[MENU_EXIT + 1] = { - {"", "Not in menu", 0, 0, 0}, - {"", "Hold 2 sec", 0, 0, 0}, - - // Node specific configuration - /* LCD, Desc, Min, Max, Default */ - {"CONFIG", "Fixed Cable or Type 2 Socket", 0, 1, CONFIG}, - {"LOCK", "Cable locking actuator type", 0, 2, LOCK}, - {"MIN", "MIN Charge Current the EV will accept (per phase)", MIN_CURRENT, 16, MIN_CURRENT}, - {"MAX", "MAX Charge Current for this EVSE (per phase)", 6, 80, MAX_CURRENT}, - {"PWR SHARE", "Share Power between multiple SmartEVSEs (2-8)", 0, NR_EVSES, LOADBL}, - {"SWITCH", "Switch function control on pin SW", 0, 4, SWITCH}, - {"RCMON", "Residual Current Monitor on pin RCM", 0, 1, RC_MON}, - {"RFID", "RFID reader, learn/remove cards", 0, 5, RFID_READER}, - {"EV METER","Type of EV electric meter", 0, EM_CUSTOM, EV_METER}, - {"EV ADDR", "Address of EV electric meter", MIN_METER_ADDRESS, MAX_METER_ADDRESS, EV_METER_ADDRESS}, - - // System configuration - /* LCD, Desc, Min, Max, Default */ - {"MODE", "Normal, Smart or Solar EVSE mode", 0, 2, MODE}, - {"CIRCUIT", "EVSE Circuit max Current", 10, 160, MAX_CIRCUIT}, - {"GRID", "Grid type to which the Sensorbox is connected", 0, 1, GRID}, - {"CAL", "Calibrate CT1 (CT2+3 will also change)", (unsigned int) (ICAL * 0.3), (unsigned int) (ICAL * 2.0), ICAL}, // valid range is 0.3 - 2.0 times measured value - {"MAINS", "Max MAINS Current (per phase)", 10, 200, MAX_MAINS}, - {"START", "Surplus energy start Current (sum of phases)", 0, 48, START_CURRENT}, - {"STOP", "Stop solar charging at 6A after this time", 0, 60, STOP_TIME}, - {"IMPORT", "Allow grid power when solar charging (sum of phase)",0, 48, IMPORT_CURRENT}, - {"MAINS MET","Type of mains electric meter", 0, EM_CUSTOM, MAINS_METER}, - {"MAINS ADR","Address of mains electric meter", MIN_METER_ADDRESS, MAX_METER_ADDRESS, MAINS_METER_ADDRESS}, - {"BYTE ORD","Byte order of custom electric meter", 0, 3, EMCUSTOM_ENDIANESS}, - {"DATA TYPE","Data type of custom electric meter", 0, MB_DATATYPE_MAX - 1, EMCUSTOM_DATATYPE}, - {"FUNCTION","Modbus Function of custom electric meter", 3, 4, EMCUSTOM_FUNCTION}, - {"VOL REGI","Register for Voltage (V) of custom electric meter", 0, 65530, EMCUSTOM_UREGISTER}, - {"VOL DIVI","Divisor for Voltage (V) of custom electric meter", 0, 7, EMCUSTOM_UDIVISOR}, - {"CUR REGI","Register for Current (A) of custom electric meter", 0, 65530, EMCUSTOM_IREGISTER}, - {"CUR DIVI","Divisor for Current (A) of custom electric meter", 0, 7, EMCUSTOM_IDIVISOR}, - {"POW REGI","Register for Power (W) of custom electric meter", 0, 65534, EMCUSTOM_PREGISTER}, - {"POW DIVI","Divisor for Power (W) of custom electric meter", 0, 7, EMCUSTOM_PDIVISOR}, - {"ENE REGI","Register for Energy (kWh) of custom electric meter", 0, 65534, EMCUSTOM_EREGISTER}, - {"ENE DIVI","Divisor for Energy (kWh) of custom electric meter", 0, 7, EMCUSTOM_EDIVISOR}, - {"READ MAX","Max register read at once of custom electric meter", 3, 255, 3}, - {"WIFI", "Connect to WiFi access point", 0, 2, WIFI_MODE}, - {"CONTACT 2","Contactor2 (C2) behaviour", 0, sizeof(StrEnableC2) / sizeof(StrEnableC2[0])-1, ENABLE_C2}, - {"MAX TEMP","Maximum temperature for the EVSE module", 40, 75, MAX_TEMPERATURE}, - {"SUM MAINS","Capacity Rate limit on sum of MAINS Current (A)", 10, 600, MAX_SUMMAINS}, - {"", "Hold 2 sec to stop charging", 0, 0, 0}, - {"", "Hold 2 sec to start charging", 0, 0, 0}, - - {"EXIT", "EXIT", 0, 0, 0} -}; - - -struct EMstruct { - uint8_t Desc[10]; - uint8_t Endianness; // 0: low byte first, low word first, 1: low byte first, high word first, 2: high byte first, low word first, 3: high byte first, high word first - uint8_t Function; // 3: holding registers, 4: input registers - MBDataType DataType; // How data is represented on this Modbus meter - uint16_t URegister; // Single phase voltage (V) - int8_t UDivisor; // 10^x - uint16_t IRegister; // Single phase current (A) - int8_t IDivisor; // 10^x - uint16_t PRegister; // Total power (W) -- only used for EV/PV meter momentary power - int8_t PDivisor; // 10^x - uint16_t ERegister; // Total imported energy (kWh); equals total energy if meter doesnt support exported energy - int8_t EDivisor; // 10^x - uint16_t ERegister_Exp; // Total exported energy (kWh) - int8_t EDivisor_Exp; // 10^x -}; - -extern struct EMstruct EMConfig[EM_CUSTOM + 1]; - -struct DelayedTimeStruct { - uint32_t epoch2; // in case of Delayed Charging the StartTime in epoch2; if zero we are NOT Delayed Charging - // epoch2 is the number of seconds since 1/1/2023 00:00 UTC, which equals epoch 1672531200 - // we avoid using epoch so we don't need expensive 64bits arithmetics with difftime - // and we can store dates until 7/2/2159 - int32_t diff; // StartTime minus current time in seconds -}; - -#define EPOCH2_OFFSET 1672531200 - -extern struct DelayedTimeStruct DelayedStartTime; - -void CheckAPpassword(void); -void read_settings(); -void write_settings(void); -void setSolarStopTimer(uint16_t Timer); -void setState(uint8_t NewState); -void setAccess(bool Access); -void SetCPDuty(uint32_t DutyCycle); -uint8_t setItemValue(uint8_t nav, uint16_t val); -uint16_t getItemValue(uint8_t nav); -void ConfigureModbusMode(uint8_t newmode); - -void handleWIFImode(void); - -#endif diff --git a/SmartEVSE-3/SmartEVSE-3/include/glcd.h b/SmartEVSE-3/SmartEVSE-3/include/glcd.h deleted file mode 100644 index 861db85..0000000 --- a/SmartEVSE-3/SmartEVSE-3/include/glcd.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -; Project: Smart EVSE -; -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. -*/ - -#ifndef __GLCD_H -#define __GLCD_H - -#define GLCD_MERGE 0b00001000 -#define GLCD_HIRES_FONT -#define GLCD_FULL_CHARSET -#define GLCD_ALIGN_LEFT 0 -#define GLCD_ALIGN_CENTER 1 -#define GLCD_ALIGN_RIGHT 2 - -extern void GLCDHelp(void); -extern void GLCD(void); -extern void GLCDMenu(unsigned char Buttons); -extern void GLCD_init(void); -extern void GLCD_version(void); - - -#endif // #ifndef __GLCD_H \ No newline at end of file diff --git a/SmartEVSE-3/SmartEVSE-3/include/modbus.h b/SmartEVSE-3/SmartEVSE-3/include/modbus.h deleted file mode 100644 index 15f64ba..0000000 --- a/SmartEVSE-3/SmartEVSE-3/include/modbus.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -; Project: Smart EVSE -; -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. -*/ - -#ifndef __EVSE_MODBUS -#define __EVSE_MODBUS - -struct ModBus { - uint8_t Address; - uint8_t Function; - uint16_t Register; - uint16_t RegisterCount; - uint16_t Value; - uint8_t *Data; - uint8_t DataLength; - uint8_t Type; - uint8_t RequestAddress; - uint8_t RequestFunction; - uint16_t RequestRegister; - uint8_t Exception; -}; - -// definition of MBserver / MBclient class is done in evse.cpp -extern ModbusServerRTU MBserver; -extern ModbusClientRTU MBclient; - -void RS485SendBuf(uint8_t *buffer, uint8_t len); -uint8_t mapModbusRegister2ItemID(); - -// ########################### Modbus main functions ########################### - -void ModbusReadInputRequest(uint8_t address, uint8_t function, uint16_t reg, uint16_t quantity); -void ModbusReadInputResponse(uint8_t address, uint8_t function, uint16_t *values, uint8_t count); -void ModbusWriteSingleRequest(uint8_t address, uint16_t reg, uint16_t value); -void ModbusWriteMultipleRequest(uint8_t address, uint16_t reg, uint16_t *values, uint8_t count); -void ModbusException(uint8_t address, uint8_t function, uint8_t exception); -void ModbusDecode(uint8_t *buf, uint8_t len); - -// ########################### EVSE modbus functions ########################### - -signed int receiveMeasurement(uint8_t *buf, uint8_t pos, uint8_t Endianness, MBDataType dataType, signed char Divisor); -void requestMeasurement(uint8_t Meter, uint8_t Address, uint16_t Register, uint8_t Count); -void requestCurrentMeasurement(uint8_t Meter, uint8_t Address); -uint8_t receiveCurrentMeasurement(uint8_t *buf, uint8_t Meter, signed int *var); - -//void ReadItemValueResponse(void); -//void WriteItemValueResponse(void); -//void WriteMultipleItemValueResponse(void); - - -#endif diff --git a/SmartEVSE-3/SmartEVSE-3/include/mongoose.h b/SmartEVSE-3/SmartEVSE-3/include/mongoose.h deleted file mode 100644 index 9ae5071..0000000 --- a/SmartEVSE-3/SmartEVSE-3/include/mongoose.h +++ /dev/null @@ -1,2930 +0,0 @@ -// Copyright (c) 2004-2013 Sergey Lyubka -// Copyright (c) 2013-2024 Cesanta Software Limited -// All rights reserved -// -// This software is dual-licensed: you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. For the terms of this -// license, see http://www.gnu.org/licenses/ -// -// You are free to use this software under the terms of the GNU General -// Public License, but WITHOUT ANY WARRANTY; without even the implied -// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU General Public License for more details. -// -// Alternatively, you can license this software under a commercial -// license, as set out in https://www.mongoose.ws/licensing/ -// -// SPDX-License-Identifier: GPL-2.0-only or commercial - -#ifndef MONGOOSE_H -#define MONGOOSE_H - -#define MG_VERSION "7.13" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define MG_ARCH_CUSTOM 0 // User creates its own mongoose_custom.h -#define MG_ARCH_UNIX 1 // Linux, BSD, Mac, ... -#define MG_ARCH_WIN32 2 // Windows -#define MG_ARCH_ESP32 3 // ESP32 -#define MG_ARCH_ESP8266 4 // ESP8266 -#define MG_ARCH_FREERTOS 5 // FreeRTOS -#define MG_ARCH_AZURERTOS 6 // MS Azure RTOS -#define MG_ARCH_ZEPHYR 7 // Zephyr RTOS -#define MG_ARCH_NEWLIB 8 // Bare metal ARM -#define MG_ARCH_CMSIS_RTOS1 9 // CMSIS-RTOS API v1 (Keil RTX) -#define MG_ARCH_TIRTOS 10 // Texas Semi TI-RTOS -#define MG_ARCH_RP2040 11 // Raspberry Pi RP2040 -#define MG_ARCH_ARMCC 12 // Keil MDK-Core with Configuration Wizard -#define MG_ARCH_CMSIS_RTOS2 13 // CMSIS-RTOS API v2 (Keil RTX5, FreeRTOS) -#define MG_ARCH_RTTHREAD 14 // RT-Thread RTOS - -#if !defined(MG_ARCH) -#if defined(__unix__) || defined(__APPLE__) -#define MG_ARCH MG_ARCH_UNIX -#elif defined(_WIN32) -#define MG_ARCH MG_ARCH_WIN32 -#elif defined(ICACHE_FLASH) || defined(ICACHE_RAM_ATTR) -#define MG_ARCH MG_ARCH_ESP8266 -#elif defined(__ZEPHYR__) -#define MG_ARCH MG_ARCH_ZEPHYR -#elif defined(ESP_PLATFORM) -#define MG_ARCH MG_ARCH_ESP32 -#elif defined(FREERTOS_IP_H) -#define MG_ARCH MG_ARCH_FREERTOS -#define MG_ENABLE_FREERTOS_TCP 1 -#elif defined(AZURE_RTOS_THREADX) -#define MG_ARCH MG_ARCH_AZURERTOS -#elif defined(PICO_TARGET_NAME) -#define MG_ARCH MG_ARCH_RP2040 -#elif defined(__RTTHREAD__) -#define MG_ARCH MG_ARCH_RTTHREAD -#endif -#endif // !defined(MG_ARCH) - -#if !defined(MG_ARCH) || (MG_ARCH == MG_ARCH_CUSTOM) -#include "mongoose_custom.h" // keep this include -#endif - -#if !defined(MG_ARCH) -#error "MG_ARCH is not specified and we couldn't guess it. Set -D MG_ARCH=..." -#endif - -// http://esr.ibiblio.org/?p=5095 -#define MG_BIG_ENDIAN (*(uint16_t *) "\0\xff" < 0x100) - - - - - - - - - - - - - - - -#if MG_ARCH == MG_ARCH_AZURERTOS - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#define PATH_MAX FX_MAXIMUM_PATH -#define MG_DIRSEP '\\' - -#define socklen_t int -#define closesocket(x) soc_close(x) - -#undef FOPEN_MAX - -#endif - - -#if MG_ARCH == MG_ARCH_ESP32 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define MG_PATH_MAX 128 - -#endif - - -#if MG_ARCH == MG_ARCH_ESP8266 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define MG_PATH_MAX 128 - -#endif - - -#if MG_ARCH == MG_ARCH_FREERTOS - -#include -#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP -#include -#endif -#include -#include -#include -#include -#include -#include // rand(), strtol(), atoi() -#include -#if defined(__ARMCC_VERSION) -#define mode_t size_t -#include -#include -#else -#include -#endif - -#include -#include - -#ifndef MG_IO_SIZE -#define MG_IO_SIZE 512 -#endif - -#define calloc(a, b) mg_calloc(a, b) -#define free(a) vPortFree(a) -#define malloc(a) pvPortMalloc(a) -#define strdup(s) ((char *) mg_strdup(mg_str(s)).ptr) - -// Re-route calloc/free to the FreeRTOS's functions, don't use stdlib -static inline void *mg_calloc(size_t cnt, size_t size) { - void *p = pvPortMalloc(cnt * size); - if (p != NULL) memset(p, 0, size * cnt); - return p; -} - -#define mkdir(a, b) mg_mkdir(a, b) -static inline int mg_mkdir(const char *path, mode_t mode) { - (void) path, (void) mode; - return -1; -} - -#endif // MG_ARCH == MG_ARCH_FREERTOS - - -#if MG_ARCH == MG_ARCH_NEWLIB -#define _POSIX_TIMERS - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MG_PATH_MAX 100 -#define MG_ENABLE_SOCKET 0 -#define MG_ENABLE_DIRLIST 0 - -#endif - - -#if MG_ARCH == MG_ARCH_RP2040 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -int mkdir(const char *, mode_t); -#endif - - -#if MG_ARCH == MG_ARCH_RTTHREAD - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef MG_IO_SIZE -#define MG_IO_SIZE 1460 -#endif - -#endif // MG_ARCH == MG_ARCH_RTTHREAD - - -#if MG_ARCH == MG_ARCH_ARMCC || MG_ARCH == MG_ARCH_CMSIS_RTOS1 || \ - MG_ARCH == MG_ARCH_CMSIS_RTOS2 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if MG_ARCH == MG_ARCH_CMSIS_RTOS1 -#include "cmsis_os.h" // keep this include -// https://developer.arm.com/documentation/ka003821/latest -extern uint32_t rt_time_get(void); -#elif MG_ARCH == MG_ARCH_CMSIS_RTOS2 -#include "cmsis_os2.h" // keep this include -#endif - -#define strdup(s) ((char *) mg_strdup(mg_str(s)).ptr) - -#if defined(__ARMCC_VERSION) -#define mode_t size_t -#define mkdir(a, b) mg_mkdir(a, b) -static inline int mg_mkdir(const char *path, mode_t mode) { - (void) path, (void) mode; - return -1; -} -#endif - -#if (MG_ARCH == MG_ARCH_CMSIS_RTOS1 || MG_ARCH == MG_ARCH_CMSIS_RTOS2) && \ - !defined MG_ENABLE_RL && (!defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP) && \ - (!defined(MG_ENABLE_TCPIP) || !MG_ENABLE_TCPIP) -#define MG_ENABLE_RL 1 -#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE -#define MG_SOCK_LISTEN_BACKLOG_SIZE 3 -#endif -#endif - -#endif - - -#if MG_ARCH == MG_ARCH_TIRTOS - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -#endif - - -#if MG_ARCH == MG_ARCH_UNIX - -#define _DARWIN_UNLIMITED_SELECT 1 // No limit on file descriptors - -#if defined(__APPLE__) -#include -#endif - -#if !defined(MG_ENABLE_EPOLL) && defined(__linux__) -#define MG_ENABLE_EPOLL 1 -#elif !defined(MG_ENABLE_POLL) -#define MG_ENABLE_POLL 1 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(MG_ENABLE_EPOLL) && MG_ENABLE_EPOLL -#include -#elif defined(MG_ENABLE_POLL) && MG_ENABLE_POLL -#include -#else -#include -#endif - -#include -#include -#include -#include -#include -#include - -#ifndef MG_ENABLE_DIRLIST -#define MG_ENABLE_DIRLIST 1 -#endif - -#ifndef MG_PATH_MAX -#define MG_PATH_MAX FILENAME_MAX -#endif - -#endif - - -#if MG_ARCH == MG_ARCH_WIN32 - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - -#ifndef _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_WARNINGS -#endif - -#ifndef _WINSOCK_DEPRECATED_NO_WARNINGS -#define _WINSOCK_DEPRECATED_NO_WARNINGS -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(_MSC_VER) && _MSC_VER < 1700 -#define __func__ "" -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -typedef unsigned char uint8_t; -typedef char int8_t; -typedef unsigned short uint16_t; -typedef short int16_t; -typedef unsigned int uint32_t; -typedef int int32_t; -typedef enum { false = 0, true = 1 } bool; -#else -#include -#include -#include -#endif - -#include -#include -#include - -// Protect from calls like std::snprintf in app code -// See https://github.com/cesanta/mongoose/issues/1047 -#ifndef __cplusplus -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#ifndef strdup // For MSVC with _DEBUG, see #1359 -#define strdup(x) _strdup(x) -#endif -#endif - -#define MG_INVALID_SOCKET INVALID_SOCKET -#define MG_SOCKET_TYPE SOCKET -typedef unsigned long nfds_t; -#if defined(_MSC_VER) -#pragma comment(lib, "ws2_32.lib") -#ifndef alloca -#define alloca(a) _alloca(a) -#endif -#endif -#define poll(a, b, c) WSAPoll((a), (b), (c)) -#define closesocket(x) closesocket(x) - -typedef int socklen_t; -#define MG_DIRSEP '\\' - -#ifndef MG_PATH_MAX -#define MG_PATH_MAX FILENAME_MAX -#endif - -#ifndef SO_EXCLUSIVEADDRUSE -#define SO_EXCLUSIVEADDRUSE ((int) (~SO_REUSEADDR)) -#endif - -#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? WSAGetLastError() : 0) - -#define MG_SOCK_PENDING(errcode) \ - (((errcode) < 0) && \ - (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEINPROGRESS || \ - WSAGetLastError() == WSAEWOULDBLOCK)) - -#define MG_SOCK_RESET(errcode) \ - (((errcode) < 0) && (WSAGetLastError() == WSAECONNRESET)) - -#define realpath(a, b) _fullpath((b), (a), MG_PATH_MAX) -#define sleep(x) Sleep((x) *1000) -#define mkdir(a, b) _mkdir(a) -#define timegm(x) _mkgmtime(x) - -#ifndef S_ISDIR -#define S_ISDIR(x) (((x) &_S_IFMT) == _S_IFDIR) -#endif - -#ifndef MG_ENABLE_DIRLIST -#define MG_ENABLE_DIRLIST 1 -#endif - -#ifndef SIGPIPE -#define SIGPIPE 0 -#endif - -#endif - - -#if MG_ARCH == MG_ARCH_ZEPHYR - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MG_PUTCHAR(x) printk("%c", x) -#ifndef strdup -#define strdup(s) ((char *) mg_strdup(mg_str(s)).ptr) -#endif -#define strerror(x) zsock_gai_strerror(x) - -#ifndef FD_CLOEXEC -#define FD_CLOEXEC 0 -#endif - -#ifndef F_SETFD -#define F_SETFD 0 -#endif - -#define MG_ENABLE_SSI 0 - -int rand(void); -int sscanf(const char *, const char *, ...); - -#endif - - -#if defined(MG_ENABLE_FREERTOS_TCP) && MG_ENABLE_FREERTOS_TCP - -#include -#include - -#include -#include -#include // contents to be moved and file removed, some day - -#define MG_SOCKET_TYPE Socket_t -#define MG_INVALID_SOCKET FREERTOS_INVALID_SOCKET - -// Why FreeRTOS-TCP did not implement a clean BSD API, but its own thing -// with FreeRTOS_ prefix, is beyond me -#define IPPROTO_TCP FREERTOS_IPPROTO_TCP -#define IPPROTO_UDP FREERTOS_IPPROTO_UDP -#define AF_INET FREERTOS_AF_INET -#define SOCK_STREAM FREERTOS_SOCK_STREAM -#define SOCK_DGRAM FREERTOS_SOCK_DGRAM -#define SO_BROADCAST 0 -#define SO_ERROR 0 -#define SOL_SOCKET 0 -#define SO_REUSEADDR 0 - -#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? (errcode) : 0) - -#define MG_SOCK_PENDING(errcode) \ - ((errcode) == -pdFREERTOS_ERRNO_EWOULDBLOCK || \ - (errcode) == -pdFREERTOS_ERRNO_EISCONN || \ - (errcode) == -pdFREERTOS_ERRNO_EINPROGRESS || \ - (errcode) == -pdFREERTOS_ERRNO_EAGAIN) - -#define MG_SOCK_RESET(errcode) ((errcode) == -pdFREERTOS_ERRNO_ENOTCONN) - -// actually only if optional timeout is enabled -#define MG_SOCK_INTR(fd) (fd == NULL) - -#define sockaddr_in freertos_sockaddr -#define sockaddr freertos_sockaddr -#define accept(a, b, c) FreeRTOS_accept((a), (b), (c)) -#define connect(a, b, c) FreeRTOS_connect((a), (b), (c)) -#define bind(a, b, c) FreeRTOS_bind((a), (b), (c)) -#define listen(a, b) FreeRTOS_listen((a), (b)) -#define socket(a, b, c) FreeRTOS_socket((a), (b), (c)) -#define send(a, b, c, d) FreeRTOS_send((a), (b), (c), (d)) -#define recv(a, b, c, d) FreeRTOS_recv((a), (b), (c), (d)) -#define setsockopt(a, b, c, d, e) FreeRTOS_setsockopt((a), (b), (c), (d), (e)) -#define sendto(a, b, c, d, e, f) FreeRTOS_sendto((a), (b), (c), (d), (e), (f)) -#define recvfrom(a, b, c, d, e, f) \ - FreeRTOS_recvfrom((a), (b), (c), (d), (e), (f)) -#define closesocket(x) FreeRTOS_closesocket(x) -#define gethostbyname(x) FreeRTOS_gethostbyname(x) -#define getsockname(a, b, c) mg_getsockname((a), (b), (c)) -#define getpeername(a, b, c) mg_getpeername((a), (b), (c)) - -static inline int mg_getsockname(MG_SOCKET_TYPE fd, void *buf, socklen_t *len) { - (void) fd, (void) buf, (void) len; - return -1; -} - -static inline int mg_getpeername(MG_SOCKET_TYPE fd, void *buf, socklen_t *len) { - (void) fd, (void) buf, (void) len; - return 0; -} -#endif - - -#if defined(MG_ENABLE_LWIP) && MG_ENABLE_LWIP - -#if defined(__GNUC__) && !defined(__ARMCC_VERSION) -#include -#endif - -struct timeval; - -#include - -#if !LWIP_TIMEVAL_PRIVATE -#if defined(__GNUC__) && !defined(__ARMCC_VERSION) // armclang sets both -#include -#else -struct timeval { - time_t tv_sec; - long tv_usec; -}; -#endif -#endif - -#if LWIP_SOCKET != 1 -// Sockets support disabled in LWIP by default -#error Set LWIP_SOCKET variable to 1 (in lwipopts.h) -#endif -#endif - - -#if defined(MG_ENABLE_RL) && MG_ENABLE_RL -#include - -#define closesocket(x) closesocket(x) - -#define TCP_NODELAY SO_KEEPALIVE - -#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? (errcode) : 0) - -#define MG_SOCK_PENDING(errcode) \ - ((errcode) == BSD_EWOULDBLOCK || (errcode) == BSD_EALREADY || \ - (errcode) == BSD_EINPROGRESS) - -#define MG_SOCK_RESET(errcode) \ - ((errcode) == BSD_ECONNABORTED || (errcode) == BSD_ECONNRESET) - -// In blocking mode, which is enabled by default, accept() waits for a -// connection request. In non blocking mode, you must call accept() -// again if the error code BSD_EWOULDBLOCK is returned. -#define MG_SOCK_INTR(fd) (fd == BSD_EWOULDBLOCK) - -#define socklen_t int -#endif - - -#ifndef MG_ENABLE_LOG -#define MG_ENABLE_LOG 1 -#endif - -#ifndef MG_ENABLE_CUSTOM_LOG -#define MG_ENABLE_CUSTOM_LOG 0 // Let user define their own MG_LOG -#endif - -#ifndef MG_ENABLE_TCPIP -#define MG_ENABLE_TCPIP 0 // Mongoose built-in network stack -#endif - -#ifndef MG_ENABLE_LWIP -#define MG_ENABLE_LWIP 0 // lWIP network stack -#endif - -#ifndef MG_ENABLE_FREERTOS_TCP -#define MG_ENABLE_FREERTOS_TCP 0 // Amazon FreeRTOS-TCP network stack -#endif - -#ifndef MG_ENABLE_RL -#define MG_ENABLE_RL 0 // ARM MDK network stack -#endif - -#ifndef MG_ENABLE_SOCKET -#define MG_ENABLE_SOCKET !MG_ENABLE_TCPIP -#endif - -#ifndef MG_ENABLE_POLL -#define MG_ENABLE_POLL 0 -#endif - -#ifndef MG_ENABLE_EPOLL -#define MG_ENABLE_EPOLL 0 -#endif - -#ifndef MG_ENABLE_FATFS -#define MG_ENABLE_FATFS 0 -#endif - -#ifndef MG_ENABLE_SSI -#define MG_ENABLE_SSI 0 -#endif - -#ifndef MG_ENABLE_IPV6 -#define MG_ENABLE_IPV6 0 -#endif - -#ifndef MG_IPV6_V6ONLY -#define MG_IPV6_V6ONLY 0 // IPv6 socket binds only to V6, not V4 address -#endif - -#ifndef MG_ENABLE_MD5 -#define MG_ENABLE_MD5 1 -#endif - -// Set MG_ENABLE_WINSOCK=0 for Win32 builds with external IP stack (like LWIP) -#ifndef MG_ENABLE_WINSOCK -#define MG_ENABLE_WINSOCK 1 -#endif - -#ifndef MG_ENABLE_DIRLIST -#define MG_ENABLE_DIRLIST 0 -#endif - -#ifndef MG_ENABLE_CUSTOM_RANDOM -#define MG_ENABLE_CUSTOM_RANDOM 0 -#endif - -#ifndef MG_ENABLE_CUSTOM_MILLIS -#define MG_ENABLE_CUSTOM_MILLIS 0 -#endif - -#ifndef MG_ENABLE_PACKED_FS -#define MG_ENABLE_PACKED_FS 0 -#endif - -#ifndef MG_ENABLE_ASSERT -#define MG_ENABLE_ASSERT 0 -#endif - -#ifndef MG_IO_SIZE -#define MG_IO_SIZE 2048 // Granularity of the send/recv IO buffer growth -#endif - -#ifndef MG_MAX_RECV_SIZE -#define MG_MAX_RECV_SIZE (3UL * 1024UL * 1024UL) // Maximum recv IO buffer size -#endif - -#ifndef MG_DATA_SIZE -#define MG_DATA_SIZE 32 // struct mg_connection :: data size -#endif - -#ifndef MG_MAX_HTTP_HEADERS -#define MG_MAX_HTTP_HEADERS 30 -#endif - -#ifndef MG_HTTP_INDEX -#define MG_HTTP_INDEX "index.html" -#endif - -#ifndef MG_PATH_MAX -#ifdef PATH_MAX -#define MG_PATH_MAX PATH_MAX -#else -#define MG_PATH_MAX 128 -#endif -#endif - -#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE -#define MG_SOCK_LISTEN_BACKLOG_SIZE 128 -#endif - -#ifndef MG_DIRSEP -#define MG_DIRSEP '/' -#endif - -#ifndef MG_ENABLE_POSIX_FS -#if defined(FOPEN_MAX) -#define MG_ENABLE_POSIX_FS 1 -#else -#define MG_ENABLE_POSIX_FS 0 -#endif -#endif - -#ifndef MG_INVALID_SOCKET -#define MG_INVALID_SOCKET (-1) -#endif - -#ifndef MG_SOCKET_TYPE -#define MG_SOCKET_TYPE int -#endif - -#ifndef MG_SOCKET_ERRNO -#define MG_SOCKET_ERRNO errno -#endif - -#if MG_ENABLE_EPOLL -#define MG_EPOLL_ADD(c) \ - do { \ - struct epoll_event ev = {EPOLLIN | EPOLLERR | EPOLLHUP, {c}}; \ - epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_ADD, (int) (size_t) c->fd, &ev); \ - } while (0) -#define MG_EPOLL_MOD(c, wr) \ - do { \ - struct epoll_event ev = {EPOLLIN | EPOLLERR | EPOLLHUP, {c}}; \ - if (wr) ev.events |= EPOLLOUT; \ - epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_MOD, (int) (size_t) c->fd, &ev); \ - } while (0) -#else -#define MG_EPOLL_ADD(c) -#define MG_EPOLL_MOD(c, wr) -#endif - -#ifndef MG_ENABLE_PROFILE -#define MG_ENABLE_PROFILE 0 -#endif - - - - -struct mg_str { - const char *ptr; // Pointer to string data - size_t len; // String len -}; - -#define MG_C_STR(a) \ - { (a), sizeof(a) - 1 } - -// Using macro to avoid shadowing C++ struct constructor, see #1298 -#define mg_str(s) mg_str_s(s) - -struct mg_str mg_str(const char *s); -struct mg_str mg_str_n(const char *s, size_t n); -int mg_lower(const char *s); -int mg_ncasecmp(const char *s1, const char *s2, size_t len); -int mg_casecmp(const char *s1, const char *s2); -int mg_vcmp(const struct mg_str *s1, const char *s2); -int mg_vcasecmp(const struct mg_str *str1, const char *str2); -int mg_strcmp(const struct mg_str str1, const struct mg_str str2); -struct mg_str mg_strstrip(struct mg_str s); -struct mg_str mg_strdup(const struct mg_str s); -const char *mg_strstr(const struct mg_str haystack, const struct mg_str needle); -bool mg_match(struct mg_str str, struct mg_str pattern, struct mg_str *caps); -bool mg_globmatch(const char *pattern, size_t plen, const char *s, size_t n); -bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char delim); -char *mg_hex(const void *buf, size_t len, char *dst); -void mg_unhex(const char *buf, size_t len, unsigned char *to); -unsigned long mg_unhexn(const char *s, size_t len); -bool mg_path_is_sane(const char *path); - - - - -// Single producer, single consumer non-blocking queue - -struct mg_queue { - char *buf; - size_t size; - volatile size_t tail; - volatile size_t head; -}; - -void mg_queue_init(struct mg_queue *, char *, size_t); // Init queue -size_t mg_queue_book(struct mg_queue *, char **buf, size_t); // Reserve space -void mg_queue_add(struct mg_queue *, size_t); // Add new message -size_t mg_queue_next(struct mg_queue *, char **); // Get oldest message -void mg_queue_del(struct mg_queue *, size_t); // Delete oldest message - - - - -typedef void (*mg_pfn_t)(char, void *); // Output function -typedef size_t (*mg_pm_t)(mg_pfn_t, void *, va_list *); // %M printer - -size_t mg_vxprintf(void (*)(char, void *), void *, const char *fmt, va_list *); -size_t mg_xprintf(void (*fn)(char, void *), void *, const char *fmt, ...); - - - - - - -// Convenience wrappers around mg_xprintf -size_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap); -size_t mg_snprintf(char *, size_t, const char *fmt, ...); -char *mg_vmprintf(const char *fmt, va_list *ap); -char *mg_mprintf(const char *fmt, ...); -size_t mg_queue_vprintf(struct mg_queue *, const char *fmt, va_list *); -size_t mg_queue_printf(struct mg_queue *, const char *fmt, ...); - -// %M print helper functions -size_t mg_print_base64(void (*out)(char, void *), void *arg, va_list *ap); -size_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap); -size_t mg_print_hex(void (*out)(char, void *), void *arg, va_list *ap); -size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap); -size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap); -size_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap); -size_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap); -size_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap); - -// Various output functions -void mg_pfn_iobuf(char ch, void *param); // param: struct mg_iobuf * -void mg_pfn_stdout(char c, void *param); // param: ignored - -// A helper macro for printing JSON: mg_snprintf(buf, len, "%m", MG_ESC("hi")) -#define MG_ESC(str) mg_print_esc, 0, (str) - - - - - - -enum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_DEBUG, MG_LL_VERBOSE }; -extern int mg_log_level; // Current log level, one of MG_LL_* - -void mg_log(const char *fmt, ...); -void mg_log_prefix(int ll, const char *file, int line, const char *fname); -// bool mg_log2(int ll, const char *file, int line, const char *fmt, ...); -void mg_hexdump(const void *buf, size_t len); -void mg_log_set_fn(mg_pfn_t fn, void *param); - -#define mg_log_set(level_) mg_log_level = (level_) - -#if MG_ENABLE_LOG -#define MG_LOG(level, args) \ - do { \ - if ((level) <= mg_log_level) { \ - mg_log_prefix((level), __FILE__, __LINE__, __func__); \ - mg_log args; \ - } \ - } while (0) -#else -#define MG_LOG(level, args) \ - do { \ - if (0) mg_log args; \ - } while (0) -#endif - -#define MG_ERROR(args) MG_LOG(MG_LL_ERROR, args) -#define MG_INFO(args) MG_LOG(MG_LL_INFO, args) -#define MG_DEBUG(args) MG_LOG(MG_LL_DEBUG, args) -#define MG_VERBOSE(args) MG_LOG(MG_LL_VERBOSE, args) - - - - -struct mg_timer { - unsigned long id; // Timer ID - uint64_t period_ms; // Timer period in milliseconds - uint64_t expire; // Expiration timestamp in milliseconds - unsigned flags; // Possible flags values below -#define MG_TIMER_ONCE 0 // Call function once -#define MG_TIMER_REPEAT 1 // Call function periodically -#define MG_TIMER_RUN_NOW 2 // Call immediately when timer is set - void (*fn)(void *); // Function to call - void *arg; // Function argument - struct mg_timer *next; // Linkage -}; - -void mg_timer_init(struct mg_timer **head, struct mg_timer *timer, - uint64_t milliseconds, unsigned flags, void (*fn)(void *), - void *arg); -void mg_timer_free(struct mg_timer **head, struct mg_timer *); -void mg_timer_poll(struct mg_timer **head, uint64_t new_ms); -bool mg_timer_expired(uint64_t *expiration, uint64_t period, uint64_t now); - - - - - -enum { MG_FS_READ = 1, MG_FS_WRITE = 2, MG_FS_DIR = 4 }; - -// Filesystem API functions -// st() returns MG_FS_* flags and populates file size and modification time -// ls() calls fn() for every directory entry, allowing to list a directory -// -// NOTE: UNIX-style shorthand names for the API functions are deliberately -// chosen to avoid conflicts with some libraries that make macros for e.g. -// stat(), write(), read() calls. -struct mg_fs { - int (*st)(const char *path, size_t *size, time_t *mtime); // stat file - void (*ls)(const char *path, void (*fn)(const char *, void *), - void *); // List directory entries: call fn(file_name, fn_data) - // for each directory entry - void *(*op)(const char *path, int flags); // Open file - void (*cl)(void *fd); // Close file - size_t (*rd)(void *fd, void *buf, size_t len); // Read file - size_t (*wr)(void *fd, const void *buf, size_t len); // Write file - size_t (*sk)(void *fd, size_t offset); // Set file position - bool (*mv)(const char *from, const char *to); // Rename file - bool (*rm)(const char *path); // Delete file - bool (*mkd)(const char *path); // Create directory -}; - -extern struct mg_fs mg_fs_posix; // POSIX open/close/read/write/seek -extern struct mg_fs mg_fs_packed; // Packed FS, see examples/device-dashboard -extern struct mg_fs mg_fs_fat; // FAT FS - -// File descriptor -struct mg_fd { - void *fd; - struct mg_fs *fs; -}; - -struct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags); -void mg_fs_close(struct mg_fd *fd); -bool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len); -struct mg_str mg_file_read(struct mg_fs *fs, const char *path); -bool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t); -bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...); - -// Packed API -const char *mg_unpack(const char *path, size_t *size, time_t *mtime); -const char *mg_unlist(size_t no); // Get no'th packed filename -struct mg_str mg_unpacked(const char *path); // Packed file as mg_str - - - - - - - -#if MG_ENABLE_ASSERT -#include -#elif !defined(assert) -#define assert(x) -#endif - -void mg_bzero(volatile unsigned char *buf, size_t len); -void mg_random(void *buf, size_t len); -char *mg_random_str(char *buf, size_t len); -uint16_t mg_ntohs(uint16_t net); -uint32_t mg_ntohl(uint32_t net); -uint32_t mg_crc32(uint32_t crc, const char *buf, size_t len); -uint64_t mg_millis(void); // Return milliseconds since boot -uint64_t mg_now(void); // Return milliseconds since Epoch - -#define mg_htons(x) mg_ntohs(x) -#define mg_htonl(x) mg_ntohl(x) - -#define MG_U32(a, b, c, d) \ - (((uint32_t) ((a) &255) << 24) | ((uint32_t) ((b) &255) << 16) | \ - ((uint32_t) ((c) &255) << 8) | (uint32_t) ((d) &255)) - -// For printing IPv4 addresses: printf("%d.%d.%d.%d\n", MG_IPADDR_PARTS(&ip)) -#define MG_U8P(ADDR) ((uint8_t *) (ADDR)) -#define MG_IPADDR_PARTS(ADDR) \ - MG_U8P(ADDR)[0], MG_U8P(ADDR)[1], MG_U8P(ADDR)[2], MG_U8P(ADDR)[3] - -#define MG_REG(x) ((volatile uint32_t *) (x))[0] -#define MG_BIT(x) (((uint32_t) 1U) << (x)) -#define MG_SET_BITS(R, CLRMASK, SETMASK) (R) = ((R) & ~(CLRMASK)) | (SETMASK) - -#define MG_ROUND_UP(x, a) ((a) == 0 ? (x) : ((((x) + (a) -1) / (a)) * (a))) -#define MG_ROUND_DOWN(x, a) ((a) == 0 ? (x) : (((x) / (a)) * (a))) - -#ifdef __GNUC__ -#define MG_ARM_DISABLE_IRQ() asm volatile("cpsid i" : : : "memory") -#define MG_ARM_ENABLE_IRQ() asm volatile("cpsie i" : : : "memory") -#else -#define MG_ARM_DISABLE_IRQ() -#define MG_ARM_ENABLE_IRQ() -#endif - -#if defined(__CC_ARM) -#define MG_DSB() __dsb(0xf) -#elif defined(__ARMCC_VERSION) -#define MG_DSB() __builtin_arm_dsb(0xf) -#elif defined(__GNUC__) && defined(__arm__) && defined(__thumb__) -#define MG_DSB() asm("DSB 0xf") -#elif defined(__ICCARM__) -#define MG_DSB() __iar_builtin_DSB() -#else -#define MG_DSB() -#endif - -struct mg_addr; -int mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip); - -// Linked list management macros -#define LIST_ADD_HEAD(type_, head_, elem_) \ - do { \ - (elem_)->next = (*head_); \ - *(head_) = (elem_); \ - } while (0) - -#define LIST_ADD_TAIL(type_, head_, elem_) \ - do { \ - type_ **h = head_; \ - while (*h != NULL) h = &(*h)->next; \ - *h = (elem_); \ - } while (0) - -#define LIST_DELETE(type_, head_, elem_) \ - do { \ - type_ **h = head_; \ - while (*h != (elem_)) h = &(*h)->next; \ - *h = (elem_)->next; \ - } while (0) - - - -unsigned short mg_url_port(const char *url); -int mg_url_is_ssl(const char *url); -struct mg_str mg_url_host(const char *url); -struct mg_str mg_url_user(const char *url); -struct mg_str mg_url_pass(const char *url); -const char *mg_url_uri(const char *url); - - - - -struct mg_iobuf { - unsigned char *buf; // Pointer to stored data - size_t size; // Total size available - size_t len; // Current number of bytes - size_t align; // Alignment during allocation -}; - -int mg_iobuf_init(struct mg_iobuf *, size_t, size_t); -int mg_iobuf_resize(struct mg_iobuf *, size_t); -void mg_iobuf_free(struct mg_iobuf *); -size_t mg_iobuf_add(struct mg_iobuf *, size_t, const void *, size_t); -size_t mg_iobuf_del(struct mg_iobuf *, size_t ofs, size_t len); - - -size_t mg_base64_update(unsigned char input_byte, char *buf, size_t len); -size_t mg_base64_final(char *buf, size_t len); -size_t mg_base64_encode(const unsigned char *p, size_t n, char *buf, size_t); -size_t mg_base64_decode(const char *src, size_t n, char *dst, size_t); - - - - -typedef struct { - uint32_t buf[4]; - uint32_t bits[2]; - unsigned char in[64]; -} mg_md5_ctx; - -void mg_md5_init(mg_md5_ctx *c); -void mg_md5_update(mg_md5_ctx *c, const unsigned char *data, size_t len); -void mg_md5_final(mg_md5_ctx *c, unsigned char[16]); - - - - -typedef struct { - uint32_t state[5]; - uint32_t count[2]; - unsigned char buffer[64]; -} mg_sha1_ctx; - -void mg_sha1_init(mg_sha1_ctx *); -void mg_sha1_update(mg_sha1_ctx *, const unsigned char *data, size_t len); -void mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *); - - - - -typedef struct { - uint32_t state[8]; - uint64_t bits; - uint32_t len; - unsigned char buffer[64]; -} mg_sha256_ctx; - -void mg_sha256_init(mg_sha256_ctx *); -void mg_sha256_update(mg_sha256_ctx *, const unsigned char *data, size_t len); -void mg_sha256_final(unsigned char digest[32], mg_sha256_ctx *); -void mg_hmac_sha256(uint8_t dst[32], uint8_t *key, size_t keysz, uint8_t *data, - size_t datasz); -/****************************************************************************** - * - * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL - * - * This is a simple and straightforward implementation of the AES Rijndael - * 128-bit block cipher designed by Vincent Rijmen and Joan Daemen. The focus - * of this work was correctness & accuracy. It is written in 'C' without any - * particular focus upon optimization or speed. It should be endian (memory - * byte order) neutral since the few places that care are handled explicitly. - * - * This implementation of Rijndael was created by Steven M. Gibson of GRC.com. - * - * It is intended for general purpose use, but was written in support of GRC's - * reference implementation of the SQRL (Secure Quick Reliable Login) client. - * - * See: http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html - * - * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE - * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK. - * - *******************************************************************************/ - -#ifndef AES_HEADER -#define AES_HEADER - -/******************************************************************************/ -#define AES_DECRYPTION 1 // whether AES decryption is supported -/******************************************************************************/ - -#define ENCRYPT 1 // specify whether we're encrypting -#define DECRYPT 0 // or decrypting - - - -typedef unsigned char uchar; // add some convienent shorter types -typedef unsigned int uint; - -/****************************************************************************** - * AES_INIT_KEYGEN_TABLES : MUST be called once before any AES use - ******************************************************************************/ -void aes_init_keygen_tables(void); - -/****************************************************************************** - * AES_CONTEXT : cipher context / holds inter-call data - ******************************************************************************/ -typedef struct { - int mode; // 1 for Encryption, 0 for Decryption - int rounds; // keysize-based rounds count - uint32_t *rk; // pointer to current round key - uint32_t buf[68]; // key expansion buffer -} aes_context; - -/****************************************************************************** - * AES_SETKEY : called to expand the key for encryption or decryption - ******************************************************************************/ -int aes_setkey(aes_context *ctx, // pointer to context - int mode, // 1 or 0 for Encrypt/Decrypt - const uchar *key, // AES input key - uint keysize); // size in bytes (must be 16, 24, 32 for - // 128, 192 or 256-bit keys respectively) - // returns 0 for success - -/****************************************************************************** - * AES_CIPHER : called to encrypt or decrypt ONE 128-bit block of data - ******************************************************************************/ -int aes_cipher(aes_context *ctx, // pointer to context - const uchar input[16], // 128-bit block to en/decipher - uchar output[16]); // 128-bit output result block - // returns 0 for success - -#endif /* AES_HEADER */ -/****************************************************************************** - * - * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL - * - * This is a simple and straightforward implementation of AES-GCM authenticated - * encryption. The focus of this work was correctness & accuracy. It is written - * in straight 'C' without any particular focus upon optimization or speed. It - * should be endian (memory byte order) neutral since the few places that care - * are handled explicitly. - * - * This implementation of AES-GCM was created by Steven M. Gibson of GRC.com. - * - * It is intended for general purpose use, but was written in support of GRC's - * reference implementation of the SQRL (Secure Quick Reliable Login) client. - * - * See: http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf - * http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/ \ - * gcm/gcm-revised-spec.pdf - * - * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE - * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK. - * - *******************************************************************************/ -#ifndef GCM_HEADER -#define GCM_HEADER - - -#define GCM_AUTH_FAILURE 0x55555555 // authentication failure - -/****************************************************************************** - * GCM_CONTEXT : GCM context / holds keytables, instance data, and AES ctx - ******************************************************************************/ -typedef struct { - int mode; // cipher direction: encrypt/decrypt - uint64_t len; // cipher data length processed so far - uint64_t add_len; // total add data length - uint64_t HL[16]; // precalculated lo-half HTable - uint64_t HH[16]; // precalculated hi-half HTable - uchar base_ectr[16]; // first counter-mode cipher output for tag - uchar y[16]; // the current cipher-input IV|Counter value - uchar buf[16]; // buf working value - aes_context aes_ctx; // cipher context used -} gcm_context; - -/****************************************************************************** - * GCM_CONTEXT : MUST be called once before ANY use of this library - ******************************************************************************/ -int gcm_initialize(void); - -/****************************************************************************** - * GCM_SETKEY : sets the GCM (and AES) keying material for use - ******************************************************************************/ -int gcm_setkey(gcm_context *ctx, // caller-provided context ptr - const uchar *key, // pointer to cipher key - const uint keysize // size in bytes (must be 16, 24, 32 for - // 128, 192 or 256-bit keys respectively) -); // returns 0 for success - -/****************************************************************************** - * - * GCM_CRYPT_AND_TAG - * - * This either encrypts or decrypts the user-provided data and, either - * way, generates an authentication tag of the requested length. It must be - * called with a GCM context whose key has already been set with GCM_SETKEY. - * - * The user would typically call this explicitly to ENCRYPT a buffer of data - * and optional associated data, and produce its an authentication tag. - * - * To reverse the process the user would typically call the companion - * GCM_AUTH_DECRYPT function to decrypt data and verify a user-provided - * authentication tag. The GCM_AUTH_DECRYPT function calls this function - * to perform its decryption and tag generation, which it then compares. - * - ******************************************************************************/ -int gcm_crypt_and_tag( - gcm_context *ctx, // gcm context with key already setup - int mode, // cipher direction: ENCRYPT (1) or DECRYPT (0) - const uchar *iv, // pointer to the 12-byte initialization vector - size_t iv_len, // byte length if the IV. should always be 12 - const uchar *add, // pointer to the non-ciphered additional data - size_t add_len, // byte length of the additional AEAD data - const uchar *input, // pointer to the cipher data source - uchar *output, // pointer to the cipher data destination - size_t length, // byte length of the cipher data - uchar *tag, // pointer to the tag to be generated - size_t tag_len); // byte length of the tag to be generated - -/****************************************************************************** - * - * GCM_AUTH_DECRYPT - * - * This DECRYPTS a user-provided data buffer with optional associated data. - * It then verifies a user-supplied authentication tag against the tag just - * re-created during decryption to verify that the data has not been altered. - * - * This function calls GCM_CRYPT_AND_TAG (above) to perform the decryption - * and authentication tag generation. - * - ******************************************************************************/ -int gcm_auth_decrypt( - gcm_context *ctx, // gcm context with key already setup - const uchar *iv, // pointer to the 12-byte initialization vector - size_t iv_len, // byte length if the IV. should always be 12 - const uchar *add, // pointer to the non-ciphered additional data - size_t add_len, // byte length of the additional AEAD data - const uchar *input, // pointer to the cipher data source - uchar *output, // pointer to the cipher data destination - size_t length, // byte length of the cipher data - const uchar *tag, // pointer to the tag to be authenticated - size_t tag_len); // byte length of the tag <= 16 - -/****************************************************************************** - * - * GCM_START - * - * Given a user-provided GCM context, this initializes it, sets the encryption - * mode, and preprocesses the initialization vector and additional AEAD data. - * - ******************************************************************************/ -int gcm_start( - gcm_context *ctx, // pointer to user-provided GCM context - int mode, // ENCRYPT (1) or DECRYPT (0) - const uchar *iv, // pointer to initialization vector - size_t iv_len, // IV length in bytes (should == 12) - const uchar *add, // pointer to additional AEAD data (NULL if none) - size_t add_len); // length of additional AEAD data (bytes) - -/****************************************************************************** - * - * GCM_UPDATE - * - * This is called once or more to process bulk plaintext or ciphertext data. - * We give this some number of bytes of input and it returns the same number - * of output bytes. If called multiple times (which is fine) all but the final - * invocation MUST be called with length mod 16 == 0. (Only the final call can - * have a partial block length of < 128 bits.) - * - ******************************************************************************/ -int gcm_update(gcm_context *ctx, // pointer to user-provided GCM context - size_t length, // length, in bytes, of data to process - const uchar *input, // pointer to source data - uchar *output); // pointer to destination data - -/****************************************************************************** - * - * GCM_FINISH - * - * This is called once after all calls to GCM_UPDATE to finalize the GCM. - * It performs the final GHASH to produce the resulting authentication TAG. - * - ******************************************************************************/ -int gcm_finish(gcm_context *ctx, // pointer to user-provided GCM context - uchar *tag, // ptr to tag buffer - NULL if tag_len = 0 - size_t tag_len); // length, in bytes, of the tag-receiving buf - -/****************************************************************************** - * - * GCM_ZERO_CTX - * - * The GCM context contains both the GCM context and the AES context. - * This includes keying and key-related material which is security- - * sensitive, so it MUST be zeroed after use. This function does that. - * - ******************************************************************************/ -void gcm_zero_ctx(gcm_context *ctx); - -#endif /* GCM_HEADER */ -// -// aes-gcm.h -// MKo -// -// Created by Markus Kosmal on 20/11/14. -// -// - -#ifndef mko_aes_gcm_h -#define mko_aes_gcm_h - -int aes_gcm_encrypt(unsigned char *output, const unsigned char *input, - size_t input_length, const unsigned char *key, - const size_t key_len, const unsigned char *iv, - const size_t iv_len, unsigned char *aead, size_t aead_len, - unsigned char *tag, const size_t tag_len); - -int aes_gcm_decrypt(unsigned char *output, const unsigned char *input, - size_t input_length, const unsigned char *key, - const size_t key_len, const unsigned char *iv, - const size_t iv_len); - -#endif - -// End of aes128 PD - - - -#define uECC_SUPPORTS_secp256r1 1 -/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */ - -#ifndef _UECC_H_ -#define _UECC_H_ - -/* Platform selection options. -If uECC_PLATFORM is not defined, the code will try to guess it based on compiler -macros. Possible values for uECC_PLATFORM are defined below: */ -#define uECC_arch_other 0 -#define uECC_x86 1 -#define uECC_x86_64 2 -#define uECC_arm 3 -#define uECC_arm_thumb 4 -#define uECC_arm_thumb2 5 -#define uECC_arm64 6 -#define uECC_avr 7 - -/* If desired, you can define uECC_WORD_SIZE as appropriate for your platform -(1, 4, or 8 bytes). If uECC_WORD_SIZE is not explicitly defined then it will be -automatically set based on your platform. */ - -/* Optimization level; trade speed for code size. - Larger values produce code that is faster but larger. - Currently supported values are 0 - 4; 0 is unusably slow for most - applications. Optimization level 4 currently only has an effect ARM platforms - where more than one curve is enabled. */ -#ifndef uECC_OPTIMIZATION_LEVEL -#define uECC_OPTIMIZATION_LEVEL 2 -#endif - -/* uECC_SQUARE_FUNC - If enabled (defined as nonzero), this will cause a -specific function to be used for (scalar) squaring instead of the generic -multiplication function. This can make things faster somewhat faster, but -increases the code size. */ -#ifndef uECC_SQUARE_FUNC -#define uECC_SQUARE_FUNC 0 -#endif - -/* uECC_VLI_NATIVE_LITTLE_ENDIAN - If enabled (defined as nonzero), this will -switch to native little-endian format for *all* arrays passed in and out of the -public API. This includes public and private keys, shared secrets, signatures -and message hashes. Using this switch reduces the amount of call stack memory -used by uECC, since less intermediate translations are required. Note that this -will *only* work on native little-endian processors and it will treat the -uint8_t arrays passed into the public API as word arrays, therefore requiring -the provided byte arrays to be word aligned on architectures that do not support -unaligned accesses. IMPORTANT: Keys and signatures generated with -uECC_VLI_NATIVE_LITTLE_ENDIAN=1 are incompatible with keys and signatures -generated with uECC_VLI_NATIVE_LITTLE_ENDIAN=0; all parties must use the same -endianness. */ -#ifndef uECC_VLI_NATIVE_LITTLE_ENDIAN -#define uECC_VLI_NATIVE_LITTLE_ENDIAN 0 -#endif - -/* Curve support selection. Set to 0 to remove that curve. */ -#ifndef uECC_SUPPORTS_secp160r1 -#define uECC_SUPPORTS_secp160r1 0 -#endif -#ifndef uECC_SUPPORTS_secp192r1 -#define uECC_SUPPORTS_secp192r1 0 -#endif -#ifndef uECC_SUPPORTS_secp224r1 -#define uECC_SUPPORTS_secp224r1 0 -#endif -#ifndef uECC_SUPPORTS_secp256r1 -#define uECC_SUPPORTS_secp256r1 1 -#endif -#ifndef uECC_SUPPORTS_secp256k1 -#define uECC_SUPPORTS_secp256k1 0 -#endif - -/* Specifies whether compressed point format is supported. - Set to 0 to disable point compression/decompression functions. */ -#ifndef uECC_SUPPORT_COMPRESSED_POINT -#define uECC_SUPPORT_COMPRESSED_POINT 1 -#endif - -struct uECC_Curve_t; -typedef const struct uECC_Curve_t *uECC_Curve; - -#ifdef __cplusplus -extern "C" { -#endif - -#if uECC_SUPPORTS_secp160r1 -uECC_Curve uECC_secp160r1(void); -#endif -#if uECC_SUPPORTS_secp192r1 -uECC_Curve uECC_secp192r1(void); -#endif -#if uECC_SUPPORTS_secp224r1 -uECC_Curve uECC_secp224r1(void); -#endif -#if uECC_SUPPORTS_secp256r1 -uECC_Curve uECC_secp256r1(void); -#endif -#if uECC_SUPPORTS_secp256k1 -uECC_Curve uECC_secp256k1(void); -#endif - -/* uECC_RNG_Function type -The RNG function should fill 'size' random bytes into 'dest'. It should return 1 -if 'dest' was filled with random data, or 0 if the random data could not be -generated. The filled-in values should be either truly random, or from a -cryptographically-secure PRNG. - -A correctly functioning RNG function must be set (using uECC_set_rng()) before -calling uECC_make_key() or uECC_sign(). - -Setting a correctly functioning RNG function improves the resistance to -side-channel attacks for uECC_shared_secret() and uECC_sign_deterministic(). - -A correct RNG function is set by default when building for Windows, Linux, or OS -X. If you are building on another POSIX-compliant system that supports -/dev/random or /dev/urandom, you can define uECC_POSIX to use the predefined -RNG. For embedded platforms there is no predefined RNG function; you must -provide your own. -*/ -typedef int (*uECC_RNG_Function)(uint8_t *dest, unsigned size); - -/* uECC_set_rng() function. -Set the function that will be used to generate random bytes. The RNG function -should return 1 if the random data was generated, or 0 if the random data could -not be generated. - -On platforms where there is no predefined RNG function (eg embedded platforms), -this must be called before uECC_make_key() or uECC_sign() are used. - -Inputs: - rng_function - The function that will be used to generate random bytes. -*/ -void uECC_set_rng(uECC_RNG_Function rng_function); - -/* uECC_get_rng() function. - -Returns the function that will be used to generate random bytes. -*/ -uECC_RNG_Function uECC_get_rng(void); - -/* uECC_curve_private_key_size() function. - -Returns the size of a private key for the curve in bytes. -*/ -int uECC_curve_private_key_size(uECC_Curve curve); - -/* uECC_curve_public_key_size() function. - -Returns the size of a public key for the curve in bytes. -*/ -int uECC_curve_public_key_size(uECC_Curve curve); - -/* uECC_make_key() function. -Create a public/private key pair. - -Outputs: - public_key - Will be filled in with the public key. Must be at least 2 * -the curve size (in bytes) long. For example, if the curve is secp256r1, -public_key must be 64 bytes long. private_key - Will be filled in with the -private key. Must be as long as the curve order; this is typically the same as -the curve size, except for secp160r1. For example, if the curve is secp256r1, -private_key must be 32 bytes long. - - For secp160r1, private_key must be 21 bytes long! Note that -the first byte will almost always be 0 (there is about a 1 in 2^80 chance of it -being non-zero). - -Returns 1 if the key pair was generated successfully, 0 if an error occurred. -*/ -int uECC_make_key(uint8_t *public_key, uint8_t *private_key, uECC_Curve curve); - -/* uECC_shared_secret() function. -Compute a shared secret given your secret key and someone else's public key. If -the public key is not from a trusted source and has not been previously -verified, you should verify it first using uECC_valid_public_key(). Note: It is -recommended that you hash the result of uECC_shared_secret() before using it for -symmetric encryption or HMAC. - -Inputs: - public_key - The public key of the remote party. - private_key - Your private key. - -Outputs: - secret - Will be filled in with the shared secret value. Must be the same -size as the curve size; for example, if the curve is secp256r1, secret must be -32 bytes long. - -Returns 1 if the shared secret was generated successfully, 0 if an error -occurred. -*/ -int uECC_shared_secret(const uint8_t *public_key, const uint8_t *private_key, - uint8_t *secret, uECC_Curve curve); - -#if uECC_SUPPORT_COMPRESSED_POINT -/* uECC_compress() function. -Compress a public key. - -Inputs: - public_key - The public key to compress. - -Outputs: - compressed - Will be filled in with the compressed public key. Must be at -least (curve size + 1) bytes long; for example, if the curve is secp256r1, - compressed must be 33 bytes long. -*/ -void uECC_compress(const uint8_t *public_key, uint8_t *compressed, - uECC_Curve curve); - -/* uECC_decompress() function. -Decompress a compressed public key. - -Inputs: - compressed - The compressed public key. - -Outputs: - public_key - Will be filled in with the decompressed public key. -*/ -void uECC_decompress(const uint8_t *compressed, uint8_t *public_key, - uECC_Curve curve); -#endif /* uECC_SUPPORT_COMPRESSED_POINT */ - -/* uECC_valid_public_key() function. -Check to see if a public key is valid. - -Note that you are not required to check for a valid public key before using any -other uECC functions. However, you may wish to avoid spending CPU time computing -a shared secret or verifying a signature using an invalid public key. - -Inputs: - public_key - The public key to check. - -Returns 1 if the public key is valid, 0 if it is invalid. -*/ -int uECC_valid_public_key(const uint8_t *public_key, uECC_Curve curve); - -/* uECC_compute_public_key() function. -Compute the corresponding public key for a private key. - -Inputs: - private_key - The private key to compute the public key for - -Outputs: - public_key - Will be filled in with the corresponding public key - -Returns 1 if the key was computed successfully, 0 if an error occurred. -*/ -int uECC_compute_public_key(const uint8_t *private_key, uint8_t *public_key, - uECC_Curve curve); - -/* uECC_sign() function. -Generate an ECDSA signature for a given hash value. - -Usage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and -pass it in to this function along with your private key. - -Inputs: - private_key - Your private key. - message_hash - The hash of the message to sign. - hash_size - The size of message_hash in bytes. - -Outputs: - signature - Will be filled in with the signature value. Must be at least 2 * -curve size long. For example, if the curve is secp256r1, signature must be 64 -bytes long. - -Returns 1 if the signature generated successfully, 0 if an error occurred. -*/ -int uECC_sign(const uint8_t *private_key, const uint8_t *message_hash, - unsigned hash_size, uint8_t *signature, uECC_Curve curve); - -/* uECC_HashContext structure. -This is used to pass in an arbitrary hash function to uECC_sign_deterministic(). -The structure will be used for multiple hash computations; each time a new hash -is computed, init_hash() will be called, followed by one or more calls to -update_hash(), and finally a call to finish_hash() to produce the resulting -hash. - -The intention is that you will create a structure that includes uECC_HashContext -followed by any hash-specific data. For example: - -typedef struct SHA256_HashContext { - uECC_HashContext uECC; - SHA256_CTX ctx; -} SHA256_HashContext; - -void init_SHA256(uECC_HashContext *base) { - SHA256_HashContext *context = (SHA256_HashContext *)base; - SHA256_Init(&context->ctx); -} - -void update_SHA256(uECC_HashContext *base, - const uint8_t *message, - unsigned message_size) { - SHA256_HashContext *context = (SHA256_HashContext *)base; - SHA256_Update(&context->ctx, message, message_size); -} - -void finish_SHA256(uECC_HashContext *base, uint8_t *hash_result) { - SHA256_HashContext *context = (SHA256_HashContext *)base; - SHA256_Final(hash_result, &context->ctx); -} - -... when signing ... -{ - uint8_t tmp[32 + 32 + 64]; - SHA256_HashContext ctx = {{&init_SHA256, &update_SHA256, &finish_SHA256, 64, -32, tmp}}; uECC_sign_deterministic(key, message_hash, &ctx.uECC, signature); -} -*/ -typedef struct uECC_HashContext { - void (*init_hash)(const struct uECC_HashContext *context); - void (*update_hash)(const struct uECC_HashContext *context, - const uint8_t *message, unsigned message_size); - void (*finish_hash)(const struct uECC_HashContext *context, - uint8_t *hash_result); - unsigned - block_size; /* Hash function block size in bytes, eg 64 for SHA-256. */ - unsigned - result_size; /* Hash function result size in bytes, eg 32 for SHA-256. */ - uint8_t *tmp; /* Must point to a buffer of at least (2 * result_size + - block_size) bytes. */ -} uECC_HashContext; - -/* uECC_sign_deterministic() function. -Generate an ECDSA signature for a given hash value, using a deterministic -algorithm (see RFC 6979). You do not need to set the RNG using uECC_set_rng() -before calling this function; however, if the RNG is defined it will improve -resistance to side-channel attacks. - -Usage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and -pass it to this function along with your private key and a hash context. Note -that the message_hash does not need to be computed with the same hash function -used by hash_context. - -Inputs: - private_key - Your private key. - message_hash - The hash of the message to sign. - hash_size - The size of message_hash in bytes. - hash_context - A hash context to use. - -Outputs: - signature - Will be filled in with the signature value. - -Returns 1 if the signature generated successfully, 0 if an error occurred. -*/ -int uECC_sign_deterministic(const uint8_t *private_key, - const uint8_t *message_hash, unsigned hash_size, - const uECC_HashContext *hash_context, - uint8_t *signature, uECC_Curve curve); - -/* uECC_verify() function. -Verify an ECDSA signature. - -Usage: Compute the hash of the signed data using the same hash as the signer and -pass it to this function along with the signer's public key and the signature -values (r and s). - -Inputs: - public_key - The signer's public key. - message_hash - The hash of the signed data. - hash_size - The size of message_hash in bytes. - signature - The signature value. - -Returns 1 if the signature is valid, 0 if it is invalid. -*/ -int uECC_verify(const uint8_t *public_key, const uint8_t *message_hash, - unsigned hash_size, const uint8_t *signature, uECC_Curve curve); - -#ifdef __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* _UECC_H_ */ - -/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */ - -#ifndef _UECC_VLI_H_ -#define _UECC_VLI_H_ - -// -// - -/* Functions for raw large-integer manipulation. These are only available - if uECC.c is compiled with uECC_ENABLE_VLI_API defined to 1. */ -#ifndef uECC_ENABLE_VLI_API -#define uECC_ENABLE_VLI_API 0 -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if uECC_ENABLE_VLI_API - -void uECC_vli_clear(uECC_word_t *vli, wordcount_t num_words); - -/* Constant-time comparison to zero - secure way to compare long integers */ -/* Returns 1 if vli == 0, 0 otherwise. */ -uECC_word_t uECC_vli_isZero(const uECC_word_t *vli, wordcount_t num_words); - -/* Returns nonzero if bit 'bit' of vli is set. */ -uECC_word_t uECC_vli_testBit(const uECC_word_t *vli, bitcount_t bit); - -/* Counts the number of bits required to represent vli. */ -bitcount_t uECC_vli_numBits(const uECC_word_t *vli, - const wordcount_t max_words); - -/* Sets dest = src. */ -void uECC_vli_set(uECC_word_t *dest, const uECC_word_t *src, - wordcount_t num_words); - -/* Constant-time comparison function - secure way to compare long integers */ -/* Returns one if left == right, zero otherwise */ -uECC_word_t uECC_vli_equal(const uECC_word_t *left, const uECC_word_t *right, - wordcount_t num_words); - -/* Constant-time comparison function - secure way to compare long integers */ -/* Returns sign of left - right, in constant time. */ -cmpresult_t uECC_vli_cmp(const uECC_word_t *left, const uECC_word_t *right, - wordcount_t num_words); - -/* Computes vli = vli >> 1. */ -void uECC_vli_rshift1(uECC_word_t *vli, wordcount_t num_words); - -/* Computes result = left + right, returning carry. Can modify in place. */ -uECC_word_t uECC_vli_add(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, wordcount_t num_words); - -/* Computes result = left - right, returning borrow. Can modify in place. */ -uECC_word_t uECC_vli_sub(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, wordcount_t num_words); - -/* Computes result = left * right. Result must be 2 * num_words long. */ -void uECC_vli_mult(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, wordcount_t num_words); - -/* Computes result = left^2. Result must be 2 * num_words long. */ -void uECC_vli_square(uECC_word_t *result, const uECC_word_t *left, - wordcount_t num_words); - -/* Computes result = (left + right) % mod. - Assumes that left < mod and right < mod, and that result does not overlap - mod. */ -void uECC_vli_modAdd(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words); - -/* Computes result = (left - right) % mod. - Assumes that left < mod and right < mod, and that result does not overlap - mod. */ -void uECC_vli_modSub(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words); - -/* Computes result = product % mod, where product is 2N words long. - Currently only designed to work for mod == curve->p or curve_n. */ -void uECC_vli_mmod(uECC_word_t *result, uECC_word_t *product, - const uECC_word_t *mod, wordcount_t num_words); - -/* Calculates result = product (mod curve->p), where product is up to - 2 * curve->num_words long. */ -void uECC_vli_mmod_fast(uECC_word_t *result, uECC_word_t *product, - uECC_Curve curve); - -/* Computes result = (left * right) % mod. - Currently only designed to work for mod == curve->p or curve_n. */ -void uECC_vli_modMult(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words); - -/* Computes result = (left * right) % curve->p. */ -void uECC_vli_modMult_fast(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, uECC_Curve curve); - -/* Computes result = left^2 % mod. - Currently only designed to work for mod == curve->p or curve_n. */ -void uECC_vli_modSquare(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *mod, wordcount_t num_words); - -/* Computes result = left^2 % curve->p. */ -void uECC_vli_modSquare_fast(uECC_word_t *result, const uECC_word_t *left, - uECC_Curve curve); - -/* Computes result = (1 / input) % mod.*/ -void uECC_vli_modInv(uECC_word_t *result, const uECC_word_t *input, - const uECC_word_t *mod, wordcount_t num_words); - -#if uECC_SUPPORT_COMPRESSED_POINT -/* Calculates a = sqrt(a) (mod curve->p) */ -void uECC_vli_mod_sqrt(uECC_word_t *a, uECC_Curve curve); -#endif - -/* Converts an integer in uECC native format to big-endian bytes. */ -void uECC_vli_nativeToBytes(uint8_t *bytes, int num_bytes, - const uECC_word_t *native); -/* Converts big-endian bytes to an integer in uECC native format. */ -void uECC_vli_bytesToNative(uECC_word_t *native, const uint8_t *bytes, - int num_bytes); - -unsigned uECC_curve_num_words(uECC_Curve curve); -unsigned uECC_curve_num_bytes(uECC_Curve curve); -unsigned uECC_curve_num_bits(uECC_Curve curve); -unsigned uECC_curve_num_n_words(uECC_Curve curve); -unsigned uECC_curve_num_n_bytes(uECC_Curve curve); -unsigned uECC_curve_num_n_bits(uECC_Curve curve); - -const uECC_word_t *uECC_curve_p(uECC_Curve curve); -const uECC_word_t *uECC_curve_n(uECC_Curve curve); -const uECC_word_t *uECC_curve_G(uECC_Curve curve); -const uECC_word_t *uECC_curve_b(uECC_Curve curve); - -int uECC_valid_point(const uECC_word_t *point, uECC_Curve curve); - -/* Multiplies a point by a scalar. Points are represented by the X coordinate - followed by the Y coordinate in the same array, both coordinates are - curve->num_words long. Note that scalar must be curve->num_n_words long (NOT - curve->num_words). */ -void uECC_point_mult(uECC_word_t *result, const uECC_word_t *point, - const uECC_word_t *scalar, uECC_Curve curve); - -/* Generates a random integer in the range 0 < random < top. - Both random and top have num_words words. */ -int uECC_generate_random_int(uECC_word_t *random, const uECC_word_t *top, - wordcount_t num_words); - -#endif /* uECC_ENABLE_VLI_API */ - -#ifdef __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* _UECC_VLI_H_ */ - -/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */ - -#ifndef _UECC_TYPES_H_ -#define _UECC_TYPES_H_ - -#ifndef uECC_PLATFORM -#if defined(__AVR__) && __AVR__ -#define uECC_PLATFORM uECC_avr -#elif defined(__thumb2__) || \ - defined(_M_ARMT) /* I think MSVC only supports Thumb-2 targets */ -#define uECC_PLATFORM uECC_arm_thumb2 -#elif defined(__thumb__) -#define uECC_PLATFORM uECC_arm_thumb -#elif defined(__arm__) || defined(_M_ARM) -#define uECC_PLATFORM uECC_arm -#elif defined(__aarch64__) -#define uECC_PLATFORM uECC_arm64 -#elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) || \ - defined(__I86__) -#define uECC_PLATFORM uECC_x86 -#elif defined(__amd64__) || defined(_M_X64) -#define uECC_PLATFORM uECC_x86_64 -#else -#define uECC_PLATFORM uECC_arch_other -#endif -#endif - -#ifndef uECC_ARM_USE_UMAAL -#if (uECC_PLATFORM == uECC_arm) && (__ARM_ARCH >= 6) -#define uECC_ARM_USE_UMAAL 1 -#elif (uECC_PLATFORM == uECC_arm_thumb2) && (__ARM_ARCH >= 6) && \ - (!defined(__ARM_ARCH_7M__) || !__ARM_ARCH_7M__) -#define uECC_ARM_USE_UMAAL 1 -#else -#define uECC_ARM_USE_UMAAL 0 -#endif -#endif - -#ifndef uECC_WORD_SIZE -#if uECC_PLATFORM == uECC_avr -#define uECC_WORD_SIZE 1 -#elif (uECC_PLATFORM == uECC_x86_64 || uECC_PLATFORM == uECC_arm64) -#define uECC_WORD_SIZE 8 -#else -#define uECC_WORD_SIZE 4 -#endif -#endif - -#if (uECC_WORD_SIZE != 1) && (uECC_WORD_SIZE != 4) && (uECC_WORD_SIZE != 8) -#error "Unsupported value for uECC_WORD_SIZE" -#endif - -#if ((uECC_PLATFORM == uECC_avr) && (uECC_WORD_SIZE != 1)) -#pragma message("uECC_WORD_SIZE must be 1 for AVR") -#undef uECC_WORD_SIZE -#define uECC_WORD_SIZE 1 -#endif - -#if ((uECC_PLATFORM == uECC_arm || uECC_PLATFORM == uECC_arm_thumb || \ - uECC_PLATFORM == uECC_arm_thumb2) && \ - (uECC_WORD_SIZE != 4)) -#pragma message("uECC_WORD_SIZE must be 4 for ARM") -#undef uECC_WORD_SIZE -#define uECC_WORD_SIZE 4 -#endif - -typedef int8_t wordcount_t; -typedef int16_t bitcount_t; -typedef int8_t cmpresult_t; - -#if (uECC_WORD_SIZE == 1) - -typedef uint8_t uECC_word_t; -typedef uint16_t uECC_dword_t; - -#define HIGH_BIT_SET 0x80 -#define uECC_WORD_BITS 8 -#define uECC_WORD_BITS_SHIFT 3 -#define uECC_WORD_BITS_MASK 0x07 - -#elif (uECC_WORD_SIZE == 4) - -typedef uint32_t uECC_word_t; -typedef uint64_t uECC_dword_t; - -#define HIGH_BIT_SET 0x80000000 -#define uECC_WORD_BITS 32 -#define uECC_WORD_BITS_SHIFT 5 -#define uECC_WORD_BITS_MASK 0x01F - -#elif (uECC_WORD_SIZE == 8) - -typedef uint64_t uECC_word_t; - -#define HIGH_BIT_SET 0x8000000000000000U -#define uECC_WORD_BITS 64 -#define uECC_WORD_BITS_SHIFT 6 -#define uECC_WORD_BITS_MASK 0x03F - -#endif /* uECC_WORD_SIZE */ - -#endif /* _UECC_TYPES_H_ */ -// End of uecc BSD-2 - - -struct mg_connection; -typedef void (*mg_event_handler_t)(struct mg_connection *, int ev, - void *ev_data); -void mg_call(struct mg_connection *c, int ev, void *ev_data); -void mg_error(struct mg_connection *c, const char *fmt, ...); - -enum { - MG_EV_ERROR, // Error char *error_message - MG_EV_OPEN, // Connection created NULL - MG_EV_POLL, // mg_mgr_poll iteration uint64_t *uptime_millis - MG_EV_RESOLVE, // Host name is resolved NULL - MG_EV_CONNECT, // Connection established NULL - MG_EV_ACCEPT, // Connection accepted NULL - MG_EV_TLS_HS, // TLS handshake succeeded NULL - MG_EV_READ, // Data received from socket long *bytes_read - MG_EV_WRITE, // Data written to socket long *bytes_written - MG_EV_CLOSE, // Connection closed NULL - MG_EV_HTTP_MSG, // HTTP request/response struct mg_http_message * - MG_EV_WS_OPEN, // Websocket handshake done struct mg_http_message * - MG_EV_WS_MSG, // Websocket msg, text or bin struct mg_ws_message * - MG_EV_WS_CTL, // Websocket control msg struct mg_ws_message * - MG_EV_MQTT_CMD, // MQTT low-level command struct mg_mqtt_message * - MG_EV_MQTT_MSG, // MQTT PUBLISH received struct mg_mqtt_message * - MG_EV_MQTT_OPEN, // MQTT CONNACK received int *connack_status_code - MG_EV_SNTP_TIME, // SNTP time received uint64_t *epoch_millis - MG_EV_WAKEUP, // mg_wakeup() data received struct mg_str *data - MG_EV_USER // Starting ID for user events -}; - - - - - - - - - -struct mg_dns { - const char *url; // DNS server URL - struct mg_connection *c; // DNS server connection -}; - -struct mg_addr { - uint8_t ip[16]; // Holds IPv4 or IPv6 address, in network byte order - uint16_t port; // TCP or UDP port in network byte order - uint8_t scope_id; // IPv6 scope ID - bool is_ip6; // True when address is IPv6 address -}; - -struct mg_mgr { - struct mg_connection *conns; // List of active connections - struct mg_dns dns4; // DNS for IPv4 - struct mg_dns dns6; // DNS for IPv6 - int dnstimeout; // DNS resolve timeout in milliseconds - bool use_dns6; // Use DNS6 server by default, see #1532 - unsigned long nextid; // Next connection ID - unsigned long timerid; // Next timer ID - void *userdata; // Arbitrary user data pointer - void *tls_ctx; // TLS context shared by all TLS sessions - uint16_t mqtt_id; // MQTT IDs for pub/sub - void *active_dns_requests; // DNS requests in progress - struct mg_timer *timers; // Active timers - int epoll_fd; // Used when MG_EPOLL_ENABLE=1 - void *priv; // Used by the MIP stack - size_t extraconnsize; // Used by the MIP stack - MG_SOCKET_TYPE pipe; // Socketpair end for mg_wakeup() -#if MG_ENABLE_FREERTOS_TCP - SocketSet_t ss; // NOTE(lsm): referenced from socket struct -#endif -}; - -struct mg_connection { - struct mg_connection *next; // Linkage in struct mg_mgr :: connections - struct mg_mgr *mgr; // Our container - struct mg_addr loc; // Local address - struct mg_addr rem; // Remote address - void *fd; // Connected socket, or LWIP data - unsigned long id; // Auto-incrementing unique connection ID - struct mg_iobuf recv; // Incoming data - struct mg_iobuf send; // Outgoing data - struct mg_iobuf prof; // Profile data enabled by MG_ENABLE_PROFILE - struct mg_iobuf rtls; // TLS only. Incoming encrypted data - mg_event_handler_t fn; // User-specified event handler function - void *fn_data; // User-specified function parameter - mg_event_handler_t pfn; // Protocol-specific handler function - void *pfn_data; // Protocol-specific function parameter - char data[MG_DATA_SIZE]; // Arbitrary connection data - void *tls; // TLS specific data - unsigned is_listening : 1; // Listening connection - unsigned is_client : 1; // Outbound (client) connection - unsigned is_accepted : 1; // Accepted (server) connection - unsigned is_resolving : 1; // Non-blocking DNS resolution is in progress - unsigned is_arplooking : 1; // Non-blocking ARP resolution is in progress - unsigned is_connecting : 1; // Non-blocking connect is in progress - unsigned is_tls : 1; // TLS-enabled connection - unsigned is_tls_hs : 1; // TLS handshake is in progress - unsigned is_udp : 1; // UDP connection - unsigned is_websocket : 1; // WebSocket connection - unsigned is_mqtt5 : 1; // For MQTT connection, v5 indicator - unsigned is_hexdumping : 1; // Hexdump in/out traffic - unsigned is_draining : 1; // Send remaining data, then close and free - unsigned is_closing : 1; // Close and free the connection immediately - unsigned is_full : 1; // Stop reads, until cleared - unsigned is_resp : 1; // Response is still being generated - unsigned is_readable : 1; // Connection is ready to read - unsigned is_writable : 1; // Connection is ready to write -}; - -void mg_mgr_poll(struct mg_mgr *, int ms); -void mg_mgr_init(struct mg_mgr *); -void mg_mgr_free(struct mg_mgr *); - -struct mg_connection *mg_listen(struct mg_mgr *, const char *url, - mg_event_handler_t fn, void *fn_data); -struct mg_connection *mg_connect(struct mg_mgr *, const char *url, - mg_event_handler_t fn, void *fn_data); -struct mg_connection *mg_wrapfd(struct mg_mgr *mgr, int fd, - mg_event_handler_t fn, void *fn_data); -void mg_connect_resolved(struct mg_connection *); -bool mg_send(struct mg_connection *, const void *, size_t); -size_t mg_printf(struct mg_connection *, const char *fmt, ...); -size_t mg_vprintf(struct mg_connection *, const char *fmt, va_list *ap); -bool mg_aton(struct mg_str str, struct mg_addr *addr); - -// These functions are used to integrate with custom network stacks -struct mg_connection *mg_alloc_conn(struct mg_mgr *); -void mg_close_conn(struct mg_connection *c); -bool mg_open_listener(struct mg_connection *c, const char *url); - -// Utility functions -bool mg_wakeup(struct mg_mgr *, unsigned long id, const void *buf, size_t len); -bool mg_wakeup_init(struct mg_mgr *); -struct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds, - unsigned flags, void (*fn)(void *), void *arg); - - - - - - - - -struct mg_http_header { - struct mg_str name; // Header name - struct mg_str value; // Header value -}; - -struct mg_http_message { - struct mg_str method, uri, query, proto; // Request/response line - struct mg_http_header headers[MG_MAX_HTTP_HEADERS]; // Headers - struct mg_str body; // Body - struct mg_str head; // Request + headers - struct mg_str message; // Request + headers + body -}; - -// Parameter for mg_http_serve_dir() -struct mg_http_serve_opts { - const char *root_dir; // Web root directory, must be non-NULL - const char *ssi_pattern; // SSI file name pattern, e.g. #.shtml - const char *extra_headers; // Extra HTTP headers to add in responses - const char *mime_types; // Extra mime types, ext1=type1,ext2=type2,.. - const char *page404; // Path to the 404 page, or NULL by default - struct mg_fs *fs; // Filesystem implementation. Use NULL for POSIX -}; - -// Parameter for mg_http_next_multipart -struct mg_http_part { - struct mg_str name; // Form field name - struct mg_str filename; // Filename for file uploads - struct mg_str body; // Part contents -}; - -int mg_http_parse(const char *s, size_t len, struct mg_http_message *); -int mg_http_get_request_len(const unsigned char *buf, size_t buf_len); -void mg_http_printf_chunk(struct mg_connection *cnn, const char *fmt, ...); -void mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len); -void mg_http_delete_chunk(struct mg_connection *c, struct mg_http_message *hm); -struct mg_connection *mg_http_listen(struct mg_mgr *, const char *url, - mg_event_handler_t fn, void *fn_data); -struct mg_connection *mg_http_connect(struct mg_mgr *, const char *url, - mg_event_handler_t fn, void *fn_data); -void mg_http_serve_dir(struct mg_connection *, struct mg_http_message *hm, - const struct mg_http_serve_opts *); -void mg_http_serve_file(struct mg_connection *, struct mg_http_message *hm, - const char *path, const struct mg_http_serve_opts *); -void mg_http_reply(struct mg_connection *, int status_code, const char *headers, - const char *body_fmt, ...); -struct mg_str *mg_http_get_header(struct mg_http_message *, const char *name); -struct mg_str mg_http_var(struct mg_str buf, struct mg_str name); -int mg_http_get_var(const struct mg_str *, const char *name, char *, size_t); -int mg_url_decode(const char *s, size_t n, char *to, size_t to_len, int form); -size_t mg_url_encode(const char *s, size_t n, char *buf, size_t len); -void mg_http_creds(struct mg_http_message *, char *, size_t, char *, size_t); -bool mg_http_match_uri(const struct mg_http_message *, const char *glob); -long mg_http_upload(struct mg_connection *c, struct mg_http_message *hm, - struct mg_fs *fs, const char *dir, size_t max_size); -void mg_http_bauth(struct mg_connection *, const char *user, const char *pass); -struct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v); -size_t mg_http_next_multipart(struct mg_str, size_t, struct mg_http_part *); -int mg_http_status(const struct mg_http_message *hm); -void mg_hello(const char *url); - - -void mg_http_serve_ssi(struct mg_connection *c, const char *root, - const char *fullpath); - - -#define MG_TLS_NONE 0 // No TLS support -#define MG_TLS_MBED 1 // mbedTLS -#define MG_TLS_OPENSSL 2 // OpenSSL -#define MG_TLS_BUILTIN 3 // Built-in -#define MG_TLS_CUSTOM 4 // Custom implementation - -#ifndef MG_TLS -#define MG_TLS MG_TLS_NONE -#endif - - - - - -struct mg_tls_opts { - struct mg_str ca; // PEM or DER - struct mg_str cert; // PEM or DER - struct mg_str key; // PEM or DER - struct mg_str name; // If not empty, enable host name verification -}; - -void mg_tls_init(struct mg_connection *, const struct mg_tls_opts *opts); -void mg_tls_free(struct mg_connection *); -long mg_tls_send(struct mg_connection *, const void *buf, size_t len); -long mg_tls_recv(struct mg_connection *, void *buf, size_t len); -size_t mg_tls_pending(struct mg_connection *); -void mg_tls_handshake(struct mg_connection *); - -// Private -void mg_tls_ctx_init(struct mg_mgr *); -void mg_tls_ctx_free(struct mg_mgr *); - -// Low-level IO primives used by TLS layer -enum { MG_IO_ERR = -1, MG_IO_WAIT = -2, MG_IO_RESET = -3 }; -long mg_io_send(struct mg_connection *c, const void *buf, size_t len); -long mg_io_recv(struct mg_connection *c, void *buf, size_t len); - - - - - - - -#if MG_TLS == MG_TLS_MBED -#include -#include -#include -#include - -struct mg_tls_ctx { - int dummy; -#ifdef MBEDTLS_SSL_SESSION_TICKETS - mbedtls_ssl_ticket_context tickets; -#endif -}; - -struct mg_tls { - mbedtls_x509_crt ca; // Parsed CA certificate - mbedtls_x509_crt cert; // Parsed certificate - mbedtls_pk_context pk; // Private key context - mbedtls_ssl_context ssl; // SSL/TLS context - mbedtls_ssl_config conf; // SSL-TLS config -#ifdef MBEDTLS_SSL_SESSION_TICKETS - mbedtls_ssl_ticket_context ticket; // Session tickets context -#endif -}; -#endif - - -#if MG_TLS == MG_TLS_OPENSSL - -#include -#include - -struct mg_tls { - BIO_METHOD *bm; - SSL_CTX *ctx; - SSL *ssl; -}; -#endif - - -#define WEBSOCKET_OP_CONTINUE 0 -#define WEBSOCKET_OP_TEXT 1 -#define WEBSOCKET_OP_BINARY 2 -#define WEBSOCKET_OP_CLOSE 8 -#define WEBSOCKET_OP_PING 9 -#define WEBSOCKET_OP_PONG 10 - - - -struct mg_ws_message { - struct mg_str data; // Websocket message data - uint8_t flags; // Websocket message flags -}; - -struct mg_connection *mg_ws_connect(struct mg_mgr *, const char *url, - mg_event_handler_t fn, void *fn_data, - const char *fmt, ...); -void mg_ws_upgrade(struct mg_connection *, struct mg_http_message *, - const char *fmt, ...); -size_t mg_ws_send(struct mg_connection *, const void *buf, size_t len, int op); -size_t mg_ws_wrap(struct mg_connection *, size_t len, int op); -size_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...); -size_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt, - va_list *); - - - - -struct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url, - mg_event_handler_t fn, void *fn_data); -void mg_sntp_request(struct mg_connection *c); -int64_t mg_sntp_parse(const unsigned char *buf, size_t len); - - - - - -#define MQTT_CMD_CONNECT 1 -#define MQTT_CMD_CONNACK 2 -#define MQTT_CMD_PUBLISH 3 -#define MQTT_CMD_PUBACK 4 -#define MQTT_CMD_PUBREC 5 -#define MQTT_CMD_PUBREL 6 -#define MQTT_CMD_PUBCOMP 7 -#define MQTT_CMD_SUBSCRIBE 8 -#define MQTT_CMD_SUBACK 9 -#define MQTT_CMD_UNSUBSCRIBE 10 -#define MQTT_CMD_UNSUBACK 11 -#define MQTT_CMD_PINGREQ 12 -#define MQTT_CMD_PINGRESP 13 -#define MQTT_CMD_DISCONNECT 14 -#define MQTT_CMD_AUTH 15 - -#define MQTT_PROP_PAYLOAD_FORMAT_INDICATOR 0x01 -#define MQTT_PROP_MESSAGE_EXPIRY_INTERVAL 0x02 -#define MQTT_PROP_CONTENT_TYPE 0x03 -#define MQTT_PROP_RESPONSE_TOPIC 0x08 -#define MQTT_PROP_CORRELATION_DATA 0x09 -#define MQTT_PROP_SUBSCRIPTION_IDENTIFIER 0x0B -#define MQTT_PROP_SESSION_EXPIRY_INTERVAL 0x11 -#define MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER 0x12 -#define MQTT_PROP_SERVER_KEEP_ALIVE 0x13 -#define MQTT_PROP_AUTHENTICATION_METHOD 0x15 -#define MQTT_PROP_AUTHENTICATION_DATA 0x16 -#define MQTT_PROP_REQUEST_PROBLEM_INFORMATION 0x17 -#define MQTT_PROP_WILL_DELAY_INTERVAL 0x18 -#define MQTT_PROP_REQUEST_RESPONSE_INFORMATION 0x19 -#define MQTT_PROP_RESPONSE_INFORMATION 0x1A -#define MQTT_PROP_SERVER_REFERENCE 0x1C -#define MQTT_PROP_REASON_STRING 0x1F -#define MQTT_PROP_RECEIVE_MAXIMUM 0x21 -#define MQTT_PROP_TOPIC_ALIAS_MAXIMUM 0x22 -#define MQTT_PROP_TOPIC_ALIAS 0x23 -#define MQTT_PROP_MAXIMUM_QOS 0x24 -#define MQTT_PROP_RETAIN_AVAILABLE 0x25 -#define MQTT_PROP_USER_PROPERTY 0x26 -#define MQTT_PROP_MAXIMUM_PACKET_SIZE 0x27 -#define MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE 0x28 -#define MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE 0x29 -#define MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE 0x2A - -enum { - MQTT_PROP_TYPE_BYTE, - MQTT_PROP_TYPE_STRING, - MQTT_PROP_TYPE_STRING_PAIR, - MQTT_PROP_TYPE_BINARY_DATA, - MQTT_PROP_TYPE_VARIABLE_INT, - MQTT_PROP_TYPE_INT, - MQTT_PROP_TYPE_SHORT -}; - -enum { MQTT_OK, MQTT_INCOMPLETE, MQTT_MALFORMED }; - -struct mg_mqtt_prop { - uint8_t id; // Enumerated at MQTT5 Reference - uint32_t iv; // Integer value for 8-, 16-, 32-bit integers types - struct mg_str key; // Non-NULL only for user property type - struct mg_str val; // Non-NULL only for UTF-8 types and user properties -}; - -struct mg_mqtt_opts { - struct mg_str user; // Username, can be empty - struct mg_str pass; // Password, can be empty - struct mg_str client_id; // Client ID - struct mg_str topic; // message/subscription topic - struct mg_str message; // message content - uint8_t qos; // message quality of service - uint8_t version; // Can be 4 (3.1.1), or 5. If 0, assume 4 - uint16_t keepalive; // Keep-alive timer in seconds - bool retain; // Retain flag - bool clean; // Clean session flag - struct mg_mqtt_prop *props; // MQTT5 props array - size_t num_props; // number of props - struct mg_mqtt_prop *will_props; // Valid only for CONNECT packet (MQTT5) - size_t num_will_props; // Number of will props -}; - -struct mg_mqtt_message { - struct mg_str topic; // Parsed topic for PUBLISH - struct mg_str data; // Parsed message for PUBLISH - struct mg_str dgram; // Whole MQTT packet, including headers - uint16_t id; // For PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, PUBLISH - uint8_t cmd; // MQTT command, one of MQTT_CMD_* - uint8_t qos; // Quality of service - uint8_t ack; // CONNACK return code, 0 = success - size_t props_start; // Offset to the start of the properties (MQTT5) - size_t props_size; // Length of the properties -}; - -struct mg_connection *mg_mqtt_connect(struct mg_mgr *, const char *url, - const struct mg_mqtt_opts *opts, - mg_event_handler_t fn, void *fn_data); -struct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url, - mg_event_handler_t fn, void *fn_data); -void mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts); -void mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts); -void mg_mqtt_sub(struct mg_connection *, const struct mg_mqtt_opts *opts); -int mg_mqtt_parse(const uint8_t *, size_t, uint8_t, struct mg_mqtt_message *); -void mg_mqtt_send_header(struct mg_connection *, uint8_t cmd, uint8_t flags, - uint32_t len); -void mg_mqtt_ping(struct mg_connection *); -void mg_mqtt_pong(struct mg_connection *); -void mg_mqtt_disconnect(struct mg_connection *, const struct mg_mqtt_opts *); -size_t mg_mqtt_next_prop(struct mg_mqtt_message *, struct mg_mqtt_prop *, - size_t ofs); - - - - - -// Mongoose sends DNS queries that contain only one question: -// either A (IPv4) or AAAA (IPv6) address lookup. -// Therefore, we expect zero or one answer. -// If `resolved` is true, then `addr` contains resolved IPv4 or IPV6 address. -struct mg_dns_message { - uint16_t txnid; // Transaction ID - bool resolved; // Resolve successful, addr is set - struct mg_addr addr; // Resolved address - char name[256]; // Host name -}; - -struct mg_dns_header { - uint16_t txnid; // Transaction ID - uint16_t flags; - uint16_t num_questions; - uint16_t num_answers; - uint16_t num_authority_prs; - uint16_t num_other_prs; -}; - -// DNS resource record -struct mg_dns_rr { - uint16_t nlen; // Name or pointer length - uint16_t atype; // Address type - uint16_t aclass; // Address class - uint16_t alen; // Address length -}; - -void mg_resolve(struct mg_connection *, const char *url); -void mg_resolve_cancel(struct mg_connection *); -bool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *); -size_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs, - bool is_question, struct mg_dns_rr *); - - - - - -#ifndef MG_JSON_MAX_DEPTH -#define MG_JSON_MAX_DEPTH 30 -#endif - -// Error return values - negative. Successful returns are >= 0 -enum { MG_JSON_TOO_DEEP = -1, MG_JSON_INVALID = -2, MG_JSON_NOT_FOUND = -3 }; -int mg_json_get(struct mg_str json, const char *path, int *toklen); - -struct mg_str mg_json_get_tok(struct mg_str json, const char *path); -bool mg_json_get_num(struct mg_str json, const char *path, double *v); -bool mg_json_get_bool(struct mg_str json, const char *path, bool *v); -long mg_json_get_long(struct mg_str json, const char *path, long dflt); -char *mg_json_get_str(struct mg_str json, const char *path); -char *mg_json_get_hex(struct mg_str json, const char *path, int *len); -char *mg_json_get_b64(struct mg_str json, const char *path, int *len); - -bool mg_json_unescape(struct mg_str str, char *buf, size_t len); -size_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key, - struct mg_str *val); - - - - -// JSON-RPC request descriptor -struct mg_rpc_req { - struct mg_rpc **head; // RPC handlers list head - struct mg_rpc *rpc; // RPC handler being called - mg_pfn_t pfn; // Response printing function - void *pfn_data; // Response printing function data - void *req_data; // Arbitrary request data - struct mg_str frame; // Request, e.g. {"id":1,"method":"add","params":[1,2]} -}; - -// JSON-RPC method handler -struct mg_rpc { - struct mg_rpc *next; // Next in list - struct mg_str method; // Method pattern - void (*fn)(struct mg_rpc_req *); // Handler function - void *fn_data; // Handler function argument -}; - -void mg_rpc_add(struct mg_rpc **head, struct mg_str method_pattern, - void (*handler)(struct mg_rpc_req *), void *handler_data); -void mg_rpc_del(struct mg_rpc **head, void (*handler)(struct mg_rpc_req *)); -void mg_rpc_process(struct mg_rpc_req *); - -// Helper functions to print result or error frame -void mg_rpc_ok(struct mg_rpc_req *, const char *fmt, ...); -void mg_rpc_vok(struct mg_rpc_req *, const char *fmt, va_list *ap); -void mg_rpc_err(struct mg_rpc_req *, int code, const char *fmt, ...); -void mg_rpc_verr(struct mg_rpc_req *, int code, const char *fmt, va_list *); -void mg_rpc_list(struct mg_rpc_req *r); -// Copyright (c) 2023 Cesanta Software Limited -// All rights reserved - - - - - -#define MG_OTA_NONE 0 // No OTA support -#define MG_OTA_FLASH 1 // OTA via an internal flash -#define MG_OTA_CUSTOM 100 // Custom implementation - -#ifndef MG_OTA -#define MG_OTA MG_OTA_NONE -#endif - -#if defined(__GNUC__) && !defined(__APPLE__) -#define MG_IRAM __attribute__((section(".iram"))) -#else -#define MG_IRAM -#endif - -// Firmware update API -bool mg_ota_begin(size_t new_firmware_size); // Start writing -bool mg_ota_write(const void *buf, size_t len); // Write chunk, aligned to 1k -bool mg_ota_end(void); // Stop writing - -enum { - MG_OTA_UNAVAILABLE = 0, // No OTA information is present - MG_OTA_FIRST_BOOT = 1, // Device booting the first time after the OTA - MG_OTA_UNCOMMITTED = 2, // Ditto, but marking us for the rollback - MG_OTA_COMMITTED = 3 // The firmware is good -}; -enum { MG_FIRMWARE_CURRENT = 0, MG_FIRMWARE_PREVIOUS = 1 }; - -int mg_ota_status(int firmware); // Return firmware status MG_OTA_* -uint32_t mg_ota_crc32(int firmware); // Return firmware checksum -uint32_t mg_ota_timestamp(int firmware); // Firmware timestamp, UNIX UTC epoch -size_t mg_ota_size(int firmware); // Firmware size - -bool mg_ota_commit(void); // Commit current firmware -bool mg_ota_rollback(void); // Rollback to the previous firmware -MG_IRAM void mg_ota_boot(void); // Bootloader function -// Copyright (c) 2023 Cesanta Software Limited -// All rights reserved - - - - - -#define MG_DEVICE_NONE 0 // Dummy system -#define MG_DEVICE_STM32H5 1 // STM32 H5 -#define MG_DEVICE_STM32H7 2 // STM32 H7 -#define MG_DEVICE_RT1020 3 // IMXRT1020 -#define MG_DEVICE_RT1060 4 // IMXRT1060 -#define MG_DEVICE_CH32V307 100 // WCH CH32V307 -#define MG_DEVICE_CUSTOM 1000 // Custom implementation - -#ifndef MG_DEVICE -#define MG_DEVICE MG_DEVICE_NONE -#endif - -// Flash information -void *mg_flash_start(void); // Return flash start address -size_t mg_flash_size(void); // Return flash size -size_t mg_flash_sector_size(void); // Return flash sector size -size_t mg_flash_write_align(void); // Return flash write align, minimum 4 -int mg_flash_bank(void); // 0: not dual bank, 1: bank1, 2: bank2 - -// Write, erase, swap bank -bool mg_flash_write(void *addr, const void *buf, size_t len); -bool mg_flash_erase(void *sector); -bool mg_flash_swap_bank(void); - -// Convenience functions to store data on a flash sector with wear levelling -// If `sector` is NULL, then the last sector of flash is used -bool mg_flash_load(void *sector, uint32_t key, void *buf, size_t len); -bool mg_flash_save(void *sector, uint32_t key, const void *buf, size_t len); - -void mg_device_reset(void); // Reboot device immediately - - - - - - -#if defined(MG_ENABLE_TCPIP) && MG_ENABLE_TCPIP -struct mg_tcpip_if; // Mongoose TCP/IP network interface - -struct mg_tcpip_driver { - bool (*init)(struct mg_tcpip_if *); // Init driver - size_t (*tx)(const void *, size_t, struct mg_tcpip_if *); // Transmit frame - size_t (*rx)(void *buf, size_t len, struct mg_tcpip_if *); // Receive frame - bool (*up)(struct mg_tcpip_if *); // Up/down status -}; - -// Network interface -struct mg_tcpip_if { - uint8_t mac[6]; // MAC address. Must be set to a valid MAC - uint32_t ip, mask, gw; // IP address, mask, default gateway - struct mg_str tx; // Output (TX) buffer - bool enable_dhcp_client; // Enable DCHP client - bool enable_dhcp_server; // Enable DCHP server - bool enable_get_gateway; // DCHP server sets client as gateway - bool enable_crc32_check; // Do a CRC check on RX frames and strip it - bool enable_mac_check; // Do a MAC check on RX frames - struct mg_tcpip_driver *driver; // Low level driver - void *driver_data; // Driver-specific data - struct mg_mgr *mgr; // Mongoose event manager - struct mg_queue recv_queue; // Receive queue - uint16_t mtu; // Interface MTU -#define MG_TCPIP_MTU_DEFAULT 1500 - - // Internal state, user can use it but should not change it - uint8_t gwmac[6]; // Router's MAC - uint64_t now; // Current time - uint64_t timer_1000ms; // 1000 ms timer: for DHCP and link state - uint64_t lease_expire; // Lease expiration time, in ms - uint16_t eport; // Next ephemeral port - volatile uint32_t ndrop; // Number of received, but dropped frames - volatile uint32_t nrecv; // Number of received frames - volatile uint32_t nsent; // Number of transmitted frames - volatile uint32_t nerr; // Number of driver errors - uint8_t state; // Current state -#define MG_TCPIP_STATE_DOWN 0 // Interface is down -#define MG_TCPIP_STATE_UP 1 // Interface is up -#define MG_TCPIP_STATE_REQ 2 // Interface is up and has requested an IP -#define MG_TCPIP_STATE_READY 3 // Interface is up and has an IP assigned -}; - -void mg_tcpip_init(struct mg_mgr *, struct mg_tcpip_if *); -void mg_tcpip_free(struct mg_tcpip_if *); -void mg_tcpip_qwrite(void *buf, size_t len, struct mg_tcpip_if *ifp); - -extern struct mg_tcpip_driver mg_tcpip_driver_stm32f; -extern struct mg_tcpip_driver mg_tcpip_driver_w5500; -extern struct mg_tcpip_driver mg_tcpip_driver_tm4c; -extern struct mg_tcpip_driver mg_tcpip_driver_stm32h; -extern struct mg_tcpip_driver mg_tcpip_driver_imxrt; -extern struct mg_tcpip_driver mg_tcpip_driver_same54; -extern struct mg_tcpip_driver mg_tcpip_driver_cmsis; - -// Drivers that require SPI, can use this SPI abstraction -struct mg_tcpip_spi { - void *spi; // Opaque SPI bus descriptor - void (*begin)(void *); // SPI begin: slave select low - void (*end)(void *); // SPI end: slave select high - uint8_t (*txn)(void *, uint8_t); // SPI transaction: write 1 byte, read reply -}; -#endif - - - -// Macros to record timestamped events that happens with a connection. -// They are saved into a c->prof IO buffer, each event is a name and a 32-bit -// timestamp in milliseconds since connection init time. -// -// Test (run in two separate terminals): -// make -C examples/http-server/ CFLAGS_EXTRA=-DMG_ENABLE_PROFILE=1 -// curl localhost:8000 -// Output: -// 1ea1f1e7 2 net.c:150:mg_close_conn 3 profile: -// 1ea1f1e8 2 net.c:150:mg_close_conn 1ea1f1e6 init -// 1ea1f1e8 2 net.c:150:mg_close_conn 0 EV_OPEN -// 1ea1f1e8 2 net.c:150:mg_close_conn 0 EV_ACCEPT -// 1ea1f1e8 2 net.c:150:mg_close_conn 0 EV_READ -// 1ea1f1e8 2 net.c:150:mg_close_conn 0 EV_HTTP_MSG -// 1ea1f1e8 2 net.c:150:mg_close_conn 0 EV_WRITE -// 1ea1f1e8 2 net.c:150:mg_close_conn 1 EV_CLOSE -// -// Usage: -// Enable profiling by setting MG_ENABLE_PROFILE=1 -// Invoke MG_PROF_ADD(c, "MY_EVENT_1") in the places you'd like to measure - -#if MG_ENABLE_PROFILE -struct mg_profitem { - const char *name; // Event name - uint32_t timestamp; // Milliseconds since connection creation (MG_EV_OPEN) -}; - -#define MG_PROFILE_ALLOC_GRANULARITY 256 // Can save 32 items wih to realloc - -// Adding a profile item to the c->prof. Must be as fast as possible. -// Reallocation of the c->prof iobuf is not desirable here, that's why we -// pre-allocate c->prof with MG_PROFILE_ALLOC_GRANULARITY. -// This macro just inits and copies 8 bytes, and calls mg_millis(), -// which should be fast enough. -#define MG_PROF_ADD(c, name_) \ - do { \ - struct mg_iobuf *io = &c->prof; \ - uint32_t inittime = ((struct mg_profitem *) io->buf)->timestamp; \ - struct mg_profitem item = {name_, (uint32_t) mg_millis() - inittime}; \ - mg_iobuf_add(io, io->len, &item, sizeof(item)); \ - } while (0) - -// Initialising profile for a new connection. Not time sensitive -#define MG_PROF_INIT(c) \ - do { \ - struct mg_profitem first = {"init", (uint32_t) mg_millis()}; \ - mg_iobuf_init(&(c)->prof, 0, MG_PROFILE_ALLOC_GRANULARITY); \ - mg_iobuf_add(&c->prof, c->prof.len, &first, sizeof(first)); \ - } while (0) - -#define MG_PROF_FREE(c) mg_iobuf_free(&(c)->prof) - -// Dumping the profile. Not time sensitive -#define MG_PROF_DUMP(c) \ - do { \ - struct mg_iobuf *io = &c->prof; \ - struct mg_profitem *p = (struct mg_profitem *) io->buf; \ - struct mg_profitem *e = &p[io->len / sizeof(*p)]; \ - MG_INFO(("%lu profile:", c->id)); \ - while (p < e) { \ - MG_INFO(("%5lx %s", (unsigned long) p->timestamp, p->name)); \ - p++; \ - } \ - } while (0) - -#else -#define MG_PROF_INIT(c) -#define MG_PROF_FREE(c) -#define MG_PROF_ADD(c, name) -#define MG_PROF_DUMP(c) -#endif - - -#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS) && MG_ENABLE_DRIVER_CMSIS - -#include "Driver_ETH_MAC.h" // keep this include -#include "Driver_ETH_PHY.h" // keep this include - -#endif - - -struct mg_tcpip_driver_imxrt_data { - // MDC clock divider. MDC clock is derived from IPS Bus clock (ipg_clk), - // must not exceed 2.5MHz. Configuration for clock range 2.36~2.50 MHz - // 37.5.1.8.2, Table 37-46 : f = ipg_clk / (2(mdc_cr + 1)) - // ipg_clk mdc_cr VALUE - // -------------------------- - // -1 <-- TODO() tell driver to guess the value - // 25 MHz 4 - // 33 MHz 6 - // 40 MHz 7 - // 50 MHz 9 - // 66 MHz 13 - int mdc_cr; // Valid values: -1 to 63 - - uint8_t phy_addr; // PHY address -}; - - -struct mg_tcpip_driver_same54_data { - int mdc_cr; -}; - - -struct mg_tcpip_driver_stm32f_data { - // MDC clock divider. MDC clock is derived from HCLK, must not exceed 2.5MHz - // HCLK range DIVIDER mdc_cr VALUE - // ------------------------------------- - // -1 <-- tell driver to guess the value - // 60-100 MHz HCLK/42 0 - // 100-150 MHz HCLK/62 1 - // 20-35 MHz HCLK/16 2 - // 35-60 MHz HCLK/26 3 - // 150-216 MHz HCLK/102 4 <-- value for Nucleo-F* on max speed - // 216-310 MHz HCLK/124 5 - // 110, 111 Reserved - int mdc_cr; // Valid values: -1, 0, 1, 2, 3, 4, 5 - - uint8_t phy_addr; // PHY address -}; - - -struct mg_tcpip_driver_stm32h_data { - // MDC clock divider. MDC clock is derived from HCLK, must not exceed 2.5MHz - // HCLK range DIVIDER mdc_cr VALUE - // ------------------------------------- - // -1 <-- tell driver to guess the value - // 60-100 MHz HCLK/42 0 - // 100-150 MHz HCLK/62 1 - // 20-35 MHz HCLK/16 2 - // 35-60 MHz HCLK/26 3 - // 150-250 MHz HCLK/102 4 <-- value for Nucleo-H* on max speed driven by HSI - // 250-300 MHz HCLK/124 5 <-- value for Nucleo-H* on max speed driven by CSI - // 110, 111 Reserved - int mdc_cr; // Valid values: -1, 0, 1, 2, 3, 4, 5 -}; - - -struct mg_tcpip_driver_tm4c_data { - // MDC clock divider. MDC clock is derived from SYSCLK, must not exceed 2.5MHz - // SYSCLK range DIVIDER mdc_cr VALUE - // ------------------------------------- - // -1 <-- tell driver to guess the value - // 60-100 MHz SYSCLK/42 0 - // 100-150 MHz SYSCLK/62 1 <-- value for EK-TM4C129* on max speed - // 20-35 MHz SYSCLK/16 2 - // 35-60 MHz SYSCLK/26 3 - // 0x4-0xF Reserved - int mdc_cr; // Valid values: -1, 0, 1, 2, 3 -}; - -#ifdef __cplusplus -} -#endif -#endif // MONGOOSE_H diff --git a/SmartEVSE-3/SmartEVSE-3/include/utils.h b/SmartEVSE-3/SmartEVSE-3/include/utils.h deleted file mode 100644 index c30e34e..0000000 --- a/SmartEVSE-3/SmartEVSE-3/include/utils.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -; Project: Smart EVSE -; -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. - */ - -// This is a guard condition so that contents of this file are not included -// more than once. -#ifndef UTILS_H -#define UTILS_H - -extern unsigned long pow_10[10]; - -uint32_t MacId(); -unsigned char crc8(unsigned char *buf, unsigned char len); -unsigned int crc16(unsigned char *buf, unsigned char len); -void sprintfl(char *str, const char *Format, signed long Value, unsigned char Divisor, unsigned char Decimal); -unsigned char triwave8(unsigned char in); -unsigned char scale8(unsigned char i, unsigned char scale); -unsigned char ease8InOutQuad(unsigned char i); - -#endif /* UTILS_H */ diff --git a/SmartEVSE-3/SmartEVSE-3/lib/README b/SmartEVSE-3/SmartEVSE-3/lib/README deleted file mode 100644 index 58415f5..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/README +++ /dev/null @@ -1,45 +0,0 @@ -This directory is intended for project specific (private) libraries. -PlatformIO will compile them to static libraries and link into executable file. - -The source code of each library should be placed in a an own separate directory -("lib/your_library_name/[here are source files]"). - -For example, see a structure of the following two libraries `Foo` and `Bar`: - -|--lib -| | -| |--Bar -| | |--docs -| | |--examples -| | |--src -| | |- Bar.c -| | |- Bar.h -| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html -| | -| |--Foo -| | |- Foo.c -| | |- Foo.h -| | -| |- README --> THIS FILE -| -|- platformio.ini -|--src - |- main.c - -and a contents of `src/main.c`: -``` -#include -#include - -int main (void) -{ - ... -} - -``` - -PlatformIO Library Dependency Finder will find automatically dependent -libraries scanning project source files. - -More information about PlatformIO Library Dependency Finder -- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.github/ISSUE_TEMPLATE/bug_report.md b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index daf40f6..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. -2. -3. - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Arduino Information:** - - OS: [e.g. Windows, MacOS, Linux] - - IDE [e.g. Arduino IDE, Eclipse, VSCode] - - IDE Version [e.g. 1.8.6] - - Board [e.g ESP32] - -**Additional context** -Add any other context about the problem here. diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.github/ISSUE_TEMPLATE/feature_request.md b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 066b2d9..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.gitignore b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.gitignore deleted file mode 100644 index e43b0f9..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/LICENSE.txt b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/LICENSE.txt deleted file mode 100755 index 6a981c5..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Joao Lopes - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/README.md b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/README.md deleted file mode 100755 index d524463..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/README.md +++ /dev/null @@ -1,737 +0,0 @@ -# RemoteDebug Library - -A library for Arduino to debug projects over WiFi, with web app or telnet client, -with Print commands like Serial Monitor. - -![logo](extras/readme_media/logo.png) - -[![arduino-library-badge](https://www.ardu-badge.com/badge/RemoteDebug.svg?)](https://www.ardu-badge.com/RemoteDebug) -[![GitHub release](https://img.shields.io/github/release/JoaoLopesF/RemoteDebug.svg)](#releases) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/3eadfd19246f4808907cf53599a6b9f0)](https://www.codacy.com/app/JoaoLopesF/RemoteDebug?utm_source=github.com&utm_medium=referral&utm_content=JoaoLopesF/RemoteDebug&utm_campaign=Badge_Grade) -[![platform badge](https://img.shields.io/badge/platform-Arduino|Espressif-orange.svg)](https://github.com/arduino) -[![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/JoaoLopesF/RemoteDebug/blob/master/LICENSE.txt) -[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](#github) -[![GitHub issues](https://img.shields.io/github/issues/JoaoLopesF/RemoteDebug.svg)](http://github.com/JoaoLopesF/RemoteDebug/issues) -[![star this repo](http://githubbadges.com/star.svg?user=JoaoLopesF&repo=RemoteDebug)](http://github.com/JoaoLopesF/RemoteDebug) - - -![remotedebugapp](extras/readme_media/remotedebugapp.png) - -## A library to remotely debug over a WiFi connection by telnet or web browser - -### RemoteDebug setup a TCP/IP server, that you connect to debugging, as an alternative to the serial connection - -## Contents - -- [About](#about) -- [How it looks](#how-it-looks) -- [Github](#github) -- [News](#news) -- [Benefits](#benefits) -- [HTML5 web app](#web-app) -- [Telnet client](#telnet) -- [Wishlist](#wishlist) -- [Install](#install) -- [Using](#usage) -- [Known issues](#known-issues) -- [Releases](#releases) -- [Thanks](#thanks) - -## About - -By default the Arduino only has as debug possibility via the Serial port. -This has a few disadvantages: - -- requires a physical cable to the Arduino device (if the device is far away or in a remote location this is not easy) -- debugging multiple Arduinos at the same time requires many serial ports and a lot of cables - -With the ESP8266 (NodeMCU) or ESP32 we now have network connectivity (WiFi) which can be used for streaming debugging information in real-time. - -This library is good for IoT projects, home automation, mobile robots (can debug it in moviment with a cable ?) or -another WiFi projects. - -In fact, this library was born of a need to debug an IoT project of home automation. -In this project there was a central module and three auxiliary modules, -and these were far from each other. One was hard to reach, under the roof of the house. -To debug this project, accompanying the exchange of messages in realtime, -is impossible to do with traditional way, by USB cable. - -The MiP_ESP8266_Library and my ESP32 WiFi robot are example of projects that uses __RemoteDebug__. -See it in: [MiP_ESP8266_Library](https://github.com/Tiogaplanet/MiP_ESP8266_Library) and [ESPlorer_v1](https://github.com/JoaoLopesF/ESPlorer_v1) - -__RemoteDebug__ is improved with client buffering (is last send is <= 10ms), -to avoid mysterious delays of WiFi networking on ESP32 and ESP8266 boards - -Note: If your project not use WiFi, you can use my another library, -the __[SerialDebug](https://github.com/JoaoLopesF/SerialDebug)__ library, -this library works with any Arduino board. - -Note II: __RemoteDebug__ library is now only to Espressif boards, as ESP32 and ESP8266, -If need for another WiFi boards, please add an issue about this -and we will see if it is possible made the port for your board. - -## How it looks - -Image: In RemoteDebugApp (web app) - -![webapp](extras/readme_media/remotedebug_webapp.png) - -Image: In telnet client - -![remotedebug_v2](extras/readme_media/remotedebug_v2.png) - -Youtube (RemoteDebug v2): - -[![youtube1](https://img.youtube.com/vi/T4nxdsFUGgg/0.jpg)](https://youtu.be/T4nxdsFUGgg) - -Youtube (3 telnet connections with RemoteDebug) v1: - -[![youtube2](http://img.youtube.com/vi/lOo-MAD8gPo/0.jpg)](http://www.youtube.com/watch?v=lOo-MAD8gPo) - -## Github - -Contribute to this library development by creating an account on GitHub. - -Please give a star, if you find this library useful, -this help an another people, discover it too. - -Please add an issue for problems or suggestion. - -## News - -- RemoteDebugApp Beta - - - Now have another repository, [RemoteDebugApp](https://github.com/JoaoLopesF/RemoteDebugApp) - It is for local copy of web app in internet. - It is updated with lastest version of web app, - after it is publised in web server: [http://joaolopesf.net/remotedebugapp](http://joaolopesf.net/remotedebugapp/). - Download it, for use when internet is offline. - As it is a local copy, the app will check for new versions periodically. - - - An HTML5 web app to use for debugging in web browser, instead telnet client, - that uses web socket to comunicate. - - - Now RemoteDebug v3 have a web socket server too, - to support the RemoteDebugApp connection. - - - RemoteDebugApp is in beta, - if you have any problems or suggestions, please add issue about this. - - - The telnet connection remains, to any want this, - or to internet offline uses. - -- Version 2.1.1 - - - Now __RemoteDebug__ have a code converter, for help you to convert your codes: - to do it, please access the [RemoteDebugConverter](https://github.com/JoaoLopesF/RemoteDebugConverter) - -- Version 2.0.0 - - - Now __RemoteDebug__ can have the same simple software debugger, that __SerialDebug__ library have. - This is done, installing another library, the __[RemoteDebugger](https://github.com/JoaoLopesF/RemoteDebugger)__ - The __RemoteDebugger__ act as an add on to __RemoteDebug__. - To support this addon, the changes in __RemoteDebug__, is minimum, just a few callbacks - It is done to no add extra overhead to projects that no need an debugger. - To more informations please access the __[RemoteDebugger](https://github.com/JoaoLopesF/RemoteDebugger)__ github repository. - - - Now __RemoteDebug__ have a new color system, using more colors, as done in __SerialDebugApp__ - - Note: due the __RemoteDebug__ library, is migrate to Arduino 1.5 format, with folder "src", - please delete and reinstall the library to avoid duplication of RemoteDebug sources files. - -- Version 1.5.* - - In 1.5.0 version, we have debug* and rdebug* macros (see below), that put automatically, - the name of function that called, and core id (core id is only for ESP32) - -## Benefits - -__SerialDebug__ is better than Arduino default debugging by Serial.print commands: - -### This is more __optimized__ - - Being or not debugging via USB cable, - the Serial.print command allways is processed, - waste CPU time on microcontroller. - In other words, the debug commands are processed, - with someone connected in the serial or not. - - With __RemoteDebug__, all debug output is processed only - if exists anyone debugging via telnet or web app connection. - - And with the debug levels of resource, the volume displayed - of messages are reduced for higher levels. - For example, only process all messages, - if the level is the lowest, the verbose, - - __RemoteDebug__ is otimized to reduce overheads, - in CPU and memory and include client buffering feature. - -### Have __debug levels__ - - During the development, we can put a lot of debug messages... - - But with __RemoteDebug__, we can put a level in each one. - - For all messages (except levels always (debugA) or error (debugE), - the message only is processed and showed, - if debug level is equal or higher than it level - - __RemoteDebug__ have 6 debug levels, in order of priority: - - Alway showed: - - __Error__: Critical errors - - __Always__: Important messages - - Another levels (showed if level is equal or higher that actual one): - - __Warning__: Error conditions but not critical - - __Info__: Information messages - - __Debug__: Extra information - - __Verbose__: More information than the usual - - So We can change the level to verbose, to see all messages. - Or to debug to see only debug or higher level, etc. - - Is very good to reduce a quantity of messages that a project can generate, - to help debugging. - -### It is __easy__ to migrate - - __RemoteDebug__ have a converter to help migrate your Arduino codes, - from Serial.prints to this library. - - [RemoteDebugConverter](https://github.com/JoaoLopesF/RemoteDebugConverter) - - Even if you want to do this manually, it's very simple. Please see topic [Using](#usage) above. - -### Have __auto__ function name and simple __profiler__ - - A simple debug: - - ```cpp - debugV("* Run time: %02u:%02u:%02u (VERBOSE)", mRunHours, mRunMinutes, mRunSeconds); - ```` - - Can generate this output in serial monitor: - - (V p:3065 loop C1) * Run time: 00:41:23 (VERBOSE) - - Where: V: is the level - p: is a profiler time, elased, between this and previous debug - loop: is a function name, that executed this debug - C1: is a core that executed this debug (and a function of this) (only for ESP32) - The remaining is the message formatted (printf) - - For ESP32, the core id in each debug is very good to optimizer multicore programming. - -### Have __commands__ to execute from telnet or web app - - For example: - -- Show help (__?__) -- Change the level of debug (__v__,__d__,__i__,__w__,__e__), - to show less or more messages. -- See memory (__m__) -- Reset the board (__reset__) - - See about __RemoteDebug__ commands below. - - You can add your own commands, see the examples please - - If your project have __[RemoteDebugger](https://github.com/JoaoLopesF/RemoteDebugger)__ installed, - have a new commands, e.g. call a function, see/change variables, ... - -### Have a simple __software debugger__ - - Now __RemoteDebug__ (version >= 2.0.0), have an simple software debuggger, - based in codes of SerialDebug library. - - This is another library, that act as an addon to __RemoteDebug__. - - Please acess the RemoteDebugger repository to more informations: __[RemoteDebugger](https://github.com/JoaoLopesF/RemoteDebugger)__ - -### Ready for __production__ (release compiler) - - For release your device, just uncomment DEBUG_DISABLED in your project - Done this, and no more debug processing. - And better for DEBUG_DISABLED, __RemoteDebug__ have ZERO overhead, - due is nothing of this is compiled. - -## Web app - -As SerialDebug, now RemoteDebug (v3) have an app,the RemoteDebugApp, -to debug in web browser. - -This app is an HTM5 web app, with websocket to comunicate to Arduino board. -For it, RemoteDebug v3 have a web socket server (can be disabled). -It used a local copy of [arduinoWebSockets](https://github.com/Links2004/arduinoWebSockets) library, -due it not in Arduino Library manager. - -As a large web page on web server, the solution for Arduino is save it in a storage, -like SPIFFS. But not have automatically updates new version in data saved this way, -this SPIFFS data is good for a project but not for a library. - -Due it, this app not is stored and served by board, -instead the app is in web: [http://joaolopesf.net/remotedebugapp](http://joaolopesf.net/remotedebugapp) -Note: this not uses SSL (https), due web server socket on Arduino, not supports SSL (wss). -But after page load, all traffic is in local network, no data is exposed on internet. - -The RemoteDebugApp is a modern HTML5 and needs a modern browsers to work. -Internet Explorer 11 and Safari 10 are an examples that not supported. -But you can use anothers, as Chrome, Edge, Firefox. - -The web app is in beta, please add an issue, -for problems or suggestions. - -Now have another repository, [RemoteDebugApp](https://github.com/JoaoLopesF/RemoteDebugApp) -It is for local copy of web app in internet. -It is updated with lastest version of web app, -after it is publised in web server: [http://joaolopesf.net/remotedebugapp](http://joaolopesf.net/remotedebugapp/). -Download it, for use when internet is offline. -As it is a local copy, the app will check for new versions periodically, -for you can download a new version. - -The telnet remains work, for when want this, -or for fails on web app. - -## Telnet - -Telnet is a standard way of remotely connecting to a server and -is supported on all operating systems (Windows, Mac, Linux...). - -MacOSx and Linux have a native telnet client. - -For Windows, a typical telnet client is the __Putty__: [putty](https://www.putty.org/) . - -Have a good tool for mobiles: the __Fing__, please find it in your mobile store. -Its show all devices in local network (WiFi), show ports opened and can execute the telnet client too (external App) - -__RemoteDebug__ sets-up a telnet server which is listening to any telnet client that wants to connect. After connection, logging is streamed to the telnet client. - -__RemoteDebug__ is very simple to use, after a few lines of initialization code, you can use the well-known "print" commands to stream your logging to the remote client. - -### Debug levels - -__RemoteDebug__ supports the filtering of logging based on __debug levels__: - -Only show for it actual debug level: - -- Verbose -- Debug -- Info -- Warnings - -Note: These levels are in the order of most-logging -> least-logging. - -Or for always show (not depends of actual debug level): - -- Any -- Errors - -Note: All debugs is processed and showed only if have a client connection. - -The telnet client or web app can set the debug level by typing a few simple commands. - -### Profiler - -__RemoteDebug__ includes a simple profiler. It can be enabled by the connected client (telnet or web app) -or the Arduino code itself. - -When enabled, it shows the time between 2 debug statements, using different colors depending on the elapsed time. - -A typical example would be to insert logging just before and after a function after which you can see how much the is spent in the function. - -### Lightweight - -__RemoteDebug__ is designed to give minimal overhead (connected or not) and -only process debugs,if there is a client (telnet or web app) connected. - -### Custom commands - -__RemoteDebug__ supports custom commands that can be entered in the client (telnet or web app). - These trigger the execution of a custom function in the Arduino code. For example this can be used to send back a status on request of the client. - -### DISCLAIMER - -The current version of __RemoteDebug__ does not yet include any encrypted authentication, -only plain text and is intended only for development, not use in production/release. - -Future versions, if is possible, will include a secure way for authentication and further testing to support production environments. - -## Wishlist - - - An app to RemoteDebug like SerialDebug have. - - Http page to begin/stop the telnet server or websocket server. - - Authentication as telnet support (kerberos, etc.) to support production environment - -## Install - -Just download or clone this repository. - -Or for Arduino IDE, you can use the library manager to install and update the library. - -For install help, please click on this: [![arduino-library-badge](https://www.ardu-badge.com/badge/RemoteDebug.svg?)](https://www.ardu-badge.com/RemoteDebug) - - - -For another IDE, or not using the library manager of Arduino IDE, -I suggest you use a [Github Desktop](https://desktop.github.com/) app to clone,it help to keep updated. - -Please open the projects in example folder, to see it working. - -## Usage - -### includes - -```cpp -#include "RemoteDebug.h" //https://github.com/JoaoLopesF/RemoteDebug -``` - -### instance - -RemoteDebug Debug; - -### setup - -In the setup function after WiFi initialization - -```cpp -// Initialize the server (telnet or web socket) of RemoteDebug - -Debug.begin(HOST_NAME); - -// OR - -Debug.begin(HOST_NAME, startingDebugLevel); - -// Options - -Debug.setResetCmdEnabled(true); // Enable the reset command - -// Debug.showProfiler(true); // To show profiler - time between messages of Debug - -``` - -Note: to enable the debugger, by RemoteDebugger, please acess this github repository: -__[RemoteDebugger](https://github.com/JoaoLopesF/RemoteDebugger)__ - -In the tail of loop function - -```cpp -// Remote debug over WiFi - -Debug.handle(); - -// Or - -debugHandle(); // Equal to SerialDebug - -``` - -In any place of you code: - -```cpp -#ifndef DEBUG_DISABLED -if (Debug.isActive(Debug.)) { - Debug.printf("bla bla bla: %d %s", number, str); // OR - Debug.printf("bla bla bla: %d %s", number, str.c_str()); // Note: if type is String need c_str() // OR - Debug.println("bla bla bla 2 ln"); - Debug.printf("float: %f\n", value); // Not works in ESP8266 :-( - // Note: to show floats with printf (ESP8266 only), - // you can use my ArduinoUtil library -> https://github.com/JoaoLopesF/ArduinoUtil - Debug.printf("float: %s\n", Util.formatFloat(value, 0, 5).c_str()); -} -#endif -``` - -Note: Using isActive, you need surround the code by DEBUG_DISABLE precompile condition, - to avoid compile it for production/release - -Or short way (equal to SerialDebug) (prefered if only one debug at time): - -```cpp -debugA("This is a any (always showed) - var %d", var); -debugV("This is a verbose - var %d", var); -debugD("This is a debug - var %d", var); -debugI("This is a information - var %d", var); -debugW("This is a warning - var %d", var); -debugE("This is a error - var %d", var); - -debugV("This is a println"); -``` - -Or if your project uses several Serial.print commands to generate a single debug message -for example: - -```cpp -Serial.print("a = "); -Serial.print(a); -Serial.print(" b = "); -Serial.print(b); -Serial.print(" c = "); -Serial.println(c); -``` - -can be use rdebug* macros: - -```cpp -rdebugV("a = "); -rdebugV(a); -rdebugV(" b = "); -rdebugV(b); -rdebugV(" c = "); -rdebugVln(c); -``` - -Note: in future, I suggest that you migrate this to a single debug command: - -```cpp -debugV(a = %d b = %d c = %d", a, b, c); -``` - -An example of use debug levels: (supposing the data is a lot of characters) - -```cpp -if (Debug.isActive(Debug.VERBOSE)) { // Debug message long - Debug.printf("routine: data received: %s\n", data.c_str()); // Note: if type is String need c_str() -} else if (Debug.isActive(Debug.DEBUG)) { // Debug message short - Debug.printf("routine: data received: %s ...\n", data.substring(0, 20).c_str()); // %.20s not working :-| -} -``` - -Starting at version 1.5.0, debug macros (debug* and rdebug*), automatically put the name of function that called the macro, -and core id (core id only for ESP32). - -So: - -```cpp -void foo() { - - uint8_t var = 1; - debugV("this is a debug - var %u", var); -} - -``` - - It will show in client (telnet or web app): - - (V p:^0000ms) (foo)(C1) this is a debug - var 1 - - Where: - - V -> verbose - p -> profiler time - (foo) -> this is a function name that calls the debug macro - (C1) -> It is running it Core 1 (only for ESP32) - -An example of use debug with serial enabled - - Useful to see messages if setup or - in cause the ESP8266/ESP32 is rebooting (client connection stop before received all messages) - Only for this purposes I suggest it - -```cpp -// Setup after Debug.begin - -Debug.setSerialEnabled(true); // All messages too send to serial too, and can be see in serial monitor -``` - -For reduce overheads RemoteDebug is disconnect the client (telnet or web app), if it not active. - - - Please press enter or any key if you need keep the connection - - The default is 5 minutes (You can change it in RemoteDebug.h) - - You can use mDNS to register each node with different name, it helps to connect without know the IP. - -Please not forget to use if clause with Debug.isActive (if not using debug macros) - - ---> This is very important to reduce overheads and work of debug levels - -Please see the samples, basic or advanced, to learn how to use - -In advanced sample, I used WifiManager library, ArduinoOTA and mDNS, please see it. - -## Releases - -### 3.0.5 - 2019-03-23 - - - Ajustment on debugA macro, thanks @jetpax and @cmidgley to add this issue. - -### 3.0.4 - 2019-03-19 - - - All public configurations (#defines) have moved to RemoteDebugCfg.h, to facilitate changes for anybody. - - Changed examples, with warnings on change any #define in project, - with workarounds if it not work. (thanks to @22MarioZ for added this issue) - -### 3.0.3 - 2019-03-18 - - - Adjustments if web socket is disabled - -### 3.0.2 - 2019-03-16 - - - Adjustments in examples, added one for debugger - -### 3.0.1 - 2019-03-13 - - - Adjustments in silente mode - - Commands from RemoteDebugApp now is treated - - Adjusts to RemoteDebugger support connection by web sockets - -### 3.0.0 - 2019-03-10 - - - If not disabled, add a web socket server to comunicate with RemoteDebugApp (HTML5 web app) - - The standard telnet still working, to debug with internet offline - - Ajustment on debugA macro, thanks @jetpax to add this issue - -### 2.1.2 - 2019-03-08 - - - Add empty rprint* macros, if debug is disabled - -### 2.1.1 - 2019-03-06 - - - Create option DEBUG_DISABLE_AUTO_FUNC - - Create macros to be used for code converter: rprint and rprintln - RemoteDebug now have an code converters to help migrate codes - -### 2.1.0 - 2019-03-04 - - - Create precompiler DEBUG_DISABLED to compile for production/release, - equal that have in SerialDebug - - Adjustments in examples - -### 2.0.1 - 2019-03-01 - - - Adjustments for the debugger: it still disable until dbg command, equal to SerialDebug - - The callback will to be called before print debug messages now - - And only if debugger is enabled in RemoteDebugger (command dbg) - - Changed handle debugger logic - -### 2.0.0 - 2019-02-28 - - - Added support to RemoteDebug addon library: the RemoteDebugger, an simple software debugger, based on SerialDebug - - New color system - -### 1.5.9 - 2019-02-18 - - - Bug -> sometimes the command is process twice - - Workaround -> check time - -### 1.5.8 - 2019-02-08 - - - New macros to compatibility with SerialDebug (can use RemoteDebug or SerialDebug) thanks to @phrxmd - -### 1.5.7 - 2018-11-03 - - - Fixed bug for MAX_TIME_INACTIVE, thanks to @achuchev to add this issue - -### 1.5.6 - 2018-10-19 - - - Adjustments based on pull request from @jeroenst (to allow serial output with telnet password and setPassword method) - -### 1.5.5 - 2018-10-19 - - - Serial output is now not allowed if telnet password is enabled - - Few adjustments - -### 1.5.4 - 2018-10-05 - - - Few adjustment in write logic - -### 1.5.3 - 2018-09-04 - - - Serial output adjustments (due bug in password logic) - -### 1.5.2 - - - Correct rdebug macro (thanks @stritti) - -### 1.5.1 - 2018-08-28 - - - New silent mode (command s) - -### 1.5.0 - 2018-08=26 - - - Auto function name and ESP32 core id for rdebug* macros - - begin method have a option for port number - - Few adjustments - - Added new rdebug?ln to put auto new line - -### 1.4.0 - 2018-08-18 - - - Simple text password request feature (disabled by default) - - Notes: - It is very simple feature, only text, no cryptography, - and the password is echoed in screen (I not discovery yet how disable it) - - telnet use advanced authentication (kerberos, etc.) - Such as now RemoteDebug is not for production (releases), - this kind of authentication will not be done now. - -### 1.3.1 - 2018-08-18 - - - Adjustments in precompiler macros - -### 1.3.0 - 2018-08-17 - - - Bug in write with latest ESP8266 SDK - - Port number can be modified in project Arduino (.ino file) - - Few adjustments as ESP32 includes - -### 1.2.2 - - - Adjustments, as avoid ESP32 include errors - - Telnet port of server can be modified by project - Just put it in your .ino, before the include: - -### 1.2.0 - - - Shortcuts and client buffering to avoid mysterious delay of ESP networking - -### 1.1.0 - - - Adjustments and now runs in Esp32 too. - -### 1.0.0 - - - Adjustments and improvements from Beta versions. - - New features: - - - Filter - - Colors - - Support to Windows telnet client - -### 0.9 - - - First Beta - -## Known issues - - - Sometimes (rarely) the connection over telnet becomes very slow. - Especially right after uploading firmware. - Reset command in telnet connection or turn off/on can be resolve it. - But I need find why it occurs - -## Thanks - - First thanks a lot for Igrr for bring to us the Arduino ESP8266 and to Espressif to Arduino ESP32 - - Thanks to Links2004 for a good web server socket, used for web app connection. - - For the logo: thanks to a freepik and pngtree sites for free icons that have in logo - - Resources: - - - Example of TelnetServer code in http://www.rudiswiki.de/wiki9/WiFiTelnetServer - - arduinoWebSockets library in https://github.com/Links2004/arduinoWebSockets - -## End of README - -Hit counter on this file, starting at 2019-03-03: -[![HitCount](http://hits.dwyl.io/JoaoLopesF/RemoteDebug.svg)](http://hits.dwyl.io/JoaoLopesF/RemoteDebug) diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Advanced/RemoteDebug_Advanced.ino b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Advanced/RemoteDebug_Advanced.ino deleted file mode 100644 index c96f1f7..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Advanced/RemoteDebug_Advanced.ino +++ /dev/null @@ -1,634 +0,0 @@ -//////// -// Library: Remote debug - debug over WiFi - for Esp8266 (NodeMCU) or ESP32 -// Author : Joao Lopes -// File : RemoteDebug_Advanced.ino -// Notes : -// -// Attention: This library is only for help development. Please not use this in production -// -// Sample to show how to use advanced features of Arduino and RemoteDebug library -// -// Example of use: -// -//#ifndef DEBUG_DISABLED -// if (Debug.isActive(Debug.)) { // <--- This is very important to reduce overheads and work of debug levels -// Debug.printf("bla bla bla: %d %s\n", number, str); -// Debug.println("bla bla bla"); -// } -//#endif -// -// Or short way (prefered if only one debug at time) -// -// debugA("This is a any (always showed) - var %d", var); -// -// debugV("This is a verbose - var %d", var); -// debugD("This is a debug - var %d", var); -// debugI("This is a information - var %d", var); -// debugW("This is a warning - var %d", var); -// debugE("This is a error - var %d", var); -// -// debugV("This is println"); -// -/////// - -////// Defines - -// Host name (please change it) - -#define HOST_NAME "remotedebug" - -// Board especific libraries - -#if defined ESP8266 || defined ESP32 - -// Use mDNS ? (comment this do disable it) - -#define USE_MDNS true - -// Arduino OTA (uncomment this to enable) - -//#define USE_ARDUINO_OTA true - -#else - -// RemoteDebug library is now only to Espressif boards, -// as ESP32 and ESP82266, -// If need for another WiFi boards, -// please add an issue about this -// and we will see if it is possible made the port for your board. -// access: https://github.com/JoaoLopesF/RemoteDebug/issues - -#error "The board must be ESP8266 or ESP32" - -#endif // ESP - -// Web server (uncomment this to need this) - -//#define WEB_SERVER_ENABLED true - -////// Includes - -#if defined ESP8266 - -// Includes of ESP8266 - -#include - -#ifdef USE_MDNS -#include -#include -#endif - -#ifdef WEB_SERVER_ENABLED -#include -#endif - -#elif defined ESP32 - -// Includes of ESP32 - -#include - -#ifdef USE_MDNS -#include -#include "ESPmDNS.h" -#endif - -#ifdef WEB_SERVER_ENABLED -#include -#endif - -#else - -#error "For now, RemoteDebug support only boards Espressif, as ESP8266 and ESP32" - -#endif // ESP - -// Arduino OTA - -#ifdef USE_ARDUINO_OTA -#include -#endif - -// HTTP Web server - -#ifdef WEB_SERVER_ENABLED - -#if defined ESP8266 - -ESP8266WebServer HTTPServer(80); - -#elif defined ESP32 - -WebServer HTTPServer(80); - -#endif - -#endif // WEB_SERVER_ENABLED - -///// Remote debug over WiFi - not recommended for production/release, only for development - -// Options for RemoteDebug of this project - -// Attention: read this, before you change any option -// -// If yot changed it and not works, the compiler is using catching old compiled files -// To workaround this: -// - If have a clean project option in IDE (as Eclipse/Platformio), do it -// - or force compiler to compiler all (changing any configuration of board) -// - or to this change globally in RemoteDebugCfg.h (on library directory) -// - And upload again -// -// thanks to @22MarioZ for added this issue - -// Disable all debug ? -// Important to compile for prodution/release -// Disable all debug ? Good to release builds (production) -// as nothing of RemoteDebug is compiled, zero overhead :-) -// Uncomment the line below, to do it: -//#define DEBUG_DISABLED true - -// Disable te auto function feature of RemoteDebug -// Good if your code already have func name on debug messages -// Uncomment the line below, to do it: -//#define DEBUG_DISABLE_AUTO_FUNC true - -// Disable Websocket? This is used with RemoteDebugApp connection -// Uncomment the line below, to do it: -//#define WEBSOCKET_DISABLED true - -#ifndef WEBSOCKET_DISABLED // Only if Web socket enabled (RemoteDebugApp) -// If enabled, you can change the port here (8232 is default) -// Uncomment the line below, to do it: -//#define WEBSOCKET_PORT 8232 - -// Internally, the RemoteDebug uses a local copy of the arduinoWebSockets library (https://github.com/Links2004/arduinoWebSockets) -// Due it not in Arduino Library Manager -// If your project already use this library, -// Uncomment the line below, to do it: -//#define USE_LIB_WEBSOCKET true -#endif - -// Include libraries - -#include "RemoteDebug.h" //https://github.com/JoaoLopesF/RemoteDebug - -#ifndef DEBUG_DISABLED // Only if debug is not disabled (for production/release) - -// Instance of RemoteDebug - -RemoteDebug Debug; - -#endif - -// WiFi credentials -// Note: if commented, is used the smartConfig -// That allow to it in mobile app -// See more details in http://www.iotsharing.com/2017/05/how-to-use-smartconfig-on-esp32.html - -//#define WIFI_SSID "..." // your network SSID (name) -//#define WIFI_PASS "..." // your network key - -/////// Variables - -// Time - -uint32_t mTimeToSec = 0; -uint32_t mTimeSeconds = 0; - -////// Setup - -void setup() { - - // Initialize the Serial (use only in setup codes) - - Serial.begin(230400); - - // Buildin led - -#ifdef LED_BUILTIN - pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(LED_BUILTIN, LOW); -#endif - - // Connect WiFi - - connectWiFi(); - - // Host name of WiFi - -#ifdef ESP8266 - WiFi.hostname(HOST_NAME); -#endif - -#ifdef USE_ARDUINO_OTA - // Update over air (OTA) - - initializeOTA(); -#endif - - // Register host name in mDNS - -#if defined USE_MDNS && defined HOST_NAME - - if (MDNS.begin(HOST_NAME)) { - Serial.print("* MDNS responder started. Hostname -> "); - Serial.println(HOST_NAME); - } - - // Register the services - -#ifdef WEB_SERVER_ENABLED - MDNS.addService("http", "tcp", 80); // Web server -#endif - -#ifndef DEBUG_DISABLED - MDNS.addService("telnet", "tcp", 23); // Telnet server of RemoteDebug, register as telnet -#endif - -#endif // MDNS - - // HTTP web server - -#ifdef WEB_SERVER_ENABLED - HTTPServer.on("/", handleRoot); - - HTTPServer.onNotFound(handleNotFound); - - HTTPServer.begin(); - - Serial.println("* HTTP server started"); -#endif - -#ifndef DEBUG_DISABLED // Only for development - - // Initialize RemoteDebug - - Debug.begin(HOST_NAME); // Initialize the WiFi server - - //Debug.setPassword("r3m0t0."); // Password for WiFi client connection (telnet or webapp) ? - - Debug.setResetCmdEnabled(true); // Enable the reset command - - Debug.showProfiler(true); // Profiler (Good to measure times, to optimize codes) - - Debug.showColors(true); // Colors - - // Debug.setSerialEnabled(true); // if you wants serial echo - only recommended if ESP is plugged in USB - - // Project commands - - String helpCmd = "bench1 - Benchmark 1\n"; - helpCmd.concat("bench2 - Benchmark 2"); - - Debug.setHelpProjectsCmds(helpCmd); - Debug.setCallBackProjectCmds(&processCmdRemoteDebug); - - // End of setup - show IP - - Serial.println("* Arduino RemoteDebug Library"); - Serial.println("*"); - Serial.print("* WiFI connected. IP address: "); - Serial.println(WiFi.localIP()); - Serial.println("*"); - Serial.println("* Please use the telnet client (telnet for Mac/Unix or putty and others for Windows)"); - Serial.println("* or the RemoteDebugApp (in browser: http://joaolopesf.net/remotedebugapp)"); - Serial.println("*"); - Serial.println("* This sample will send messages of debug in all levels."); - Serial.println("*"); - Serial.println("* Please try change debug level in client (telnet or web app), to see how it works"); - Serial.println("*"); - -#endif - -} - -void loop() { - -#ifndef DEBUG_DISABLED - // Time of begin of this loop - uint32_t timeBeginLoop = millis(); -#endif - - - // Each second - - if (millis() >= mTimeToSec) { - - // Time - - mTimeToSec = millis() + 1000; - - mTimeSeconds++; - - // Blink the led - -#ifdef LED_BUILTIN - digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); -#endif - - // Debug the time (verbose level) - - debugV("* Time: %u seconds (VERBOSE)", mTimeSeconds); - - if (mTimeSeconds % 5 == 0) { // Each 5 seconds - - // Debug levels - - debugV("* This is a message of debug level VERBOSE"); - debugD("* This is a message of debug level DEBUG"); - debugI("* This is a message of debug level INFO"); - debugW("* This is a message of debug level WARNING"); - debugE("* This is a message of debug level ERROR"); - - - // RemoteDebug isActive? Use this RemoteDebug sintaxe if you need process anything only for debug - // It is good to avoid overheads (this is only use that is suggest to use isActive) - // Note this need be surrounded by DEBUG_DISABLED precompiler condition to not compile for production/release - -#ifndef DEBUG_DISABLED - - if (Debug.isActive(Debug.VERBOSE)) { - - debugV("Calling a foo function"); - debugV("At time of %d sec.\n", mTimeSeconds); - - // Call a function - - foo(); - } -#endif - - } - } - - ////// Services on Wifi - -#ifdef USE_ARDUINO_OTA - // Update over air (OTA) - - ArduinoOTA.handle(); -#endif - -#ifdef WEB_SERVER_ENABLED - // Web server - - HTTPServer.handleClient(); -#endif - -#ifndef DEBUG_DISABLED - // RemoteDebug handle (for WiFi connections) - - Debug.handle(); -#endif - - // Give a time for ESP - - yield(); - -#ifndef DEBUG_DISABLED - // Show a debug - warning if time of these loop is over 50 (info) or 100 ms (warning) - - uint32_t time = (millis() - timeBeginLoop); - - if (time > 100) { - debugI("* Time elapsed for the loop: %u ms.", time); - } else if (time > 200) { - debugW("* Time elapsed for the loop: %u ms.", time); - } -#endif - -} - - -// Function example to show a new auto function name of debug* macros - -void foo() { - - uint8_t var = 1; - - debugV("this is a debug - var %u", var); - debugV("This is a println"); -} - -#ifndef DEBUG_DISABLED - -// Process commands from RemoteDebug - -void processCmdRemoteDebug() { - - String lastCmd = Debug.getLastCommand(); - - if (lastCmd == "bench1") { - - // Benchmark 1 - Printf - - debugA("* Benchmark 1 - one Printf"); - - - uint32_t timeBegin = millis(); - uint8_t times = 50; - - for (uint8_t i = 1; i <= times; i++) { - debugA("%u - 1234567890 - AAAA", i); - - } - - debugA("* Time elapsed for %u printf: %ld ms.\n", times, - (millis() - timeBegin)); - - } else if (lastCmd == "bench2") { - - // Benchmark 2 - Print/println - - debugA("* Benchmark 2 - Print/Println"); - - uint32_t timeBegin = millis(); - uint8_t times = 50; - - for (uint8_t i = 1; i <= times; i++) { - if (Debug.isActive(Debug.ANY)) { - Debug.print(i); - Debug.print(" - 1234567890"); - Debug.println(" - AAAA"); - } - } - - debugA("* Time elapsed for %u printf: %ld ms.\n", times, - (millis() - timeBegin)); - } -} -#endif - -////// WiFi - -void connectWiFi() { - - ////// Connect WiFi - -#ifdef EM_DEPURACAO - Serial.println("*** connectWiFi: begin conection ..."); -#endif - -#ifdef ESP32 - // ESP32 // TODO: is really necessary ? - WiFi.enableSTA(true); - delay(100); -#endif - - // Connect with SSID and password stored - -#ifndef WIFI_SSID - WiFi.begin(); -#else - WiFi.begin(WIFI_SSID, WIFI_PASS); -#endif - - // Wait connection - - uint32_t timeout = millis() + 20000; // Time out - - while (WiFi.status() != WL_CONNECTED && millis() < timeout) { - delay(250); - Serial.print("."); - } - - // Not connected yet? - - if (WiFi.status() != WL_CONNECTED) { - -#ifndef WIFI_SSID - // SmartConfig - - WiFi.beginSmartConfig(); - - // Wait for SmartConfig packet from mobile - - Serial.println("connectWiFi: Waiting for SmartConfig."); - - while (!WiFi.smartConfigDone()) { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println("connectWiFi: SmartConfig received."); - - // Wait for WiFi to connect to AP - - Serial.println("connectWiFi: Waiting for WiFi"); - - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } -#else - Serial.println("Not possible connect to WiFi, rebooting"); - ESP.restart(); -#endif - } - - // End - - Serial.println(""); - Serial.print("connectWiFi: connect a "); - Serial.println(WiFi.SSID()); - Serial.print("IP: "); - Serial.println(WiFi.localIP().toString()); - -} - -#ifdef USE_ARDUINO_OTA - -// Initialize o Arduino OTA - -void initializeOTA() { - - // TODO: option to authentication (password) - -#if defined ESP8266 - - ArduinoOTA.onStart([]() { - Serial.println("* OTA: Start"); - }); - ArduinoOTA.onEnd([]() { - Serial.println("\n*OTA: End"); - }); - ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("*OTA: Progress: %u%%\r", (progress / (total / 100))); - }); - ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("*OTA: Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - -#elif defined ESP32 - - // ArduinoOTA - - ArduinoOTA.onStart([]() { - String type; - if (ArduinoOTA.getCommand() == U_FLASH) - type = "sketch"; - else // U_SPIFFS - type = "filesystem"; - Serial.println("Start updating " + type); - }).onEnd([]() { - Serial.println("\nEnd"); - }).onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }).onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - -#endif - - // Begin - - ArduinoOTA.begin(); - -} - -#endif - -#ifdef WEB_SERVER_ENABLED - -/////////// Handles - - void handleRoot() { - - // Root web page - - HTTPServer.send(200, "text/plain", "hello from esp - RemoteDebug Sample!"); - } - - void handleNotFound(){ - - // Page not Found - - String message = "File Not Found\n\n"; - message.concat("URI: "); - message.concat(HTTPServer.uri()); - message.concat("\nMethod: "); - message.concat((HTTPServer.method() == HTTP_GET)?"GET":"POST"); - message.concat("\nArguments: "); - message.concat(HTTPServer.args()); - message.concat("\n"); - for (uint8_t i=0; i)) { // <--- This is very important to reduce overheads and work of debug levels -// Debug.printf("bla bla bla: %d %s\n", number, str); -// Debug.println("bla bla bla"); -// } -//#endif -// -// Or short way (prefered if only one debug at time) -// -// debugA("This is a any (always showed) - var %d", var); -// -// debugV("This is a verbose - var %d", var); -// debugD("This is a debug - var %d", var); -// debugI("This is a information - var %d", var); -// debugW("This is a warning - var %d", var); -// debugE("This is a error - var %d", var); -// -// debugV("This is println"); -// -// -/////// - -////// Defines - -// Host name (please change it) - -#define HOST_NAME "remotedebug" - -// Board especific libraries - -#if defined ESP8266 || defined ESP32 - -// Use mDNS ? (comment this do disable it) - -#define USE_MDNS true - -// Arduino OTA (uncomment this to enable) - -//#define USE_ARDUINO_OTA true - -#else - -// RemoteDebug library is now only to Espressif boards, -// as ESP32 and ESP82266, -// If need for another WiFi boards, -// please add an issue about this -// and we will see if it is possible made the port for your board. -// access: https://github.com/JoaoLopesF/RemoteDebug/issues - -#error "The board must be ESP8266 or ESP32" - -#endif // ESP - -//////// Libraries - -#if defined ESP8266 - -// Includes of ESP8266 - -#include - -#ifdef USE_MDNS -#include -#include -#endif - -#elif defined ESP32 - -// Includes of ESP32 - -#include - -#ifdef USE_MDNS -#include -#include "ESPmDNS.h" -#endif - -#endif // ESP - -// Remote debug over WiFi - not recommended for production, only for development - -#include "RemoteDebug.h" //https://github.com/JoaoLopesF/RemoteDebug - -RemoteDebug Debug; - -// SSID and password - -const char* ssid = "........"; -const char* password = "........"; - -// Time - -uint32_t mLastTime = 0; -uint32_t mTimeSeconds = 0; - -////// Setup - -void setup() { - - // Initialize the Serial (use only in setup codes) - - Serial.begin(230400); - - // Buildin led of ESP - - pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(LED_BUILTIN, LOW); - - // Debug - - Serial.println("**** Setup: initializing ..."); - - // WiFi connection - - WiFi.begin(ssid, password); - Serial.println(""); - - // Wait for connection - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.print("Connected to "); - Serial.println(ssid); - Serial.print("IP address: "); - Serial.println(WiFi.localIP()); - - // Register host name in WiFi and mDNS - - String hostNameWifi = HOST_NAME; - hostNameWifi.concat(".local"); - -#ifdef ESP8266 // Only for it - WiFi.hostname(hostNameWifi); -#endif - -#ifdef USE_MDNS // Use the MDNS ? - - if (MDNS.begin(HOST_NAME)) { - Serial.print("* MDNS responder started. Hostname -> "); - Serial.println(HOST_NAME); - } - - MDNS.addService("telnet", "tcp", 23); - -#endif - - // Initialize RemoteDebug - - Debug.begin(HOST_NAME); // Initialize the WiFi server - - Debug.setResetCmdEnabled(true); // Enable the reset command - - Debug.showProfiler(true); // Profiler (Good to measure times, to optimize codes) - Debug.showColors(true); // Colors - - // End off setup - - Serial.println("* Arduino RemoteDebug Library"); - Serial.println("*"); - Serial.print("* WiFI connected. IP address: "); - Serial.println(WiFi.localIP()); - Serial.println("*"); - Serial.println("* Please use the telnet client (telnet for Mac/Unix or putty and others for Windows)"); - Serial.println("* or the RemoteDebugApp (in browser: http://joaolopesf.net/remotedebugapp)"); - Serial.println("*"); - Serial.println("* This sample will send messages of debug in all levels."); - Serial.println("*"); - Serial.println("* Please try change debug level in client (telnet or web app), to see how it works"); - Serial.println("*"); - -} - -void loop() -{ - // Each second - - if ((millis() - mLastTime) >= 1000) { - - // Time - - mLastTime = millis(); - - mTimeSeconds++; - - // Blink the led - - digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); - - // Debug the time (verbose level) - - debugV("* Time: %u seconds (VERBOSE)", mTimeSeconds); - - if (mTimeSeconds % 5 == 0) { // Each 5 seconds - - // Debug levels - - debugV("* This is a message of debug level VERBOSE"); - debugD("* This is a message of debug level DEBUG"); - debugI("* This is a message of debug level INFO"); - debugW("* This is a message of debug level WARNING"); - debugE("* This is a message of debug level ERROR"); - - // Call a function - - foo(); - } - } - - // RemoteDebug handle - - Debug.handle(); - - // Give a time for ESP - - yield(); - -} - -// Function example to show a new auto function name of debug* macros - -void foo() { - - uint8_t var = 1; - - debugV("this is a debug - var %u", var); - debugV("This is a println"); -} - -/////////// End diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Debugger/RemoteDebug_Debugger.ino b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Debugger/RemoteDebug_Debugger.ino deleted file mode 100644 index 88b52a9..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/examples/RemoteDebug_Debugger/RemoteDebug_Debugger.ino +++ /dev/null @@ -1,893 +0,0 @@ -//////// -// Library: Remote debug - debug over WiFi - for Esp8266 (NodeMCU) or ESP32 -// Author : Joao Lopes -// File : RemoteDebugger.ino -// Notes : -// -// Attention: This library is only for help development. Please not use this in production -// -// This example use the RemoteDebugger library: ao addon to Remotedebug with an simple software debug, based on SerialDebug library -// Attention: this library must be installed too -// Please open github repo to informations: //https://github.com/JoaoLopesF/RemoteDebugger -// -// Example of use: -// -//#ifndef DEBUG_DISABLED -// if (Debug.isActive(Debug.)) { // <--- This is very important to reduce overheads and work of debug levels -// Debug.printf("bla bla bla: %d %s\n", number, str); -// Debug.println("bla bla bla"); -// } -//#endif -// -// Or short way (prefered if only one debug at time) -// -// debugA("This is a any (always showed) - var %d", var); -// -// debugV("This is a verbose - var %d", var); -// debugD("This is a debug - var %d", var); -// debugI("This is a information - var %d", var); -// debugW("This is a warning - var %d", var); -// debugE("This is a error - var %d", var); -// -// debugV("This is println"); -// -/////// - -////// Defines - -// Host name (please change it) - -#define HOST_NAME "remotedebug" - -// Board especific libraries - -#if defined ESP8266 || defined ESP32 - -// Use mDNS ? (comment this do disable it) - -#define USE_MDNS true - -// Arduino OTA (uncomment this to enable) - -//#define USE_ARDUINO_OTA true - -#else - -// RemoteDebug library is now only to Espressif boards, -// as ESP32 and ESP82266, -// If need for another WiFi boards, -// please add an issue about this -// and we will see if it is possible made the port for your board. -// access: https://github.com/JoaoLopesF/RemoteDebug/issues - -#error "The board must be ESP8266 or ESP32" - -#endif // ESP - -// Web server (uncomment this to need this) - -//#define WEB_SERVER_ENABLED true - -////// Includes - -#if defined ESP8266 - -// Includes of ESP8266 - -#include - -#ifdef USE_MDNS -#include -#include -#endif - -#ifdef WEB_SERVER_ENABLED -#include -#endif - -#elif defined ESP32 - -// Includes of ESP32 - -#include - -#ifdef USE_MDNS -#include -#include "ESPmDNS.h" -#endif - -#ifdef WEB_SERVER_ENABLED -#include -#endif - -#else - -#error "Now RemoteDebug support only boards Espressif, as ESP8266 and ESP32" - -#endif // ESP - -// Arduino OTA - -#ifdef USE_ARDUINO_OTA -#include -#endif - -// HTTP Web server - -#ifdef WEB_SERVER_ENABLED - -#if defined ESP8266 - -ESP8266WebServer HTTPServer(80); - -#elif defined ESP32 - -WebServer HTTPServer(80); - -#endif - -#endif // WEB_SERVER_ENABLED - -// Remote debug over WiFi - not recommended for production/release, only for development - -// Options for RemoteDebug of this project - -// Attention: read this, before you change any option -// -// If yot changed it and not works, the compiler is using catching old compiled files -// To workaround this: -// - If have a clean project option (as Eclipse/Platformio), do it -// - or force compiler to compiler all (changing any configuration of board) -// - or to this change globally in RemoteDebugCfg.h (on library directory) -// - And upload again -// -// thanks to @22MarioZ for added this issue - -// Disable all debug ? -// Important to compile for prodution/release -// Disable all debug ? Good to release builds (production) -// as nothing of RemoteDebug is compiled, zero overhead :-) -// Uncomment the line below, to do it: -//#define DEBUG_DISABLED true - -// Disable te auto function feature of RemoteDebug -// Good if your code already have func name on debug messages -// Uncomment the line below, to do it: -//#define DEBUG_DISABLE_AUTO_FUNC true - -// Disable Websocket? This is used with RemoteDebugApp connection -// Uncomment the line below, to do it: -//#define WEBSOCKET_DISABLED true - -#ifndef WEBSOCKET_DISABLED // Only if Web socket enabled (RemoteDebugApp) -// If enabled, you can change the port here (8232 is default) -// Uncomment the line below, to do it: -//#define WEBSOCKET_PORT 8232 - -// Internally, the RemoteDebug uses a local copy of the arduinoWebSockets library (https://github.com/Links2004/arduinoWebSockets) -// Due it not in Arduino Library Manager -// If your project already use this library, -// Uncomment the line below, to do it: -//#define USE_LIB_WEBSOCKET true -#endif - - -#include "RemoteDebug.h" //https://github.com/JoaoLopesF/RemoteDebug - -#ifndef DEBUG_DISABLED // Only if debug is not disabled (for production/release) - -// RemoteDebug addon library: RemoteDebugger, an Simple software debugger - based on SerialDebug Library - -#include "RemoteDebugger.h" //https://github.com/JoaoLopesF/RemoteDebugger - -// Instance of RemoteDebug - -RemoteDebug Debug; - -#endif - -// WiFi credentials -// Note: if commented, is used the smartConfig -// That allow to it in mobile app -// See more details in http://www.iotsharing.com/2017/05/how-to-use-smartconfig-on-esp32.html - -//#define WIFI_SSID "..." // your network SSID (name) -//#define WIFI_PASS "..." // your network key - -/////// Variables - -// Time - -uint32_t mTimeToSec = 0; - -uint8_t mRunSeconds = 0; -uint8_t mRunMinutes = 0; -uint8_t mRunHours = 0; - -// Globals for example of debugger - -boolean mBoolean = false; -char mChar = 'X'; -byte mByte = 'Y'; -int mInt = 1; -unsigned int mUInt = 2; -long mLong = 3; -unsigned long mULong = 4; -float mFloat = 5.0f; -double mDouble = 6.0; - -String mString = "This is a string"; -String mStringLarge = "This is a large stringggggggggggggggggggggggggggggggggggggggggggggg"; - -char mCharArray[] = "This is a char array"; -char mCharArrayLarge[] = "This is a large char arrayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; - -int mIntArray[5] = {1 ,2 ,3, 4, 5}; - -//const char mCharArrayConst[] = "This is const"; - -////// Setup - -void setup() { - - // Initialize the Serial (use only in setup codes) - - Serial.begin(230400); - - // Buildin led - -#ifdef LED_BUILTIN - pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(LED_BUILTIN, LOW); -#endif - - // Connect WiFi - - connectWiFi(); - - // Host name of WiFi - -#ifdef ESP8266 - WiFi.hostname(HOST_NAME); -#endif - -#ifdef USE_ARDUINO_OTA - // Update over air (OTA) - - initializeOTA(); -#endif - - // Register host name in mDNS - -#if defined USE_MDNS && defined HOST_NAME - - if (MDNS.begin(HOST_NAME)) { - Serial.print("* MDNS responder started. Hostname -> "); - Serial.println(HOST_NAME); - } - - // Register the services - -#ifdef WEB_SERVER_ENABLED - MDNS.addService("http", "tcp", 80); // Web server -#endif - -#ifndef DEBUG_DISABLED - MDNS.addService("telnet", "tcp", 23);// Telnet server RemoteDebug -#endif - -#endif // MDNS - - // HTTP web server - -#ifdef WEB_SERVER_ENABLED - HTTPServer.on("/", handleRoot); - - HTTPServer.onNotFound(handleNotFound); - - HTTPServer.begin(); - - Serial.println("* HTTP server started"); -#endif - -#ifndef DEBUG_DISABLED // Only for development - - // Initialize RemoteDebug - - Debug.begin(HOST_NAME); // Initialize the WiFi server - - //Debug.setPassword("r3m0t0."); // Password on telnet connection ? - - Debug.setResetCmdEnabled(true); // Enable the reset command - - Debug.showProfiler(true); // Profiler (Good to measure times, to optimize codes) - - Debug.showColors(true); // Colors - - // Debug.setSerialEnabled(true); // if you wants serial echo - only recommended if ESP is plugged in USB - - // Project commands - - String helpCmd = "bench1 - Benchmark 1\n"; - helpCmd.concat("bench2 - Benchmark 2"); - - Debug.setHelpProjectsCmds(helpCmd); - Debug.setCallBackProjectCmds(&processCmdRemoteDebug); - - // Init the simple software debugger, based on SerialDebug library - -#ifndef DEBUG_DISABLE_DEBUGGER - - Debug.initDebugger(debugGetDebuggerEnabled, debugHandleDebugger, debugGetHelpDebugger, debugProcessCmdDebugger); // Set the callbacks - - debugInitDebugger(&Debug); // Init the debugger - - // Add Functions and global variables to RemoteDebuggger - - // Notes: descriptions is optionals - - // Add functions that can called from SerialDebug - - if (debugAddFunctionVoid("benchInt", &benchInt) >= 0) { - debugSetLastFunctionDescription("To run a benchmark of integers"); - } - if (debugAddFunctionVoid("benchFloat", &benchFloat) >= 0) { - debugSetLastFunctionDescription("To run a benchmark of float"); - } - if (debugAddFunctionVoid("benchGpio", &benchGpio) >= 0) { - debugSetLastFunctionDescription("To run a benchmark of Gpio operations"); - } - if (debugAddFunctionVoid("benchAll", &benchAll) >= 0) { - debugSetLastFunctionDescription("To run all benchmarks"); - } - - if (debugAddFunctionStr("funcArgStr", &funcArgStr) >= 0) { - debugSetLastFunctionDescription("To run with String arg"); - } - if (debugAddFunctionChar("funcArgChar", &funcArgChar) >= 0) { - debugSetLastFunctionDescription("To run with Character arg"); - } - if (debugAddFunctionInt("funcArgInt", &funcArgInt) >= 0) { - debugSetLastFunctionDescription("To run with Integer arg"); - } - - // Add global variables that can showed/changed from SerialDebug - // Note: Only global, if pass local for SerialDebug, can be dangerous - - if (debugAddGlobalUInt8_t("mRunSeconds", &mRunSeconds) >= 0) { - debugSetLastGlobalDescription("Seconds of run time"); - } - if (debugAddGlobalUInt8_t("mRunMinutes", &mRunMinutes) >= 0) { - debugSetLastGlobalDescription("Minutes of run time"); - } - if (debugAddGlobalUInt8_t("mRunHours", &mRunHours) >= 0) { - debugSetLastGlobalDescription("Hours of run time"); - } - - // Note: easy way, no descriptions .... - - debugAddGlobalBoolean("mBoolean", &mBoolean); - debugAddGlobalChar("mChar", &mChar); - debugAddGlobalByte("mByte", &mByte); - debugAddGlobalInt("mInt", &mInt); - debugAddGlobalUInt("mUInt", &mUInt); - debugAddGlobalLong("mLong", &mLong); - debugAddGlobalULong("mULong", &mULong); - debugAddGlobalFloat("mFloat", &mFloat); - debugAddGlobalDouble("mDouble", &mDouble); - - debugAddGlobalString("mString", &mString); - - // Note: For char arrays, not use the '&' - - debugAddGlobalCharArray("mCharArray", mCharArray); - - // Note, here inform to show only 20 characteres of this string or char array - - debugAddGlobalString("mStringLarge", &mStringLarge, 20); - - debugAddGlobalCharArray("mCharArrayLarge", - mCharArrayLarge, 20); - - // For arrays, need add for each item (not use loop for it, due the name can not by a variable) - // Notes: Is good added arrays in last order, to help see another variables - // In next versions, we can have a helper to do it in one command - - debugAddGlobalInt("mIntArray[0]", &mIntArray[0]); - debugAddGlobalInt("mIntArray[1]", &mIntArray[1]); - debugAddGlobalInt("mIntArray[2]", &mIntArray[2]); - debugAddGlobalInt("mIntArray[3]", &mIntArray[3]); - debugAddGlobalInt("mIntArray[4]", &mIntArray[4]); - - // Add watches for some global variables - // Note: watches can be added/changed in serial monitor too - - // Watch -> mBoolean when changed (put 0 on value) - - debugAddWatchBoolean("mBoolean", DEBUG_WATCH_CHANGED, 0); - - // Watch -> mRunSeconds == 10 - - debugAddWatchUInt8_t("mRunSeconds", DEBUG_WATCH_EQUAL, 10); - - // Watch -> mRunMinutes > 3 - - debugAddWatchUInt8_t("mRunMinutes", DEBUG_WATCH_GREAT, 3); - - // Watch -> mRunMinutes == mRunSeconds (just for test) - - debugAddWatchCross("mRunMinutes", DEBUG_WATCH_EQUAL, "mRunSeconds"); - -#endif - - // End of setup - show IP - - Serial.println("* Arduino RemoteDebug Library"); - Serial.println("*"); - Serial.print("* WiFI connected. IP address: "); - Serial.println(WiFi.localIP()); - Serial.println("*"); - Serial.println("* Please use the telnet client (telnet for Mac/Unix or putty and others for Windows)"); - Serial.println("* or the RemoteDebugApp (in browser: http://joaolopesf.net/remotedebugapp)"); - Serial.println("*"); - Serial.println("* This sample will send messages of debug in all levels."); - Serial.println("*"); - Serial.println("* Please try change debug level in client (telnet or web app), to see how it works"); - Serial.println("*"); - -#endif - -} - -void loop() { - -#ifndef DEBUG_DISABLED - // Time of begin of this loop - uint32_t timeBeginLoop = millis(); -#endif - - // Each second - - if (millis() >= mTimeToSec) { - - // Time - - mTimeToSec = millis() + 1000; - - // Count run time (just a test - for real suggest the TimeLib and NTP, if board have WiFi) - - mRunSeconds++; - - if (mRunSeconds == 60) { - mRunMinutes++; - mRunSeconds = 0; - } - if (mRunMinutes == 60) { - mRunHours++; - mRunMinutes = 0; - } - if (mRunHours == 24) { - mRunHours = 0; - } - - // Blink the led - -#ifdef LED_BUILTIN - digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); -#endif - - // Debug the time (verbose level) - - debugV("* Time: %u seconds (VERBOSE)", mRunSeconds); - - if (mRunSeconds % 5 == 0) { // Each 5 seconds - - // Debug levels - - debugV("* This is a message of debug level VERBOSE"); - debugD("* This is a message of debug level DEBUG"); - debugI("* This is a message of debug level INFO"); - debugW("* This is a message of debug level WARNING"); - debugE("* This is a message of debug level ERROR"); - - - // RemoteDebug isActive? Use this RemoteDebug sintaxe if you need process anything only for debug - // It is good to avoid overheads (this is only use that is suggest to use isActive) - // Note this need be surrounded by DEBUG_DISABLED precompiler condition to not compile for production/release - -#ifndef DEBUG_DISABLED - - if (Debug.isActive(Debug.VERBOSE)) { - - Debug.println("Calling a foo function"); - Debug.printf("At time of %d sec.\n", mRunSeconds); - - // Call a function - - foo(); - } -#endif - - } - } - - ////// Services on Wifi - -#ifdef USE_ARDUINO_OTA - // Update over air (OTA) - - ArduinoOTA.handle(); -#endif - -#ifdef WEB_SERVER_ENABLED - // Web server - - HTTPServer.handleClient(); -#endif - -#ifndef DEBUG_DISABLED - // Remote debug over telnet - - Debug.handle(); -#endif - - // Give a time for ESP - - yield(); - -#ifndef DEBUG_DISABLED - // Show a debug - warning if time of these loop is over 50 (info) or 100 ms (warning) - - uint32_t time = (millis() - timeBeginLoop); - - if (time > 100) { - debugI("* Time elapsed for the loop: %u ms.", time); - } else if (time > 200) { - debugW("* Time elapsed for the loop: %u ms.", time); - } -#endif - -} - - -// Function example to show a new auto function name of debug* macros - -void foo() { - - uint8_t var = 1; - - debugV("this is a debug - var %u", var); - debugV("This is a println"); -} - -#ifndef DEBUG_DISABLED - -// Process commands from RemoteDebug - -void processCmdRemoteDebug() { - - String lastCmd = Debug.getLastCommand(); - - if (lastCmd == "bench1") { - - // Benchmark 1 - Printf - - debugA("* Benchmark 1 - one Printf"); - - - uint32_t timeBegin = millis(); - uint8_t times = 50; - - for (uint8_t i = 1; i <= times; i++) { - debugA("%u - 1234567890 - AAAA", i); - - } - - debugA("* Time elapsed for %u printf: %ld ms.\n", times, - (millis() - timeBegin)); - - } else if (lastCmd == "bench2") { - - // Benchmark 2 - Print/println - - debugA("* Benchmark 2 - Print/Println"); - - uint32_t timeBegin = millis(); - uint8_t times = 50; - - for (uint8_t i = 1; i <= times; i++) { - if (Debug.isActive(Debug.ANY)) { - Debug.print(i); - Debug.print(" - 1234567890"); - Debug.println(" - AAAA"); - } - } - - debugA("* Time elapsed for %u printf: %ld ms.\n", times, - (millis() - timeBegin)); - } -} -#endif - -////// Benchmarks - simple - -// Note: how it as called by SerialDebug, must be return type void and no args -// Note: Flash F variables is not used during the tests, due it is slow to use in loops - -#define BENCHMARK_EXECS 10000 - -// Simple benckmark of integers - -void benchInt() { - - int test = 0; - - for (int i = 0; i < BENCHMARK_EXECS; i++) { - - // Some integer operations - - test++; - test += 2; - test -= 2; - test *= 2; - test /= 2; - } - - // Note: Debug always is used here - - debugA("*** Benchmark of integers. %u exec.", BENCHMARK_EXECS); - -} - -// Simple benckmark of floats - -void benchFloat() { - - float test = 0; - - for (int i = 0; i < BENCHMARK_EXECS; i++) { - - // Some float operations - - test++; - test += 2; - test -= 2; - test *= 2; - test /= 2; - } - - // Note: Debug always is used here - - debugA("*** Benchmark of floats, %u exec.", BENCHMARK_EXECS); - -} - -// Simple benckmark of GPIO - -void benchGpio() { - -// const int execs = (BENCHMARK_EXECS / 10); // Reduce it - const int execs = BENCHMARK_EXECS; - - for (int i = 0; i < execs; i++) { - - // Some GPIO operations - - digitalWrite(LED_BUILTIN, HIGH); - digitalRead(LED_BUILTIN); - digitalWrite(LED_BUILTIN, LOW); - - analogRead(A0); - analogRead(A0); - analogRead(A0); - - } - - // Note: Debug always is used here - - debugA("*** Benchmark of GPIO. %u exec.", execs); - -} - -// Run all benchmarks - -void benchAll() { - - benchInt(); - benchFloat(); - benchGpio(); - - // Note: Debug always is used here - - debugA("*** All Benchmark done."); - -} - -// Example functions with argument (only 1) to call from serial monitor -// Note others types is not yet available in this version of SerialDebug - -void funcArgStr (String str) { - - debugA("*** called with arg.: %s", str.c_str()); -} -void funcArgChar (char character) { - - debugA("*** called with arg.: %c", character); -} -void funcArgInt (int number) { - - debugA("*** called with arg.: %d", number); -} - -////// WiFi - -void connectWiFi() { - - ////// Connect WiFi - -#ifdef EM_DEPURACAO - Serial.println("*** connectWiFi: begin conection ..."); -#endif - -#ifdef ESP32 - // ESP32 // TODO: is really necessary ? - WiFi.enableSTA(true); - delay(100); -#endif - - // Connect with SSID and password stored - -#ifndef WIFI_SSID - WiFi.begin(); -#else - WiFi.begin(WIFI_SSID, WIFI_PASS); -#endif - - // Wait connection - - uint32_t timeout = millis() + 20000; // Time out - - while (WiFi.status() != WL_CONNECTED && millis() < timeout) { - delay(250); - Serial.print("."); - } - - // Not connected yet? - - if (WiFi.status() != WL_CONNECTED) { - -#ifndef WIFI_SSID - // SmartConfig - - WiFi.beginSmartConfig(); - - // Wait for SmartConfig packet from mobile - - Serial.println("connectWiFi: Waiting for SmartConfig."); - - while (!WiFi.smartConfigDone()) { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println("connectWiFi: SmartConfig received."); - - // Wait for WiFi to connect to AP - - Serial.println("connectWiFi: Waiting for WiFi"); - - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } -#else - Serial.println("Not possible connect to WiFi, rebooting"); - ESP.restart(); -#endif - } - - // End - - Serial.println(""); - Serial.print("connectWiFi: connect a "); - Serial.println(WiFi.SSID()); - Serial.print("IP: "); - Serial.println(WiFi.localIP().toString()); - -} - -#ifdef USE_ARDUINO_OTA - -// Initialize o Arduino OTA - -void initializeOTA() { - - // TODO: option to authentication (password) - -#if defined ESP8266 - - ArduinoOTA.onStart([]() { - Serial.println("* OTA: Start"); - }); - ArduinoOTA.onEnd([]() { - Serial.println("\n*OTA: End"); - }); - ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("*OTA: Progress: %u%%\r", (progress / (total / 100))); - }); - ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("*OTA: Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - -#elif defined ESP32 - - // ArduinoOTA - - ArduinoOTA.onStart([]() { - String type; - if (ArduinoOTA.getCommand() == U_FLASH) - type = "sketch"; - else // U_SPIFFS - type = "filesystem"; - Serial.println("Start updating " + type); - }).onEnd([]() { - Serial.println("\nEnd"); - }).onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }).onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - -#endif - - // Begin - - ArduinoOTA.begin(); - -} - -#endif - -#ifdef WEB_SERVER_ENABLED - -/////////// Handles - - void handleRoot() { - - // Root web page - - HTTPServer.send(200, "text/plain", "hello from esp - RemoteDebug Sample!"); - } - - void handleNotFound(){ - - // Page not Found - - String message = "File Not Found\n\n"; - message.concat("URI: "); - message.concat(HTTPServer.uri()); - message.concat("\nMethod: "); - message.concat((HTTPServer.method() == HTTP_GET)?"GET":"POST"); - message.concat("\nArguments: "); - message.concat(HTTPServer.args()); - message.concat("\n"); - for (uint8_t i=0; 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

wFtgdy>AGEb#5vefc7^yUV4fqEc^T2R7T!Ft# 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 diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/logo.png b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/logo.png deleted file mode 100644 index dd3c412dc724193540b3defe8182b7670c5d0b88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17365 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 UuS!wCr)_{piz|p#i5Ld|AGDUNIRF3v diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebug_telnet.png b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebug_telnet.png deleted file mode 100644 index 8d34799ae6c70de3bae04069d60afac93a67ea04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167307 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 E2e@Yf)&Kwi diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebug_v2.png b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebug_v2.png deleted file mode 100644 index 63acc9780261c0b747fc918cde22579beaf0c60b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91432 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

%Yuc;r`1PiR7IV0$pOv>8n34L8 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⪻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

TDvqv6u>H(!G&6@_Pqzdl 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

hzofAbetXD@y@W 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 diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebugapp.png b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/extras/readme_media/remotedebugapp.png deleted file mode 100644 index 2f98b1ffbab309fce91e7fe0d024e5a07049303f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472745 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

X5w)GyYJAXkc*3#BhEF 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

!f4^KD>^4BYMzcWs}<$X+TSqd?KKrI@$h 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ͬbvGP3In+=~_Fgp0VSUB#tNOE=<8&JOgpe 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 &S>w}h|0t@^@ilNiC+ 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 diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/library.json b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/library.json deleted file mode 100755 index f332cd3..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/library.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "RemoteDebug", - "keywords": "Debug, Remote, Telnet, WiFi", - "description": "A library for Arduino to debug projects over WiFi, with web app or telnet client, with Print commands like Serial Monitor.", - "repository": - { - "type": "git", - "url": "https://github.com/JoaoLopesF/RemoteDebug.git" - }, - "version": "3.0.5", - "frameworks": "arduino", - "platforms": "*" -} - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/library.properties b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/library.properties deleted file mode 100755 index 6cad46c..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=RemoteDebug -version=3.0.5 -author=Joao Lopes -maintainer=Joao Lopes -sentence=A library for Arduino to debug projects over WiFi, with web app or telnet client, with Print commands like Serial Monitor. -paragraph= -category=Communication -url=https://github.com/JoaoLopesF/RemoteDebug -architectures=* diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebug.cpp b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebug.cpp deleted file mode 100644 index 22c220a..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebug.cpp +++ /dev/null @@ -1,2015 +0,0 @@ -/* - * Libraries Arduino - * ***************** - * Library : Remote debug - debug over telnet - for Esp8266 (NodeMCU) or ESP32 - * Author : Joao Lopes - * Comments: Telnet server based on example of TelnetServer code in http: *www.rudiswiki.de/wiki9/WiFiTelnetServer - * Web socket server uses the arduinWebSockets library (https://github.com/Links2004/arduinoWebSockets) - * The author uses Eclise IDE (sloeber) to made this source - * License : See RemoteDebug.h - * - * Versions: - * ------ ---------- ----------------- - * 3.0.5 2019-03-32 Ajustment on debugA macro, thanks @jetpax and @cmidgley to add this issue - * 3.0.4 2019-03-19 All public configurations (#defines) have moved to RemoteDebugCfg.h, to facilitate changes for anybody. - * Changed examples with warnings on change any #define in project, - * with workarounds, if it not work. (thanks to @22MarioZ for added this issue) - * 3.0.3 2019-03-18 Adjustments if web socket is disabled - * 3.0.2 2019-03-16 Adjustments in examples, added one for debugger - * 3.0.1 2019-03-13 Adjustments in silente mode - * Commands from RemoteDebugApp now is treated - * Adjusts to RemoteDebugger support connection by web sockets - * 3.0.0 2019-03-11 If not disabled, add a web socket server to comunicate with RemoteDebugApp (HTML5 web app) - * The standard telnet still working, to debug with internet offline - * Ajustment on debugA macro, thanks @jetpax to add this issue - * 2.1.2 2019-03-08 Add empty rprint* macros, if debug is disabled - * 2.1.1 2019-03-06 Create option DEBUG_DISABLE_AUTO_FUNC - * Create macros to be used for code converter: rprint and rprintln - * RemoteDebug now have an code converters to help migrate codes - * - * 2.1.0 2019-03-04 Create precompiler DEBUG_DISABLED to compile for production/release, - * equal that have in SerialDebug - * Adjustments in examples - * - * 2.0.2 2019-03-03 Just to do new release, to update other files - * 2.0.1 2019-03-01 Adjustments for the debugger: it still disable until dbg command, equal to SerialDebug - * The callback will to be called before print debug messages now - * And only if debugger is enabled in RemoteDebugger (command dbg) - * Changed handle debugger logic - * - * 2.0.0 2019-02-28 Added support to RemoteDebug addon library: the RemoteDebugger, an simple software debugger, based on SerialDebug - * New color system (uncomment COLOR_NEW_SYSTEM in remotedebug.h to return to old way) - * 1.5.9 2019-02-18 Bug> sometimes the processCommand is executed twice. Workaround> check time - * 1.5.8 2019-02-08 New macros to compatibility with SerialDebug (can use RemoteDebug or SerialDebug) thanks to @phrxmd - * 1.5.7 2018-11-03 Fixed bug for MAX_TIME_INACTIVE - * 1.5.6 2018-10-19 Adjustments based on pull request from @jeroenst (to allow serial output with telnet password and setPassword method) - * 1.5.5 ? Serial output is now not allowed if telnet password is enabled - * 1.5.4 ? Serial output not depending of telnet password (thanks @jeroenst for suggestion) - * 1.5.3 ? Serial output adjustments (due bug in password logic) - * 1.5.2 ? Correct rdebug macro (thanks @stritti) - * 1.5.1 ? New command: silence - * Added new rdebug?ln to put auto new line - * Auto function and core if (for ESP32) in rdebug macros - * Class destructor implemented - * 1.5.0 ? Port can be pass in begin method (thanks @PjotrekSE for suggestion) - * Few adjustments - * this kind of authentication will not be done now. - * Such as RemoteDebug now is not for production releases, - * Note: telnet use advanced authentication (kerberos, etc.) - * 1.4.0 ? A simple text password request, if enabled (thanks @jeroenst for suggestion) - * 1.3.1 ? Retired # from VARGS precompiler macros - * Few adjustments as ESP32 includes - * Port number can be modified in project Arduino (.ino file) - * 1.3.0 Aug 2018 Bug in write with latest ESP8266 SDK - * 1.2.1 ? Adjusts to not cause error in Arduino - * 1.2.0 ? Added shortcuts and buffering to avoid delays - * 1.1.1 2017-11-24 Added support for the pass through of commands, and default debug levels thanks B. Harville - * 1.1.0 Aug 2017 Support to ESP32 - * New commands for CPU frequencies - * New level> profiler and auto-profiler - * 1.0.1 Aug 2017 New connection logic - * 1.0.0 Jan 2017 First RC - * 0.9.1 Oct 2016 Beta 2 - * 0.9.0 Aug 2016 Beta 1 - * - */ - -/* - * TODO: - Page HTML for begin/stop Telnet server - * - Add support to another Arduino WiFi boards (if have demand on it) - */ - -///// RemoteDebug configuration - -#include "RemoteDebugCfg.h" - -///// Debug disable for compile to production/release ? -///// as nothing of RemotedDebug is compiled, zero overhead :-) - -#ifndef DEBUG_DISABLED - -///// Defines - -#define VERSION "3.0.5" - -///// Includes - -#include "stdint.h" - -#if defined(ESP8266) -// ESP8266 SDK -extern "C" { -bool system_update_cpu_freq(uint8_t freq); -} -#endif - -#include "Arduino.h" -#include "Print.h" - -#ifdef SERIAL_DEBUG_H -// Cannot used with SerialDebug at same time -#error "RemoteDebug cannot be used with SerialDebug" -#endif - -// ESP8266 or ESP32 ? - -#if defined(ESP8266) - -#include - -#elif defined(ESP32) - -#include - -#else - -#error Only for ESP8266 or ESP32 - -#endif - -#include "RemoteDebug.h" // This library - -#ifdef ALPHA_VERSION // In test, not good yet -#include "telnet.h" -#endif - -// Support to websocket connection with RemoteDebugApp -// Note: you must install the arduinoWebSocket library before - -#ifndef WEBSOCKET_DISABLED // Only if Web socket enabled (RemoteDebugApp) -#include "RemoteDebugWS.h" -#endif - -// Internal print macros for send messages to client - -#ifndef WEBSOCKET_DISABLED // Only if Web socket enabled (RemoteDebugApp) - -#define debugPrintf(fmt, ...) { \ - if (_connected) TelnetClient.printf(fmt, ##__VA_ARGS__);\ - else if (_connectedWS) DebugWS.printf(fmt, ##__VA_ARGS__);\ -} -#define debugPrintln(str) { \ - if (_connected) TelnetClient.println(str);\ - else if (_connectedWS) DebugWS.println(str);\ -} -#define debugPrint(str) { \ - if (_connected) TelnetClient.print(str);\ - else if (_connectedWS) DebugWS.print(str);\ -} - -#else // With web socket too - -#define debugPrintf(fmt, ...) { \ - if (_connected) TelnetClient.printf(fmt, ##__VA_ARGS__);\ -} -#define debugPrintln(str) { \ - if (_connected) TelnetClient.println(str);\ -} -#define debugPrint(str) { \ - if (_connected) TelnetClient.print(str);\ -} - -#endif - -// Internal debug macro - recommended stay disable - -#define D(fmt, ...) // Without this -//#define D(fmt, ...) Serial.printf("rd: " fmt "\n", ##__VA_ARGS__) // Serial debug - -////// Variables - -// Instance - -static RemoteDebug* _instance; - -// WiFi server (telnet) - -static WiFiServer TelnetServer(TELNET_PORT); // @suppress("Abstract class cannot be instantiated") -static WiFiClient TelnetClient; // @suppress("Abstract class cannot be instantiated") - -// Support to websocket connection with RemoteDebugApp - -#ifndef WEBSOCKET_DISABLED - -// Instance of RemoteDebugWS - -static RemoteDebugWS DebugWS; // @suppress("Abstract class cannot be instantiated") - -static boolean _connectedWS = false; // Connected : - -// Callbacks - -class MyRemoteDebugCallbacks: public RemoteDebugWSCallbacks { - void onConnect() { - // Web socket (app) connected - - D("rd: onconnect"); - - _connectedWS = true; - - // Is telnet connected -> disconnect it, due reduce overheads - - if (_instance->isConnected()) { - - _instance->disconnect(true); - } - - // Call same routine that telnet - - _instance->onConnection(true); - } - void onDisconnect() { - // Web socket (app) disconnected - - D("rd: ondisconnect"); - - _connectedWS = false; - } - void onReceive(const char *message) { - // Receive a message - - D("rd: onreceive"); - - _instance->wsOnReceive(message); - } -}; - -#endif // WEBSOCKET_DISABLED - -////// Methods / routines - -// Constructor - -RemoteDebug::RemoteDebug() { - - // Save the instance - - _instance = this; -} - -// Initialize the telnet server - -bool RemoteDebug::begin(String hostName, uint8_t startingDebugLevel) { - return begin(hostName, TELNET_PORT, startingDebugLevel); -} - -bool RemoteDebug::begin(String hostName, uint16_t port, uint8_t startingDebugLevel) { - - // Initialize server telnet - - if (port != TELNET_PORT) { // Bug: not more can use begin(port).. - return false; - } - - TelnetServer.begin(); - TelnetServer.setNoDelay(true); - -#ifndef WEBSOCKET_DISABLED - // Initialize web socket (for RemoteDebugApp) - - DebugWS.begin(new MyRemoteDebugCallbacks()); - -#endif - - // Reserve space to buffer of print writes - - _bufferPrint.reserve(BUFFER_PRINT); - -#ifdef CLIENT_BUFFERING - // Reserve space to buffer of send - - _bufferPrint.reserve(MAX_SIZE_SEND); - -#endif - - // Host name of this device - - _hostName = hostName; - - // Debug level - - _clientDebugLevel = startingDebugLevel; - _lastDebugLevel = startingDebugLevel; - - return true; -} - -#ifdef DEBUGGER_ENABLED -// Simple software debugger - based on SerialDebug Library -void RemoteDebug::initDebugger(boolean (*callbackEnabled)(), void (*callbackHandle)(const boolean), String (*callbackGetHelp)(), void (*callbackProcessCmd)()) { - - // Init callbacks for the debugger - - _callbackDbgEnabled = callbackEnabled; - _callbackDbgHandle = callbackHandle; - _callbackDbgHelp = callbackGetHelp; - _callbackDbgProcessCmd = callbackProcessCmd; - -} - -WiFiClient* RemoteDebug::getTelnetClient() { - - return &TelnetClient; -} - -#endif - -// Set the password for telnet - thanks @jeroenst for suggest thist method - -void RemoteDebug::setPassword(String password) { - - _password = password; - -} - -// Destructor - -RemoteDebug::~RemoteDebug() { - - // Flush - - if (TelnetClient && TelnetClient.connected()) { - TelnetClient.flush(); - } - - // Stop - - stop(); -} - -// Stop the server - -void RemoteDebug::stop() { - - // Stop Client - - if (TelnetClient && TelnetClient.connected()) { - TelnetClient.stop(); - } - - // Stop server - - TelnetServer.stop(); - -#ifndef WEBSOCKET_DISABLED - // Stop web socket (RemoteDebugApp) - - DebugWS.stop(); // stop the websocket server -#endif - -} - -// Handle the connection (in begin of loop in sketch) -// TODO: optimize when loop not have a large delay - -void RemoteDebug::handle() { - -#ifdef ALPHA_VERSION // In test, not good yet - static uint32_t lastTime = millis(); -#endif - -#ifdef DEBUGGER_ENABLED - static uint32_t dbgTimeHandle = millis(); // To avoid call the handler desnecessary - static boolean dbgLastConnected = false; // Last is connected ? -#endif - - // Silence timeout ? - - if (_silence && _silenceTimeout > 0 && millis() >= _silenceTimeout) { - - // Get out of silence mode - - silence(false, true); - } - - // Debug level is profiler -> set the level before - - if (_clientDebugLevel == PROFILER) { - if (millis() > _levelProfilerDisable) { - _clientDebugLevel = _levelBeforeProfiler; - debugPrintln("* Debug level profile inactive now"); - } - } - -#ifdef ALPHA_VERSION // In test, not good yet - - // Automatic change to profiler level if time between handles is greater than n millis - - if (_autoLevelProfiler > 0 && _clientDebugLevel != PROFILER) { - - uint32_t diff = (millis() - lastTime); - - if (diff >= _autoLevelProfiler) { - _levelBeforeProfiler = _clientDebugLevel; - _clientDebugLevel = PROFILER; - _levelProfilerDisable = 1000; // Disable it at 1 sec - - debugPrintf("* Debug level profile active now - time between handels: %u\r\n", diff); - } - - lastTime = millis(); - } -#endif - - // look for Client connect trial - - if (TelnetServer.hasClient()) { - - // Old connection logic - -// if (!TelnetClient || !TelnetClient.connected()) { -// -// if (TelnetClient) { // Close the last connect - only one supported -// -// TelnetClient.stop(); -// -// } - - // New connection logic - 10/08/17 - - if (TelnetClient && TelnetClient.connected()) { - - // Verify if the IP is same than actual conection - - WiFiClient newClient; // @suppress("Abstract class cannot be instantiated") - newClient = TelnetServer.available(); - String ip = newClient.remoteIP().toString(); - - if (ip == TelnetClient.remoteIP().toString()) { - - // Reconnect - - TelnetClient.stop(); - TelnetClient = newClient; - - } else { - - // Disconnect (not allow more than one connection) - - newClient.stop(); - - return; - - } - - } else { - - // New TCP client - - TelnetClient = TelnetServer.available(); - - // Password request ? - 18/07/18 - - if (_password != "") { - - #ifdef ALPHA_VERSION // In test, not good yet - // Send command to telnet client to not do local echos - // Experimental code ! - - sendTelnetCommand(TELNET_WONT, TELNET_ECHO); - #endif - - } - } - - if (!TelnetClient) { // No client yet ??? - return; - } - - // Set client - - TelnetClient.setNoDelay(true); // More faster - TelnetClient.flush(); // clear input buffer, else you get strange characters - - // Empty buffer - - delay(100); - - while (TelnetClient.available()) { - TelnetClient.read(); - } - - // Connection event - - onConnection(true); - - } - - // Is client connected ? (to reduce overhead in active) - - _connected = (TelnetClient && TelnetClient.connected()); - - // Get command over telnet - - if (_connected) { - - char last = ' '; // To avoid process two times the "\r\n" - - while (TelnetClient.available()) { // get data from Client - - // Get character - - char character = TelnetClient.read(); - - // Newline (CR or LF) - once one time if (\r\n) - 26/07/17 - - if (isCRLF(character) == true) { - - if (isCRLF(last) == false) { - - // Process the command - - if (_command.length() > 0) { - - _lastCommand = _command; // Store the last command - processCommand(); - - } - } - - _command = ""; // Init it for next command - - } else if (isPrintable(character)) { - - // Concat - - _command.concat(character); - - } - - // Last char - - last = character; - } - - } - - // Client connected ? - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - boolean connected = (_connected || _connectedWS); -#else // By telnet - boolean connected = _connected; -#endif - - if (connected) { - -#ifdef CLIENT_BUFFERING - // Client buffering - send data in intervals to avoid delays or if its is too big - - if ((millis() - _lastTimeSend) >= DELAY_TO_SEND || _sizeBufferSend >= MAX_SIZE_SEND) { - debugPrint(_bufferSend); - _bufferSend = ""; - _sizeBufferSend = 0; - _lastTimeSend = millis(); - } -#endif - -#ifdef MAX_TIME_INACTIVE -#if MAX_TIME_INACTIVE > 0 - - // Inactivity - close connection if not received commands from user in telnet - // For reduce overheads - - uint32_t maxTime = MAX_TIME_INACTIVE; // Normal - - if (_password != "" && !_passwordOk) { // Request password - 18/08/08 - maxTime = 60000; // One minute to password - } - - if ((millis() - _lastTimeCommand) > maxTime) { - - debugPrintln("* Closing session by inactivity"); - - // Disconnect - - disconnect(); - return; - } -#endif -#endif - } - -#ifndef WEBSOCKET_DISABLED // For websocket server - - // Web socket server handle - - DebugWS.handle(); - -#endif - -#ifdef DEBUGGER_ENABLED - - // For Simple software debugger - based on SerialDebug Library - - // Changed handle debugger logic - 2018-03-01 - - if (_callbackDbgEnabled && _callbackDbgHandle) { // Calbacks ok ? - - boolean callHandle = false; - - if (dbgLastConnected != connected) { // Change connection -> always call - - dbgLastConnected = connected; - callHandle = true; - - } else if (millis() >= dbgTimeHandle) { - - if (_callbackDbgEnabled()) { // Only if it is enabled - callHandle = true; - } - } - - if (callHandle) { - - // Call the handle - - _callbackDbgHandle(true); - - // Save time - - dbgTimeHandle = millis() + DEBUGGER_HANDLE_TIME; - } - } -#endif - - //DV("*handle time: ", (millis() - timeBegin)); -} - - -// Disconnect client - -void RemoteDebug::disconnect(boolean onlyTelnetClient) { - - // Disconnect - - if (onlyTelnetClient) { - if (_connected) { - TelnetClient.println("* Closing client connection ..."); // this is to web app new conn not receive it - } - } else { - debugPrintln("* Closing client connection ..."); - } - - _silence = false; - _silenceTimeout = 0; - - if (_connected) { // By telnet - TelnetClient.stop(); - _connected = false; - } -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - if (_connectedWS && !onlyTelnetClient) { - DebugWS.disconnect(); // Disconnect client - _connectedWS = false; - } -#endif -} - -// Connection/disconnection event - -void RemoteDebug::onConnection(boolean connected) { - - // Clear variables - - D("rd onconn %d", connected); - - _bufferPrint = ""; // Clean buffer - - _lastTimeCommand = millis(); // To mark time for inactivity - - _command = ""; // Clear command - _lastCommand = ""; // Clear las command - - _lastTimePrint = millis(); // Clear the time - - _silence = false; // No silence - _silenceTimeout = 0; - -#ifdef CLIENT_BUFFERING - // Client buffering - send data in intervals to avoid delays or if its is too big - _bufferSend = ""; - _sizeBufferSend = 0; - _lastTimeSend = millis(); -#endif - - // Password request ? - 18/07/18 - - if (_password != "") { - - _passwordOk = false; - -#ifdef REMOTEDEBUG_PWD_ATTEMPTS - _passwordAttempt = 1; -#endif - } - - // Save it - - _connected = connected; - - // Process - - if (connected) { // Connected ? - - - // Callback - - if (_callbackNewClient) { - _callbackNewClient(); - } - - // Show the initial message - -#if SHOW_HELP - showHelp(); -#endif - } -} - -boolean RemoteDebug::isConnected() { - - // Is connected - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - return (_connected || _connectedWS); -#else - return _connected; -#endif -} - -// Send to serial too (use only if need) - -void RemoteDebug::setSerialEnabled(boolean enable) { - - _serialEnabled = enable; - _showColors = false; // Disable it for Serial - -} - -// Allow ESP reset over telnet client - -void RemoteDebug::setResetCmdEnabled(boolean enable) { - _resetCommandEnabled = enable; -} - -// Show time in millis - -void RemoteDebug::showTime(boolean show) { - _showTime = show; -} - -// Show profiler - time in millis between messages of debug - -void RemoteDebug::showProfiler(boolean show, uint32_t minTime) { - _showProfiler = show; - _minTimeShowProfiler = minTime; -} - -#ifdef ALPHA_VERSION // In test, not good yet -// Automatic change to profiler level if time between handles is greater than n mills (0 - disable) - -void RemoteDebug::autoProfilerLevel(uint32_t millisElapsed) { - _autoLevelProfiler = millisElapsed; -} -#endif - -// Show debug level - -void RemoteDebug::showDebugLevel(boolean show) { - _showDebugLevel = show; -} - -// Show colors - -void RemoteDebug::showColors(boolean show) { - if (_serialEnabled == false) { - _showColors = show; - } else { - _showColors = false; // Disable it for Serial - } -} - -// Show in raw mode - only data ? - -void RemoteDebug::showRaw(boolean show) { - _showRaw = show; -} - - -// Is active ? client telnet connected and level of debug equal or greater then set by user in telnet - -boolean RemoteDebug::isActive(uint8_t debugLevel) { - - // Active -> - // Not in silence (new) - // Debug level ok and - // Telnet connected or - // Serial enabled (use only if need) - // Password ok (if enabled) - 18/08/18 - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - - boolean ret = (debugLevel >= _clientDebugLevel && - !_silence && - (_connected || _connectedWS || _serialEnabled)); - -#else // Telnet only - - boolean ret = (debugLevel >= _clientDebugLevel && - !_silence && - (_connected || _serialEnabled)); - -#endif - - - if (ret) { - _lastDebugLevel = debugLevel; - } - - return ret; - -} - -// Set help for commands over telnet set by sketch - -void RemoteDebug::setHelpProjectsCmds(String help) { - - _helpProjectCmds = help; - -} - -// Set callback of sketch function to process project messages - -void RemoteDebug::setCallBackProjectCmds(void (*callback)()) { - _callbackProjectCmds = callback; -} - -void RemoteDebug::setCallBackNewClient(void (*callback)()) { - _callbackNewClient = callback; -} - -// Print - -size_t RemoteDebug::write(const uint8_t *buffer, size_t size) { - - // Process buffer - // Insert due a write bug w/ latest Esp8266 SDK - 17/08/18 - - for(size_t i=0; i 1) { - show.concat(COLOR_RESET); - } - } - } - - // Show time in millis - - if (_showTime) { - if (show != "") - show.concat(" "); - show.concat("t:"); - show.concat(millis()); - show.concat("ms"); - } - - // Show profiler (time between messages) - - if (_showProfiler) { - elapsed = (millis() - _lastTimePrint); - boolean resetColors = false; - if (show != "") - show.concat(" "); - if (_showColors) { - if (elapsed < 250) { - ; // not color this - } else if (elapsed < 1000) { - show.concat(COLOR_BACKGROUND_CYAN); - resetColors = true; - } else if (elapsed < 3000) { - show.concat(COLOR_BACKGROUND_YELLOW); - resetColors = true; - } else if (elapsed < 5000) { - show.concat(COLOR_BACKGROUND_MAGENTA); - resetColors = true; - } else { - show.concat(COLOR_BACKGROUND_RED); - resetColors = true; - } - } - show.concat("p:^"); - show.concat(formatNumber(elapsed, 4)); - show.concat("ms"); - if (resetColors) { - show.concat(COLOR_RESET); - } - _lastTimePrint = millis(); - } - -#endif - - } else { // Raw mode - only data - e.g. used for debugger messages - -#ifdef COLOR_NEW_SYSTEM - show.concat(COLOR_RAW); -#endif - } - - // Show anything ? - - if (show != "") { - - if (!_showRaw) { - show.concat(") "); - } - - // Write to telnet buffered - - if (connected || _serialEnabled) { // send data to Client - _bufferPrint = show; - } - } - - _newLine = false; - - } - - // Print ? - - boolean doPrint = false; - - // New line ? - - if (character == '\n') { - - _bufferPrint.concat("\r"); // Para clientes windows - 29/01/17 - - _newLine = true; - doPrint = true; - - } else if (_bufferPrint.length() == BUFFER_PRINT) { // Limit of buffer - - doPrint = true; - - } - - // Write to telnet Buffered - - _bufferPrint.concat((char) character); - - // Send the characters buffered by print.h - - if (doPrint) { // Print the buffer - - boolean noPrint = false; - - if (_showProfiler && elapsed < _minTimeShowProfiler) { // Profiler time Minimal - noPrint = true; - } else if (_filterActive) { // Check filter before print - - String aux = _bufferPrint; - aux.toLowerCase(); - - if (aux.indexOf(_filter) == -1) { // not find -> no print - noPrint = true; - } - } - - if (noPrint == false) { - -#ifdef COLOR_NEW_SYSTEM - _bufferPrint.concat(COLOR_RESET); -#endif - // Send to telnet or websocket (buffered) - - boolean sendToClient = connected; - - if (_password != "" && !_passwordOk) { // With no password -> no telnet output - 2018-10-19 - sendToClient = false; - } - - if (sendToClient) { // send data to Client - - -#ifndef CLIENT_BUFFERING - debugPrint(_bufferPrint); -#else // Cliente buffering - - uint8_t size = _bufferPrint.length(); - - // Buffer too big ? - - if ((_sizeBufferSend + size) >= MAX_SIZE_SEND) { - - // Send it - - debugPrint(_bufferSend); - _bufferSend = ""; - _sizeBufferSend = 0; - _lastTimeSend = millis(); - } - - // Add to buffer of send - - _bufferSend.concat(_bufferPrint); - _sizeBufferSend+=size; - - // Client buffering - send data in intervals to avoid delays or if its is too big - // Not for raw mode - if (_showRaw || (millis() - _lastTimeSend) >= DELAY_TO_SEND) { - debugPrint(_bufferSend); - _bufferSend = ""; - _sizeBufferSend = 0; - _lastTimeSend = millis(); - } -#endif - } - - // Echo to serial (not buffering it) - - if (_serialEnabled) { - Serial.print(_bufferPrint); - } - } - - // Empty the buffer - - ret = _bufferPrint.length(); - _bufferPrint = ""; - } - - // Retorna - - return ret; -} - -////// Private - - -// Show help of commands - -void RemoteDebug::showHelp() { - - // Show the initial message - - String help = ""; - - // Password request ? - 04/03/18 - - if (_password != "" && !_passwordOk) { - - help.concat("\r\n"); - help.concat("* Please enter with a password to access"); -#ifdef REMOTEDEBUG_PWD_ATTEMPTS - help.concat(" (attempt "); - help.concat(_passwordAttempt); - help.concat(" of "); - help.concat(REMOTEDEBUG_PWD_ATTEMPTS); - help.concat(")"); -#endif - help.concat(':'); - help.concat("\r\n"); - - debugPrint(help); - - return; -} - - // Show help - -#if defined(ESP8266) - help.concat("*** Remote debug - over telnet - for ESP8266 (NodeMCU) - version "); -#elif defined(ESP32) - help.concat("*** Remote debug - over telnet - for ESP32 - version "); -#endif - help.concat(VERSION); - help.concat("\r\n"); - help.concat("* Host name: "); - help.concat(_hostName); - help.concat(" IP:"); - help.concat(WiFi.localIP().toString()); - help.concat(" Mac address:"); - help.concat(WiFi.macAddress()); - help.concat("\r\n"); - help.concat("* Free Heap RAM: "); - help.concat(ESP.getFreeHeap()); - help.concat("\r\n"); - help.concat("* ESP SDK version: "); - help.concat(ESP.getSdkVersion()); - help.concat("\r\n"); - help.concat("******************************************************\r\n"); - help.concat("* Commands:\r\n"); - help.concat(" ? or help -> display these help of commands\r\n"); - help.concat(" q -> quit (close this connection)\r\n"); - help.concat(" m -> display memory available\r\n"); - help.concat(" v -> set debug level to verbose\r\n"); - help.concat(" d -> set debug level to debug\r\n"); - help.concat(" i -> set debug level to info\r\n"); - help.concat(" w -> set debug level to warning\r\n"); - help.concat(" e -> set debug level to errors\r\n"); - help.concat(" s -> set debug silence on/off\r\n"); - help.concat(" l -> show debug level\r\n"); - help.concat(" t -> show time (millis)\r\n"); - help.concat(" profiler:\r\n"); - help.concat( - " p -> show time between actual and last message (in millis)\r\n"); - help.concat(" p min -> show only if time is this minimal\r\n"); - help.concat(" P time -> set debug level to profiler\r\n"); -#ifdef ALPHA_VERSION // In test, not good yet - help.concat(" A time -> set auto debug level to profiler\r\n"); -#endif - help.concat(" c -> show colors\r\n"); - help.concat(" filter:\r\n"); - help.concat(" filter -> show only debugs with this\r\n"); - help.concat(" nofilter -> disable the filter\r\n"); -#if defined(ESP8266) - help.concat(" cpu80 -> ESP8266 CPU a 80MHz\r\n"); - help.concat(" cpu160 -> ESP8266 CPU a 160MHz\r\n"); - if (_resetCommandEnabled) { - help.concat(" reset -> reset the ESP8266\r\n"); - } -#elif defined(ESP32) - if (_resetCommandEnabled) { - help.concat(" reset -> reset the ESP32\r\n"); - } -#endif - - // Callbacks - - if (_helpProjectCmds != "" && (_callbackProjectCmds)) { - help.concat("\r\n"); - help.concat(" * Project commands:\r\n"); - String show = "\r\n"; - show.concat(_helpProjectCmds); - show.replace("\n", "\n "); // ident this - help.concat(show); - } - -#ifdef DEBUGGER_ENABLED - // Get help for the debugger - - if (_callbackDbgHelp) { - help.concat("\r\n"); - help.concat(_callbackDbgHelp()); - } -#endif - help.concat("\r\n"); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - if (!_connectedWS) { // For telnet only - help.concat("****\r\n"); - help.concat("* New features available:\r\n"); - help.concat("* - Now you can debug in web browser too.\r\n"); - help.concat("* Please access: http://joaolopesf.net/remotedebugapp\r\n"); - help.concat("* - Now you can add an simple software debuggger.\r\n"); - help.concat("* Please access: https://github.com/JoaoLopesF/RemoteDebugger\r\n"); - help.concat("****\r\n"); - } -#endif - - help.concat("\r\n"); - help.concat( - "* Please type the command and press enter to execute.(? or h for this help)\r\n"); - help.concat("***\r\n"); - - // Send to client - - debugPrint(help); -} - -// Get last command received - -String RemoteDebug::getLastCommand() { - - return _lastCommand; -} - -// Clear the last command received - -void RemoteDebug::clearLastCommand() { - _lastCommand = ""; -} - -// Process user command over telnet or web socket - -void RemoteDebug::processCommand() { - - static uint32_t lastTime = 0; - - // Bug -> sometimes the command is process twice - // Workaround -> check time - // TODO: see correction for this - - if (lastTime > 0 && (millis() - lastTime) < 500) { - debugPrintln("* Bug workaround: ignoring command repeating"); - return; - } - lastTime = millis(); - - D("cmd: %s" , _command.c_str()); - - // Password request ? - 18/07/18 - - if (_password != "" && !_passwordOk) { // Process the password - 18/08/18 - adjust in 04/09/08 and 2018-10-19 - - if (_command == _password) { - - debugPrintln("* Password ok, allowing access now..."); - - _passwordOk = true; - -#ifdef ALPHA_VERSION // In test, not good yet - sendTelnetCommand(TELNET_WILL, TELNET_ECHO); // Send a command to telnet to restore echoes = 18/08/18 -#endif - showHelp(); - - } else { - - debugPrintln("* Wrong password!"); - - #ifdef REMOTEDEBUG_PWD_ATTEMPTS - - _passwordAttempt++; - - if (_passwordAttempt > REMOTEDEBUG_PWD_ATTEMPTS) { - - debugPrintln("* Many attempts. Closing session now."); - - // Disconnect - - disconnect(); - - } else { - - showHelp(); - } - - #endif - } - - return; - - } - - // Process commands - - debugPrint("* Debug: Command received: "); - debugPrintln(_command); - - String options = ""; - uint8_t pos = _command.indexOf(" "); - if (pos > 0) { - options = _command.substring(pos + 1); - } - - // Set time of last command received - - _lastTimeCommand = millis(); - - // Get out of silent mode - - if (_command != "s" && _silence) { - - silence(false, true); - } - - // Process the command - - if (_command == "h" || _command == "?") { - - // Show help - - showHelp(); - - } else if (_command == "q") { - - // Quit - - debugPrintln("* Closing client connection ..."); - - TelnetClient.stop(); - - } else if (_command == "m") { - - uint32_t free = ESP.getFreeHeap(); - - debugPrint("* Free Heap RAM: "); - debugPrintln(free); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - - // Send status to app - - if (_connectedWS) { - DebugWS.printf("$app:M:%lu:\n", free); - } - -#endif - -#if defined(ESP8266) - - } else if (_command == "cpu80") { - - // Change ESP8266 CPU para 80 MHz - - system_update_cpu_freq(80); - debugPrintln("CPU ESP8266 changed to: 80 MHz"); - - } else if (_command == "cpu160") { - - // Change ESP8266 CPU para 160 MHz - - system_update_cpu_freq(160); - debugPrintln("CPU ESP8266 changed to: 160 MHz"); - -#endif - - } else if (_command == "v") { - - // Debug level - - _clientDebugLevel = VERBOSE; - - debugPrintln("* Debug level set to Verbose"); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - wsSendLevelInfo(); -#endif - - } else if (_command == "d") { - - // Debug level - - _clientDebugLevel = DEBUG; - - debugPrintln("* Debug level set to Debug"); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - wsSendLevelInfo(); -#endif - - } else if (_command == "i") { - - // Debug level - - _clientDebugLevel = INFO; - - debugPrintln("* Debug level set to Info"); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - wsSendLevelInfo(); -#endif - - } else if (_command == "w") { - - // Debug level - - _clientDebugLevel = WARNING; - - debugPrintln("* Debug level set to Warning"); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - wsSendLevelInfo(); -#endif - - } else if (_command == "e") { - - // Debug level - - _clientDebugLevel = ERROR; - - debugPrintln("* Debug level set to Error"); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - wsSendLevelInfo(); -#endif - - } else if (_command == "l") { - - // Show debug level - - _showDebugLevel = !_showDebugLevel; - - debugPrintf("* Show debug level: %s\r\n", - (_showDebugLevel) ? "On" : "Off"); - - } else if (_command == "t") { - - // Show time - - _showTime = !_showTime; - - debugPrintf("* Show time: %s\r\n", (_showTime) ? "On" : "Off"); - - } else if (_command == "s") { - - // Toogle silence (new) = 28/08/18 - - silence(!_silence); - - } else if (_command == "p") { - - // Show profiler - - _showProfiler = !_showProfiler; - _minTimeShowProfiler = 0; - - debugPrintf("* Show profiler: %s\r\n", - (_showProfiler) ? "On" : "Off"); - - } else if (_command.startsWith("p ")) { - - // Show profiler with minimal time - - if (options.length() > 0) { // With minimal time - int32_t aux = options.toInt(); - if (aux > 0) { // Valid number - _showProfiler = true; - _minTimeShowProfiler = aux; - debugPrintf( - "* Show profiler: On (with minimal time: %u)\r\n", - _minTimeShowProfiler); - } - } - - } else if (_command == "P") { - - // Debug level profile - - _levelBeforeProfiler = _clientDebugLevel; - _clientDebugLevel = PROFILER; - - if (_showProfiler == false) { - _showProfiler = true; - } - - _levelProfilerDisable = 1000; // Default - - if (options.length() > 0) { // With time of disable - int32_t aux = options.toInt(); - if (aux > 0) { // Valid number - _levelProfilerDisable = millis() + aux; - } - } - - debugPrintf( - "* Debug level set to Profiler (disable in %u millis)\r\n", - _levelProfilerDisable); - - } else if (_command == "A") { - - // Auto debug level profile - - _autoLevelProfiler = 1000; // Default - - if (options.length() > 0) { // With time of disable - int32_t aux = options.toInt(); - if (aux > 0) { // Valid number - _autoLevelProfiler = aux; - } - } - - debugPrintf( - "* Auto profiler debug level active (time >= %u millis)\r\n", - _autoLevelProfiler); - - } else if (_command == "c") { - - // Show colors - - _showColors = !_showColors; - - debugPrintf("* Show colors: %s\r\n", - (_showColors) ? "On" : "Off"); - - } else if (_command.startsWith("filter ") && options.length() > 0) { - - setFilter(options); - - } else if (_command == "nofilter") { - - setNoFilter(); - } else if (_command == "reset" && _resetCommandEnabled) { - - debugPrintln("* Reset ..."); - - debugPrintln("* Closing client connection ..."); - -#if defined(ESP8266) - debugPrintln("* Resetting the ESP8266 ..."); -#elif defined(ESP32) - debugPrintln("* Resetting the ESP32 ..."); -#endif - - TelnetClient.stop(); - TelnetServer.stop(); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - DebugWS.stop(); -#endif - - delay(500); - - // Reset - - ESP.restart(); - -#ifdef DEBUGGER_ENABLED - - } else if (!_callbackDbgProcessCmd && _command.startsWith("dbg")) { - - // Show a message of debugger not is active - - debugPrintln("* RemoteDebugger not activate for this project"); - debugPrintln("* Please access it to see how activate this:"); - debugPrintln("* https://github.com/JoaoLopesF/RemoteDebugger"); - -#endif - - } else { - - // Callbacks - -#ifdef DEBUGGER_ENABLED - // Process commands for the debugger - - if (_callbackDbgProcessCmd) { - _callbackDbgProcessCmd(); - } -#endif - - // Project commands - set by programmer - - if (_callbackProjectCmds) { - - _callbackProjectCmds(); - - } - } -} - -// Filter - -void RemoteDebug::setFilter(String filter) { - - _filter = filter; - _filter.toLowerCase(); // TODO: option to case insensitive ? - _filterActive = true; - - debugPrint("* Debug: Filter active: "); - debugPrintln(_filter); - -} - -void RemoteDebug::setNoFilter() { - - _filter = ""; - _filterActive = false; - - debugPrintln("* Debug: Filter disabled"); - -} - -// Silence - -void RemoteDebug::silence(boolean activate, boolean showMessage, boolean fromBreak, uint32_t timeout) { - - // Set silence and timeout - - if (showMessage) { - - if (activate) { - - debugPrintln("* Debug now is in silent mode!"); -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - if (_connectedWS) { - debugPrintln("* Press button \"Silence\" or another command to return show debugs"); - } else { - debugPrintln("* Press s again or another command to return show debugs"); - } -#else - debugPrintln("* Press s again or another command to return show debugs"); -#endif - } else { - - debugPrintln("* Debug now exit from silent mode!"); - } - } - - // Set it - - _silence = activate; - _silenceTimeout = (timeout == 0)?0:(millis() + timeout); - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - - // Send status to app - - if (_connectedWS) { - DebugWS.printf("$app:S:%c\n", ((_silence)? '1':'0')); - } - -#endif - -} - -boolean RemoteDebug::isSilence() { - - return _silence; -} - -// Format numbers - -String RemoteDebug::formatNumber(uint32_t value, uint8_t size, char insert) { - - // Putting zeroes in left - - String ret = ""; - - for (uint8_t i = 1; i <= size; i++) { - uint32_t max = pow(10, i); - if (value < max) { - for (uint8_t j = (size - i); j > 0; j--) { - ret.concat(insert); - } - break; - } - } - - ret.concat(value); - - return ret; -} - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - -/////// Web socket routines - -// Process user command over telnet or web socket - -void RemoteDebug::wsOnReceive(const char* command) { // @suppress("Unused function declaration") - - // Process the command - - _command = command; - _lastCommand = _command; // Store the last command - - D("cmd: %s", command); - - // Is app commands - - if (_command == "$app") { - - // RemoteDebug connected, send info - - wsSendInfo (); - - } else { // Normal commands - - processCommand(); - } -} - -// Send info to RemoteDebugApp - -void RemoteDebug::wsSendInfo() { - - // Send version, board, debugger disabled and if is low or enough memory board - - char features; - char dbgEnabled; - - // Not connected ? - - if (!_connectedWS) { - return; - } - - // Features - -#ifndef DEBUGGER_ENABLED - features = 'M'; // Disabled - dbgEnabled = 'D'; -#else - if (_callbackDbgProcessCmd) { - features = 'E'; // Enough - dbgEnabled = 'E'; - } else { - features = 'M'; // Medium - dbgEnabled = 'D'; - } -#endif - - // Send info - - String version = String(VERSION); - String board; - -#ifdef ESP32 - board = "ESP32"; -#else - board = "ESP8266"; -#endif - - DebugWS.println(); // Workaround to not get dirty "[0m" ??? - DebugWS.printf("$app:V:%s:%s:%c:%lu:%c:N\n", version.c_str(), board.c_str(), features, getFreeMemory(), dbgEnabled); - - // Status of debug level - - wsSendLevelInfo(); - - // Send status of debugger - - // TODO: made it - -} - -void RemoteDebug::wsSendLevelInfo() { - - // Send debug level info to app - - if (_connectedWS) { - DebugWS.printf("$app:L:%u\n", _clientDebugLevel); - } -} - -#endif // WEBSOCKET_DISABLED - -boolean RemoteDebug::wsIsConnected() { - - // Web socket is connected (RemoteDebugApp) - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - return _connectedWS; -#else - return false; -#endif -} - -/////// Utilities - -// Get free memory - -uint32_t RemoteDebug::getFreeMemory() { - - return ESP.getFreeHeap(); - -} - -// Is CR or LF ? - -boolean RemoteDebug::isCRLF(char character) { - - return (character == '\r' || character == '\n'); - -} - -// Expand characters as CR/LF to \\r, \\n -// TODO: make this for another chars not printable - -String RemoteDebug::expand(String string) { - - string.replace("\r", "\\r"); - string.replace("\n", "\\n"); - - return string; -} - -#ifdef ALPHA_VERSION // In test, not good yet -// Send telnet commands (as used with password request) - 18/08/18 -// Experimental code ! - -void RemoteDebug::sendTelnetCommand(uint8_t command, uint8_t option) { - - // Send a command to the telnet client - - debugPrintf("%c%c%c", TELNET_IAC, command, option); - TelnetClient.flush(); -} -#endif - -#else // DEBUG_DISABLED - -/////// All debug is disabled, this include is to define empty debug macros - -#include "RemoteDebug.h" // This library - -#endif // DEBUG_DISABLED - -/////// End diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebug.h b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebug.h deleted file mode 100644 index 902cd4d..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebug.h +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Header for RemoteDebug - * - * MIT License - * - * Copyright (c) 2019 Joao Lopes - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * - */ - -#ifndef REMOTEDEBUG_H -#define REMOTEDEBUG_H -#pragma once - -///// RemoteDebug configuration - -#include "RemoteDebugCfg.h" - -// Debug enabled ? - -#ifndef DEBUG_DISABLED - -//////// Defines - -// New color system (comment this to return to old system) - 2019-02-27 - -#define COLOR_NEW_SYSTEM true - -// ANSI Colors - -#define COLOR_RESET "\x1B[0m" - -#define COLOR_BLACK "\x1B[0;30m" -#define COLOR_RED "\x1B[0;31m" -#define COLOR_GREEN "\x1B[0;32m" -#define COLOR_YELLOW "\x1B[0;33m" -#define COLOR_BLUE "\x1B[0;34m" -#define COLOR_MAGENTA "\x1B[0;35m" -#define COLOR_CYAN "\x1B[0;36m" -#define COLOR_WHITE "\x1B[0;37m" - -#define COLOR_DARK_BLACK "\x1B[1;30m" - -#define COLOR_LIGHT_RED "\x1B[1;31m" -#define COLOR_LIGHT_GREEN "\x1B[1;32m" -#define COLOR_LIGHT_YELLOW "\x1B[1;33m" -#define COLOR_LIGHT_BLUE "\x1B[1;34m" -#define COLOR_LIGHT_MAGENTA "\x1B[1;35m" -#define COLOR_LIGHT_CYAN "\x1B[1;36m" -#define COLOR_LIGHT_WHITE "\x1B[1;37m" - -#define COLOR_BACKGROUND_BLACK "\x1B[40m" -#define COLOR_BACKGROUND_RED "\x1B[41m" -#define COLOR_BACKGROUND_GREEN "\x1B[42m" -#define COLOR_BACKGROUND_YELLOW "\x1B[43m" -#define COLOR_BACKGROUND_BLUE "\x1B[44m" -#define COLOR_BACKGROUND_MAGENTA "\x1B[45m" -#define COLOR_BACKGROUND_CYAN "\x1B[46m" -#define COLOR_BACKGROUND_WHITE "\x1B[47m" - -#ifdef COLOR_NEW_SYSTEM -// New system of Colors -// Note: this colors is not equals to SerialDebug colors, due using standard 16 colors of Ansi, for compatibility -#define COLOR_VERBOSE COLOR_GREEN -#define COLOR_DEBUG COLOR_LIGHT_GREEN -//#define COLOR_INFO COLOR_YELLOW -//#define COLOR_WARNING COLOR_CYAN -//#define COLOR_ERROR COLOR_RED -#define COLOR_INFO COLOR_LIGHT_YELLOW -#define COLOR_WARNING COLOR_LIGHT_CYAN -#define COLOR_ERROR COLOR_LIGHT_RED -#define COLOR_RAW COLOR_WHITE // COLOR_MAGENTA -#endif - -//////// Includes - -#include "Arduino.h" -#include "Print.h" - -// ESP8266 or ESP32 ? - -#if defined(ESP8266) - -#include - -#elif defined(ESP32) - -#include - -#else - -#error "Only for ESP8266 or ESP32" - -#endif - -////// Shortcuts macros - -// Auto function for debug macros? - -#ifndef DEBUG_DISABLE_AUTO_FUNC // With auto func - - #ifdef ESP32 - - // ESP32 -> Multicore - show core id ? - - #define DEBUG_AUTO_CORE true // debug show core id ? (comment to disable it) - - #ifdef DEBUG_AUTO_CORE - - #define rdebugA(fmt, ...) if (Debug.isActive(Debug.ANY)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) - #define rdebugP(fmt, ...) if (Debug.isActive(Debug.PROFILER)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) - #define rdebugV(fmt, ...) if (Debug.isActive(Debug.VERBOSE)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) - #define rdebugD(fmt, ...) if (Debug.isActive(Debug.DEBUG)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) - #define rdebugI(fmt, ...) if (Debug.isActive(Debug.INFO)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) - #define rdebugW(fmt, ...) if (Debug.isActive(Debug.WARNING)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) - #define rdebugE(fmt, ...) if (Debug.isActive(Debug.ERROR)) Debug.printf("(%s)(C%d) " fmt, __func__, xPortGetCoreID(), ##__VA_ARGS__) - - #endif - - #endif - - #ifndef DEBUG_AUTO_CORE // No auto core or for ESP8266 - - #define rdebugA(fmt, ...) if (Debug.isActive(Debug.ANY)) Debug.printf("(%s) " fmt, __func__, ##__VA_ARGS__) - #define rdebugP(fmt, ...) if (Debug.isActive(Debug.PROFILER)) Debug.printf("(%s) " fmt, __func__, ##__VA_ARGS__) - #define rdebugV(fmt, ...) if (Debug.isActive(Debug.VERBOSE)) Debug.printf("(%s) " fmt, __func__, ##__VA_ARGS__) - #define rdebugD(fmt, ...) if (Debug.isActive(Debug.DEBUG)) Debug.printf("(%s) " fmt, __func__, ##__VA_ARGS__) - #define rdebugI(fmt, ...) if (Debug.isActive(Debug.INFO)) Debug.printf("(%s) " fmt, __func__, ##__VA_ARGS__) - #define rdebugW(fmt, ...) if (Debug.isActive(Debug.WARNING)) Debug.printf("(%s) " fmt, __func__, ##__VA_ARGS__) - #define rdebugE(fmt, ...) if (Debug.isActive(Debug.ERROR)) Debug.printf("(%s) " fmt, __func__, ##__VA_ARGS__) - - #endif - -#else // Without auto func - - #define rdebugA(fmt, ...) if (Debug.isActive(Debug.ANY)) Debug.printf(fmt, ##__VA_ARGS__) - #define rdebugP(fmt, ...) if (Debug.isActive(Debug.PROFILER)) Debug.printf(fmt, ##__VA_ARGS__) - #define rdebugV(fmt, ...) if (Debug.isActive(Debug.VERBOSE)) Debug.printf(fmt, ##__VA_ARGS__) - #define rdebugD(fmt, ...) if (Debug.isActive(Debug.DEBUG)) Debug.printf(fmt, ##__VA_ARGS__) - #define rdebugI(fmt, ...) if (Debug.isActive(Debug.INFO)) Debug.printf(fmt, ##__VA_ARGS__) - #define rdebugW(fmt, ...) if (Debug.isActive(Debug.WARNING)) Debug.printf(fmt, ##__VA_ARGS__) - #define rdebugE(fmt, ...) if (Debug.isActive(Debug.ERROR)) Debug.printf(fmt, ##__VA_ARGS__) - -#endif - -// With newline - -#define rdebugAln(fmt, ...) rdebugA(fmt "\n", ##__VA_ARGS__) -#define rdebugPln(fmt, ...) rdebugP(fmt "\n", ##__VA_ARGS__) -#define rdebugVln(fmt, ...) rdebugV(fmt "\n", ##__VA_ARGS__) -#define rdebugDln(fmt, ...) rdebugD(fmt "\n", ##__VA_ARGS__) -#define rdebugIln(fmt, ...) rdebugI(fmt "\n", ##__VA_ARGS__) -#define rdebugWln(fmt, ...) rdebugW(fmt "\n", ##__VA_ARGS__) -#define rdebugEln(fmt, ...) rdebugE(fmt "\n", ##__VA_ARGS__) - -// For old versions compatibility - -#define rdebug(fmt, ...) rdebugA(fmt, ##__VA_ARGS__) - -// Another way - for compatibility - -#define DEBUG(fmt, ...) rdebugA(fmt, ##__VA_ARGS__) - -#define DEBUG_A(fmt, ...) rdebugA(fmt, ##__VA_ARGS__) -#define DEBUG_P(fmt, ...) rdebugP(fmt, ##__VA_ARGS__) -#define DEBUG_V(fmt, ...) rdebugV(fmt, ##__VA_ARGS__) -#define DEBUG_D(fmt, ...) rdebugD(fmt, ##__VA_ARGS__) -#define DEBUG_I(fmt, ...) rdebugI(fmt, ##__VA_ARGS__) -#define DEBUG_W(fmt, ...) rdebugW(fmt, ##__VA_ARGS__) -#define DEBUG_E(fmt, ...) rdebugE(fmt, ##__VA_ARGS__) - -// New way: To compatibility with SerialDebug (can use RemoteDebug or SerialDebug) -// This is my favorite :) - -#define debugV(fmt, ...) rdebugVln(fmt, ##__VA_ARGS__) -#define debugD(fmt, ...) rdebugDln(fmt, ##__VA_ARGS__) -#define debugI(fmt, ...) rdebugIln(fmt, ##__VA_ARGS__) -#define debugW(fmt, ...) rdebugWln(fmt, ##__VA_ARGS__) -#define debugE(fmt, ...) rdebugEln(fmt, ##__VA_ARGS__) -#define debugA(fmt, ...) rdebugAln(fmt, ##__VA_ARGS__) - -#define debugHandle() Debug.handle() - -// Macros used by code converter for codes with several prints to only message -// due the converter cannot -// convert severals Serial.print in one debug* macro. - -#define rprintV(x, ...) if (Debug.isActive(Debug.VERBOSE)) Debug.print(x, ##__VA_ARGS__) -#define rprintD(x, ...) if (Debug.isActive(Debug.DEBUG)) Debug.print(x, ##__VA_ARGS__) -#define rprintI(x, ...) if (Debug.isActive(Debug.INFO)) Debug.print(x, ##__VA_ARGS__) -#define rprintW(x, ...) if (Debug.isActive(Debug.WARNING)) Debug.print(x, ##__VA_ARGS__) -#define rprintE(x, ...) if (Debug.isActive(Debug.ERROR)) Debug.print(x, ##__VA_ARGS__) -#define rprintA(x, ...) if (Debug.isActive(Debug.ANY)) Debug.print(x, ##__VA_ARGS__) - - -#define rprintVln(x, ...) if (Debug.isActive(Debug.VERBOSE)) Debug.println(x, ##__VA_ARGS__) -#define rprintDln(x, ...) if (Debug.isActive(Debug.DEBUG)) Debug.println(x, ##__VA_ARGS__) -#define rprintIln(x, ...) if (Debug.isActive(Debug.INFO)) Debug.println(x, ##__VA_ARGS__) -#define rprintWln(x, ...) if (Debug.isActive(Debug.WARNING)) Debug.println(x, ##__VA_ARGS__) -#define rprintEln(x, ...) if (Debug.isActive(Debug.ERROR)) Debug.println(x, ##__VA_ARGS__) -#define rprintAln(x, ...) if (Debug.isActive(Debug.ANY)) Debug.println(x, ##__VA_ARGS__) - -///// Class - -class RemoteDebug: public Print -{ - public: - - // Constructor - - RemoteDebug(); - - // Methods - - bool begin(String hostName, uint16_t port, uint8_t startingDebugLevel = DEBUG); - bool begin(String hostName, uint8_t startingDebugLevel = DEBUG); - - void setPassword(String password); - - void stop(); - - void handle(); - - void disconnect(boolean onlyTelnetClient = false); - - void setSerialEnabled(boolean enable); - - void setResetCmdEnabled(boolean enable); - - void setHelpProjectsCmds(String help); - void setCallBackProjectCmds(void (*callback)()); - String getLastCommand(); - void clearLastCommand(); - - void showTime(boolean show); - void showProfiler(boolean show, uint32_t minTime = 0); - void showDebugLevel(boolean show); - void showColors(boolean show); - - void showRaw(boolean show); - - void setCallBackNewClient(void (*callback)()); - -#ifdef ALPHA_VERSION // In test, not good yet - void autoProfilerLevel(uint32_t millisElapsed); -#endif - - void setFilter(String filter); - void setNoFilter(); - - boolean isActive(uint8_t debugLevel = DEBUG); - - void silence(boolean activate, boolean showMessage = true, boolean fromBreak = false, uint32_t timeout = 0); - boolean isSilence(); - - void onConnection(boolean connected); - - boolean isConnected(); - -#ifdef DEBUGGER_ENABLED - // For Simple software debugger - based on SerialDebug Library - void initDebugger(boolean (*callbackEnabled)(), void (*callbackHandle)(const boolean), String (*callbackGetHelp)(), void (*callbackProcessCmd)()); - WiFiClient* getTelnetClient(); -#endif - -#ifndef WEBSOCKET_DISABLED // For web socket server (app) - void wsOnReceive(const char* command); - void wsSendInfo(); - void wsSendLevelInfo(); -#endif - boolean wsIsConnected(); - - // Print - - virtual size_t write(uint8_t); - - virtual size_t write(const uint8_t *buffer, size_t size); // Insert due a write bug w/ latest Esp8266 SDK - 17/08/18 - - // Debug levels - - static const uint8_t PROFILER = 0; // Used for show time of execution of pieces of code(profiler) - static const uint8_t VERBOSE = 1; // Used for show verboses messages - static const uint8_t DEBUG = 2; // Used for show debug messages - static const uint8_t INFO = 3; // Used for show info messages - static const uint8_t WARNING = 4; // Used for show warning messages - static const uint8_t ERROR = 5; // Used for show error messages - static const uint8_t ANY = 6; // Used for show always messages, for any current debug level - - // Expand characters as CR/LF to \\r, \\n - - String expand(String string); - - // Destructor - - ~RemoteDebug(); - -private: - - // Variables - - String _hostName = ""; // Host name - - boolean _connected = false; // Client is connected ? - - String _password = ""; // Password - - boolean _passwordOk = false; // Password request ? - 18/07/18 - uint8_t _passwordAttempt = 0; - - boolean _silence = false; // Silence mode ? - uint32_t _silenceTimeout = 0; // Silence timeout - - uint8_t _clientDebugLevel = DEBUG; // Level setted by user in web app or telnet client - uint8_t _lastDebugLevel = DEBUG; // Last Level setted by active() - - uint32_t _lastTimePrint = millis(); // Last time print a line - - uint8_t _levelBeforeProfiler=DEBUG; // Last Level before Profiler level - uint32_t _levelProfilerDisable = 0; // time in millis to disable the profiler level - uint32_t _autoLevelProfiler = 0; // Automatic change to profiler level if time between handles is greater than n millis - - boolean _showTime = false; // Show time in millis - - boolean _showProfiler = false; // Show time between messages - uint32_t _minTimeShowProfiler = 0; // Minimal time to show profiler - - boolean _showDebugLevel = true; // Show debug Level - - boolean _showColors = false; // Show colors - - boolean _showRaw = false; // Show in raw mode ? - - boolean _serialEnabled = false; // Send to serial too (not recommended) - - boolean _resetCommandEnabled=false; // Enable command to reset the board - - boolean _newLine = true; // New line write ? - - String _command = ""; // Command received - String _lastCommand = ""; // Last Command received - uint32_t _lastTimeCommand = millis();// Last time command received - String _helpProjectCmds = ""; // Help of comands setted by project (sketch) - void (*_callbackProjectCmds)() = NULL; // Callable for projects commands - void (*_callbackNewClient)() = NULL; // Callable for when have a new client connected - - String _filter = ""; // Filter - boolean _filterActive = false; - - String _bufferPrint = ""; // Buffer of print write to WiFi - -#ifdef CLIENT_BUFFERING - String _bufferSend = ""; // Buffer to send data to web app or telnet client - uint16_t _sizeBufferSend = 0; // Size of it - uint32_t _lastTimeSend = 0; // Last time command send data -#endif - -#ifdef DEBUGGER_ENABLED -// // For Simple software debugger - based on SerialDebug Library - boolean (*_callbackDbgEnabled)() = NULL;// Callable for debugger enabled - void (*_callbackDbgHandle)(const boolean) = NULL; // Callable for handle of debugger - String (*_callbackDbgHelp)() = NULL; // Callable for get debugger help - void (*_callbackDbgProcessCmd)() = NULL;// Callable for process commands of debugger -#endif - - //////// Privates - - void showHelp(); - void processCommand(); - String formatNumber(uint32_t value, uint8_t size, char insert='0'); - boolean isCRLF(char character); - uint32_t getFreeMemory(); - -#ifdef ALPHA_VERSION // In test, not good yet - void sendTelnetCommand(uint8_t command, uint8_t option); -#endif - -}; - -#else // DEBUG_DISABLED - -// Disable debug macros - -#define rdebugAln(...) -#define rdebugPln(...) -#define rdebugVln(...) -#define rdebugDln(...) -#define rdebugIln(...) -#define rdebugWln(...) -#define rdebugEln(...) -#define rdebug(...) - -#define DEBUG(...) - -#define DEBUG_A(...) -#define DEBUG_P(...) -#define DEBUG_V(...) -#define DEBUG_D(...) -#define DEBUG_I(...) -#define DEBUG_W(...) -#define DEBUG_E(...) - -#define debugA(...) -#define debugP(...) -#define debugV(...) -#define debugD(...) -#define debugI(...) -#define debugW(...) -#define debugE(...) - -#define rprintA(...) -#define rprintV(...) -#define rprintD(...) -#define rprintI(...) -#define rprintW(...) -#define rprintE(...) - -#define rprintAln(...) -#define rprintVln(...) -#define rprintDln(...) -#define rprintIln(...) -#define rprintWln(...) -#define rprintEln(...) - -#define debugHandle() - -// Note all of Debug. codes need uses "#ifndef DEBUG_DISABLED" -// For example, the initialization codes and: - -//#ifndef DEBUG_DISABLED -//if (Debug.isActive(Debug.VERBOSE)) { -// Debug.printf("bla bla bla: %d %s", number, str); // OR -// Debug.printf("bla bla bla: %d %s", number, str.c_str()); // Note: if type is String need c_str() // OR -// Debug.println("bla bla bla 2 ln"); -//} -//#endif - -#endif // DEBUG_DISABLED - -#endif // H - -//////// End diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebugCfg.h b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebugCfg.h deleted file mode 100644 index 215c898..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/RemoteDebugCfg.h +++ /dev/null @@ -1,135 +0,0 @@ - -/* - * Header for RemoteDebugCfg - * - * MIT License - * - * Copyright (c) 2019 Joao Lopes - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * - */ - -/* - * All configurations have moved to RemoteDebugCfg.h, - * to facilitate changes - */ - -///////////// User config, to not lost in library updates - -#ifndef REMOTEDEBUGCFG_H_ -#define REMOTEDEBUGCFG_H_ -#pragma once - -///////////// For RemoteDebug /////////////////// - -///// Debug disable for compile to production/release -///// as nothing of RemotedDebug is compiled, zero overhead :-) -//#define DEBUG_DISABLED true - -// Debug enabled ? - -#ifndef DEBUG_DISABLED - -///// Port for telnet server -#define TELNET_PORT 23 - -// Disable auto function for debug macros? (uncomment this if not want this) -//#define DEBUG_DISABLE_AUTO_FUNC true - -// Simple password request - left commented if not need this - 18/07/18 -// Notes: -// It is very simple feature, only text, no cryptography, -// and the password is echoed in screen (I not discovery yet how disable it) -// telnet use advanced authentication (kerberos, etc.) -// Such now as RemoteDebug now is not for production releases, -// this kind of authentication will not be done now. -// Can be by project, just call setPassword method -#define REMOTEDEBUG_PWD_ATTEMPTS 3 - -// Maximum time for inactivity (em milliseconds) -// Default: 10 minutes -// Comment it if you not want this -// Can be by project, just define it before include this file -//#define MAX_TIME_INACTIVE 600000 - -// Buffered print write to WiFi -> length of buffer -// Can be by project, just define it before include this file -#define BUFFER_PRINT 170 - -// Should the help text be displayed on connection. -// Enabled by default, comment to disable -#define SHOW_HELP true - -// Buffering (sends in interval of time to avoid ESP misterious delays) -// Uncomment this to disable it -#define CLIENT_BUFFERING true -#ifdef CLIENT_BUFFERING -#define DELAY_TO_SEND 10 // Time to send buffer -#define MAX_SIZE_SEND 1460 // Maximum size of packet (limit of TCP/IP) -#endif - -// Enable if you test features yet in development -//#define ALPHA_VERSION true - -// Debugger support enabled ? -// Comment this to disable it -#define DEBUGGER_ENABLED true -#ifdef DEBUGGER_ENABLED -#define DEBUGGER_HANDLE_TIME 850 // Interval to call handle of debugger - equal to implemented in debugger -// App have debugger elements on screen ? -// Note: app not have it yet -//#define DEBUGGER_SEND_INFO true -#endif - -///// Websocket server to support debug over web browser (RemoteDebugApp) -// Uncomment this to disable it -#define WEBSOCKET_DISABLED true - -///////////// For RemoteDebugWS /////////////////// - -#ifndef WEBSOCKET_DISABLED - -// Websocket port -#define WEBSOCKET_PORT 8232 - -// Library arduinoWebSockets already installed, uncomment to use it -// Do this if you receive errors of multiple definition ... -//#define USE_LIB_WEBSOCKET true -#endif - -///////////// For RemoteDebugger /////////////////// - -// Enable Flash variables support - F() -// Used internally in SerialDebug and in public API -// If is a low memory board, like AVR, all strings in SerialDebug is using flash memory -// If have RAM memory, this is more fast than flash -//#define DEBUG_USE_FLASH_F true - -// For Espressif boards, default is not flash support for printf, -// due it have a lot of memory and Serial.printf is not compatible with it -// If you need more memory, can force it: -//#define DEBUG_USE_FLASH_F true - -#endif /* DEBUG_DISABLED */ - -#endif /* REMOTEDEBUGCFG_H_ */ - -////// End diff --git a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/telnet.h b/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/telnet.h deleted file mode 100644 index 474dcde..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/RemoteDebug/src/telnet.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * telnet.h - Telnet Defines - * - * Note: only used is uncommented - * */ - -#ifndef TELNET_H -#define TELNET_TELNET_H - -#define TELNET_IAC 255 -#define TELNET_DONT 254 -#define TELNET_DO 253 -#define TELNET_WONT 252 -#define TELNET_WILL 251 - -// #define TELNET_SE 240 // Subnegotiation End -// #define TELNET_NOP 241 // No Operation -// #define TELNET_DM 242 // Data Mark -// #define TELNET_BRK 243 // Break -// #define TELNET_IP 244 // Interrupt process -// #define TELNET_AO 245 // Abort output -// #define TELNET_AYT 246 // Are You There -// #define TELNET_EC 247 // Erase Character -// #define TELNET_EL 248 // Erase Line -//#define TELNET_GA 249 // Go Ahead -// #define TELNET_SB 250 // Subnegotiation Begin - -// #define TELNET_BINARY 0 // 8-bit data path -#define TELNET_ECHO 1 // echo -// #define TELNET_RCP 2 // prepare to reconnect -#define TELNET_SGA 3 // suppress go ahead -// #define TELNET_NAMS 4 // approximate message size -// #define TELNET_STATUS 5 // give status -// #define TELNET_TM 6 // timing mark -// #define TELNET_RCTE 7 // remote controlled transmission and echo -// #define TELNET_NAOL 8 // negotiate about output line width -// #define TELNET_NAOP 9 // negotiate about output page size -// #define TELNET_NAOCRD 10 // negotiate about CR disposition -// #define TELNET_NAOHTS 11 // negotiate about horizontal tabstops -// #define TELNET_NAOHTD 12 // negotiate about horizontal tab disposition -// #define TELNET_NAOFFD 13 // negotiate about formfeed disposition -// #define TELNET_NAOVTS 14 // negotiate about vertical tab stops -// #define TELNET_NAOVTD 15 // negotiate about vertical tab disposition -// #define TELNET_NAOLFD 16 // negotiate about output LF disposition -// #define TELNET_XASCII 17 // extended ascii character set -// #define TELNET_LOGOUT 18 // force logout -// #define TELNET_BM 19 // byte macro -// #define TELNET_DET 20 // data entry terminal -// #define TELNET_SUPDUP 21 // supdup protocol -// #define TELNET_SUPDUPOUTPUT 22 // supdup output -// #define TELNET_SNDLOC 23 // send location -// #define TELNET_TTYPE 24 // terminal type -// #define TELNET_EOR 25 // end or record -// #define TELNET_TUID 26 // TACACS user identification -// #define TELNET_OUTMRK 27 // output marking -// #define TELNET_TTYLOC 28 // terminal location number -// #define TELNET_VT3270REGIME 29 // 3270 regime -// #define TELNET_X3PAD 30 // X.3 PAD -// #define TELNET_NAWS 31 // window size -// #define TELNET_TSPEED 32 // terminal speed -// #define TELNET_LFLOW 33 // remote flow control -// #define TELNET_LINEMODE 34 // Linemode option -// #define TELNET_XDISPLOC 35 // X Display Location -// #define TELNET_OLD_ENVIRON 36 // Old - Environment variables -// #define TELNET_AUTHENTICATION 37 // Authenticate -// #define TELNET_ENCRYPT 38 // Encryption option -// #define TELNET_NEW_ENVIRON 39 // New - Environment variables -// #define TELNET_TN3270E 40 // TN3270E -// #define TELNET_XAUTH 41 // XAUTH -// #define TELNET_CHARSET 42 // CHARSET -// #define TELNET_RSP 43 // Telnet Remote Serial Port -// #define TELNET_COM_PORT_OPTION 44 // Com Port Control Option -#define TELNET_SUPPRESS_LOCAL_ECHO 45 // Telnet Suppress Local Echo -// #define TELNET_TLS 46 // Telnet Start TLS -// #define TELNET_KERMIT 47 // KERMIT -// #define TELNET_SEND_URL 48 // SEND-URL -// #define TELNET_FORWARD_X 49 // FORWARD_X -// #define TELNET_PRAGMA_LOGON 138 // TELOPT PRAGMA LOGON -// #define TELNET_SSPI_LOGON 139 // TELOPT SSPI LOGON -// #define TELNET_PRAGMA_HEARTBEAT 140 // TELOPT PRAGMA HEARTBEAT -// #define TELNET_EXOPL 255 // Extended-Options-List -// #define TELNET_NOOPT 0 - -// #define TELNET_IS 0 -// #define TELNET_SEND 1 - -#endif // TELNET_H - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/LICENSE b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/LICENSE deleted file mode 100644 index cf1ab25..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/README.md b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/README.md deleted file mode 100644 index 7dc5190..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/README.md +++ /dev/null @@ -1,518 +0,0 @@ -[![PlatformIO](https://github.com/chrisjoyce911/esp32FOTA/workflows/PlatformIO/badge.svg)](https://github.com/chrisjoyce911/esp32FOTA/actions/) - -[![arduino-library-badge](https://www.ardu-badge.com/badge/esp32FOTA.svg?)](https://www.ardu-badge.com/esp32FOTA) -[![PlatformIO Registry](https://badges.registry.platformio.org/packages/chrisjoyce911/library/esp32FOTA.svg)](https://registry.platformio.org/libraries/chrisjoyce911/esp32FOTA) - - - -# esp32FOTA library for Arduino - -## Purpose - -A simple library to add support for Over-The-Air (OTA) updates to your project. - -## Features - -- [x] Zlib or gzip compressed firmware support -- [x] SPIFFS/LittleFS partition Update [#25], [#47], [#60], [#92] (thanks to all participants) -- [x] Any fs::FS support (SPIFFS/LITTLEFS/SD) for cert/signature storage [#79], [#74], [#91], [#92] (thanks to all participants) -- [x] Seamless http/https -- [x] Web update (requires web server) -- [x] Batch firmware sync -- [x] Force firmware update [#8] -- [x] https support [#26] ( Thanks to @fbambusi ) -- [x] Signature check of downloaded firmware-image [#65] -- [x] Signature verification -- [x] Semantic versioning support -- [ ] Checking for update via bin headers [#15] - -## How it works - -This library tries to access a JSON file hosted on a webserver, and reviews it to decide if a newer firmware has been published, if so it will download it and install it. - -There are a few things that need to be in place for an update to work. - -- A webserver with the firmware information in a JSON file -- Firmware version -- Firmware type -- Firmware bin (can optionnally be compressed with zlib or gzip) -- For https or signature check: SPIFFS with root_ca.pem (https) and rsa_key.pem (signature check) - -You can supply http or https URLs. If you are using https, you need the root_ca.pem in your SPIFFS partition. For the actual firmware it will use https when you define port 443 or 4433. Otherwise it will use plain http. - -## Usage - -### Hosted JSON - -This is hosted by a webserver and contains information about the latest firmware: - -```json -{ - "type": "esp32-fota-http", - "version": 2, - "host": "192.168.0.100", - "port": 80, - "bin": "/fota/esp32-fota-http-2.bin" -} -``` - -Version information can be either a single number or a semantic version string. Alternatively, a full URL path can be provided: - -```json -{ - "type": "esp32-fota-http", - "version": "2.5.1", - "url": "http://192.168.0.100/fota/esp32-fota-http-2.bin" -} -``` - -A single JSON file can provide information on multiple firmware types by combining them together into an array. When this is loaded, the firmware manifest with a type matching the one passed to the esp32FOTA constructor will be selected: - -```json -[ - { - "type":"esp32-fota-http", - "version":"0.0.2", - "url":"http://192.168.0.100/fota/esp32-fota-http-2.bin" - }, - { - "type":"esp32-other-hardware", - "version":"0.0.3", - "url":"http://192.168.0.100/fota/esp32-other-hardware.bin" - } -] -``` - - -A single JSON file can also contain several versions of a single firmware type: - -```json -[ - { - "type":"esp32-fota-http", - "version":"0.0.2", - "url":"http://192.168.0.100/fota/esp32-fota-0.0.2.bin" - }, - { - "type":"esp32-fota-http", - "version":"0.0.3", - "url":"http://192.168.0.100/fota/esp32-fota-0.0.3.bin", - "spiffs":"http://192.168.0.100/fota/esp32-fota-0.0.3.spiffs.bin" - } -] -``` - - - - -#### Filesystem image (spiffs/littlefs) - -Adding `spiffs` key to the JSON entry will end up with the filesystem being updated first, then the firmware. - -Obviously don't use the filesystem you're updating to store certificates needed by the update, spiffs partition -doesn't have redundancy like OTA0/OTA1 and won't recover from a failed update without a restart and format. - -```json -{ - "type": "esp32-fota-http", - "version": 2, - "host": "192.168.0.100", - "port": 80, - "bin": "/fota/esp32-fota-http-2.bin", - "spiffs": "/fota/default_spiffs.bin" -} -``` - -Other accepted keys for filesystems are `spiffs`, `littlefs` and `fatfs`. -Picking one or another doesn't make any difference yet. - - -#### Firmware types - -Types are used to compare with the current loaded firmware, this is used to make sure that when loaded, the device will still do the intended job. - -As an example, a device used as a data logger should ony be updated with new versions of the data logger. - -##### examples - -- TTGO-T8-ESP32-Logger -- TTGO-T8-ESP32-Temp -- TTGO-T8-ESP32-Relay - - -### Debug - -Messages depends of build level. If you pass -D CORE_DEBUG_LEVEL=3 to build flags, it enable the messages - -### Sketch - -In this early init example, a version 1 of 'esp32-fota-http' is in use, it would be updated when using the JSON example. - -```cpp -#include - -const char *ssid = ""; -const char *password = ""; - -esp32FOTA esp32FOTA("esp32-fota-http", "1.0.0"); - -const char* manifest_url = "http://server/fota/fota.json"; - -void setup() -{ - Serial.begin(115200); - setup_wifi(); - esp32FOTA.setManifestURL( manifest_url ); - // esp32FOTA.useDeviceId( true ); // optionally append the device ID to the HTTP query -} - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to "); - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } -} - -void loop() -{ - esp32FOTA.handle(); - // or ... - // bool updatedNeeded = esp32FOTA.execHTTPcheck(); - // if (updatedNeeded) { - // esp32FOTA.execOTA(); - // } - delay(2000); -} -``` - - -Late init is possible using `FOTAConfig_t`, allowing more complex configurations: - -```cpp -#include // include filesystem *before* esp32FOTA librart -#include - -esp32FOTA FOTA; - -const char* manifest_url = "http://server/fota/fota.json"; -const char* fota_name = "esp32-fota-http"; - -// CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SPIFFS ); -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &SD ); - -void setup() -{ - Serial.begin( 115200 ); - setup_wifi(); - - { - auto cfg = FOTA.getConfig(); - cfg.name = fota_name; - cfg.manifest_url = manifest_url; - cfg.sem = SemverClass( 1, 0, 0 ); // major, minor, patch - cfg.check_sig = false; // verify signed firmware with rsa public key - cfg.unsafe = true; // disable certificate check when using TLS - //cfg.root_ca = MyRootCA; - //cfg.pub_key = MyRSAKey; - //cfg.use_device_id = false; - FOTA.setConfig( cfg ); - } -} - -void loop() -{ - esp32FOTA.handle(); - // or ... - // bool updatedNeeded = esp32FOTA.execHTTPcheck(); - // if (updatedNeeded) { - // esp32FOTA.execOTA(); - // } - delay(2000); -} - -``` - - -### Zlib/gzip support - -⚠️ This feature cannot be used with signature check. - - -For firmwares compressed with `pigz` utility (see , file extension must be `.zz`: - -```cpp -#include // http://github.com/vortigont/esp32-flashz -#include -``` - -```bash -$ pigz -9kzc esp32-fota-http-2.bin > esp32-fota-http-2.bin.zz -``` - -```json -{ - "type": "esp32-fota-http", - "version": "2.5.1", - "url": "http://192.168.0.100/fota/esp32-fota-http-2.bin.zz" -} -``` - - -For firmwares compressed with `gzip` utility, file extension must be `.gz` - -```cpp -#include // http://github.com/tobozo/ESP32-targz -#include -``` - -```bash -$ gzip -c esp32-fota-http-2.bin > esp32-fota-http-2.bin.gz -``` - -```json -{ - "type": "esp32-fota-http", - "version": "2.5.1", - "url": "http://192.168.0.100/fota/esp32-fota-http-2.bin.gz" -} -``` - - - - - - -### Root Certificates - -Certificates and signatures can be stored in different places: any fs::FS filesystem or progmem as const char*. - -Filesystems: - -```C++ -CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SPIFFS ); -``` - -```C++ -CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &LittleFS ); -``` - -```C++ -CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SD ); -``` - -Progmem: - -```C++ -const char* root_ca = R"ROOT_CA( ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- -)ROOT_CA"; - -// mixed sources is possible -CryptoMemAsset *MyRootCA = new CryptoMemAsset("Root CA", root_ca, strlen(root_ca)+1 ); -CryptoFileAsset *MyPubKey = new CryptoFileAsset("RSA Key", "/rsa_key.pub", &SD); - -``` - -Then later in the `setup()`: - -```C++ - -const char* manifest_url = "http://server/fota/fota.json"; - -void setup() -{ - // (...) - esp32FOTA.setManifestURL( manifest_url ); - esp32FOTA.setRootCA( MyRootCA ); - esp32FOTA.setPubKey( MyPubKey ); -} - -``` - - -# Update callbacks - - -## Progress callback - -Can be used to draw a progress bar e.g. on a TFT. - -The callback signature is: `void my_progress_callback( size_t progress, size_t size);`, lambda functions are accepted. - -Use `esp32FOTA.setProgressCb( my_progress_callback )` to attach the callback. - -This method is aliased to Update.h `onProgress()` feature and defaults to printing dots in the serial console. - -```C++ -void my_progress_callback( size_t progress, size_t size ) -{ - if( progress == size || progress == 0 ) Serial.println(); - Serial.print("."); -} - -void setup() -{ - // (...) - - // usage with callback function: - esp32FOTA.setProgressCb( my_progress_callback ) ; - - // usage with lambda function: - esp32FOTA.setProgressCb( [](size_t progress, size_t size) { - if( progress == size || progress == 0 ) Serial.println(); - Serial.print("."); - }); -} -``` - - -## Update begin-fail callback - -- Description: fired when Update.begin() failed -- Callback type: `void(int partition)` -- Callback setter: `setUpdateBeginFailCb( cb )` -- Usage: - -```cpp -esp32FOTA.setUpdateBeginFailCb( [](int partition) { - Serial.printf("Update could not begin with %s partition\n", partition==U_SPIFFS ? "spiffs" : "firmware" ); -}); -``` - -## Update end callback - -- Description: fired after Update.end() and before signature check -- Callback type: `void(int partition)` -- Callback setter: `setUpdateEndCb( cb )` -- Usage: - -```cpp -esp32FOTA.setUpdateEndCb( [](int partition) { - Serial.printf("Update could not finish with %s partition\n", partition==U_SPIFFS ? "spiffs" : "firmware" ); -}); -``` - - -## Update check-fail callback - -- Description: fired when partition or signature check failed -- Callback type: `void(int partition, int update_error_code)` -- Callback setter: `setUpdateCheckFailCb( cb )` -- Usage: - -```cpp -esp32FOTA.setUpdateCheckFailCb( [](int partition, int error_code) { - Serial.printf("Update could validate %s partition (error %d)\n", partition==U_SPIFFS ? "spiffs" : "firmware", error_code ); - // error codes: - // -1 : partition not found - // -2 : validation (signature check) failed -}); -``` - - -## Update finished callback - -- Description: fired update is complete -- Callback type: `void(int partition, bool needs_restart)` -- Callback setter: `setUpdateFinishedCb( cb )` -- Usage: - -```cpp -esp32FOTA.setUpdateFinishedCb( [](int partition, bool restart_after) { - Serial.printf("Update could not begin with %s partition\n", partition==U_SPIFFS ? "spiffs" : "firmware" ); - // do some stuff e.g. notify a MQTT server the update completed successfully - if( restart_after ) { - ESP.restart(); - } -}); -``` - - - - - - -### Verified images via signature - -You can now sign your firmware image with an RSA public/private key pair and have the ESP32 check if the signature is correct before -it switches over to the new image. - -In order to use this feature just set the boolean `validate` to `true` in the constructor. Next create a key-pair to sign your firmware image: -``` -openssl genrsa -out priv_key.pem 4096 -openssl rsa -in priv_key.pem -pubout > rsa_key.pub -``` - -Compile your code so you get your OTA update file (e.g. `firmware.bin`). Now it's time to create the signature: -``` -# Create signature file -openssl dgst -sign priv_key.pem -keyform PEM -sha256 -out firmware.sign -binary firmware.bin - -# throw it all in one file -cat firmware.sign firmware.bin > firmware.img -``` - -Upload `firmware.img` to your OTA server and point to it in your `firmware.json` - -Last step, create an SPIFFS partition with your `rsa_key.pub` in it. The OTA update should not touch this partition during the update. You'll only need to distribute this partition once. - -On the next update-check the ESP32 will download the `firmware.img` extract the first 512 bytes with the signature and check it together with the public key against the new image. If the signature check runs OK, it'll reset into the new firmware. - - - -[#8]: https://github.com/chrisjoyce911/esp32FOTA/issues/8 -[#15]: https://github.com/chrisjoyce911/esp32FOTA/issues/15 -[#25]: https://github.com/chrisjoyce911/esp32FOTA/issues/25 -[#26]: https://github.com/chrisjoyce911/esp32FOTA/issues/26 -[#60]: https://github.com/chrisjoyce911/esp32FOTA/issues/60 -[#65]: https://github.com/chrisjoyce911/esp32FOTA/issues/65 -[#74]: https://github.com/chrisjoyce911/esp32FOTA/issues/74 -[#47]: https://github.com/chrisjoyce911/esp32FOTA/pull/47 -[#79]: https://github.com/chrisjoyce911/esp32FOTA/pull/79 -[#91]: https://github.com/chrisjoyce911/esp32FOTA/pull/91 -[#92]: https://github.com/chrisjoyce911/esp32FOTA/pull/92 - - -### Libraries - -This library relies on [semver.c by h2non](https://github.com/h2non/semver.c) for semantic versioning support. semver.c is licensed under [MIT](https://github.com/h2non/semver.c/blob/master/LICENSE). - -Optional dependencies (zlib/gzip support): -* [esp32-flashz](https://github.com/vortigont/esp32-flashz) -* [esp32-targz](https://github.com/tobozo/ESP32-targz) - - -### Thanks to - -* @nuclearcat -* @thinksilicon -* @tuan-karma -* @hpsaturn -* @tobozo -* @vortigont - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTP/HTTP.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTP/HTTP.ino deleted file mode 100644 index 0f58694..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTP/HTTP.ino +++ /dev/null @@ -1,60 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update from a bin located on a webserver (HTTP Only) - - Setup: - Step 1 : Set your WiFi (ssid & password) - Step 2 : set esp32fota() - - Upload: - Step 1 : Menu > Sketch > Export Compiled Library. The bin file will be saved in the sketch folder (Menu > Sketch > Show Sketch folder) - Step 2 : Upload it to your webserver - Step 3 : Update your firmware JSON file ( see firwmareupdate ) - -*/ - -#include -#include - - -// esp32fota esp32fota("", , ); -esp32FOTA esp32FOTA("esp32-fota-http", 1, false); - -const char* manifest_url = "http://server/fota/fota.json"; - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi"); - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - -void setup() -{ - Serial.begin(115200); - esp32FOTA.setManifestURL( manifest_url ); - esp32FOTA.printConfig(); - setup_wifi(); -} - -void loop() -{ - - bool updatedNeeded = esp32FOTA.execHTTPcheck(); - if (updatedNeeded) - { - esp32FOTA.execOTA(); - } - - delay(2000); -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTPS/HTTPS.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTPS/HTTPS.ino deleted file mode 100644 index dfbab0e..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTPS/HTTPS.ino +++ /dev/null @@ -1,71 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update from a bin located on a webserver (HTTPS) - - Setup: - Step 1 : Set your WiFi (ssid & password) - Step 2 : set esp32fota() - Step 3 : Provide SPIFFS filesystem with root_ca.pem of your webserver - - Upload: - Step 1 : Menu > Sketch > Export Compiled Library. The bin file will be saved in the sketch folder (Menu > Sketch > Show Sketch folder) - Step 2 : Upload it to your webserver - Step 3 : Update your firmware JSON file ( see firwmareupdate ) - -*/ - -#include - -#include - -#include -#include -#include - - -// esp32fota esp32fota("", , ); -esp32FOTA esp32FOTA("esp32-fota-http", 1, false); -const char* manifest_url = "https://server/fota/fota.json"; - -CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SPIFFS ); - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi"); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - -void setup() -{ - Serial.begin(115200); - // Provide spiffs with root_ca.pem to validate server certificate - SPIFFS.begin(true); - esp32FOTA.setManifestURL( manifest_url ); - esp32FOTA.setRootCA( MyRootCA ); - esp32FOTA.printConfig(); - setup_wifi(); -} - -void loop() -{ - - bool updatedNeeded = esp32FOTA.execHTTPcheck(); - if (updatedNeeded) - { - esp32FOTA.execOTA(); - } - - delay(2000); -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTPS_without_root_cert/HTTPS_without_root_cert.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTPS_without_root_cert/HTTPS_without_root_cert.ino deleted file mode 100644 index ac19647..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTPS_without_root_cert/HTTPS_without_root_cert.ino +++ /dev/null @@ -1,65 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update from a bin located on a webserver (HTTPS) without having a root cert - - Setup: - Step 1 : Set your WiFi (ssid & password) - Step 2 : set esp32fota() - - Upload: - Step 1 : Menu > Sketch > Export Compiled Library. The bin file will be saved in the sketch folder (Menu > Sketch > Show Sketch folder) - Step 2 : Upload it to your webserver - Step 3 : Update your firmware JSON file ( see firwmareupdate ) - -*/ - -#include - -#include - -#include -#include -#include - - -// esp32fota esp32fota("", , , ); -esp32FOTA esp32FOTA("esp32-fota-http", 1, false, true); -const char* manifest_url = "http://server/fota/fota.json"; - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi"); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - -void setup() -{ - Serial.begin(115200); - esp32FOTA.setManifestURL( manifest_url ); - esp32FOTA.printConfig(); - setup_wifi(); -} - -void loop() -{ - - bool updatedNeeded = esp32FOTA.execHTTPcheck(); - if (updatedNeeded) - { - esp32FOTA.execOTA(); - } - - delay(2000); -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTP_signature_check/HTTP_signature_check.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTP_signature_check/HTTP_signature_check.ino deleted file mode 100644 index ae56dff..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/HTTP/HTTP_signature_check/HTTP_signature_check.ino +++ /dev/null @@ -1,70 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update from a bin located on a webserver (HTTP Only) - - Setup: - Step 1 : Set your WiFi (ssid & password) - Step 2 : set esp32fota() - - Upload: - Step 1 : Menu > Sketch > Export Compiled Library. The bin file will be saved in the sketch folder (Menu > Sketch > Show Sketch folder) - Step 2 : Upload it to your webserver - Step 3 : Update your firmware JSON file ( see firwmareupdate ) - -*/ -#include -#include - -#include -#include - -#include - - -// esp32fota esp32fota("", , ); -esp32FOTA esp32FOTA("esp32-fota-http", 1, true); - -const char* manifest_url = "http://server/fota/fota.json"; -CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &SPIFFS ); - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi"); - - // Need to provide SPIFFS with rsa_key.pub inside. - SPIFFS.begin( true ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - -void setup() -{ - Serial.begin(115200); - esp32FOTA.setManifestURL( manifest_url ); - esp32FOTA.setPubKey( MyRSAKey ); - esp32FOTA.printConfig(); - setup_wifi(); -} - -void loop() -{ - - bool updatedNeeded = esp32FOTA.execHTTPcheck(); - if (updatedNeeded) - { - esp32FOTA.execOTA(); - } - - delay(2000); -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/anyFS.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/anyFS.ino deleted file mode 100644 index e2cb853..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/anyFS.ino +++ /dev/null @@ -1,129 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update from a bin located on a webserver (HTTPS) - -*/ - -// declare filesystem first ! - -//#include -//#include -//#include -#include -//#include - -//#include // optional esp32-flashz for zlib compressed firmwares -//#include // optional ESP32-targz for gzip compressed firmwares -#include // fota pulls WiFi library - - - -// esp32fota settings -const int firmware_version = 1; -#if !defined FOTA_URL - #define FOTA_URL "http://server/fota/fota.json" -#endif -const char* firmware_name = "esp32-fota-http"; -const bool check_signature = false; -const bool disable_security = false; -// for debug only -const char* description = "Basic example with any filesystem"; - -CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &LittleFS ); -// CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SPIFFS ); -// CryptoMemAsset *MyRootCA = new CryptoMemAsset("Certificates Chain", root_ca, strlen(root_ca)+1 ); - -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &SPIFFS ); -CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &LittleFS ); -// CryptoMemAsset *MyRSAKey = new CryptoMemAsset("RSA Public Key", rsa_key_pub, strlen(rsa_key_pub)+1 ); - - -esp32FOTA FOTA; // empty constructor - - -bool WiFiConnected() -{ - return (WiFi.status() == WL_CONNECTED); -} - - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi "); - Serial.println( WiFi.macAddress() ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while ( !WiFiConnected() ) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); - -} - - -void setup() -{ - Serial.begin(115200); - // Provide filesystem with root_ca.pem to validate server certificate - if( ! LittleFS.begin( false ) ) { - Serial.println("LittleFS Mounting failed, aborting!"); - while(1) vTaskDelay(1); - } - - - { - auto cfg = FOTA.getConfig(); - - cfg.name = (char*)firmware_name; - cfg.manifest_url = (char*)FOTA_URL; - cfg.sem = SemverClass( firmware_version ); - cfg.check_sig = check_signature; - cfg.unsafe = disable_security; - cfg.root_ca = MyRootCA; - cfg.pub_key = MyRSAKey; - - FOTA.setConfig( cfg ); - } - - FOTA.printConfig(); - // FOTA.setStatusChecker( WiFiConnected ); - - - // /!\ FOTA.checkURL is deprecated, use setManifestURL( String ) instead - //FOTA.setManifestURL( FOTA_URL ); - //FOTA.setRootCA( MyRootCA ); - //FOTA.setPubKey( MyRSAKey ); - // use this when more than one filesystem is used in the sketch - // FOTA.setCertFileSystem( &SD ); - - // show progress when an update occurs (e.g. on a TFT display) - FOTA.setProgressCb( [](size_t progress, size_t size) { - if( progress == size || progress == 0 ) Serial.println(); - Serial.print("."); - }); - - // add some custom headers to the http queries - FOTA.setExtraHTTPHeader("Authorization", "Basic "); - - setup_wifi(); -} - -void loop() -{ - - bool updatedNeeded = FOTA.execHTTPcheck(); - if (updatedNeeded) - { - FOTA.execOTA(); - } - - delay(20000); -} - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/data/root_ca.pem b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/data/root_ca.pem deleted file mode 100644 index 342ecfe..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/data/root_ca.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.1.nosecurity/1.1.nosecurity.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.1.nosecurity/1.1.nosecurity.ino deleted file mode 100644 index 6942cf2..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.1.nosecurity/1.1.nosecurity.ino +++ /dev/null @@ -1,84 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update to both firmware and filesystem from binaries located - on a webserver (HTTPS) without checking for certificate validity - - Usage: If the ESP32 had a previous successful WiFi connection, then no need to set the ssid/password - to run this sketch, the credentials are still cached :-) - Sketch 1 will FOTA to Sketch 2, then Sketch 3, and so on until all versions in firmware.json are - exhausted. - - -*/ - -#include // optional ESP32-targz for gzip compressed firmwares -#include -#include - -// esp32fota settings -int firmware_version_major = 1; -int firmware_version_minor = 1; -int firmware_version_patch = 0; - -// #define FOTA_URL "http://server/fota/fota.json" - -const char* firmware_name = "esp32-fota-http"; -const bool check_signature = false; -const bool disable_security = true; -// for debug only -const char* title = "1.1"; -const char* description = "Basic example with no security and no filesystem"; - - -esp32FOTA FOTA; - - -void setup_wifi() -{ - delay(10); - - Serial.print("MAC Address "); - Serial.println( WiFi.macAddress() ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - - -void setup() -{ - Serial.begin(115200); - - PrintFOTAInfo(); - - { - auto cfg = FOTA.getConfig(); - cfg.name = (char*)firmware_name; - cfg.manifest_url = (char*)FOTA_URL; - cfg.sem = SemverClass( firmware_version_major, firmware_version_minor, firmware_version_patch ); - cfg.check_sig = check_signature; - cfg.unsafe = disable_security; - //cfg.root_ca = MyRootCA; - //cfg.pub_key = MyRSAKey; - FOTA.setConfig( cfg ); - } - FOTA.printConfig(); - - setup_wifi(); -} - - -void loop() -{ - FOTA.handle(); - delay(20000); -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.2.nosecurity.gz/1.2.nosecurity.gz.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.2.nosecurity.gz/1.2.nosecurity.gz.ino deleted file mode 100644 index 35a422a..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.2.nosecurity.gz/1.2.nosecurity.gz.ino +++ /dev/null @@ -1,88 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update to both firmware and filesystem from binaries located - on a webserver (HTTPS) without checking for certificate validity - - Usage: If the ESP32 had a previous successful WiFi connection, then no need to set the ssid/password - to run this sketch, the credentials are still cached :-) - Sketch 1 will FOTA to Sketch 2, then Sketch 3, and so on until all versions in firmware.json are - exhausted. - - -*/ - -#include // optional esp32-flashz for gzipped firmwares -#include -#include - -// esp32fota settings -int firmware_version_major = 1; -int firmware_version_minor = 2; -int firmware_version_patch = 0; - -// #define FOTA_URL "http://server/fota/fota.json" - -const char* firmware_name = "esp32-fota-http"; -const bool check_signature = false; -const bool disable_security = true; -// for debug only -const char* title = "1.2"; -const char* description = "Basic *gzipped* example with no security and no filesystem"; - - -esp32FOTA FOTA; - - -void setup_wifi() -{ - delay(10); - - Serial.print("MAC Address "); - Serial.println( WiFi.macAddress() ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - - -void setup() -{ - Serial.begin(115200); - - PrintFOTAInfo(); - - { - auto cfg = FOTA.getConfig(); - cfg.name = (char*)firmware_name; - cfg.manifest_url = (char*)FOTA_URL; - cfg.sem = SemverClass( firmware_version_major, firmware_version_minor, firmware_version_patch ); - cfg.check_sig = check_signature; - cfg.unsafe = disable_security; - //cfg.root_ca = MyRootCA; - //cfg.pub_key = MyRSAKey; - FOTA.setConfig( cfg ); - } - FOTA.printConfig(); - - setup_wifi(); -} - -void loop() -{ - bool updatedNeeded = FOTA.execHTTPcheck(); - if (updatedNeeded) { - FOTA.execOTA(); - } - - delay(20000); -} - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.3.nosecurity.zz/1.3.nosecurity.zz.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.3.nosecurity.zz/1.3.nosecurity.zz.ino deleted file mode 100644 index ff46a3d..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/1.3.nosecurity.zz/1.3.nosecurity.zz.ino +++ /dev/null @@ -1,87 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update to both firmware and filesystem from binaries located - on a webserver (HTTPS) without checking for certificate validity - - Usage: If the ESP32 had a previous successful WiFi connection, then no need to set the ssid/password - to run this sketch, the credentials are still cached :-) - Sketch 1 will FOTA to Sketch 2, then Sketch 3, and so on until all versions in firmware.json are - exhausted. - - -*/ - -#include -#include - -// esp32fota settings -int firmware_version_major = 1; -int firmware_version_minor = 3; -int firmware_version_patch = 0; - -// #define FOTA_URL "http://server/fota/fota.json" - -const char* firmware_name = "esp32-fota-http"; -const bool check_signature = false; -const bool disable_security = true; -// for debug only -const char* title = "1.3"; -const char* description = "Basic *gzipped* example with no security and no filesystem"; - - -esp32FOTA FOTA; - - -void setup_wifi() -{ - delay(10); - - Serial.print("MAC Address "); - Serial.println( WiFi.macAddress() ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - - -void setup() -{ - Serial.begin(115200); - - PrintFOTAInfo(); - - { - auto cfg = FOTA.getConfig(); - cfg.name = (char*)firmware_name; - cfg.manifest_url = (char*)FOTA_URL; - cfg.sem = SemverClass( firmware_version_major, firmware_version_minor, firmware_version_patch ); - cfg.check_sig = check_signature; - cfg.unsafe = disable_security; - //cfg.root_ca = MyRootCA; - //cfg.pub_key = MyRSAKey; - FOTA.setConfig( cfg ); - } - FOTA.printConfig(); - - setup_wifi(); -} - -void loop() -{ - bool updatedNeeded = FOTA.execHTTPcheck(); - if (updatedNeeded) { - FOTA.execOTA(); - } - - delay(20000); -} - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/2.cert-in-spiffs/2.cert-in-spiffs.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/2.cert-in-spiffs/2.cert-in-spiffs.ino deleted file mode 100644 index e6aeadc..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/2.cert-in-spiffs/2.cert-in-spiffs.ino +++ /dev/null @@ -1,99 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update firmware from a bin located on a webserver (HTTPS) - while using filesystem to check for certificate validity - -*/ - -#include // include filesystem **before** esp32fota !! -#include -#include - -// esp32fota settings -int firmware_version_major = 2; -int firmware_version_minor = 0; -int firmware_version_patch = 0; - -// #define FOTA_URL "http://server/fota/fota.json" - -const char* firmware_name = "esp32-fota-http"; -const bool check_signature = false; -const bool disable_security = false; -// for debug only -const char* title = "2"; -const char* description = "SPIFFS example with security"; - - -esp32FOTA FOTA; - - -// CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &LittleFS ); -CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SPIFFS ); -// CryptoMemAsset *MyRootCA = new CryptoMemAsset("Certificates Chain", root_ca, strlen(root_ca)+1 ); - -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &SPIFFS ); -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &LittleFS ); -// CryptoMemAsset *MyRSAKey = new CryptoMemAsset("RSA Public Key", pub_key, strlen(pub_key)+1 ); - - -void setup_wifi() -{ - delay(10); - Serial.print("MAC Address "); - Serial.println( WiFi.macAddress() ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - - -void setup() -{ - Serial.begin(115200); - - PrintFOTAInfo(); - - // Provide filesystem with root_ca.pem to validate server certificate - if( ! SPIFFS.begin( false ) ) { - Serial.println("SPIFFS Mounting failed, aborting!"); - while(1) vTaskDelay(1); - } - - { - auto cfg = FOTA.getConfig(); - cfg.name = (char*)firmware_name; - cfg.manifest_url = (char*)FOTA_URL; - cfg.sem = SemverClass( firmware_version_major, firmware_version_minor, firmware_version_patch ); - cfg.check_sig = check_signature; - cfg.unsafe = disable_security; - cfg.root_ca = MyRootCA; - //cfg.pub_key = MyRSAKey; - FOTA.setConfig( cfg ); - } - FOTA.printConfig(); - - setup_wifi(); -} - - -void loop() -{ - bool updatedNeeded = FOTA.execHTTPcheck(); - if (updatedNeeded) { - FOTA.execOTA(); - } - - delay(20000); -} - - - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/2.cert-in-spiffs/data/root_ca.pem b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/2.cert-in-spiffs/data/root_ca.pem deleted file mode 100644 index 342ecfe..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/2.cert-in-spiffs/data/root_ca.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/3.cert-in-progmem/3.cert-in-progmem.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/3.cert-in-progmem/3.cert-in-progmem.ino deleted file mode 100644 index 8d15a3f..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/3.cert-in-progmem/3.cert-in-progmem.ino +++ /dev/null @@ -1,93 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update to both firmware and filesystem from binaries located - on a webserver (HTTPS) while using progmem to check for certificate validity - - -*/ - -#include -#include - -#include "root_ca.h" - -// esp32fota settings -int firmware_version_major = 3; -int firmware_version_minor = 0; -int firmware_version_patch = 0; - -// #define FOTA_URL "http://server/fota/fota.json" - -const char* firmware_name = "esp32-fota-http"; -const bool check_signature = false; -const bool disable_security = false; -// for debug only -const char* title = "3"; -const char* description = "PROGMEM example with security"; - - -esp32FOTA FOTA; - -// CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &LittleFS ); -// CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SPIFFS ); -CryptoMemAsset *MyRootCA = new CryptoMemAsset("Certificates Chain", root_ca, strlen(root_ca)+1 ); - -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &SPIFFS ); -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &LittleFS ); -// CryptoMemAsset *MyRSAKey = new CryptoMemAsset("RSA Public Key", pub_key, strlen(pub_key)+1 ); - - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi "); - Serial.println( WiFi.macAddress() ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); - - FOTA.setRootCA( MyRootCA ); -} - - -void setup() -{ - Serial.begin(115200); - - PrintFOTAInfo(); - - { - auto cfg = FOTA.getConfig(); - cfg.name = (char*)firmware_name; - cfg.manifest_url = (char*)FOTA_URL; - cfg.sem = SemverClass( firmware_version_major, firmware_version_minor, firmware_version_patch ); - cfg.check_sig = check_signature; - cfg.unsafe = disable_security; - cfg.root_ca = MyRootCA; - //cfg.pub_key = MyRSAKey; - FOTA.setConfig( cfg ); - } - FOTA.printConfig(); - - setup_wifi(); -} - -void loop() -{ - bool updatedNeeded = FOTA.execHTTPcheck(); - if (updatedNeeded) { - FOTA.execOTA(); - } - - delay(20000); -} - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/3.cert-in-progmem/root_ca.h b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/3.cert-in-progmem/root_ca.h deleted file mode 100644 index 60b1c9f..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/3.cert-in-progmem/root_ca.h +++ /dev/null @@ -1,25 +0,0 @@ - -const char* /*github_*/root_ca = R"ROOT_CA( ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- -)ROOT_CA"; diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/4.cert-in-littlefs/4.cert-in-littlefs.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/4.cert-in-littlefs/4.cert-in-littlefs.ino deleted file mode 100644 index 8aa1663..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/4.cert-in-littlefs/4.cert-in-littlefs.ino +++ /dev/null @@ -1,99 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update firmware from a bin located on a webserver (HTTPS) - while using filesystem to check for certificate validity - -*/ - -#include // include filesystem **before** esp32fota !! -#include -#include - -// esp32fota settings -int firmware_version_major = 4; -int firmware_version_minor = 0; -int firmware_version_patch = 0; - -// #define FOTA_URL "http://server/fota/fota.json" - -const char* firmware_name = "esp32-fota-http"; -const bool check_signature = true; -const bool disable_security = false; -// for debug only -const char* title = "4"; -const char* description = "LittleFS example with enforced security"; - - -esp32FOTA FOTA; - -CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &LittleFS ); -// CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SPIFFS ); -// CryptoMemAsset *MyRootCA = new CryptoMemAsset("Certificates Chain", root_ca, strlen(root_ca)+1 ); - -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &SPIFFS ); -CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &LittleFS ); -// CryptoMemAsset *MyRSAKey = new CryptoMemAsset("RSA Public Key", pub_key, strlen(pub_key)+1 ); - - -void setup_wifi() -{ - delay(10); - - Serial.print("MAC Address "); - Serial.println( WiFi.macAddress() ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - - -void setup() -{ - Serial.begin(115200); - - PrintFOTAInfo(); - - // Provide filesystem with root_ca.pem to validate server certificate - if( ! LittleFS.begin( false ) ) { - Serial.println("LittleFS Mounting failed, aborting!"); - while(1) vTaskDelay(1); - } - - { - auto cfg = FOTA.getConfig(); - cfg.name = (char*)firmware_name; - cfg.manifest_url = (char*)FOTA_URL; - cfg.sem = SemverClass( firmware_version_major, firmware_version_minor, firmware_version_patch ); - cfg.check_sig = check_signature; - cfg.unsafe = disable_security; - cfg.root_ca = MyRootCA; - cfg.pub_key = MyRSAKey; - FOTA.setConfig( cfg ); - } - FOTA.printConfig(); - - setup_wifi(); - -} - -void loop() -{ - bool updatedNeeded = FOTA.execHTTPcheck(); - if (updatedNeeded) { - FOTA.execOTA(); - } - - delay(20000); -} - - - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/4.cert-in-littlefs/data/root_ca.pem b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/4.cert-in-littlefs/data/root_ca.pem deleted file mode 100644 index 342ecfe..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/4.cert-in-littlefs/data/root_ca.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/5.sig-in-progmem.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/5.sig-in-progmem.ino deleted file mode 100644 index a80b081..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/5.sig-in-progmem.ino +++ /dev/null @@ -1,93 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update to both firmware and filesystem from binaries located - on a webserver (HTTPS) while using progmem to check for certificate validity - - -*/ - -#include -#include - -#include "root_ca.h" -#include "pub_key.h" - -// esp32fota settings -int firmware_version_major = 5; -int firmware_version_minor = 0; -int firmware_version_patch = 0; - -// #define FOTA_URL "http://server/fota/fota.json" - -const char* firmware_name = "esp32-fota-http"; -const bool check_signature = true; -const bool disable_security = false; -// for debug only -const char* title = "5"; -const char* description = "PROGMEM example with enforced security"; - - -esp32FOTA FOTA; - -// CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &LittleFS ); -// CryptoFileAsset *MyRootCA = new CryptoFileAsset( "/root_ca.pem", &SPIFFS ); -CryptoMemAsset *MyRootCA = new CryptoMemAsset("Certificates Chain", root_ca, strlen(root_ca)+1 ); - -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &SPIFFS ); -// CryptoFileAsset *MyRSAKey = new CryptoFileAsset( "/rsa_key.pub", &LittleFS ); -CryptoMemAsset *MyRSAKey = new CryptoMemAsset("RSA Public Key", pub_key, strlen(pub_key)+1 ); - - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi "); - Serial.println( WiFi.macAddress() ); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - - -void setup() -{ - Serial.begin(115200); - - PrintFOTAInfo(); - - { - auto cfg = FOTA.getConfig(); - cfg.name = (char*)firmware_name; - cfg.manifest_url = (char*)FOTA_URL; - cfg.sem = SemverClass( firmware_version_major, firmware_version_minor, firmware_version_patch ); - cfg.check_sig = check_signature; - cfg.unsafe = disable_security; - cfg.root_ca = MyRootCA; - cfg.pub_key = MyRSAKey; - FOTA.setConfig( cfg ); - } - FOTA.printConfig(); - - setup_wifi(); -} - -void loop() -{ - bool updatedNeeded = FOTA.execHTTPcheck(); - if (updatedNeeded) { - FOTA.execOTA(); - } - - delay(20000); -} - - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/pub_key.h b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/pub_key.h deleted file mode 100644 index 2349fdc..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/pub_key.h +++ /dev/null @@ -1,25 +0,0 @@ - -const char* /*github_*/pub_key = R"ROOT_CA( ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- -)ROOT_CA"; diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/root_ca.h b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/root_ca.h deleted file mode 100644 index 60b1c9f..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/5.sig-in-progmem/root_ca.h +++ /dev/null @@ -1,25 +0,0 @@ - -const char* /*github_*/root_ca = R"ROOT_CA( ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- -)ROOT_CA"; diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/99.final-stage/99.final-stage.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/99.final-stage/99.final-stage.ino deleted file mode 100644 index db91e37..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/anyFS/test/99.final-stage/99.final-stage.ino +++ /dev/null @@ -1,20 +0,0 @@ -// Just a dummy script prevent an endless OTA loop to occur -// It validates the last step in the test suite by printing a message in the serial. - - -void setup() -{ - Serial.begin( 115200 ); - Serial.println(); - Serial.println(); - Serial.println(); - Serial.println("**************************"); - Serial.println("Test suite COMPLETE :-)"); - Serial.println(); - Serial.println(); -} - -void loop() -{ - -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/forceUpdate/forceUpdate.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/forceUpdate/forceUpdate.ino deleted file mode 100644 index 23c6e6c..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/forceUpdate/forceUpdate.ino +++ /dev/null @@ -1,61 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update from a bin located on a webserver - - Setup: - Step 1 : Set your WiFi (ssid & password) - Step 2 : set esp32fota() - - Upload: - Step 1 : Menu > Sketch > Export Compiled Library. The bin file will be saved in the sketch folder (Menu > Sketch > Show Sketch folder) - Step 2 : Upload it to your webserver - Step 3 : Update your firmware JSON file ( see firwmareupdate ) - -*/ - -#include -#include - - -// esp32fota esp32fota("", , ); -esp32FOTA esp32FOTA("esp32-fota-http", 1, false); - -const char* manifest_url = "http://server/fota/fota.json"; - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi"); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - - -void setup() -{ - Serial.begin(115200); - esp32FOTA.setManifestURL( manifest_url ); - esp32FOTA.printConfig(); - setup_wifi(); -} - - -void loop() -{ - delay(2000); - esp32FOTA.forceUpdate("192.168.0.100", 80, "/fota/esp32-fota-http-2.bin", true ); // check signature: true - - // Alternatively, forceUpdate can be called with a complete URL: - //esp32FOTA.forceUpdate("http://192.168.0.100/fota/esp32-fota-http-2.bin", true ); // check signature: true - -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/withDeviceID/withDeviceID.ino b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/withDeviceID/withDeviceID.ino deleted file mode 100644 index 7849ac0..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/examples/withDeviceID/withDeviceID.ino +++ /dev/null @@ -1,62 +0,0 @@ -/** - esp32 firmware OTA - - Purpose: Perform an OTA update from a bin located on a webserver (HTTP Only) - - Setup: - Step 1 : Set your WiFi (ssid & password) - Step 2 : set esp32fota() - - Upload: - Step 1 : Menu > Sketch > Export Compiled Library. The bin file will be saved in the sketch folder (Menu > Sketch > Show Sketch folder) - Step 2 : Upload it to your webserver - Step 3 : Update your firmware JSON file ( see firwmareupdate ) - -*/ - -#include -#include - - -// esp32fota esp32fota("", , ); -esp32FOTA esp32FOTA("esp32-fota-http", 1, false); -const char* manifest_url = "http://server/fota/fota.json"; - -void setup_wifi() -{ - delay(10); - Serial.print("Connecting to WiFi"); - - WiFi.begin(); // no WiFi creds in this demo :-) - - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println(WiFi.localIP()); -} - - -void setup() -{ - Serial.begin(115200); - esp32FOTA.setManifestURL( manifest_url ); - esp32FOTA.useDeviceId( true ); - esp32FOTA.printConfig(); - setup_wifi(); -} - - -void loop() -{ - bool updatedNeeded = esp32FOTA.execHTTPcheck(); - if (updatedNeeded) - { - esp32FOTA.execOTA(); - } - - delay(2000); -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/fota/firmware.json b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/fota/firmware.json deleted file mode 100644 index 0476084..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/fota/firmware.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "esp32-fota-http", - "version": 2, - "host": "192.168.0.100", - "port": 80, - "bin": "/fota/esp32-fota-http-2.bin" -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/keywords.txt b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/keywords.txt deleted file mode 100644 index 58b1057..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/keywords.txt +++ /dev/null @@ -1,22 +0,0 @@ -####################################### -# Syntax Coloring Map For esp32FOTA -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -esp32FOTA KEYWORD1 -useDeviceID KEYWORD1 -checkURL KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### - -execOTA KEYWORD2 -execHTTPcheck KEYWORD2 - -####################################### -# Constants (LITERAL1) -####################################### diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/library.json b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/library.json deleted file mode 100644 index e666db7..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/library.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "esp32FOTA", - "version": "0.2.7", - "keywords": "firmware, OTA, Over The Air Updates, ArduinoOTA", - "description": "Allows for firmware to be updated from a webserver, the device can check for updates at any time. Uses a simple JSON file to outline if a new firmware is avaiable.", - "examples": "examples/*/*.ino", - "repository": { - "type": "git", - "url": "https://github.com/chrisjoyce911/esp32FOTA.git" - }, - "authors": [ - { - "name": "Chris Joyce", - "email": "chris@joyce.id.au", - "url": "https://github.com/chrisjoyce911", - "maintainer": true - } - ], - "frameworks": "arduino", - "headers": "esp32FOTA.hpp", - "platforms": [ - "esp32", - "espressif32" - ], - "dependencies": [ - "WiFiClientSecure", - "HTTPClient", - "ArduinoJson" - ] -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/library.properties b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/library.properties deleted file mode 100644 index 11a9da3..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/library.properties +++ /dev/null @@ -1,11 +0,0 @@ -name=esp32FOTA -version=0.2.7 -author=Chris Joyce -maintainer=Chris Joyce -sentence=A simple library for firmware OTA updates -paragraph=Allows for firmware to be updated from a webserver, the device can check for updates at any time. Uses a simple JSON file to outline if a new firmware is available. -category=Communication -url=https://github.com/chrisjoyce911/esp32FOTA -architectures=esp32,espressif32 -includes=esp32FOTA.hpp -depends=ArduinoJson diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/platformio.ini b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/platformio.ini deleted file mode 100644 index 1d1380a..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/platformio.ini +++ /dev/null @@ -1,52 +0,0 @@ -; CanAirIO Sensorlib -; -; Full guide and details: https://github.com/kike-canaries/canairio_sensorlib - - -[platformio] -src_dir = ./tests/ -;lib_dir = ./ - -[env] -framework = arduino -upload_speed = 1500000 -monitor_speed = 115200 -monitor_filters = time -build_flags = - -D CORE_DEBUG_LEVEL=0 -lib_deps = - bblanchon/ArduinoJson @ ^6 - esp32FOTA -; vortigont/esp32-flashz -; tobozo/ESP32-targz - -[esp32_common] -platform = espressif32 -board = esp32dev -framework = ${env.framework} -upload_speed = ${env.upload_speed} -monitor_speed = ${env.monitor_speed} -lib_deps = ${env.lib_deps} -build_flags = - ${env.build_flags} - -[env:esp32_http] -extends = esp32_common -build_src_filter = -<*> + - -[env:esp32_http_debug] -extends = esp32_common -build_flags = - -D CORE_DEBUG_LEVEL=4 -build_src_filter = -<*> + - -[env:esp32_https] -extends = esp32_common -build_src_filter = -<*> + - -[env:esp32_https_debug] -extends = esp32_common -build_flags = - -D CORE_DEBUG_LEVEL=4 -build_src_filter = -<*> + - diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/debug/test_fota_common.h b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/debug/test_fota_common.h deleted file mode 100644 index 67e54ab..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/debug/test_fota_common.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -// esp32fota settings -extern int firmware_version_major; -extern int firmware_version_minor; -extern int firmware_version_patch; - -#if !defined FOTA_URL - #define FOTA_URL "http://server/fota/fota.json" -#endif - -extern const char* firmware_name; -extern const bool check_signature; -extern const bool disable_security; -// for debug only -extern const char* description; -extern const char* title; - -extern esp32FOTA FOTA; - -const char* fota_debug_fmt = R"DBG_FMT( - -***************** STAGE %s ***************** - - Description : %s - Firmware type : %s - Firmware version : %i.%i.%i - Signature check : %s - TLS Cert check : %s - Compression : %s - -******************************************** - -)DBG_FMT"; - - -void PrintFOTAInfo() -{ - Serial.printf( fota_debug_fmt, - title, - description, - firmware_name, - firmware_version_major, - firmware_version_minor, - firmware_version_patch, - check_signature ?"Enabled":"Disabled", - disable_security ?"Disabled":"Enabled", - FOTA.zlibSupported() ?"Enabled":"Disabled" - ); -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32FOTA.cpp b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32FOTA.cpp deleted file mode 100644 index a92b991..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32FOTA.cpp +++ /dev/null @@ -1,1081 +0,0 @@ -/* - esp32 firmware OTA - Date: December 2018 - Author: Chris Joyce - Purpose: Perform an OTA update from a bin located on a webserver (HTTP Only) - - Date: 2021-12-21 - Author: Moritz Meintker - Remarks: Re-written/removed a bunch of functions around HTTPS. The library is - now URL-agnostic. This means if you provide an https://-URL it will - use the root_ca.pem (needs to be provided via PROGMEM/SPIFFS/LittleFS or SD) - to verify the server certificate and then download the ressource through an - encrypted connection unless you set the allow_insecure_https option. - Otherwise it will just use plain HTTP which will still offer to sign - your firmware image. - - Date: 2022-09-12 - Author: tobozo - Changes: - - Abstracted away filesystem - - Refactored some code blocks - - Added spiffs/littlefs/fatfs updatability - - Made crypto assets (pub key, rootca) loadable from multiple sources - Roadmap: - - Firmware/FlashFS update order (SPIFFS/LittleFS first or last?) - - Archive support for gz/targz formats - - firmware.gz + spiffs.gz in manifest - - bundle.tar.gz [ firmware + filesystem ] in manifest - - Update from Stream (e.g deported update via SD, http or gzupdater) - -*/ - -#include "esp32FOTA.hpp" - -#include "mbedtls/pk.h" -#include "mbedtls/md.h" -#include "mbedtls/md_internal.h" -#include "esp_ota_ops.h" - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - - - -static int64_t getHTTPStream( esp32FOTA* fota, int partition ); -static int64_t getFileStream( esp32FOTA* fota, int partition ); -static int64_t getSerialStream( esp32FOTA* fota, int partition ); -static bool WiFiStatusCheck(); - - -SemverClass::SemverClass( const char* version ) -{ - assert(version); - if (semver_parse_version(version, &_ver)) { - log_w( "Invalid semver string '%s' passed to constructor. Defaulting to 0", version ); - _ver = semver_t{0,0,0}; - } -} - -SemverClass::SemverClass( int major, int minor, int patch ) -{ - _ver = semver_t{major, minor, patch}; -} - -semver_t* SemverClass::ver() -{ - return &_ver; - -} - - - - -// Filesystem helper for signature check and pem validation -// This is abstracted away to allow storage alternatives such -// as PROGMEM, SD, SPIFFS, LittleFS or FatFS - -bool CryptoFileAsset::fs_read_file() -{ - File file = fs->open( path ); - // if( file->size() > ESP.getFreeHeap() ) return false; - if( !file ) { - log_e( "Failed to open %s for reading", path ); - return false; - } - contents = ""; // make sure the output bucket is empty - len = file.size()+1; - while( file.available() ) { - contents.push_back( file.read() ); - } - file.close(); - return len>0; -} - - -size_t CryptoFileAsset::size() -{ - if( len > 0 ) { // already stored, no need to access filesystem - return len; - } - if( fs ) { // fetch file contents - if( ! fs_read_file() ) { - log_e("Invalid contents!"); - return 0; - } - } else { - log_e("No filesystem was set for %s!", path); - return 0; - } - return len; -} - - - -esp32FOTA::esp32FOTA(){} -esp32FOTA::~esp32FOTA(){} - - -esp32FOTA::esp32FOTA( FOTAConfig_t cfg ) -{ - setConfig( cfg ); -} - - -void esp32FOTA::setString( char **dest, const char* src ) -{ - if( !src ) { - log_e("Can't set string to empty source"); - return; - } - if( *dest != nullptr ) free( *dest ); - *dest = (char*)malloc( strlen(src)+1 ); - if( *dest == NULL ) { - log_e("Unable to allocate %d bytes", strlen(src)+1); - return; - } - //strcpy( dest, src); - memcpy( *dest, src, strlen(src)+1); - log_d("Assigned value: %s <= %s", *dest, src ); -} - - - -esp32FOTA::esp32FOTA(const char* firmwareType, int firmwareVersion, bool validate, bool allow_insecure_https) -{ - setString( &_cfg.name, firmwareType ); - //_cfg.name = (char*)firmwareType; - _cfg.sem = SemverClass( firmwareVersion ); - _cfg.check_sig = validate; - _cfg.unsafe = allow_insecure_https; - - setupCryptoAssets(); - debugSemVer("Current firmware version", _cfg.sem.ver() ); -} - - -esp32FOTA::esp32FOTA(const char* firmwareType, const char* firmwareSemanticVersion, bool validate, bool allow_insecure_https) -{ - setString( &_cfg.name, firmwareType ); - //_cfg.name = (char*)firmwareType; - _cfg.check_sig = validate; - _cfg.unsafe = allow_insecure_https; - _cfg.sem = SemverClass( firmwareSemanticVersion ); - - setupCryptoAssets(); - debugSemVer("Current firmware version", _cfg.sem.ver() ); -} - - - -void esp32FOTA::setConfig( FOTAConfig_t cfg ) -{ - setString( &_cfg.name, cfg.name ); - setString( &_cfg.manifest_url, cfg.manifest_url ); - - _cfg.sem = cfg.sem; - _cfg.check_sig = cfg.check_sig; - _cfg.unsafe = cfg.unsafe; - _cfg.use_device_id = cfg.use_device_id; - _cfg.root_ca = cfg.root_ca; - _cfg.pub_key = cfg.pub_key; - _cfg.signature_len = cfg.signature_len; -} - - -void esp32FOTA::printConfig( FOTAConfig_t *cfg ) -{ - if( cfg == nullptr ) cfg = &_cfg; - log_d("Name: %s\nManifest URL:%s\nSemantic Version: %d.%d.%d\nCheck Sig: %s\nUnsafe: %s\nUse Device ID: %s\nRootCA: %s\nPubKey: %s\nSignatureLen: %d\n", - cfg->name ? cfg->name : "None", - cfg->manifest_url ? cfg->manifest_url : "None", - cfg->sem.ver()->major, - cfg->sem.ver()->minor, - cfg->sem.ver()->patch, - cfg->check_sig ?"true":"false", - cfg->unsafe ?"true":"false", - cfg->use_device_id ?"true":"false", - cfg->root_ca ?"true":"false", - cfg->pub_key ?"true":"false", - cfg->signature_len - ); -} - - -void esp32FOTA::setSignatureLen( size_t len ) -{ - _cfg.signature_len = len; -} - - -void esp32FOTA::setCertFileSystem( fs::FS *cert_filesystem ) -{ - _fs = cert_filesystem; - setupCryptoAssets(); -} - - -// Used for legacy behaviour when SPIFFS and RootCa/PubKey had default values -// New recommended method is to use setPubKey() and setRootCA() with CryptoMemAsset ot CryptoFileAsset objects. -void esp32FOTA::setupCryptoAssets() -{ - if( _fs ) { - _cfg.pub_key = (CryptoAsset*)(new CryptoFileAsset( rsa_key_pub_default_path, _fs )); - _cfg.root_ca = (CryptoAsset*)(new CryptoFileAsset( root_ca_pem_default_path, _fs )); - } -} - - - -void esp32FOTA::handle() -{ - if ( execHTTPcheck() ) { - execOTA(); - } -} - - -// SHA-Verify the OTA partition after it's been written -// https://techtutorialsx.com/2018/05/10/esp32-arduino-mbed-tls-using-the-sha-256-algorithm/ -// https://github.com/ARMmbed/mbedtls/blob/development/programs/pkey/rsa_verify.c -bool esp32FOTA::validate_sig( const esp_partition_t* partition, unsigned char *signature, uint32_t firmware_size ) -{ - if( !partition ) { - log_e( "Could not find update partition!" ); - return false; - } - size_t pubkeylen = _cfg.pub_key ? _cfg.pub_key->size() : 0; - - if( pubkeylen <= 1 ) { - log_e("Public key empty, can't validate!"); - return false; - } - - const char* pubkeystr = _cfg.pub_key->get(); - - if( !pubkeystr ) { - log_e("Unable to get public key, can't validate!"); - return false; - } - - log_d("Creating mbedtls context"); - - mbedtls_pk_context pk; - mbedtls_md_context_t rsa; - mbedtls_pk_init( &pk ); - - log_d("Parsing public key"); - - int ret; - if( ( ret = mbedtls_pk_parse_public_key( &pk, (const unsigned char*)pubkeystr, pubkeylen ) ) != 0 ) { - log_e( "Parsing public key failed\n ! mbedtls_pk_parse_public_key %d (%d bytes)\n%s", ret, pubkeylen, pubkeystr ); - return false; - } - - if( !mbedtls_pk_can_do( &pk, MBEDTLS_PK_RSA ) ) { - log_e( "Public key is not an rsa key -0x%x", -ret ); - return false; - } - - log_d("Initing mbedtls"); - - const mbedtls_md_info_t *mdinfo = mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ); - mbedtls_md_init( &rsa ); - mbedtls_md_setup( &rsa, mdinfo, 0 ); - mbedtls_md_starts( &rsa ); - - int bytestoread = SPI_FLASH_SEC_SIZE; - int bytesread = 0; - int size = firmware_size; - - uint8_t *_buffer = (uint8_t*)malloc(SPI_FLASH_SEC_SIZE); - if(!_buffer){ - log_e( "malloc failed" ); - return false; - } - - log_d("Parsing content"); - - log_v( "Reading partition (%i sectors, sec_size: %i)", size, bytestoread ); - while( bytestoread > 0 ) { - log_v( "Left: %i (%i) \r", size, bytestoread ); - - if( ESP.partitionRead( partition, bytesread, (uint32_t*)_buffer, bytestoread ) ) { - // Debug output for the purpose of comparing with file - // DINGO disable this since it blocks -DCORE_DEBUG_LEVEL=5 analysis of source app -/* for( int i = 0; i < bytestoread; i++ ) { - if( ( i % 16 ) == 0 ) { - log_v( "\r\n0x%08x\t", i + bytesread ); - } - log_v( "%02x ", (uint8_t*)_buffer[i] ); - } -*/ - mbedtls_md_update( &rsa, (uint8_t*)_buffer, bytestoread ); - - bytesread = bytesread + bytestoread; - size = size - bytestoread; - - if( size <= SPI_FLASH_SEC_SIZE ) { - bytestoread = size; - } - } else { - log_e( "partitionRead failed!" ); - return false; - } - } - - free( _buffer ); - - unsigned char *hash = (unsigned char*)malloc( mdinfo->size ); - if(!hash){ - log_e( "malloc failed" ); - return false; - } - mbedtls_md_finish( &rsa, hash ); - - ret = mbedtls_pk_verify( &pk, MBEDTLS_MD_SHA256, hash, mdinfo->size, (unsigned char*)signature, _cfg.signature_len ); - - free( hash ); - mbedtls_md_free( &rsa ); - mbedtls_pk_free( &pk ); - if( ret == 0 ) { - return true; - } - - // validation failed, overwrite the first few bytes so this partition won't boot! - log_w( "Validation failed, erasing the invalid partition" ); - ESP.partitionEraseRange( partition, 0, ENCRYPTED_BLOCK_SIZE); - - return false; -} - - - - -bool esp32FOTA::setupHTTP( const char* url ) -{ - const char* rootcastr = nullptr; - _http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); - - log_i("Connecting to: %s", url ); - if( String(url).startsWith("https") ) { - if (!_cfg.unsafe) { - if( !_cfg.root_ca ) { - log_e("A strict security context has been set but no RootCA was provided"); - return false; - } - if( _cfg.root_ca->size() == 0 ) { - log_e("A strict security context has been set but an empty RootCA was provided"); - return false; - } - rootcastr = _cfg.root_ca->get(); - if( !rootcastr ) { - log_e("Unable to get RootCA, aborting"); - log_e("rootcastr=%s", rootcastr); - return false; - } - log_d("Loading root_ca.pem"); - _client.setCACert( rootcastr ); - } else { - // We're downloading from a secure URL, but we don't want to validate the root cert. - _client.setInsecure(); - } - _http.begin( _client, url ); - } else { - _http.begin( url ); - } - - if( extraHTTPHeaders.size() > 0 ) { - // add custom headers provided by user e.g. _http.addHeader("Authorization", "Basic " + auth) - for( const auto &header : extraHTTPHeaders ) { - _http.addHeader(header.first, header.second); - } - } - - // TODO: add more watched headers e.g. Authorization: Signature keyId="rsa-key-1",algorithm="rsa-sha256",signature="Base64(RSA-SHA256(signing string))" - const char* get_headers[] = { "Content-Length", "Content-type", "Accept-Ranges" }; - _http.collectHeaders( get_headers, sizeof(get_headers)/sizeof(const char*) ); - - return true; -} - - - - -void esp32FOTA::setupStream() -{ - if(!getStream) { - switch( _stream_type ) { - case FOTA_FILE_STREAM: - setStreamGetter( getFileStream ); - break; - case FOTA_SERIAL_STREAM: - setStreamGetter( getSerialStream ); - break; - case FOTA_HTTP_STREAM: - default: - setStreamGetter( getHTTPStream ); - break; - } - } - - if( !isConnected ) { - setStatusChecker( WiFiStatusCheck ); - } -} - - -void esp32FOTA::stopStream() -{ - if( endStream ) { // user function provided via ::setStreamEnder( fn ) - endStream( this ); - return; - } - - // no user function provided, apply default behaviour - switch( _stream_type ) { - case FOTA_FILE_STREAM: - if( _file ) _file.close(); - break; - case FOTA_HTTP_STREAM: - _http.end(); - break; - case FOTA_SERIAL_STREAM: - default: - break; - } - -} - - - -// OTA Logic -bool esp32FOTA::execOTA() -{ - setupStream(); - - if( !_flashFileSystemUrl.isEmpty() ) { // a data partition was specified in the json manifest, handle the spiffs partition first - if( _fs ) { // Possible risk of overwriting certs and signatures, cancel flashing! - log_e("Cowardly refusing to overwrite U_SPIFFS with %s. Use setCertFileSystem(nullptr) along with setPubKey()/setCAPem() to enable this feature.", _flashFileSystemUrl); - return false; - } else { - log_i("Will check if U_SPIFFS needs updating"); - if( !execOTA( U_SPIFFS, false ) ) return false; - } - } else { - log_i("This update is for U_FLASH only"); - } - // handle the application partition and restart on success - bool ret = execOTA( U_FLASH, true ); - - stopStream(); - - return ret; -} - -// OTA Logic -bool esp32FOTA::execSPIFFSOTA() -{ - bool ret; - setupStream(); - - if( !_flashFileSystemUrl.isEmpty() ) { // a data partition was specified in the json manifest, handle the spiffs partition first - if( _fs ) { // Possible risk of overwriting certs and signatures, cancel flashing! - log_e("Cowardly refusing to overwrite U_SPIFFS with %s. Use setCertFileSystem(nullptr) along with setPubKey()/setCAPem() to enable this feature.", _flashFileSystemUrl); - return false; - } else { - log_i("Will check if U_SPIFFS needs updating"); - ret = execOTA( U_SPIFFS, false ); - } - } else { - log_i("This update is for U_FLASH only"); - } - stopStream(); - return ret; -} - - -bool esp32FOTA::execOTA( int partition, bool restart_after ) -{ - // health checks - if( partition != U_SPIFFS && partition != U_FLASH ) { - log_e("Bad partition number: %i or empty URL, aborting", partition); - return false; - } - if( partition == U_SPIFFS && _flashFileSystemUrl.isEmpty() ) { - log_i("[SKIP] No spiffs/littlefs/fatfs partition was specified"); - return true; // data partition is optional, so not an error - } - if ( partition == U_FLASH && _firmwareUrl.isEmpty() ) { - log_e("No firmware URL, aborting"); - return false; // app partition is mandatory - } - - // call getHTTPStream - int64_t updateSize = getStream( this, partition ); - - if( updateSize<=0 || _stream == nullptr ) { - log_e("HTTP Error"); - return false; - } - - // some network streams (e.g. Ethernet) can be laggy and need to 'breathe' - if( ! _stream->available() ) { - uint32_t timeout = millis() + _stream_timeout; - while( ! _stream->available() ) { - if( millis()>timeout ) { - log_e("Stream timed out"); - return false; - } - vTaskDelay(1); - } - } - - mode_z = F_isZlibStream(); - - log_d("compression: %s", mode_z ? "enabled" : "disabled" ); - - if( _cfg.check_sig ) { - if( mode_z ) { - log_e("Compressed && signed image is not (yet) supported"); - return false; - } - if( updateSize == UPDATE_SIZE_UNKNOWN || updateSize <= _cfg.signature_len ) { - log_e("Malformed signature+fw combo"); - return false; - } - updateSize -= _cfg.signature_len; - } - - // If using compression, the size is implicitely unknown - size_t fwsize = mode_z ? UPDATE_SIZE_UNKNOWN : updateSize; // fw_size is unknown if we have a compressed image - - bool canBegin = F_canBegin(); - - if( !canBegin ) { - log_e("Not enough space to begin OTA, partition size mismatch?"); - F_abort(); - if( onUpdateBeginFail ) onUpdateBeginFail( partition ); - return false; - } - - if( onOTAProgress ) { - F_Update.onProgress( onOTAProgress ); - } else { - F_Update.onProgress( [](size_t progress, size_t size) { - if( progress >= size ) Serial.println(); - else if( progress > 0) Serial.print("."); - }); - } - - unsigned char* signature = new unsigned char[_cfg.signature_len]; - if( _cfg.check_sig ) { - _stream->readBytes( signature, _cfg.signature_len ); - } - - log_i("Begin %s OTA. This may take 2 - 5 mins to complete. Things might be quiet for a while.. Patience!", partition==U_FLASH?"Firmware":"Filesystem"); - - // Some activity may appear in the Serial monitor during the update (depends on Update.onProgress) - size_t written = F_writeStream(); - - if (fwsize == UPDATE_SIZE_UNKNOWN) // match compressed fw size to responce length - fwsize = updateSize; - - if ( written == fwsize ) { - log_d("Written : %d successfully", written); - updateSize = written; // flatten value to prevent overflow when checking signature - } else { - log_e("Written only : %d/%d Premature end of stream?", written, updateSize); - F_abort(); - delete[] signature; - return false; - } - - if (!F_UpdateEnd()) { - log_e("An Update Error Occurred. Error #: %d", F_Update.getError()); - delete[] signature; - return false; - } - - if( onUpdateEnd ) onUpdateEnd( partition ); - - if( _cfg.check_sig ) { // check signature - - log_i("Checking partition %d to validate", partition); - - getPartition( partition ); // updated partition => '_target_partition' pointer - - #define CHECK_SIG_ERROR_PARTITION_NOT_FOUND -1 - #define CHECK_SIG_ERROR_VALIDATION_FAILED -2 - - if( !_target_partition ) { - log_e("Can't access partition #%d to check signature!", partition); - if( onUpdateCheckFail ) onUpdateCheckFail( partition, CHECK_SIG_ERROR_PARTITION_NOT_FOUND ); - delete[] signature; - return false; - } - - log_d("Checking signature for partition %d...", partition); - - const esp_partition_t* running_partition = esp_ota_get_running_partition(); - - if( partition == U_FLASH ) { - // /!\ An OTA partition is automatically set as bootable after being successfully - // flashed by the Update library. - // Since we want to validate before enabling the partition, we need to cancel that - // by temporarily reassigning the bootable flag to the running-partition instead - // of the next-partition. - esp_ota_set_boot_partition( running_partition ); - // By doing so the ESP will NOT boot any unvalidated partition should a reset occur - // during signature validation (crash, oom, power failure). - } - - if( !validate_sig( _target_partition, signature, updateSize ) ) { - delete[] signature; - // erase partition - esp_partition_erase_range( _target_partition, _target_partition->address, _target_partition->size ); - - if( onUpdateCheckFail ) onUpdateCheckFail( partition, CHECK_SIG_ERROR_VALIDATION_FAILED ); - - log_e("Signature check failed!"); - return false; - } else { - delete[] signature; - log_d("Signature check successful!"); - if( partition == U_FLASH ) { - // Set updated partition as bootable now that it's been verified - esp_ota_set_boot_partition( _target_partition ); - } - } - } - log_d("OTA Update complete!"); - if (F_Update.isFinished()) { - - if( onUpdateFinished ) onUpdateFinished( partition, restart_after ); - - log_i("Update successfully completed."); - if( restart_after ) { - log_i("Rebooting."); - ESP.restart(); - } - return true; - } else { - log_e("Update not finished! Something went wrong!"); - } - return false; -} - - -void esp32FOTA::getPartition( int update_partition ) -{ - _target_partition = nullptr; - if( update_partition == U_FLASH ) { - // select the last-updated OTA partition - _target_partition = esp_ota_get_next_update_partition(NULL); - } else if( update_partition == U_SPIFFS ) { - // iterate through partitions table to find the spiffs/littlefs partition - esp_partition_iterator_t iterator = esp_partition_find( ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, NULL ); - while( iterator != NULL ) { - _target_partition = (esp_partition_t *)esp_partition_get( iterator ); - iterator = esp_partition_next( iterator ); - } - esp_partition_iterator_release( iterator ); - } else { - // wut ? - log_e("Unhandled partition type #%i, must be one of U_FLASH / U_SPIFFS", update_partition ); - } -} - - - -bool esp32FOTA::checkJSONManifest(JsonVariant doc) -{ - if(strcmp(doc["type"].as(), _cfg.name) != 0) { - log_d("Payload type in manifest %s doesn't match current firmware %s", doc["type"].as(), _cfg.name ); - log_d("Doesn't match type: %s", _cfg.name ); - return false; // Move to the next entry in the manifest - } - log_i("Payload type in manifest %s matches current firmware %s", doc["type"].as(), _cfg.name ); - - _flashFileSystemUrl.clear(); - _firmwareUrl.clear(); - - if(doc["version"].is()) { - uint16_t v = doc["version"].as(); - log_d("JSON version: %d (int)", v); - _payload_sem = SemverClass(v); - } else if (doc["version"].is()) { - const char* c = doc["version"].as(); - _payload_sem = SemverClass(c); - log_d("JSON version: %s (semver)", c ); - } else { - log_e( "Invalid semver format received in manifest. Defaulting to 0" ); - _payload_sem = SemverClass(0); - } - - debugSemVer("Payload firmware version", _payload_sem.ver() ); - - // Memoize some values to help with the decision tree - bool has_url = doc["url"].is(); - bool has_firmware = doc["bin"].is(); - bool has_hostname = doc["host"].is(); - //bool has_signature = doc["sig"].is(); - bool has_port = doc["port"].is(); - uint16_t portnum = doc["port"].as(); - bool has_tls = has_port ? (portnum == 443 || portnum == 4433) : false; - bool has_spiffs = doc["spiffs"].is(); - bool has_littlefs = doc["littlefs"].is(); - bool has_fatfs = doc["fatfs"].is(); - bool has_filesystem = has_littlefs || has_spiffs || has_fatfs; - - String protocol(has_tls ? "https" : "http"); - String flashFSPath = - has_filesystem - ? ( - has_littlefs - ? doc["littlefs"].as() - : has_spiffs - ? doc["spiffs"].as() - : doc["fatfs"].as() - ) - : ""; - - log_i("JSON manifest provided keys: url=%s, host: %s, port: %s, bin: %s, fs: [%s]", - has_url?"true":"false", - has_hostname?"true":"false", - has_port?"true":"false", - has_firmware?"true":"false", - flashFSPath.c_str() - ); - - if( has_url ) { // Basic scenario: a complete URL was provided in the JSON manifest, all other keys will be ignored - _firmwareUrl = doc["url"].as(); - if( has_hostname ) { // If the manifest provides both, warn the user - log_w("Manifest provides both url and host - Using URL"); - } - } else if( has_firmware && has_hostname && has_port ) { // Precise scenario: Hostname, Port and Firmware Path were provided - _firmwareUrl = protocol + "://" + doc["host"].as() + ":" + portnum + doc["bin"].as(); - if( has_filesystem ) { // More complex scenario: the manifest also provides a [spiffs, littlefs or fatfs] partition - _flashFileSystemUrl = protocol + "://" + doc["host"].as() + ":" + portnum + flashFSPath; - } - } else { // JSON was malformed - no firmware target was provided - log_e("JSON manifest was missing one of the required keys :(" ); - String prettyJson; - serializeJsonPretty(doc, prettyJson); - log_d("%s", prettyJson); - return false; - } - - if (semver_compare(*_payload_sem.ver(), *_cfg.sem.ver()) == 1) { - return true; - } - - return false; -} - - - - -bool esp32FOTA::execHTTPcheck() -{ - String useURL = String( _cfg.manifest_url ); - - if( useURL.isEmpty() ) { - log_e("No manifest_url provided in config, aborting!"); - return false; - } - - // being deprecated, soon unsupported! - // if( useURL.isEmpty() && !checkURL.isEmpty() ) { - // log_w("checkURL will soon be unsupported, use FOTAConfig_t::manifest_url instead!!"); - // useURL = checkURL; - // } - - // // being deprecated, soon unsupported! - // if( useDeviceID ) { - // log_w("useDeviceID will soon be unsupported, use FOTAConfig_t::use_device_id instead!!"); - // _cfg.use_device_id = useDeviceID; - // } - - if (_cfg.use_device_id) { - // URL may already have GET values - String argseparator = (useURL.indexOf('?') != -1 ) ? "&" : "?"; - useURL += argseparator + "id=" + getDeviceID(); - } - - if ( isConnected && !isConnected() ) { // Check the current connection status - log_i("Connection check requested but network not ready - skipping"); - return false; // WiFi not connected - } - - log_i("Getting HTTP: %s", useURL.c_str()); - - if(! setupHTTP( useURL.c_str() ) ) { - log_e("Unable to setup http, aborting!"); - return false; - } - - int httpCode = _http.GET(); //Make the request - - // only handle 200/301, fail on everything else - if( httpCode != HTTP_CODE_OK && httpCode != HTTP_CODE_MOVED_PERMANENTLY ) { - // This error may be a false positive or a consequence of the network being disconnected. - // Since the network is controlled from outside this class, only significant error messages are reported. - if( httpCode > 0 ) { - log_e("Error on HTTP request (httpCode=%i)", httpCode); - } else { - log_d("Unknown HTTP response"); - } - _http.end(); - return false; - } - - // TODO: use payload.length() to speculate on JSONResult buffer size - #define JSON_FW_BUFF_SIZE 2048 - DynamicJsonDocument JSONResult( JSON_FW_BUFF_SIZE ); - DeserializationError err = deserializeJson( JSONResult, _http.getStream() ); - - if (err) { // Check for errors in parsing, or JSON length may exceed buffer size - log_e("JSON Parsing failed (%s, in=%d bytes, buff=%d bytes):", err.c_str(), _http.getSize(), JSON_FW_BUFF_SIZE ); - return false; - } - - _http.end(); // We're done with HTTP - free the resources - - if (JSONResult.is()) { - // Although improbable given the size on JSONResult buffer, we already received an array of multiple firmware types and/or versions - JsonArray arr = JSONResult.as(); - for (JsonVariant JSONDocument : arr) { - if(checkJSONManifest(JSONDocument)) { - // TODO: filter "highest vs next" version number for JSON with only one firmware type but several version numbers - return true; - } - } - } else if (JSONResult.is()) { - if(checkJSONManifest(JSONResult.as())) - return true; - } - - return false; // We didn't get a hit against the above, return false -} - - -String esp32FOTA::getDeviceID() -{ - char deviceid[21]; - uint64_t chipid; - chipid = ESP.getEfuseMac(); - sprintf(deviceid, "%" PRIu64, chipid); - String thisID(deviceid); - return thisID; -} - - -// Force a firmware update regardless on current version -bool esp32FOTA::forceUpdate(const char* firmwareURL, bool validate ) -{ - _firmwareUrl = firmwareURL; - _cfg.check_sig = validate; - return execOTA(); -} - -// Force a firmware update regardless on current version -bool esp32FOTA::forceUpdateSPIFFS(const char* firmwareURL, bool validate ) -{ - _firmwareUrl = firmwareURL; - _flashFileSystemUrl = firmwareURL; - _cfg.check_sig = validate; - return execSPIFFSOTA(); -} - - -bool esp32FOTA::forceUpdate(const char* firmwareHost, uint16_t firmwarePort, const char* firmwarePath, bool validate ) -{ - static String firmwareURL("http"); - if ( firmwarePort == 443 || firmwarePort == 4433 ) firmwareURL += "s"; - firmwareURL += String(firmwareHost); - firmwareURL += ":"; - firmwareURL += String(firmwarePort); - firmwareURL += firmwarePath; - return forceUpdate( firmwareURL.c_str(), validate ); -} - - -bool esp32FOTA::forceUpdate(bool validate ) -{ - // Forces an update from a manifest, ignoring the version check - if(!execHTTPcheck()) { - if (!_firmwareUrl) { - // execHTTPcheck returns false when the manifest is malformed or when the version isn't - // an upgrade. If _firmwareUrl isn't set we can't force an upgrade. - log_e("forceUpdate called, but unable to get _firmwareUrl from manifest via execHTTPcheck."); - return false; - } - } - _cfg.check_sig = validate; - return execOTA(); -} - - -/** - * This function return the new version of new firmware - */ -int esp32FOTA::getPayloadVersion() -{ - log_w( "This function only returns the MAJOR version. For complete depth use getPayloadVersion(char *)." ); - return _payload_sem.ver()->major; -} - - -void esp32FOTA::getPayloadVersion(char * version_string) -{ - semver_render( _payload_sem.ver(), version_string ); -} - - -void esp32FOTA::debugSemVer( const char* label, semver_t* version ) -{ - char version_no[256] = {'\0'}; - semver_render( version, version_no ); - log_i("%s: %s", label, version_no ); -} - - - - - - -static int64_t getHTTPStream( esp32FOTA* fota, int partition ) -{ - - const char* url = partition==U_SPIFFS ? fota->getFlashFS_URL() : fota->getFirmwareURL(); - - log_d("Opening item %s\n", url ); - - if(! fota->setupHTTP( url ) ) { // certs - log_e("unable to setup http, aborting!"); - return -1; - } - - int64_t updateSize = 0; - int httpCode = fota->getHTTPCLient()->GET(); - String contentType; - - fota->setFotaStream( nullptr ); - - if( httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY ) { - updateSize = fota->getHTTPCLient()->getSize(); - contentType = fota->getHTTPCLient()->header( "Content-type" ); - String acceptRange = fota->getHTTPCLient()->header( "Accept-Ranges" ); - if( acceptRange == "bytes" ) { - log_v("This server supports resume!" ); - } else { - log_v("This server does not support resume!" ); - } - } else { - switch( httpCode ) { - // 1xx = Hold on - // 2xx = Here you go - // 3xx = Go away - // 4xx = You fucked up - // 5xx = I fucked up - - case 204: log_e("Status: 204 (No contents), "); break; - case 401: log_e("Status: 401 (Unauthorized), check setExtraHTTPHeader() values"); break; - case 403: log_e("Status: 403 (Forbidden), check path on webserver?"); break; - case 404: log_e("Status: 404 (Not Found), also a palindrom, check path in manifest?"); break; - case 418: log_e("Status: 418 (I'm a teapot), Brit alert!"); break; - case 429: log_e("Status: 429 (Too many requests), throttle things down?"); break; - case 500: log_e("Status: 500 (Internal Server Error), you broke the webs!"); break; - default: - // This error may be a false positive or a consequence of the network being disconnected. - // Since the network is controlled from outside this class, only significant error messages are reported. - if( httpCode > 0 ) { - log_e("Server responded with HTTP Status '%i'. Please check your setup", httpCode ); - } else { - log_d("Unknown HTTP response"); - } - break; - } - - return -1; - } - - // TODO: Not all streams respond with a content length. - // TODO: Set updateSize to UPDATE_SIZE_UNKNOWN when content type is valid. - - // check updateSize and content type - if( updateSize<=0 ) { - log_e("There was no content in the http response: (length: %" PRId64 ", contentType: %s)\n", updateSize, contentType.c_str()); - return -1; - } - - log_d("updateSize : %" PRId64 ", contentType: %s", updateSize, contentType.c_str()); - - fota->setFotaStream( fota->getHTTPCLient()->getStreamPtr() ); - - return updateSize; -} - - - -static int64_t getFileStream( esp32FOTA* fota, int partition) -{ - fs::FS* fs = fota->getFotaFS(); - - if(!fs ) { - log_e("No filesystem defined, use ::setCertFileSystem( &SD ) "); - return -1; - } - - const char* path = partition==U_SPIFFS ? fota->getFlashFS_URL() : fota->getFirmwareURL(); - log_d("Opening item %s\n", path ); - - fs::File* file = (fs::File*)fota->getFotaStreamPtr(); - *file = fs->open( path ); - - if(! file ) { - log_e("unable to access filesystem, aborting!"); - return -1; - } - - int64_t updateSize = file->size(); - - // check updateSize and content type - if( !updateSize ) { - log_e("Empty file"); - file->close(); - fota->setFotaStream( nullptr ); - return -1; - } - - log_d("updateSize : %i", updateSize); - - return updateSize; -} - - - -static int64_t getSerialStream( esp32FOTA* fota, int partition) -{ - return -1; -} - - - -static bool WiFiStatusCheck() -{ - return (WiFi.status() == WL_CONNECTED); -} - -/* -static bool EthernetStatusCheck() -{ - return eth_connected; -} -*/ - - - -#pragma GCC diagnostic pop diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32FOTA.hpp b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32FOTA.hpp deleted file mode 100644 index 3ae345e..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32FOTA.hpp +++ /dev/null @@ -1,395 +0,0 @@ -/* - esp32 firmware OTA - Date: December 2018 - Author: Chris Joyce - Purpose: Perform an OTA update from a bin located on a webserver (HTTP Only) - - Date: 2021-12-21 - Author: Moritz Meintker - Remarks: Re-written/removed a bunch of functions around HTTPS. The library is - now URL-agnostic. This means if you provide an https://-URL it will - use the root_ca.pem (needs to be provided via PROGMEM/SPIFFS/LittleFS or SD) - to verify the server certificate and then download the ressource through an - encrypted connection unless you set the allow_insecure_https option. - Otherwise it will just use plain HTTP which will still offer to sign - your firmware image. - - Date: 2022-09-12 - Author: tobozo - Changes: - - Abstracted away filesystem - - Refactored some code blocks - - Added spiffs/littlefs/fatfs updatability - - Made crypto assets (pub key, rootca) loadable from multiple sources - Roadmap: - - Firmware/FlashFS update order (SPIFFS/LittleFS first or last?) - - Archive support for gz/targz formats - - firmware.gz + spiffs.gz in manifest - - bundle.tar.gz [ firmware + filesystem ] in manifest - - Update from Stream (e.g deported update via SD, http or gzupdater) -*/ - -#pragma once - -#define esp32fota_h - -extern "C" { - #include "semver/semver.h" -} - -#include -#include -#include -#include -#include - -// inherit includes from sketch, detect SPIFFS first for legacy support -#if __has_include() || defined _SPIFFS_H_ - #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - #pragma message "Using SPIFFS for certificate validation" - #endif - #include - #define FOTA_FS &SPIFFS -#elif __has_include() || defined _LiffleFS_H_ - #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - #pragma message "Using LittleFS for certificate validation" - #endif - #include - #define FOTA_FS &LittleFS -#elif __has_include() || defined _SD_H_ - #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - #pragma message "Using SD for certificate validation" - #endif - #include - #define FOTA_FS &SD -#elif __has_include() || defined _SD_MMC_H_ - #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - #pragma message "Using SD_MMC for certificate validation" - #endif - #include - #define FOTA_FS &SD_MMC -#elif defined _LIFFLEFS_H_ // older externally linked, hard to identify and unsupported versions of SPIFFS - #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - #pragma message "this version of LittleFS is unsupported, use #include instead, if using platformio add LittleFS(esp32)@^2.0.0 to lib_deps" - #endif -#elif __has_include() || defined _PSRAMFS_H_ - #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - #pragma message "Using PSRamFS for certificate validation" - #endif - #include - #define FOTA_FS &PSRamFS -#else - //#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - // #pragma message "No filesystem provided, certificate validation will be unavailable (hint: include SD, SPIFFS or LittleFS before including this library)" - //#endif - #define FOTA_FS nullptr -#endif - - - - -#if __has_include() - #pragma message "Using FlashZ as Update agent" - #include - #define F_Compression "zlib" - #define F_hasZlib() true - #define F_Update FlashZ::getInstance() - #define F_UpdateEnd() (mode_z ? F_Update.endz() : F_Update.end()) - #define F_abort() if (mode_z) F_Update.abortz(); else F_Update.abort() - #define F_writeStream() (mode_z ? F_Update.writezStream(*_stream, updateSize) : F_Update.writeStream(*_stream)) - // #define DEBUG_ESP32_FLASHZ - #if !defined DEBUG_ESP32_FLASHZ - #define F_isZlibStream() (_stream->peek() == ZLIB_HEADER && ((partition == U_SPIFFS && _flashFileSystemUrl.indexOf("zz")>-1) || (partition == U_FLASH && _firmwareUrl.indexOf("zz")>-1))) - #define F_canBegin() (mode_z ? F_Update.beginz(UPDATE_SIZE_UNKNOWN, partition) : F_Update.begin(updateSize, partition)) - #else - __attribute__((unused)) static bool F_canBegin_cb(bool mode_z, int updateSize, int partition) { // implement debug here - return (mode_z ? F_Update.beginz(UPDATE_SIZE_UNKNOWN, partition) : F_Update.begin(updateSize, partition)); - } - __attribute__((unused)) static bool F_isZlibStream_cb( Stream* stream, int partition, String flashFileSystemUrl, String firmwareUrl ) { // implement debug here - return (stream->peek() == ZLIB_HEADER && ((partition == U_SPIFFS && flashFileSystemUrl.indexOf("zz")>-1) || (partition == U_FLASH && firmwareUrl.indexOf("zz")>-1))); - } - #define F_isZlibStream() F_isZlibStream_cb( _stream, partition, _flashFileSystemUrl, _firmwareUrl ) - #define F_canBegin() F_canBegin_cb(mode_z, updateSize, partition) - #endif - -#elif __has_include("ESP32-targz.h") - #pragma message "Using GzUpdateClass as Update agent" - #include - #define F_Compression "gzip" - #define F_hasZlib() true - #define F_Update GzUpdateClass::getInstance() - #define F_UpdateEnd() (mode_z ? F_Update.endgz() : F_Update.end()) - #define F_abort() if (mode_z) F_Update.abortgz(); else F_Update.abort() - #define F_writeStream() (mode_z ? F_Update.writeGzStream(*_stream, updateSize) : F_Update.writeStream(*_stream)) - // #define DEBUG_ESP32_TARGZ - #if !defined DEBUG_ESP32_TARGZ - #define F_isZlibStream() (_stream->peek() == 0x1f && ((partition == U_SPIFFS && _flashFileSystemUrl.indexOf("gz")>-1) || (partition == U_FLASH && _firmwareUrl.indexOf("gz")>-1)) ) - #define F_canBegin() (mode_z ? F_Update.begingz(UPDATE_SIZE_UNKNOWN, partition) : F_Update.begin(updateSize, partition)) - #else - __attribute__((unused)) static bool F_canBegin_cb(bool mode_z, int updateSize, int partition) { // implement debug here - return (mode_z ? F_Update.begingz(UPDATE_SIZE_UNKNOWN, partition) : F_Update.begin(updateSize, partition)); - } - __attribute__((unused)) static bool F_isZlibStream_cb( Stream* stream, int partition, String flashFileSystemUrl, String firmwareUrl ) { // implement debug here - return (stream->peek() == 0x1f && ((partition == U_SPIFFS && flashFileSystemUrl.indexOf("gz")>-1) || (partition == U_FLASH && firmwareUrl.indexOf("gz")>-1)) ); - } - #define F_isZlibStream() F_isZlibStream_cb( _stream, partition, _flashFileSystemUrl, _firmwareUrl ) - #define F_canBegin() F_canBegin_cb(mode_z, updateSize, partition) - #endif -#else - #include - #define F_Compression "none" - #define F_Update Update - #define F_hasZlib() false - #define F_isZlibStream() false - #define F_canBegin() F_Update.begin(updateSize, partition) - #define F_UpdateEnd() F_Update.end() - #define F_abort() F_Update.abort() - #define F_writeStream() F_Update.writeStream(*_stream); -#endif - -#define FW_SIGNATURE_LENGTH 512 - -struct SemverClass -{ -public: - SemverClass( const char* version ); - SemverClass( int major, int minor=0, int patch=0 ); - ~SemverClass() { semver_free(&_ver); } - semver_t* ver(); -private: - semver_t _ver = semver_t(); -}; - - - - -// Filesystem/memory helper for signature check and pem validation. -// This is abstracted away to allow storage alternatives such as -// PROGMEM, SD, SPIFFS, LittleFS or FatFS -// Intended to be used by esp32FOTA.setPubKey() and esp32FOTA.setRootCA() -class CryptoAsset -{ -public: - virtual size_t size() = 0; - virtual const char* get() = 0; -}; - -class CryptoFileAsset : public CryptoAsset -{ -public: - CryptoFileAsset( const char* _path, fs::FS* _fs ) : path(_path), fs(_fs), contents(""), len(0) { } - size_t size(); - const char* get() { return contents.c_str(); } -private: - const char* path; - fs::FS* fs; - std::string contents; - size_t len; - bool fs_read_file(); -}; - -class CryptoMemAsset : public CryptoAsset -{ -public: - CryptoMemAsset( const char* _name, const char* _bytes, size_t _len ) : name(_name), bytes(_bytes), len(_len) { } - size_t size() { return len; }; - const char* get() { return bytes; } -private: - const char* name; - const char* bytes; - size_t len; -}; - - -struct FOTAConfig_t -{ - char* name { nullptr }; - char* manifest_url { nullptr }; - SemverClass sem {0}; - bool check_sig { false }; - bool unsafe { false }; - bool use_device_id { false }; - CryptoAsset* root_ca { nullptr }; - CryptoAsset* pub_key { nullptr }; - size_t signature_len {FW_SIGNATURE_LENGTH}; - FOTAConfig_t() = default; -}; - - -enum FOTAStreamType_t -{ - FOTA_HTTP_STREAM, - FOTA_FILE_STREAM, - FOTA_SERIAL_STREAM -}; - - -// Main Class -class esp32FOTA -{ -public: - - esp32FOTA(); - ~esp32FOTA(); - - esp32FOTA( FOTAConfig_t cfg ); - esp32FOTA(const char* firwmareType, int firwmareVersion, bool validate = false, bool allow_insecure_https = false ); - esp32FOTA(const String &firwmareType, int firwmareVersion, bool validate = false, bool allow_insecure_https = false ) - : esp32FOTA(firwmareType.c_str(), firwmareVersion, validate, allow_insecure_https){}; - esp32FOTA(const char* firwmareType, const char* firmwareSemanticVersion, bool validate = false, bool allow_insecure_https = false ); - esp32FOTA(const String &firwmareType, const String &firmwareSemanticVersion, bool validate = false, bool allow_insecure_https = false ) - : esp32FOTA(firwmareType.c_str(), firmwareSemanticVersion.c_str(), validate, allow_insecure_https){}; - - template void setPubKey( T* asset ) { _cfg.pub_key = (CryptoAsset*)asset; _cfg.check_sig = true; } - template void setRootCA( T* asset ) { _cfg.root_ca = (CryptoAsset*)asset; _cfg.unsafe = false; } - - bool forceUpdate(const char* firmwareHost, uint16_t firmwarePort, const char* firmwarePath, bool validate ); - bool forceUpdate(const char* firmwareURL, bool validate ); - bool forceUpdate(bool validate ); - - bool forceUpdateSPIFFS(const char* firmwareURL, bool validate ); - - void handle(); - - bool execOTA(); - bool execSPIFFSOTA(); - bool execOTA( int partition, bool restart_after = true ); - bool execHTTPcheck(); - - void useDeviceId( bool use=true ) { _cfg.use_device_id = use; } - - // config setter - void setConfig( FOTAConfig_t cfg ); - void printConfig( FOTAConfig_t *cfg=nullptr ); - - // Manually specify the manifest url, this is provided as a transition between legagy and new config system - void setManifestURL( const char* manifest_url ) { setString( &_cfg.manifest_url, manifest_url ); } - void setManifestURL( const String &manifest_url ) { setManifestURL( manifest_url.c_str() ); } - - // use this to set "Authorization: Basic" or other specific headers to be sent with the queries - void setExtraHTTPHeader( String name, String value ) { extraHTTPHeaders[name] = value; } - - // set the signature len - void setSignatureLen( size_t len ); - - // /!\ Only use this to change filesystem for **default** RootCA and PubKey paths. - // Otherwise use setPubKey() and setRootCA() - void setCertFileSystem( fs::FS *cert_filesystem = nullptr ); - - // this is passed to Update.onProgress() - typedef std::function ProgressCallback_cb; // size_t progress, size_t size - void setProgressCb(ProgressCallback_cb fn) { onOTAProgress = fn; } // callback setter - - // when Update.begin() returned false - typedef std::function UpdateBeginFail_cb; // int partition (U_FLASH or U_SPIFFS) - void setUpdateBeginFailCb(UpdateBeginFail_cb fn) { onUpdateBeginFail = fn; } // callback setter - - // after Update.end() and before validate_sig() - typedef std::function UpdateEnd_cb; // int partition (U_FLASH or U_SPIFFS) - void setUpdateEndCb(UpdateEnd_cb fn) { onUpdateEnd = fn; } // callback setter - - // validate_sig() error handling, mixed situations - typedef std::function UpdateCheckFail_cb; // int partition (U_FLASH or U_SPIFFS), int error_code - void setUpdateCheckFailCb(UpdateCheckFail_cb fn) { onUpdateCheckFail = fn; } // callback setter - - // update successful - typedef std::function UpdateFinished_cb; // int partition (U_FLASH or U_SPIFFS), bool restart_after - void setUpdateFinishedCb(UpdateFinished_cb fn) { onUpdateFinished = fn; } // callback setter - - // stream getter - typedef std::function getStream_cb; // esp32FOTA* this, int partition (U_FLASH or U_SPIFFS), returns stream size - void setStreamGetter( getStream_cb fn ) { getStream = fn; } // callback setter - - // stream ender - typedef std::function endStream_cb; // esp32FOTA* this - void setStreamEnder( endStream_cb fn ) { endStream = fn; } // callback setter - - // connection check - typedef std::function isConnected_cb; // - void setStatusChecker( isConnected_cb fn ) { isConnected = fn; } // callback setter - - // updating from a File or from Serial? - void setStreamType( FOTAStreamType_t stream_type ) { _stream_type = stream_type; } - void setStreamTimeout( uint32_t timeout ) { _stream_timeout = timeout; } - - const char* getManifestURL() { return _manifestUrl.c_str(); } - const char* getFirmwareURL() { return _firmwareUrl.c_str(); } - const char* getFlashFS_URL() { return _flashFileSystemUrl.c_str(); } - const char* getPath(int part) { return part==U_SPIFFS ? getFlashFS_URL() : getFirmwareURL(); } - - bool zlibSupported() { return mode_z; } - - int getPayloadVersion(); - void getPayloadVersion(char * version_string); - - FOTAConfig_t getConfig() { return _cfg; }; - FOTAStreamType_t getStreamType() { return _stream_type; } - HTTPClient* getHTTPCLient() { return &_http; } - WiFiClientSecure* getWiFiClient() { return &_client; } - fs::File* getFotaFilePtr() { return &_file; } - Stream* getFotaStreamPtr() { return _stream; } - fs::FS* getFotaFS() { return _fs; } - - // internals but need to be exposed to the callbacks - bool setupHTTP( const char* url ); - void setFotaStream( Stream* stream ) { _stream = stream; } - - //[[deprecated("Use setManifestURL( String ) or cfg.manifest_url with setConfig( FOTAConfig_t )")]] String checkURL = ""; - //[[deprecated("Use cfg.use_device_id with setConfig( FOTAConfig_t )")]] bool useDeviceID = false; - - bool validate_sig( const esp_partition_t* partition, unsigned char *signature, uint32_t firmware_size ); - -private: - - HTTPClient _http; - WiFiClientSecure _client; - Stream *_stream; - fs::File _file; - - bool mode_z = F_hasZlib(); - - FOTAStreamType_t _stream_type = FOTA_HTTP_STREAM; // defaults to HTTP - uint32_t _stream_timeout = 10000; // max wait for stream->available() - - void setupStream(); - void stopStream(); - void setString( char **dest, const char* src ); // mem allocator - - FOTAConfig_t _cfg; - - SemverClass _payload_sem = SemverClass(0,0,0); - - String _manifestUrl; - String _firmwareUrl; - String _flashFileSystemUrl; - - fs::FS *_fs = FOTA_FS; // default filesystem for certificate validation - - // custom callbacks provided by user - ProgressCallback_cb onOTAProgress; // this is passed to Update.onProgress() - UpdateBeginFail_cb onUpdateBeginFail; // when Update.begin() returned false - UpdateEnd_cb onUpdateEnd; // after Update.end() and before validate_sig() - UpdateCheckFail_cb onUpdateCheckFail; // validate_sig() error handling, mixed situations - UpdateFinished_cb onUpdateFinished; // update successful - getStream_cb getStream; // optional stream getter, defaults to http.getStreamPtr() - endStream_cb endStream; // optional stream closer, defaults to http.end() - isConnected_cb isConnected; // optional connection checker, defaults to WiFi.status()==WL_CONNECTED - - std::map extraHTTPHeaders; // this holds the extra http headers defined by the user - - String getDeviceID(); - bool checkJSONManifest(JsonVariant JSONDocument); - void debugSemVer( const char* label, semver_t* version ); - void getPartition( int update_partition ); - - - // temporary partition holder for signature check operations - const esp_partition_t* _target_partition = nullptr; - - // This is kept for legacy behaviour, use setPubKey() and setRootCA() with - // CryptoMemAsset ot CryptoFileAsset instead - void setupCryptoAssets(); - const char* rsa_key_pub_default_path = "/rsa_key.pub"; - const char* root_ca_pem_default_path = "/root_ca.pem"; - -}; diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32fota.h b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32fota.h deleted file mode 100644 index 41f9e04..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/esp32fota.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -// This is kept for legacy but should not be used in new releases -// as filename an project name don't match (esp32FOTA vs esp32fota) - -#ifdef __cplusplus - - #include "esp32FOTA.hpp" - -#else - - #error esp32FOTA requires a C++ compiler, please change file extension to .cc or .cpp - -#endif diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/README.md b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/README.md deleted file mode 100644 index 6a1bc53..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/README.md +++ /dev/null @@ -1,233 +0,0 @@ -# semver.c [![Build Status](https://travis-ci.org/h2non/semver.c.png)](https://travis-ci.org/h2non/semver.c) [![GitHub release](https://img.shields.io/github/tag/h2non/semver.c.svg)](https://github.com/h2non/semver.c/releases) - -[Semantic version](http://semver.org) v2.0 parser and render written in [ANSI C](https://en.wikipedia.org/wiki/ANSI_C) with zero dependencies. - -## Features - -- [x] Standard compliant (otherwise, open an issue) -- [x] Version metadata parsing -- [x] Version prerelease parsing -- [x] Version comparison helpers -- [x] Supports comparison operators -- [x] Version render -- [x] Version bump -- [x] Version sanitizer -- [x] 100% test coverage -- [x] No regexp (ANSI C doesn't support it) -- [x] Numeric conversion for sorting/filtering - -## Versions - -- [v0](https://github.com/h2non/semver.c/tree/89e66f36544e0250def32640b84b7e15c8585da4) - Legacy version. Beta. Not maintained anymore. -- [v1](https://github.com/h2non/semver.c) - Current stable version. - -## Usage - -Basic comparison: -```c -#include -#include - -char current[] = "1.5.10"; -char compare[] = "2.3.0"; - -int -main(int argc, char *argv[]) { - semver_t current_version = {}; - semver_t compare_version = {}; - - if (semver_parse(current, ¤t_version) - || semver_parse(compare, &compare_version)) { - fprintf(stderr,"Invalid semver string\n"); - return -1; - } - - int resolution = semver_compare(compare_version, current_version); - - if (resolution == 0) { - printf("Versions %s is equal to: %s\n", compare, current); - } - else if (resolution == -1) { - printf("Version %s is lower than: %s\n", compare, current); - } - else { - printf("Version %s is higher than: %s\n", compare, current); - } - - // Free allocated memory when we're done - semver_free(¤t_version); - semver_free(&compare_version); - return 0; -} -``` - -Satisfies version: - -```c -#include -#include - -semver_t current = {}; -semver_t compare = {}; - -int -main(int argc, char *argv[]) { - semver_parse("1.3.10", ¤t); - semver_parse("1.5.2", &compare); - - // Use caret operator for the comparison - char operator[] = "^"; - - if (semver_satisfies(current, compare, operator)) { - printf("Version %s can be satisfied by %s", "1.3.10", "1.5.2"); - } - - // Free allocated memory when we're done - semver_free(¤t); - semver_free(&compare); - return 0; -} -``` - -## Installation - -Clone this repository: - -```bash -$ git clone https://github.com/h2non/semver.c -``` - -Or install with [clib](https://github.com/clibs/clib): - -```bash -$ clib install h2non/semver.c -``` - -## API - -#### struct semver_t { int major, int minor, int patch, char * prerelease, char * metadata } - -semver base struct. - -#### semver_parse(const char *str, semver_t *ver) => int - -Parses a string as semver expression. - -**Returns**: - -- `-1` - In case of invalid semver or parsing error. -- `0` - All was fine! - -#### semver_compare(semver_t a, semver_t b) => int - -Compare versions `a` with `b`. - -Returns: -- `-1` in case of lower version. -- `0` in case of equal versions. -- `1` in case of higher version. - -#### semver_satisfies(semver_t a, semver_t b, char *operator) => int - -Checks if both versions can be satisfied -based on the given comparison operator. - -**Allowed operators**: - -- `=` - Equality -- `>=` - Higher or equal to -- `<=` - Lower or equal to -- `<` - Lower than -- `>` - Higher than -- `^` - Caret operator comparison ([more info](https://docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4)) -- `~` - Tilde operator comparison ([more info](https://docs.npmjs.com/misc/semver#tilde-ranges-1-2-3-1-2-1)) - -**Returns**: - -- `1` - Can be satisfied -- `0` - Cannot be satisfied - -#### semver_satisfies_caret(semver_t a, semver_t b) => int - -Checks if version `x` can be satisfied by `y` -performing a comparison with caret operator. - -See: https://docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 - -**Returns**: - -- `1` - Can be satisfied -- `0` - Cannot be satisfied - -#### semver_satisfies_patch(semver_t a, semver_t b) => int - -Checks if version `x` can be satisfied by `y` -performing a comparison with tilde operator. - -See: https://docs.npmjs.com/misc/semver#tilde-ranges-1-2-3-1-2-1 - -**Returns**: - -- `1` - Can be satisfied -- `0` - Cannot be satisfied - - -#### semver_eq(semver_t a, semver_t b) => int - -Equality comparison. - -#### semver_ne(semver_t a, semver_t b) => int - -Non equal comparison. - -#### semver_gt(semver_t a, semver_t b) => int - -Greater than comparison. - -#### semver_lt(semver_t a, semver_t b) => int - -Lower than comparison. - -#### semver_gte(semver_t a, semver_t b) => int - -Greater than or equal comparison. - -#### semver_lte(semver_t a, semver_t b) => int - -Lower than or equal comparison. - -#### semver_render(semver_t *v, char *dest) => void - -Render as string. - -#### semver_numeric(semver_t *v) => int - -Render as numeric value. Useful for ordering and filtering. - -#### semver_bump(semver_t *a) => void - -Bump major version. - -#### semver_bump_minor(semver_t *a) => void - -Bump minor version. - -#### semver_bump_patch(semver_t *a) => void - -Bump patch version. - -#### semver_free(semver_t *a) => void - -Helper to free allocated memory from heap. - -#### semver_is_valid(char *str) => int - -Checks if the given string is a valid semver expression. - -#### semver_clean(char *str) => int - -Removes invalid semver characters in a given string. - -## License - -MIT - Tomas Aparicio diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/semver.c b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/semver.c deleted file mode 100644 index 5cae0db..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/semver.c +++ /dev/null @@ -1,638 +0,0 @@ -/* - * semver.c - * - * Copyright (c) 2015-2017 Tomas Aparicio - * MIT licensed - */ - -#include -#include -#include -#include "semver.h" - -#define SLICE_SIZE 50 -#define DELIMITER "." -#define PR_DELIMITER "-" -#define MT_DELIMITER "+" -#define NUMBERS "0123456789" -#define ALPHA "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" -#define DELIMITERS DELIMITER PR_DELIMITER MT_DELIMITER -#define VALID_CHARS NUMBERS ALPHA DELIMITERS - -static const size_t MAX_SIZE = sizeof(char) * 255; -static const int MAX_SAFE_INT = (unsigned int) -1 >> 1; - -/** - * Define comparison operators, storing the - * ASCII code per each symbol in hexadecimal notation. - */ - -enum operators { - SYMBOL_GT = 0x3e, - SYMBOL_LT = 0x3c, - SYMBOL_EQ = 0x3d, - SYMBOL_TF = 0x7e, - SYMBOL_CF = 0x5e -}; - -/** - * Private helpers - */ - -/* - * Remove [begin:len-begin] from str by moving len data from begin+len to begin. - * If len is negative cut out to the end of the string. - */ -static int -strcut (char *str, int begin, int len) { - size_t l; - l = strlen(str); - - if((int)l < 0 || (int)l > MAX_SAFE_INT) return -1; - - if (len < 0) len = l - begin + 1; - if (begin + len > (int)l) len = l - begin; - memmove(str + begin, str + begin + len, l - len + 1 - begin); - - return len; -} - -static int -contains (const char c, const char *matrix, size_t len) { - size_t x; - for (x = 0; x < len; x++) - if ((char) matrix[x] == c) return 1; - return 0; -} - -static int -has_valid_chars (const char *str, const char *matrix) { - size_t i, len, mlen; - len = strlen(str); - mlen = strlen(matrix); - - for (i = 0; i < len; i++) - if (contains(str[i], matrix, mlen) == 0) - return 0; - - return 1; -} - -static int -binary_comparison (int x, int y) { - if (x == y) return 0; - if (x > y) return 1; - return -1; -} - -static int -parse_int (const char *s) { - int valid, num; - valid = has_valid_chars(s, NUMBERS); - if (valid == 0) return -1; - - num = strtol(s, NULL, 10); - if (num > MAX_SAFE_INT) return -1; - - return num; -} - -/* - * Return a string allocated on the heap with the content from sep to end and - * terminate buf at sep. - */ -static char * -parse_slice (char *buf, char sep) { - char *pr, *part; - int plen; - - /* Find separator in buf */ - pr = strchr(buf, sep); - if (pr == NULL) return NULL; - /* Length from separator to end of buf */ - plen = strlen(pr); - - /* Copy from buf into new string */ - part = (char*)calloc(plen + 1, sizeof(*part)); - if (part == NULL) return NULL; - memcpy(part, pr + 1, plen); - /* Null terminate new string */ - part[plen] = '\0'; - - /* Terminate buf where separator was */ - *pr = '\0'; - - return part; -} - -/** - * Parses a string as semver expression. - * - * Returns: - * - * `0` - Parsed successfully - * `-1` - In case of error - */ - -int -semver_parse (const char *str, semver_t *ver) { - int valid, res; - size_t len; - char *buf; - valid = semver_is_valid(str); - if (!valid) return -1; - - len = strlen(str); - buf = (char*)calloc(len + 1, sizeof(*buf)); - if (buf == NULL) return -1; - strcpy(buf, str); - - ver->metadata = parse_slice(buf, MT_DELIMITER[0]); - ver->prerelease = parse_slice(buf, PR_DELIMITER[0]); - - res = semver_parse_version(buf, ver); - free(buf); -#if DEBUG > 0 - printf("[debug] semver.c %s = %d.%d.%d, %s %s\n", str, ver->major, ver->minor, ver->patch, ver->prerelease, ver->metadata); -#endif - return res; -} - -/** - * Parses a given string as semver expression. - * - * Returns: - * - * `0` - Parsed successfully - * `-1` - Parse error or invalid - */ - -int -semver_parse_version (const char *str, semver_t *ver) { - size_t len; - int index, value; - char *slice, *next, *endptr; - slice = (char *) str; - index = 0; - - while (slice != NULL && index++ < 4) { - next = strchr(slice, DELIMITER[0]); - if (next == NULL) - len = strlen(slice); - else - len = next - slice; - if (len > SLICE_SIZE) return -1; - - /* Cast to integer and store */ - value = strtol(slice, &endptr, 10); - if (endptr != next && *endptr != '\0') return -1; - - switch (index) { - case 1: ver->major = value; break; - case 2: ver->minor = value; break; - case 3: ver->patch = value; break; - } - - /* Continue with the next slice */ - if (next == NULL) - slice = NULL; - else - slice = next + 1; - } - - return 0; -} - -static int -compare_prerelease (char *x, char *y) { - char *lastx, *lasty, *xptr, *yptr, *endptr; - int xlen, ylen, xisnum, yisnum, xnum, ynum; - int xn, yn, min, res; - if (x == NULL && y == NULL) return 0; - if (y == NULL && x) return -1; - if (x == NULL && y) return 1; - - lastx = x; - lasty = y; - xlen = strlen(x); - ylen = strlen(y); - - while (1) { - if ((xptr = strchr(lastx, DELIMITER[0])) == NULL) - xptr = x + xlen; - if ((yptr = strchr(lasty, DELIMITER[0])) == NULL) - yptr = y + ylen; - - xnum = strtol(lastx, &endptr, 10); - xisnum = endptr == xptr ? 1 : 0; - ynum = strtol(lasty, &endptr, 10); - yisnum = endptr == yptr ? 1 : 0; - - if (xisnum && !yisnum) return -1; - if (!xisnum && yisnum) return 1; - - if (xisnum && yisnum) { - /* Numerical comparison */ - if (xnum != ynum) return xnum < ynum ? -1 : 1; - } else { - /* String comparison */ - xn = xptr - lastx; - yn = yptr - lasty; - min = xn < yn ? xn : yn; - if ((res = strncmp(lastx, lasty, min))) return res < 0 ? -1 : 1; - if (xn != yn) return xn < yn ? -1 : 1; - } - - lastx = xptr + 1; - lasty = yptr + 1; - if (lastx == x + xlen + 1 && lasty == y + ylen + 1) break; - if (lastx == x + xlen + 1) return -1; - if (lasty == y + ylen + 1) return 1; - } - - return 0; -} - -int -semver_compare_prerelease (semver_t x, semver_t y) { - return compare_prerelease(x.prerelease, y.prerelease); -} - -/** - * Performs a major, minor and patch binary comparison (x, y). - * This function is mostly used internally - * - * Returns: - * - * `0` - If versiona are equal - * `1` - If x is higher than y - * `-1` - If x is lower than y - */ - -int -semver_compare_version (semver_t x, semver_t y) { - int res; - - if ((res = binary_comparison(x.major, y.major)) == 0) { - if ((res = binary_comparison(x.minor, y.minor)) == 0) { - return binary_comparison(x.patch, y.patch); - } - } - - return res; -} - -/** - * Compare two semantic versions (x, y). - * - * Returns: - * - `1` if x is higher than y - * - `0` if x is equal to y - * - `-1` if x is lower than y - */ - -int -semver_compare (semver_t x, semver_t y) { - int res; - - if ((res = semver_compare_version(x, y)) == 0) { - return semver_compare_prerelease(x, y); - } - - return res; -} - -/** - * Performs a `greater than` comparison - */ - -int -semver_gt (semver_t x, semver_t y) { - return semver_compare(x, y) == 1; -} - -/** - * Performs a `lower than` comparison - */ - -int -semver_lt (semver_t x, semver_t y) { - return semver_compare(x, y) == -1; -} - -/** - * Performs a `equality` comparison - */ - -int -semver_eq (semver_t x, semver_t y) { - return semver_compare(x, y) == 0; -} - -/** - * Performs a `non equal to` comparison - */ - -int -semver_neq (semver_t x, semver_t y) { - return semver_compare(x, y) != 0; -} - -/** - * Performs a `greater than or equal` comparison - */ - -int -semver_gte (semver_t x, semver_t y) { - return semver_compare(x, y) >= 0; -} - -/** - * Performs a `lower than or equal` comparison - */ - -int -semver_lte (semver_t x, semver_t y) { - return semver_compare(x, y) <= 0; -} - -/** - * Checks if version `x` can be satisfied by `y` - * performing a comparison with caret operator. - * - * See: https://docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 - * - * Returns: - * - * `1` - Can be satisfied - * `0` - Cannot be satisfied - */ - -int -semver_satisfies_caret (semver_t x, semver_t y) { - /* Major versions must always match. */ - if (x.major == y.major) { - /* If major version is 0, minor versions must match */ - if (x.major == 0) { - /* If minor version is 0, patch must match */ - if (x.minor == 0){ - return (x.minor == y.minor) && (x.patch == y.patch); - } - /* If minor version is not 0, patch must be >= */ - else if (x.minor == y.minor){ - return x.patch >= y.patch; - } - else{ - return 0; - } - } - else if (x.minor > y.minor){ - return 1; - } - else if (x.minor == y.minor) - { - return x.patch >= y.patch; - } - else { - return 0; - } - } - return 0; -} - -/** - * Checks if version `x` can be satisfied by `y` - * performing a comparison with tilde operator. - * - * See: https://docs.npmjs.com/misc/semver#tilde-ranges-1-2-3-1-2-1 - * - * Returns: - * - * `1` - Can be satisfied - * `0` - Cannot be satisfied - */ - -int -semver_satisfies_patch (semver_t x, semver_t y) { - return x.major == y.major - && x.minor == y.minor; -} - -/** - * Checks if both versions can be satisfied - * based on the given comparison operator. - * - * Allowed operators: - * - * - `=` - Equality - * - `>=` - Higher or equal to - * - `<=` - Lower or equal to - * - `<` - Lower than - * - `>` - Higher than - * - `^` - Caret comparison (see https://docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4) - * - `~` - Tilde comparison (see https://docs.npmjs.com/misc/semver#tilde-ranges-1-2-3-1-2-1) - * - * Returns: - * - * `1` - Can be satisfied - * `0` - Cannot be satisfied - */ - -int -semver_satisfies (semver_t x, semver_t y, const char *op) { - int first, second; - /* Extract the comparison operator */ - first = op[0]; - second = op[1]; - - /* Caret operator */ - if (first == SYMBOL_CF) - return semver_satisfies_caret(x, y); - - /* Tilde operator */ - if (first == SYMBOL_TF) - return semver_satisfies_patch(x, y); - - /* Strict equality */ - if (first == SYMBOL_EQ) - return semver_eq(x, y); - - /* Greater than or equal comparison */ - if (first == SYMBOL_GT) { - if (second == SYMBOL_EQ) { - return semver_gte(x, y); - } - return semver_gt(x, y); - } - - /* Lower than or equal comparison */ - if (first == SYMBOL_LT) { - if (second == SYMBOL_EQ) { - return semver_lte(x, y); - } - return semver_lt(x, y); - } - - return 0; -} - -/** - * Free heep allocated memory of a given semver. - * This is just a convenient function that you - * should call when you're done. - */ - -void -semver_free (semver_t *x) { - if (x->metadata) { - free(x->metadata); - x->metadata = NULL; - } - if (x->prerelease) { - free(x->prerelease); - x->prerelease = NULL; - } -} - -/** - * Renders - */ - -static void -concat_num (char * str, int x, const char * sep) { - char buf[SLICE_SIZE] = {0}; - if (sep == NULL) sprintf(buf, "%d", x); - else sprintf(buf, "%s%d", sep, x); - strcat(str, buf); -} - -static void -concat_char (char * str, char * x, const char * sep) { - char buf[SLICE_SIZE] = {0}; - sprintf(buf, "%s%s", sep, x); - strcat(str, buf); -} - -/** - * Render a given semver as string - */ - -void -semver_render (semver_t *x, char *dest) { - concat_num(dest, x->major, NULL); - concat_num(dest, x->minor, DELIMITER); - concat_num(dest, x->patch, DELIMITER); - if (x->prerelease) concat_char(dest, x->prerelease, PR_DELIMITER); - if (x->metadata) concat_char(dest, x->metadata, MT_DELIMITER); -} - -/** - * Version bump helpers - */ - -void -semver_bump (semver_t *x) { - x->major++; -} - -void -semver_bump_minor (semver_t *x) { - x->minor++; -} - -void -semver_bump_patch (semver_t *x) { - x->patch++; -} - -/** - * Helpers - */ - -static int -has_valid_length (const char *s) { - return strlen(s) <= MAX_SIZE; -} - -/** - * Checks if a given semver string is valid - * - * Returns: - * - * `1` - Valid expression - * `0` - Invalid - */ - -int -semver_is_valid (const char *s) { - return has_valid_length(s) - && has_valid_chars(s, VALID_CHARS); -} - -/** - * Removes non-valid characters in the given string. - * - * Returns: - * - * `0` - Valid - * `-1` - Invalid input - */ - -int -semver_clean (char *s) { - size_t i, len, mlen; - int res; - if (has_valid_length(s) == 0) return -1; - - len = strlen(s); - mlen = strlen(VALID_CHARS); - - for (i = 0; i < len; i++) { - if (contains(s[i], VALID_CHARS, mlen) == 0) { - res = strcut(s, i, 1); - if(res == -1) return -1; - --len; --i; - } - } - - return 0; -} - -static int -char_to_int (const char * str) { - int buf; - size_t i,len, mlen; - buf = 0; - len = strlen(str); - mlen = strlen(VALID_CHARS); - - for (i = 0; i < len; i++) - if (contains(str[i], VALID_CHARS, mlen)) - buf += (int) str[i]; - - return buf; -} - -/** - * Render a given semver as numeric value. - * Useful for ordering and filtering. - */ - -int -semver_numeric (semver_t *x) { - int num; - char buf[SLICE_SIZE * 3]; - memset(&buf, 0, SLICE_SIZE * 3); - - if (x->major) concat_num(buf, x->major, NULL); - if (x->major || x->minor) concat_num(buf, x->minor, NULL); - if (x->major || x->minor || x->patch) concat_num(buf, x->patch, NULL); - - num = parse_int(buf); - if(num == -1) return -1; - - if (x->prerelease) num += char_to_int(x->prerelease); - if (x->metadata) num += char_to_int(x->metadata); - - return num; -} diff --git a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/semver.h b/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/semver.h deleted file mode 100644 index e669a4a..0000000 --- a/SmartEVSE-3/SmartEVSE-3/lib/esp32FOTA/src/semver/semver.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * semver.h - * - * Copyright (c) 2015-2017 Tomas Aparicio - * MIT licensed - */ - -#ifndef __SEMVER_H -#define __SEMVER_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef SEMVER_VERSION -#define SEMVER_VERSION "0.2.0" -#endif - -/** - * semver_t struct - */ - -typedef struct semver_version_s { - int major; - int minor; - int patch; - char * metadata; - char * prerelease; -} semver_t; - -/** - * Set prototypes - */ - -int semver_satisfies (semver_t x, semver_t y, const char *op); -int semver_satisfies_caret (semver_t x, semver_t y); -int semver_satisfies_patch (semver_t x, semver_t y); -int semver_compare (semver_t x, semver_t y); -int semver_compare_version (semver_t x, semver_t y); -int semver_compare_prerelease (semver_t x, semver_t y); -int semver_gt (semver_t x, semver_t y); -int semver_gte (semver_t x, semver_t y); -int semver_lt (semver_t x, semver_t y); -int semver_lte (semver_t x, semver_t y); -int semver_eq (semver_t x, semver_t y); -int semver_neq (semver_t x, semver_t y); -int semver_parse (const char *str, semver_t *ver); -int semver_parse_version (const char *str, semver_t *ver); -void semver_render (semver_t *x, char *dest); -int semver_numeric (semver_t *x); -void semver_bump (semver_t *x); -void semver_bump_minor (semver_t *x); -void semver_bump_patch (semver_t *x); -void semver_free (semver_t *x); -int semver_is_valid (const char *s); -int semver_clean (char *s); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/SmartEVSE-3/SmartEVSE-3/pack.py b/SmartEVSE-3/SmartEVSE-3/pack.py deleted file mode 100644 index d137cac..0000000 --- a/SmartEVSE-3/SmartEVSE-3/pack.py +++ /dev/null @@ -1,117 +0,0 @@ -# Shamelessly translated mongsoose 7.13 pack.c to python to provide portability for platformio core software - -# perhaps Copyright (c) Cesanta Software Limited, I'm not sure because I'm not a lawyer -# might also be Copyright me or Copyright ChatGPT -# All rights reserved. -# but not sure by whom - -# This program is used to pack arbitrary data into a C binary. It takes -# a list of files as an input, and produces a .c data file that contains -# contents of all these files as a collection of byte arrays. -# -# Usage: -# 2. Convert list of files into single .c: -# ./pack file1.data file2.data > fs.c -# -# 3. In your application code, you can access files using this function: -# const char *mg_unpack(const char *file_name, size_t *size); -# -# 4. Build your app with fs.c: -# cc -o my_app my_app.c fs.c - -import errno -import sys -import os -import stat -import time - -code = """static int scmp(const char *a, const char *b) { - while (*a && (*a == *b)) a++, b++; - return *(const unsigned char *) a - *(const unsigned char *) b; -} -const char *mg_unlist(size_t no) { - return packed_files[no].name; -} -const char *mg_unpack(const char *name, size_t *size, time_t *mtime) { - const struct packed_file *p; - for (p = packed_files; p->name != NULL; p++) { - if (scmp(p->name, name) != 0) continue; - if (size != NULL) *size = p->size - 1; - if (mtime != NULL) *mtime = p->mtime; - return (const char *) p->data; - } - return NULL; -} -""" - -def main(argv): - i = 0 - strip_prefix = "" - - print("#include ") - print("#include ") - print("#include ") - print("") - print("#if defined(__cplusplus)\nextern \"C\" {\n#endif") - print("const char *mg_unlist(size_t no);") - print("const char *mg_unpack(const char *, size_t *, time_t *);") - print("#if defined(__cplusplus)\n}\n#endif\n\n", end='') - - while i < len(argv): - if argv[i] == "-s": - strip_prefix = argv[i + 1] - i += 2 - elif argv[i] == "-h" or argv[i] == "--help": - sys.stderr.write("Usage: %s[-s STRIP_PREFIX] files...\n" % argv[0]) - sys.exit(os.EX_USAGE) - else: - ascii = [''] * 12 - with open(argv[i], "rb") as fp: - print("static const unsigned char v%d[] = {" % (i + 1)) - j = 0 - while True: - ch = fp.read(1) - if not ch: - break - ch = ord(ch) - if j == len(ascii): - print(" // %s" % ''.join(ascii)) - j = 0 - ascii[j] = chr(ch) if ch >= 32 and ch <= 126 and ch != 92 else '.' - print(" %3u," % ch, end='') - j += 1 - print(" 0 // %s\n};" % ''.join(ascii)) - - i += 1 - - print("") - print("static const struct packed_file {") - print(" const char *name;") - print(" const unsigned char *data;") - print(" size_t size;") - print(" time_t mtime;") - print("} packed_files[] = {") - - i = 0 - while i < len(argv): - if argv[i] == "-s": - i += 1 - continue - st = os.stat(argv[i]) - name = argv[i] - n = len(strip_prefix) - if argv[i] == "-s": - i += 1 - continue - if name.startswith(strip_prefix): - name = name[n:] - print(" {\"/%s\", v%d, sizeof(v%d), %lu}," % (name, i + 1, i + 1, st.st_mtime)) - i += 1 - - print(" {NULL, NULL, 0, 0}") - print("};\n") - print(code, end='') - -if __name__ == "__main__": - main(sys.argv[1:]) - diff --git a/SmartEVSE-3/SmartEVSE-3/packfs.py b/SmartEVSE-3/SmartEVSE-3/packfs.py deleted file mode 100644 index 2ab145b..0000000 --- a/SmartEVSE-3/SmartEVSE-3/packfs.py +++ /dev/null @@ -1,34 +0,0 @@ -#this script will be run by platformio.ini from its native directory -import os, sys, gzip, shutil - -#check for the two files we need to be able to keep updating the firmware by the /update endpoint: -if not os.path.isfile("data/update2.html"): - print("Missing file: data/update2.html") - sys.exit(1) -if os.path.isdir("pack.tmp"): - shutil.rmtree('pack.tmp') -try: - filelist = [] - os.makedirs('pack.tmp/data') - # now gzip the stuff except zones.csv since this file is not served by mongoose but directly accessed: - for file in os.listdir("data"): - filename = os.fsdecode(file) - if filename == "zones.csv" or filename == "cert.pem" or filename == "key.pem" or filename == "rsa_key.pub": - shutil.copy('data/' + filename, 'pack.tmp/data/' + filename) - filelist.append('data/' + filename) - continue - else: - with open('data/' + filename, 'rb') as f_in, gzip.open('pack.tmp/data/' + filename + '.gz', 'wb') as f_out: - f_out.writelines(f_in) - filelist.append('data/' + filename + '.gz') - continue - os.chdir('pack.tmp') - cmdstring = 'python ../pack.py ' + ' '.join(filelist) - os.system(cmdstring + '>../src/packed_fs.c') - os.chdir('..') -except Exception as e: - print(f"An error occurred: {str(e)}") - sys.exit(100) -if shutil.rmtree("pack.tmp"): - print("Failed to clean up temporary files") - sys.exit(9) diff --git a/SmartEVSE-3/SmartEVSE-3/partitions_custom.csv.coredump b/SmartEVSE-3/SmartEVSE-3/partitions_custom.csv.coredump deleted file mode 100644 index 908b836..0000000 --- a/SmartEVSE-3/SmartEVSE-3/partitions_custom.csv.coredump +++ /dev/null @@ -1,8 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -ota_0, app, ota_0, 0x10000, 0x1B0000, -ota_1, app, ota_1, 0x1c0000, 0x1B0000, -spiffs, data, spiffs, 0x370000, 0x80000, -coredump, data, coredump,0x3F0000, 64K -# Serialnr, per device key, (wifi) settings are stored in the nvs (arduino: preferences) partition diff --git a/SmartEVSE-3/SmartEVSE-3/platformio.ini b/SmartEVSE-3/SmartEVSE-3/platformio.ini deleted file mode 100644 index a480ac4..0000000 --- a/SmartEVSE-3/SmartEVSE-3/platformio.ini +++ /dev/null @@ -1,42 +0,0 @@ -; PlatformIO Project Configuration File -; -; Build options: build flags, source filter -; Upload options: custom upload port, speed and extra flags -; Library options: dependencies, extra library storages -; Advanced options: extra scripting -; -; Please visit documentation for the other options and examples -; https://docs.platformio.org/page/projectconf.html - -[platformio] -description = SmartEVSE v3 (ESP32) -default_envs = release - -[env] -platform = espressif32 @ 6.6.0 -board = esp32dev -framework = arduino -monitor_port = /dev/ttyUSB0 -monitor_speed = 115200 -upload_speed = 2000000 -board_build.f_flash = 80000000L -board_build.flash_mode = dio -lib_ignore = - LittleFS_esp32 -lib_deps = - https://github.com/tzapu/WiFiManager.git - miq19/eModbus@1.7.1 - bblanchon/ArduinoJson@^6.21.4 -monitor_filters = esp32_exception_decoder -board_build.partitions = partitions_custom.csv -extra_scripts = pre:packfs.py - -[env:release] -build_flags = - -DCORE_DEBUG_LEVEL=5 - -DLOG_LEVEL=5 - -DMG_ENABLE_PACKED_FS=1 - -DMG_TLS=MG_TLS_MBED - -Wall - -Wextra - -Wunused-variable diff --git a/SmartEVSE-3/SmartEVSE-3/release b/SmartEVSE-3/SmartEVSE-3/release deleted file mode 120000 index 7c14c3a..0000000 --- a/SmartEVSE-3/SmartEVSE-3/release +++ /dev/null @@ -1 +0,0 @@ -.pio/build/release \ No newline at end of file diff --git a/SmartEVSE-3/SmartEVSE-3/src/CMakeLists.txt b/SmartEVSE-3/SmartEVSE-3/src/CMakeLists.txt deleted file mode 100644 index 483bc0c..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -# This file was automatically generated for projects -# without default 'CMakeLists.txt' file. - -FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*) - -idf_component_register(SRCS ${app_sources}) diff --git a/SmartEVSE-3/SmartEVSE-3/src/OneWire.cpp b/SmartEVSE-3/SmartEVSE-3/src/OneWire.cpp deleted file mode 100644 index 1d5ffca..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/OneWire.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/* -; Project: Smart EVSE -; -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. -*/ - -#include -#include -#include -#include -#include - -#include "evse.h" -#include "utils.h" -#include "OneWire.h" - -unsigned char RFID[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -unsigned char RFIDlist[600]; // holds up to 100 RFIDs - - -// ############################# OneWire functions ############################# - - - -// Reset 1-Wire device on SW input -// returns: 1 Device found -// 0 No device found -// 255 Error. Line is pulled low (short, or external button pressed?) -// -unsigned char OneWireReset(void) { - unsigned char r; - - if (digitalRead(PIN_SW_IN) == LOW) return 255; // Error, pulled low by external device? - - ONEWIRE_LOW; // Drive wire low - delayMicroseconds(480); - RTC_ENTER_CRITICAL(); // Disable interrupts - ONEWIRE_FLOATHIGH; // don't drive high, but use pullup - delayMicroseconds(70); - if (digitalRead(PIN_SW_IN) == HIGH) r = 0; // sample pin to see if there is a OneWire device.. - else r = 1; - RTC_EXIT_CRITICAL(); // Restore interrupts - delayMicroseconds(410); - return r; -} - -void OneWireWriteBit(unsigned char v) { - - if (v & 1) { // write a '1' - RTC_ENTER_CRITICAL(); // Disable interrupts - ONEWIRE_LOW; // Drive low - delayMicroseconds(10); - ONEWIRE_HIGH; // Drive high - RTC_EXIT_CRITICAL(); // Restore interrupts - delayMicroseconds(55); - } else { // write a '0' - RTC_ENTER_CRITICAL(); // Disable interrupts - ONEWIRE_LOW; // Drive low - delayMicroseconds(65); - ONEWIRE_HIGH; // Drive high - RTC_EXIT_CRITICAL(); // Restore interrupts - delayMicroseconds(5); - } -} - -unsigned char OneWireReadBit(void) { - unsigned char r; - - RTC_ENTER_CRITICAL(); // Disable interrupts - ONEWIRE_LOW; - delayMicroseconds(3); - ONEWIRE_FLOATHIGH; - delayMicroseconds(10); - if (digitalRead(PIN_SW_IN) == HIGH) r = 1; // sample pin - else r = 0; - RTC_EXIT_CRITICAL(); // Restore interrupts - delayMicroseconds(53); - return r; -} - -void OneWireWrite(unsigned char v) { - unsigned char bitmask; - for (bitmask = 0x01; bitmask ; bitmask <<= 1) { - OneWireWriteBit( (bitmask & v) ? 1u : 0); - } -} - -unsigned char OneWireRead(void) { - unsigned char bitmask, r = 0; - - for (bitmask = 0x01; bitmask ; bitmask <<= 1) { - if ( OneWireReadBit()) r |= bitmask; - } - return r; -} - -#if FAKE_RFID -unsigned char OneWireReadCardId(void) { - if (!RFIDstatus && Show_RFID) { //if ready to accept new card and it is shown - RFID[0] = 0x01; //Family Code - RFID[1] = 0x01; //RFID id = "01 02 03 04 05 06" - RFID[2] = 0x02; - RFID[3] = 0x03; - RFID[4] = 0x04; - RFID[5] = 0x05; - RFID[6] = 0x06; - RFID[7] = 0xf0; //crc8 code TODO is this ok? - Show_RFID = 0; //this makes "showing" the RFID a one shot event - return 1; - } - else - return 0; //card is already read, no new card -} - -#else -unsigned char OneWireReadCardId(void) { - unsigned char x; - - if (OneWireReset() == 1) { // RFID card detected - OneWireWrite(0x33); // OneWire ReadRom Command - for (x=0 ; x<8 ; x++) RFID[x] = OneWireRead(); // read Family code (0x01) RFID ID (6 bytes) and crc8 - if (crc8(RFID,8)) { - RFID[0] = 0; // CRC incorrect, clear first byte of RFID buffer - return 0; - } else { - for (x=1 ; x<7 ; x++) _LOG_A("%02x",RFID[x]); - _LOG_A("\r\n"); - return 1; - } - } - return 0; -} -#endif - - -// ############################## RFID functions ############################## - - - -// Write a list of 20 RFID's to the eeprom -// -void WriteRFIDlist(void) { - - if (preferences.begin("RFIDlist", false) ) { // read/write - preferences.putBytes("RFID", RFIDlist, 600); // write 600 bytes to storage - preferences.putUChar("RFIDinit", 2); // data initialized to 600byte mode - preferences.end(); - } else { - _LOG_A("Error opening preferences!\n"); - } - - - _LOG_I("\nRFID list saved\n"); -} - -// Read a list of 20 RFID's from preferences -// -void ReadRFIDlist(void) { - uint8_t initialized = 0; - - if (preferences.begin("RFIDlist", true) ) { // read only - initialized = preferences.getUChar("RFIDinit", 0); - switch (initialized) { - case 1: // we were initialized to old 120 bytes mode - preferences.getBytes("RFID", RFIDlist, 120); // read 120 bytes from storage - //we are now going to convert from RFIDlist 120bytes to RFIDlist 600bytes - for (int i = 120; i < 600; i++) RFIDlist[i] = 0xff; - preferences.remove("RFID"); - preferences.end(); - WriteRFIDlist(); - break; - case 0: - DeleteAllRFID(); // when unitialized, delete all cardIDs - setItemValue(MENU_RFIDREADER, 0); // RFID Reader Disabled - break; - case 2: // extended RFIDlist with room for 100tags of 6 bytes = 600 bytes - preferences.getBytes("RFID", RFIDlist, 600); // read 600 bytes from storage - preferences.end(); - break; - } - - } else { - _LOG_A("Error opening preferences!\n") ; - } -} - -// scan for matching RFID in RFIDlist -// returns offset+6 when found, 0 when not found -uint16_t MatchRFID(void) { - uint16_t offset = 0, r; - - do { - r = memcmp(RFID + 1, RFIDlist + offset, 6); // compare read RFID with list of stored RFID's - offset += 6; - } while (r !=0 && offset < 594); - - if (r == 0) return offset; // return offset + 6 in RFIDlist - else return 0; -} - - -// Store RFID card in memory and eeprom -// returns 1 when successful -// returns 2 when already stored -// returns 0 when all slots are full. -unsigned char StoreRFID(void) { - uint16_t offset = 0, r; - unsigned char empty[6] = {0xff,0xff,0xff,0xff,0xff,0xff}; - - // first check if the Card ID was already stored. - if ( MatchRFID() ) return 2; // already stored, that's ok. - - do { - r = memcmp(empty, RFIDlist + offset, 6); - offset += 6; - } while (r !=0 && offset < 600); - if (r != 0) return 0; // no more room to store RFID - offset -= 6; - _LOG_A("offset %u ",offset); - memcpy(RFIDlist + offset, RFID+1, 6); - - _LOG_I("\nRFIDlist:"); - for (r=0; r<600; r++) _LOG_I_NO_FUNC("%02x",RFIDlist[r]); - - WriteRFIDlist(); - return 1; -} - -//load and store parameter RFIDparm into global variable RFID -void LoadandStoreRFID(unsigned int *RFIDparam) { - for (int i = 0; i < 8; i++) - RFID[i]=RFIDparam[i]; - StoreRFID(); -} - -// Delete RFID card in memory and eeprom -// returns 1 when successful, 0 when RFID was not found -unsigned char DeleteRFID(void) { - uint16_t offset = 0, r; - - offset = MatchRFID(); // find RFID in list - if (offset) { - offset -= 6; - for (r = 0; r < 6; r++) RFIDlist[offset + r] = 0xff; - } else return 0; - - _LOG_A("deleted %u ",offset); - for (r=0; r<600; r++) _LOG_A("%02x",RFIDlist[r]); - - WriteRFIDlist(); - return 1; -} - -void DeleteAllRFID(void) { - uint16_t i; - - for (i = 0; i < 600; i++) RFIDlist[i] = 0xff; - WriteRFIDlist(); - _LOG_I("All RFID cards erased!\n"); -} - -void CheckRFID(void) { - uint16_t x; - // When RFID is enabled, a OneWire RFID reader is expected on the SW input - uint8_t RFIDReader = getItemValue(MENU_RFIDREADER); - if (RFIDReader) { // RFID Reader set to Enabled, Learn or Delete - if (OneWireReadCardId() ) { // Read card ID - switch (RFIDReader) { - case 1: // EnableAll. All learned cards accepted for locking /unlocking - x = MatchRFID(); - if (x && !RFIDstatus) { - _LOG_A("RFID card found!\n"); - if (Access_bit) { - setAccess(false); // Access Off, Switch back to state B1/C1 - } else setAccess(true); - - RFIDstatus = 1; - } else if (!x) RFIDstatus = 7; // invalid card - BacklightTimer = BACKLIGHT; - break; - case 2: // EnableOne. Only the card that unlocks, can re-lock the EVSE - x = MatchRFID(); - if (x && !RFIDstatus) { - _LOG_A("RFID card found!\n"); - if (!Access_bit) { - CardOffset = x; // store cardoffset from current card - setAccess(true); // Access On - } else if (CardOffset == x) { - setAccess(false); // Access Off, Switch back to state B1/C1 - } - RFIDstatus = 1; - } else if (!x) RFIDstatus = 7; // invalid card - BacklightTimer = BACKLIGHT; - break; - case 3: // Learn Card - x = StoreRFID(); - if (x == 1) { - _LOG_A("RFID card stored!\n"); - RFIDstatus = 2; - } else if (x == 2 && !RFIDstatus) { - _LOG_A("RFID card was already stored!\n"); - RFIDstatus = 4; - } else if (!RFIDstatus) { - _LOG_A("RFID storage full! Delete card first\n"); - RFIDstatus = 6; - } - break; - case 4: // Delete Card - x = DeleteRFID(); - if (x) { - _LOG_A("RFID card deleted!\n"); - RFIDstatus = 3; - } else if (!RFIDstatus) { - _LOG_A("RFID card not in list!\n"); - RFIDstatus = 5; - } - break; - default: - break; - } - } else RFIDstatus = 0; - } -} diff --git a/SmartEVSE-3/SmartEVSE-3/src/evse.cpp b/SmartEVSE-3/SmartEVSE-3/src/evse.cpp deleted file mode 100644 index 8faec49..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/evse.cpp +++ /dev/null @@ -1,5359 +0,0 @@ -#include -#include -#include -#include - -#include - -#include - -#include -#include "esp_ota_ops.h" - -#include -#include - -#include -#include - -#include -#include // Slave/node -#include // Master -#include - -#include -#include -#include -#include - -#include - -#include "evse.h" -#include "glcd.h" -#include "utils.h" -#include "OneWire.h" -#include "modbus.h" - -#ifndef DEBUG_DISABLED -RemoteDebug Debug; -#endif - -#define SNTP_GET_SERVERS_FROM_DHCP 1 -#include - -struct tm timeinfo; - -//mongoose stuff -#include "mongoose.h" -#include "esp_log.h" -struct mg_mgr mgr; // Mongoose event manager. Holds all connections -// end of mongoose stuff - -String APhostname = "SmartEVSE-" + String( MacId() & 0xffff, 10); // SmartEVSE access point Name = SmartEVSE-xxxxx - -#if MQTT -// MQTT connection info -String MQTTuser; -String MQTTpassword; -String MQTTprefix; -String MQTTHost = ""; -uint16_t MQTTPort; - -uint8_t lastMqttUpdate = 0; -#endif - -WiFiManager wifiManager; - -// SSID and PW for your Router -String Router_SSID; -String Router_Pass; - -// Create a ModbusRTU server, client and bridge instance on Serial1 -ModbusServerRTU MBserver(2000, PIN_RS485_DIR); // TCP timeout set to 2000 ms -ModbusClientRTU MBclient(PIN_RS485_DIR); - -hw_timer_t * timerA = NULL; -Preferences preferences; - -static esp_adc_cal_characteristics_t * adc_chars_CP; -static esp_adc_cal_characteristics_t * adc_chars_PP; -static esp_adc_cal_characteristics_t * adc_chars_Temperature; - -struct ModBus MB; // Used by SmartEVSE fuctions - -extern unsigned char RFID[8]; - -const char StrStateName[15][13] = {"A", "B", "C", "D", "COMM_B", "COMM_B_OK", "COMM_C", "COMM_C_OK", "Activate", "B1", "C1", "MODEM1", "MODEM2", "MODEM_OK", "MODEM_DENIED"}; -const char StrStateNameWeb[15][17] = {"Ready to Charge", "Connected to EV", "Charging", "D", "Request State B", "State B OK", "Request State C", "State C OK", "Activate", "Charging Stopped", "Stop Charging", "Modem Setup", "Modem Request", "Modem Done", "Modem Denied"}; -const char StrErrorNameWeb[9][20] = {"None", "No Power Available", "Communication Error", "Temperature High", "EV Meter Comm Error", "RCM Tripped", "Waiting for Solar", "Test IO", "Flash Error"}; -const char StrMode[3][8] = {"Normal", "Smart", "Solar"}; -const char StrAccessBit[2][6] = {"Deny", "Allow"}; -const char StrRFIDStatusWeb[8][20] = {"Ready to read card","Present", "Card Stored", "Card Deleted", "Card already stored", "Card not in storage", "Card Storage full", "Invalid" }; -bool shouldReboot = false; - -// Global data - - -// The following data will be updated by eeprom/storage data at powerup: -uint16_t MaxMains = MAX_MAINS; // Max Mains Amps (hard limit, limited by the MAINS connection) (A) -uint16_t MaxSumMains = MAX_SUMMAINS; // Max Mains Amps summed over all 3 phases, limit used by EU capacity rate - // see https://github.com/serkri/SmartEVSE-3/issues/215 -uint16_t MaxCurrent = MAX_CURRENT; // Max Charge current (A) -uint16_t MinCurrent = MIN_CURRENT; // Minimal current the EV is happy with (A) -uint16_t ICal = ICAL; // CT calibration value -uint8_t Mode = MODE; // EVSE mode (0:Normal / 1:Smart / 2:Solar) -uint32_t CurrentPWM = 0; // Current PWM duty cycle value (0 - 1024) -int8_t InitialSoC = -1; // State of charge of car -int8_t FullSoC = -1; // SoC car considers itself fully charged -int8_t ComputedSoC = -1; // Estimated SoC, based on charged kWh -int8_t RemainingSoC = -1; // Remaining SoC, based on ComputedSoC -int32_t TimeUntilFull = -1; // Remaining time until car reaches FullSoC, in seconds -int32_t EnergyCapacity = -1; // Car's total battery capacity -int32_t EnergyRequest = -1; // Requested amount of energy by car -char EVCCID[32]; // Car's EVCCID (EV Communication Controller Identifer) -char RequiredEVCCID[32]; // Required EVCCID before allowing charging - -bool CPDutyOverride = false; -uint8_t Lock = LOCK; // Cable lock (0:Disable / 1:Solenoid / 2:Motor) -uint16_t MaxCircuit = MAX_CIRCUIT; // Max current of the EVSE circuit (A) -uint8_t Config = CONFIG; // Configuration (0:Socket / 1:Fixed Cable) -uint8_t LoadBl = LOADBL; // Load Balance Setting (0:Disable / 1:Master / 2-8:Node) -uint8_t Switch = SWITCH; // External Switch (0:Disable / 1:Access B / 2:Access S / 3:Smart-Solar B / 4:Smart-Solar S) - // B=momentary push utton, S=toggle witch -uint8_t RCmon = RC_MON; // Residual Current Monitor (0:Disable / 1:Enable) -uint16_t StartCurrent = START_CURRENT; -uint16_t StopTime = STOP_TIME; -uint16_t ImportCurrent = IMPORT_CURRENT; -struct DelayedTimeStruct DelayedStartTime; -struct DelayedTimeStruct DelayedStopTime; -uint8_t DelayedRepeat; // 0 = no repeat, 1 = daily repeat -uint8_t MainsMeter = MAINS_METER; // Type of Mains electric meter (0: Disabled / Constants EM_*) -uint8_t MainsMeterAddress = MAINS_METER_ADDRESS; -uint8_t Grid = GRID; // Type of Grid connected to Sensorbox (0:4Wire / 1:3Wire ) -uint8_t EVMeter = EV_METER; // Type of EV electric meter (0: Disabled / Constants EM_*) -uint8_t EVMeterAddress = EV_METER_ADDRESS; -uint8_t RFIDReader = RFID_READER; // RFID Reader (0:Disabled / 1:Enabled / 2:Enable One / 3:Learn / 4:Delete / 5:Delete All) -#if FAKE_RFID -uint8_t Show_RFID = 0; -#endif -uint8_t WIFImode = WIFI_MODE; // WiFi Mode (0:Disabled / 1:Enabled / 2:Start Portal) -String APpassword = "00000000"; -uint8_t Initialized = INITIALIZED; // When first powered on, the settings need to be initialized. -String TZinfo = ""; // contains POSIX time string - -EnableC2_t EnableC2 = ENABLE_C2; // Contactor C2 -Modem_t Modem = NOTPRESENT; // Is an ISO15118 modem installed (experimental) -uint16_t maxTemp = MAX_TEMPERATURE; - -int16_t Irms[3]={0, 0, 0}; // Momentary current per Phase (23 = 2.3A) (resolution 100mA) -int16_t Irms_EV[3]={0, 0, 0}; // Momentary current per Phase (23 = 2.3A) (resolution 100mA) -uint8_t Nr_Of_Phases_Charging = 0; // 0 = Undetected, 1,2,3 = nr of phases that was detected at the start of this charging session -Single_Phase_t Switching_To_Single_Phase = FALSE; - -uint8_t State = STATE_A; -uint8_t ErrorFlags = NO_ERROR; -uint8_t NextState; -uint8_t pilot; -uint8_t prev_pilot; - -uint16_t MaxCapacity; // Cable limit (A) (limited by the wire in the charge cable, set automatically, or manually if Config=Fixed Cable) -uint16_t ChargeCurrent; // Calculated Charge Current (Amps *10) -uint16_t OverrideCurrent = 0; // Temporary assigned current (Amps *10) (modbus) -int16_t Imeasured = 0; // Max of all Phases (Amps *10) of mains power -int16_t Imeasured_EV = 0; // Max of all Phases (Amps *10) of EV power -int16_t Isum = 0; // Sum of all measured Phases (Amps *10) (can be negative) - -// Load Balance variables -int16_t IsetBalanced = 0; // Max calculated current (Amps *10) available for all EVSE's -uint16_t Balanced[NR_EVSES] = {0, 0, 0, 0, 0, 0, 0, 0}; // Amps value per EVSE -uint16_t BalancedMax[NR_EVSES] = {0, 0, 0, 0, 0, 0, 0, 0}; // Max Amps value per EVSE -uint8_t BalancedState[NR_EVSES] = {0, 0, 0, 0, 0, 0, 0, 0}; // State of all EVSE's 0=not active (state A), 1=charge request (State B), 2= Charging (State C) -uint16_t BalancedError[NR_EVSES] = {0, 0, 0, 0, 0, 0, 0, 0}; // Error state of EVSE - -struct { - uint8_t Online; - uint8_t ConfigChanged; - uint8_t EVMeter; - uint8_t EVAddress; - uint8_t MinCurrent; // 0.1A - uint8_t Phases; - uint32_t Timer; // 1s - uint32_t IntTimer; // 1s - uint16_t SolarTimer; // 1s - uint8_t Mode; -} Node[NR_EVSES] = { // 0: Master / 1: Node 1 ... - /* Config EV EV Min Used Charge Interval Solar * // Interval Time : last Charge time, reset when not charging - * Online, Changed, Meter, Address, Current, Phases, Timer, Timer, Timer, Mode */ // Min Current : minimal measured current per phase the EV consumes when starting to charge @ 6A (can be lower then 6A) - { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Used Phases : detected nr of phases when starting to charge (works with configured EVmeter meter, and might work with sensorbox) - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 } -}; - -uint8_t lock1 = 0, lock2 = 1; -uint8_t MainsMeterTimeout = COMM_TIMEOUT; // MainsMeter communication timeout (sec) -uint8_t EVMeterTimeout = COMM_EVTIMEOUT; // EV Meter communication Timeout (sec) -uint16_t BacklightTimer = 0; // Backlight timer (sec) -uint8_t BacklightSet = 0; -uint8_t LCDTimer = 0; -uint8_t AccessTimer = 0; -int8_t TempEVSE = 0; // Temperature EVSE in deg C (-50 to +125) -uint8_t ButtonState = 0x0f; // Holds latest push Buttons state (LSB 3:0) -uint8_t OldButtonState = 0x0f; // Holds previous push Buttons state (LSB 3:0) -uint8_t LCDNav = 0; -uint8_t SubMenu = 0; -uint32_t ScrollTimer = 0; -uint8_t LCDupdate = 0; // flag to update the LCD every 1000ms -uint8_t ChargeDelay = 0; // Delays charging at least 60 seconds in case of not enough current available. -uint8_t C1Timer = 0; -uint8_t ModemStage = 0; // 0: Modem states will be executed when Modem is enabled 1: Modem stages will be skipped, as SoC is already extracted -int8_t DisconnectTimeCounter = -1; // Count for how long we're disconnected, so we can more reliably throw disconnect event. -1 means counter is disabled -uint8_t ToModemWaitStateTimer = 0; // Timer used from STATE_MODEM_REQUEST to STATE_MODEM_WAIT -uint8_t ToModemDoneStateTimer = 0; // Timer used from STATE_MODEM_WAIT to STATE_MODEM_DONE -uint8_t LeaveModemDoneStateTimer = 0; // Timer used from STATE_MODEM_DONE to other, usually STATE_B -uint8_t LeaveModemDeniedStateTimer = 0; // Timer used from STATE_MODEM_DENIED to STATE_B to re-try authentication -uint8_t NoCurrent = 0; // counts overcurrent situations. -uint8_t TestState = 0; -uint8_t ModbusRequest = 0; // Flag to request Modbus information -uint8_t NodeNewMode = 0; -uint8_t MenuItems[MENU_EXIT]; -uint8_t Access_bit = 0; // 0:No Access 1:Access to SmartEVSE -uint16_t CardOffset = CARD_OFFSET; // RFID card used in Enable One mode - -uint8_t ConfigChanged = 0; -uint32_t serialnr = 0; -uint8_t GridActive = 0; // When the CT's are used on Sensorbox2, it enables the GRID menu option. -uint8_t CalActive = 0; // When the CT's are used on Sensorbox(1.5 or 2), it enables the CAL menu option. -uint16_t Iuncal = 0; // Uncalibrated CT1 measurement (resolution 10mA) - -uint16_t SolarStopTimer = 0; -int32_t EnergyCharged = 0; // kWh meter value energy charged. (Wh) (will reset if state changes from A->B) -int32_t EnergyMeterStart = 0; // kWh meter value is stored once EV is connected to EVSE (Wh) -int16_t PowerMeasured = 0; // Measured Charge power in Watt by kWh meter -uint8_t RFIDstatus = 0; -bool PilotDisconnected = false; -uint8_t PilotDisconnectTime = 0; // Time the Control Pilot line should be disconnected (Sec) - -int32_t EnergyEV = 0; // Wh -> EV_import_active_energy - EV_export_active_energy -int32_t Mains_export_active_energy = 0; // Mainsmeter exported active energy, only for API purposes so you can guard the - // enery usage of your house -int32_t Mains_import_active_energy = 0; // Mainsmeter imported active energy, only for API purposes so you can guard the - // enery usage of your house -int32_t EV_export_active_energy = 0; -int32_t EV_import_active_energy = 0; -int32_t CM[3]={0, 0, 0}; -uint8_t ResetKwh = 2; // if set, reset EV kwh meter at state transition B->C - // cleared when charging, reset to 1 when disconnected (state A) -uint8_t ActivationMode = 0, ActivationTimer = 0; -volatile uint16_t adcsample = 0; -volatile uint16_t ADCsamples[25]; // declared volatile, as they are used in a ISR -volatile uint8_t sampleidx = 0; -char str[20]; -bool LocalTimeSet = false; - -int phasesLastUpdate = 0; -bool phasesLastUpdateFlag = false; -int16_t IrmsOriginal[3]={0, 0, 0}; -int homeBatteryCurrent = 0; -int homeBatteryLastUpdate = 0; // Time in milliseconds -char *downloadUrl = NULL; -int downloadProgress = 0; -int downloadSize = 0; - - -struct EMstruct EMConfig[EM_CUSTOM + 1] = { - /* DESC, ENDIANNESS, FCT, DATATYPE, U_REG,DIV, I_REG,DIV, P_REG,DIV, E_REG_IMP,DIV, E_REG_EXP, DIV */ - {"Disabled", ENDIANESS_LBF_LWF, 0, MB_DATATYPE_INT32, 0, 0, 0, 0, 0, 0, 0, 0,0 , 0}, // First entry! - {"Sensorbox", ENDIANESS_HBF_HWF, 4, MB_DATATYPE_FLOAT32, 0xFFFF, 0, 0, 0, 0xFFFF, 0, 0xFFFF, 0,0 , 0}, // Sensorbox (Own routine for request/receive) - {"Phoenix C", ENDIANESS_HBF_LWF, 4, MB_DATATYPE_INT32, 0x0, 1, 0xC, 3, 0x28, 1, 0x3E, 1,0 , 0}, // PHOENIX CONTACT EEM-350-D-MCB (0,1V / mA / 0,1W / 0,1kWh) max read count 11 - {"Finder 7E", ENDIANESS_HBF_HWF, 4, MB_DATATYPE_FLOAT32, 0x1000, 0, 0x100E, 0, 0x1026, 0, 0x1106, 3,0x110E, 3}, // Finder 7E.78.8.400.0212 (V / A / W / Wh) max read count 127 - {"Eastron3P", ENDIANESS_HBF_HWF, 4, MB_DATATYPE_FLOAT32, 0x0, 0, 0x6, 0, 0x34, 0, 0x48 , 0,0x4A , 0}, // Eastron SDM630 (V / A / W / kWh) max read count 80 - {"InvEastrn", ENDIANESS_HBF_HWF, 4, MB_DATATYPE_FLOAT32, 0x0, 0, 0x6, 0, 0x34, 0, 0x48 , 0,0x4A , 0}, // Since Eastron SDM series are bidirectional, sometimes they are connected upsidedown, so positive current becomes negative etc.; Eastron SDM630 (V / A / W / kWh) max read count 80 - {"ABB", ENDIANESS_HBF_HWF, 3, MB_DATATYPE_INT32, 0x5B00, 1, 0x5B0C, 2, 0x5B14, 2, 0x5000, 2,0x5004, 2}, // ABB B23 212-100 (0.1V / 0.01A / 0.01W / 0.01kWh) RS485 wiring reversed / max read count 125 - {"SolarEdge", ENDIANESS_HBF_HWF, 3, MB_DATATYPE_INT16, 40196, 0, 40191, 0, 40206, 0, 40234, 3, 40226, 3}, // SolarEdge SunSpec (0.01V (16bit) / 0.1A (16bit) / 1W (16bit) / 1 Wh (32bit)) - {"WAGO", ENDIANESS_HBF_HWF, 3, MB_DATATYPE_FLOAT32, 0x5002, 0, 0x500C, 0, 0x5012, -3, 0x600C, 0,0x6018, 0}, // WAGO 879-30x0 (V / A / kW / kWh)//TODO maar WAGO heeft ook totaal - {"API", ENDIANESS_HBF_HWF, 3, MB_DATATYPE_FLOAT32, 0x5002, 0, 0x500C, 0, 0x5012, 3, 0x6000, 0,0x6018, 0}, // WAGO 879-30x0 (V / A / kW / kWh) - {"Eastron1P", ENDIANESS_HBF_HWF, 4, MB_DATATYPE_FLOAT32, 0x0, 0, 0x6, 0, 0x0C, 0, 0x48 , 0,0x4A , 0}, // Eastron SDM630 (V / A / W / kWh) max read count 80 - {"Finder 7M", ENDIANESS_HBF_HWF, 4, MB_DATATYPE_FLOAT32, 2500, 0, 2516, 0, 2536, 0, 2638, 3, 0, 0}, // Finder 7M.38.8.400.0212 (V / A / W / Wh) / Backlight 10173 - {"Unused 1", ENDIANESS_LBF_LWF, 4, MB_DATATYPE_INT32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // unused slot for future new meters - {"Unused 2", ENDIANESS_LBF_LWF, 4, MB_DATATYPE_INT32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // unused slot for future new meters - {"Unused 3", ENDIANESS_LBF_LWF, 4, MB_DATATYPE_INT32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // unused slot for future new meters - {"Unused 4", ENDIANESS_LBF_LWF, 4, MB_DATATYPE_INT32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // unused slot for future new meters - {"Custom", ENDIANESS_LBF_LWF, 4, MB_DATATYPE_INT32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} // Last entry! -}; - - -// Some low level stuff here to setup the ADC, and perform the conversion. -// -// -uint16_t IRAM_ATTR local_adc1_read(int channel) { - uint16_t adc_value; - - SENS.sar_read_ctrl.sar1_dig_force = 0; // switch SARADC into RTC channel - SENS.sar_meas_wait2.force_xpd_sar = SENS_FORCE_XPD_SAR_PU; // adc_power_on - RTCIO.hall_sens.xpd_hall = false; // disable other peripherals - - //adc_ll_amp_disable() // Close ADC AMP module if don't use it for power save. - SENS.sar_meas_wait2.force_xpd_amp = SENS_FORCE_XPD_AMP_PD; // channel is set in the convert function - // disable FSM, it's only used by the LNA. - SENS.sar_meas_ctrl.amp_rst_fb_fsm = 0; - SENS.sar_meas_ctrl.amp_short_ref_fsm = 0; - SENS.sar_meas_ctrl.amp_short_ref_gnd_fsm = 0; - SENS.sar_meas_wait1.sar_amp_wait1 = 1; - SENS.sar_meas_wait1.sar_amp_wait2 = 1; - SENS.sar_meas_wait2.sar_amp_wait3 = 1; - - // adc_hal_set_controller(ADC_NUM_1, ADC_CTRL_RTC); //Set controller - // see esp-idf/components/hal/esp32/include/hal/adc_ll.h - SENS.sar_read_ctrl.sar1_dig_force = 0; // 1: Select digital control; 0: Select RTC control. - SENS.sar_meas_start1.meas1_start_force = 1; // 1: SW control RTC ADC start; 0: ULP control RTC ADC start. - SENS.sar_meas_start1.sar1_en_pad_force = 1; // 1: SW control RTC ADC bit map; 0: ULP control RTC ADC bit map; - SENS.sar_touch_ctrl1.xpd_hall_force = 1; // 1: SW control HALL power; 0: ULP FSM control HALL power. - SENS.sar_touch_ctrl1.hall_phase_force = 1; // 1: SW control HALL phase; 0: ULP FSM control HALL phase. - - // adc_hal_convert(ADC_NUM_1, channel, &adc_value); - // see esp-idf/components/hal/esp32/include/hal/adc_ll.h - SENS.sar_meas_start1.sar1_en_pad = (1 << channel); // select ADC channel to sample on - while (SENS.sar_slave_addr1.meas_status != 0); // wait for conversion to be idle (blocking) - SENS.sar_meas_start1.meas1_start_sar = 0; - SENS.sar_meas_start1.meas1_start_sar = 1; // start ADC conversion - while (SENS.sar_meas_start1.meas1_done_sar == 0); // wait (blocking) for conversion to finish - adc_value = SENS.sar_meas_start1.meas1_data_sar; // read ADC value from register - - return adc_value; -} - - - -// CP pin low to high transition ISR -// -// -void IRAM_ATTR onCPpulse() { - - // reset timer, these functions are in IRAM ! - timerWrite(timerA, 0); - timerAlarmEnable(timerA); -} - - - -// Timer interrupt handler -// in STATE A this is called every 1ms (autoreload) -// in STATE B/C there is a PWM signal, and the Alarm is set to 5% after the low-> high transition of the PWM signal -void IRAM_ATTR onTimerA() { - - RTC_ENTER_CRITICAL(); - adcsample = local_adc1_read(ADC1_CHANNEL_3); - - RTC_EXIT_CRITICAL(); - - ADCsamples[sampleidx++] = adcsample; - if (sampleidx == 25) sampleidx = 0; -} - - -// --------------------------- END of ISR's ----------------------------------------------------- - -// Blink the RGB LED and LCD Backlight. -// -// NOTE: need to add multiple colour schemes -// -// Task is called every 10ms -void BlinkLed(void * parameter) { - uint8_t LcdPwm = 0; - uint8_t RedPwm = 0, GreenPwm = 0, BluePwm = 0; - uint8_t LedCount = 0; // Raw Counter before being converted to PWM value - unsigned int LedPwm = 0; // PWM value 0-255 - - while(1) - { - // Backlight LCD - if (BacklightTimer > 1 && BacklightSet != 1) { // Enable LCD backlight at max brightness - // start only when fully off(0) or when we are dimming the backlight(2) - LcdPwm = LCD_BRIGHTNESS; - ledcWrite(LCD_CHANNEL, LcdPwm); - BacklightSet = 1; // 1: we have set the backlight to max brightness - } - - if (BacklightTimer == 1 && LcdPwm >= 3) { // Last second of Backlight - LcdPwm -= 3; - ledcWrite(LCD_CHANNEL, ease8InOutQuad(LcdPwm)); // fade out - BacklightSet = 2; // 2: we are dimming the backlight - } - // Note: could be simplified by removing following code if LCD_BRIGHTNESS is multiple of 3 - if (BacklightTimer == 0 && BacklightSet) { // End of LCD backlight - ledcWrite(LCD_CHANNEL, 0); // switch off LED PWM - BacklightSet = 0; // 0: backlight fully off - } - - // RGB LED - if (ErrorFlags || ChargeDelay) { - - if (ErrorFlags & (RCM_TRIPPED | CT_NOCOMM | EV_NOCOMM) ) { - LedCount += 20; // Very rapid flashing, RCD tripped or no Serial Communication. - if (LedCount > 128) LedPwm = ERROR_LED_BRIGHTNESS; // Red LED 50% of time on, full brightness - else LedPwm = 0; - RedPwm = LedPwm; - GreenPwm = 0; - BluePwm = 0; - } else { // Waiting for Solar power or not enough current to start charging - LedCount += 2; // Slow blinking. - if (LedCount > 230) LedPwm = WAITING_LED_BRIGHTNESS; // LED 10% of time on, full brightness - else LedPwm = 0; - - if (Mode == MODE_SOLAR) { // Orange - RedPwm = LedPwm; - GreenPwm = LedPwm * 2 / 3; - } else { // Green - RedPwm = 0; - GreenPwm = LedPwm; - } - BluePwm = 0; - } - - } else if (Access_bit == 0 || State == STATE_MODEM_DENIED) { // No Access, LEDs off - RedPwm = 0; - GreenPwm = 0; - BluePwm = 0; - LedPwm = 0; - } else { // State A, B or C - - if (State == STATE_A) { - LedPwm = STATE_A_LED_BRIGHTNESS; // STATE A, LED on (dimmed) - - } else if (State == STATE_B || State == STATE_B1 || State == STATE_MODEM_REQUEST || State == STATE_MODEM_WAIT) { - LedPwm = STATE_B_LED_BRIGHTNESS; // STATE B, LED on (full brightness) - LedCount = 128; // When switching to STATE C, start at full brightness - - } else if (State == STATE_C) { - if (Mode == MODE_SOLAR) LedCount ++; // Slower fading (Solar mode) - else LedCount += 2; // Faster fading (Smart mode) - LedPwm = ease8InOutQuad(triwave8(LedCount)); // pre calculate new LedPwm value - } - - if (Mode == MODE_SOLAR) { // Orange/Yellow for Solar mode - RedPwm = LedPwm; - GreenPwm = LedPwm * 2 / 3; - } else { - RedPwm = 0; // Green for Normal/Smart mode - GreenPwm = LedPwm; - } - BluePwm = 0; - - } - ledcWrite(RED_CHANNEL, RedPwm); - ledcWrite(GREEN_CHANNEL, GreenPwm); - ledcWrite(BLUE_CHANNEL, BluePwm); - - // Pause the task for 10ms - vTaskDelay(10 / portTICK_PERIOD_MS); - } // while(1) loop -} - - -// Set Charge Current -// Current in Amps * 10 (160 = 16A) -void SetCurrent(uint16_t current) { - uint32_t DutyCycle; - - if ((current >= (MIN_CURRENT * 10)) && (current <= 510)) DutyCycle = current / 0.6; - // calculate DutyCycle from current - else if ((current > 510) && (current <= 800)) DutyCycle = (current / 2.5) + 640; - else DutyCycle = 100; // invalid, use 6A - DutyCycle = DutyCycle * 1024 / 1000; // conversion to 1024 = 100% - SetCPDuty(DutyCycle); -} - -// Write duty cycle to pin -// Value in range 0 (0% duty) to 1024 (100% duty) -void SetCPDuty(uint32_t DutyCycle){ - ledcWrite(CP_CHANNEL, DutyCycle); // update PWM signal - CurrentPWM = DutyCycle; -} - - -// Sample the Temperature sensor. -// -signed char TemperatureSensor() { - uint32_t sample, voltage; - signed char Temperature; - - RTC_ENTER_CRITICAL(); - // Sample Temperature Sensor - sample = local_adc1_read(ADC1_CHANNEL_0); - RTC_EXIT_CRITICAL(); - - // voltage range is from 0-2200mV - voltage = esp_adc_cal_raw_to_voltage(sample, adc_chars_Temperature); - - // The MCP9700A temperature sensor outputs 500mV at 0C, and has a 10mV/C change in output voltage. - // so 750mV is 25C, 400mV = -10C - Temperature = (signed int)(voltage - 500)/10; - //_LOG_A("\nTemp: %i C (%u mV) ", Temperature , voltage); - - return Temperature; -} - - -// Sample the Proximity Pin, and determine the maximum current the cable can handle. -// -void ProximityPin() { - uint32_t sample, voltage; - - RTC_ENTER_CRITICAL(); - // Sample Proximity Pilot (PP) - sample = local_adc1_read(ADC1_CHANNEL_6); - RTC_EXIT_CRITICAL(); - - voltage = esp_adc_cal_raw_to_voltage(sample, adc_chars_PP); - - if (!Config) { // Configuration (0:Socket / 1:Fixed Cable) - //socket - _LOG_A("PP pin: %u (%u mV)\n", sample, voltage); - } else { - //fixed cable - _LOG_A("PP pin: %u (%u mV) (warning: fixed cable configured so PP probably disconnected, making this reading void)\n", sample, voltage); - } - - MaxCapacity = 13; // No resistor, Max cable current = 13A - if ((voltage > 1200) && (voltage < 1400)) MaxCapacity = 16; // Max cable current = 16A 680R -> should be around 1.3V - if ((voltage > 500) && (voltage < 700)) MaxCapacity = 32; // Max cable current = 32A 220R -> should be around 0.6V - if ((voltage > 200) && (voltage < 400)) MaxCapacity = 63; // Max cable current = 63A 100R -> should be around 0.3V - - if (Config) MaxCapacity = MaxCurrent; // Override with MaxCurrent when Fixed Cable is used. -} - - -// Determine the state of the Pilot signal -// -uint8_t Pilot() { - - uint32_t sample, Min = 3300, Max = 0; - uint32_t voltage; - uint8_t n; - - // calculate Min/Max of last 25 CP measurements - for (n=0 ; n<25 ;n++) { - sample = ADCsamples[n]; - voltage = esp_adc_cal_raw_to_voltage( sample, adc_chars_CP); // convert adc reading to voltage - if (voltage < Min) Min = voltage; // store lowest value - if (voltage > Max) Max = voltage; // store highest value - } - //_LOG_A("min:%u max:%u\n",Min ,Max); - - // test Min/Max against fixed levels - if (Min >= 3055 ) return PILOT_12V; // Pilot at 12V (min 11.0V) - if ((Min >= 2735) && (Max < 3055)) return PILOT_9V; // Pilot at 9V - if ((Min >= 2400) && (Max < 2735)) return PILOT_6V; // Pilot at 6V - if ((Min >= 2000) && (Max < 2400)) return PILOT_3V; // Pilot at 3V - if ((Min > 100) && (Max < 300)) return PILOT_DIODE; // Diode Check OK - return PILOT_NOK; // Pilot NOT ok -} - - -/** - * Get name of a state - * - * @param uint8_t State - * @return uint8_t[] Name - */ -const char * getStateName(uint8_t StateCode) { - if(StateCode < 15) return StrStateName[StateCode]; - else return "NOSTATE"; -} - - -const char * getStateNameWeb(uint8_t StateCode) { - if(StateCode < 15) return StrStateNameWeb[StateCode]; - else return "NOSTATE"; -} - - -uint8_t getErrorId(uint8_t ErrorCode) { - uint8_t count = 0; - //find the error bit that is set - while (ErrorCode) { - count++; - ErrorCode = ErrorCode >> 1; - } - return count; -} - - -const char * getErrorNameWeb(uint8_t ErrorCode) { - uint8_t count = 0; - count = getErrorId(ErrorCode); - if(count < 9) return StrErrorNameWeb[count]; - else return "Multiple Errors"; -} - -/** - * Set EVSE mode - * - * @param uint8_t Mode - */ -void setMode(uint8_t NewMode) { - // If mainsmeter disabled we can only run in Normal Mode - if (!MainsMeter && NewMode != MODE_NORMAL) - return; - - // Take care of extra conditionals/checks for custom features - setAccess(!DelayedStartTime.epoch2); //if DelayedStartTime not zero then we are Delayed Charging - if (NewMode == MODE_SOLAR) { - // Reset OverrideCurrent if mode is SOLAR - OverrideCurrent = 0; - } - - // when switching modes, we just keep charging at the phases we were charging at; - // it's only the regulation algorithm that is changing... - // EXCEPT when EnableC2 == Solar Off, because we would expect C2 to be off when in Solar Mode and EnableC2 == Solar Off - // and also the other way around, multiple phases might be wanted when changing from Solar to Normal or Smart - bool switchOnLater = false; - if (EnableC2 == SOLAR_OFF) { - if ((Mode != MODE_SOLAR && NewMode == MODE_SOLAR) || (Mode == MODE_SOLAR && NewMode != MODE_SOLAR)) { - //we are switching from non-solar to solar - //since we EnableC2 == SOLAR_OFF C2 is turned On now, and should be turned off - setAccess(0); //switch to OFF - switchOnLater = true; - } - } - -#if MQTT - // Update MQTT faster - lastMqttUpdate = 10; -#endif - - if (NewMode == MODE_SMART) { - ErrorFlags &= ~(NO_SUN | LESS_6A); // Clear All errors - setSolarStopTimer(0); // Also make sure the SolarTimer is disabled. - } - ChargeDelay = 0; // Clear any Chargedelay - BacklightTimer = BACKLIGHT; // Backlight ON - if (Mode != NewMode) NodeNewMode = NewMode + 1; - Mode = NewMode; - - if (switchOnLater) - setAccess(1); - - //make mode and start/stoptimes persistent on reboot - if (preferences.begin("settings", false) ) { //false = write mode - preferences.putUChar("Mode", Mode); - preferences.putULong("DelayedStartTim", DelayedStartTime.epoch2); //epoch2 only needs 4 bytes - preferences.putULong("DelayedStopTime", DelayedStopTime.epoch2); //epoch2 only needs 4 bytes - preferences.end(); - } -} -/** - * Set the solar stop timer - * - * @param unsigned int Timer (seconds) - */ -void setSolarStopTimer(uint16_t Timer) { - SolarStopTimer = Timer; -} - -/** - * Checks all parameters to determine whether - * we are going to force single phase charging - * Returns true if we are going to do single phase charging - * Returns false if we are going to do (traditional) 3 phase charing - * This is only relevant on a 3f mains and 3f car installation! - * 1f car will always charge 1f undetermined by CONTACTOR2 - */ -uint8_t Force_Single_Phase_Charging() { // abbreviated to FSPC - switch (EnableC2) { - case NOT_PRESENT: //no use trying to switch a contactor on that is not present - case ALWAYS_OFF: - return 1; - case SOLAR_OFF: - return (Mode == MODE_SOLAR); - case AUTO: - case ALWAYS_ON: - return 0; //3f charging - } - //in case we don't know, stick to 3f charging - return 0; -} - -void setStatePowerUnavailable(void) { - if (State == STATE_A) - return; - //State changes between A,B,C,D are caused by EV or by the user - //State changes between x1 and x2 are created by the EVSE - //State changes between x1 and x2 indicate availability (x2) of unavailability (x1) of power supply to the EV - if (State == STATE_C) setState(STATE_C1); // If we are charging, tell EV to stop charging - else if (State != STATE_C1) setState(STATE_B1); // If we are not in State C1, switch to State B1 -} - -void setState(uint8_t NewState) { - if (State != NewState) { - char Str[50]; - snprintf(Str, sizeof(Str), "%02d:%02d:%02d STATE %s -> %s\n",timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, getStateName(State), getStateName(NewState) ); - - _LOG_A("%s",Str); - } - - switch (NewState) { - case STATE_B1: - if (!ChargeDelay) ChargeDelay = 3; // When entering State B1, wait at least 3 seconds before switching to another state. - if (State != STATE_B1 && State != STATE_B && !PilotDisconnected) { - PILOT_DISCONNECTED; - PilotDisconnected = true; - PilotDisconnectTime = 5; // Set PilotDisconnectTime to 5 seconds - - _LOG_A("Pilot Disconnected\n"); - } - // fall through - case STATE_A: // State A1 - CONTACTOR1_OFF; - CONTACTOR2_OFF; - SetCPDuty(1024); // PWM off, channel 0, duty cycle 100% - timerAlarmWrite(timerA, PWM_100, true); // Alarm every 1ms, auto reload - if (NewState == STATE_A) { - ErrorFlags &= ~NO_SUN; - ErrorFlags &= ~LESS_6A; - ChargeDelay = 0; - // Reset Node - Node[0].Timer = 0; - Node[0].IntTimer = 0; - Node[0].Phases = 0; - Node[0].MinCurrent = 0; // Clear ChargeDelay when disconnected. - } - -#if MODEM - if (DisconnectTimeCounter == -1){ - DisconnectTimeCounter = 0; // Start counting disconnect time. If longer than 60 seconds, throw DisconnectEvent - } - break; - case STATE_MODEM_REQUEST: // After overriding PWM, and resetting the safe state is 10% PWM. To make sure communication recovers after going to normal, we do this. Ugly and temporary - ToModemWaitStateTimer = 5; - DisconnectTimeCounter = -1; // Disable Disconnect timer. Car is connected - SetCPDuty(1024); - CONTACTOR1_OFF; - CONTACTOR2_OFF; - break; - case STATE_MODEM_WAIT: - SetCPDuty(50); - ToModemDoneStateTimer = 60; - break; - case STATE_MODEM_DONE: // This state is reached via STATE_MODEM_WAIT after 60s (timeout condition, nothing received) or after REST request (success, shortcut to immediate charging). - CP_OFF; - DisconnectTimeCounter = -1; // Disable Disconnect timer. Car is connected - LeaveModemDoneStateTimer = 5; // Disconnect CP for 5 seconds, restart charging cycle but this time without the modem steps. -#endif - break; - case STATE_B: - if (Modem) - CP_ON; - CONTACTOR1_OFF; - CONTACTOR2_OFF; - if (Modem) - DisconnectTimeCounter = -1; // Disable Disconnect timer. Car is connected - timerAlarmWrite(timerA, PWM_95, false); // Enable Timer alarm, set to diode test (95%) - SetCurrent(ChargeCurrent); // Enable PWM - break; - case STATE_C: // State C2 - ActivationMode = 255; // Disable ActivationMode - - if (Switching_To_Single_Phase == GOING_TO_SWITCH) { - CONTACTOR2_OFF; - setSolarStopTimer(0); //TODO still needed? now we switched contactor2 off, review if we need to stop solar charging - //Nr_Of_Phases_Charging = 1; this will be detected automatically - Switching_To_Single_Phase = AFTER_SWITCH; // we finished the switching process, - // BUT we don't know which is the single phase - } - - CONTACTOR1_ON; - if (!Force_Single_Phase_Charging() && Switching_To_Single_Phase != AFTER_SWITCH) { // in AUTO mode we start with 3phases - CONTACTOR2_ON; // Contactor2 ON - } - LCDTimer = 0; - break; - case STATE_C1: - SetCPDuty(1024); // PWM off, channel 0, duty cycle 100% - timerAlarmWrite(timerA, PWM_100, true); // Alarm every 1ms, auto reload - // EV should detect and stop charging within 3 seconds - C1Timer = 6; // Wait maximum 6 seconds, before forcing the contactor off. - ChargeDelay = 15; - break; - default: - break; - } - - BalancedState[0] = NewState; - State = NewState; - -#if MQTT - // Update MQTT faster - lastMqttUpdate = 10; -#endif - - // BacklightTimer = BACKLIGHT; // Backlight ON -} - -void setAccess(bool Access) { - Access_bit = Access; - if (Access == 0) { - //TODO:setStatePowerUnavailable() ? - if (State == STATE_C) setState(STATE_C1); // Determine where to switch to. - else if (State != STATE_C1 && (State == STATE_B || State == STATE_MODEM_REQUEST || State == STATE_MODEM_WAIT || State == STATE_MODEM_DONE || State == STATE_MODEM_DENIED)) setState(STATE_B1); - } - - //make mode and start/stoptimes persistent on reboot - if (preferences.begin("settings", false) ) { //false = write mode - preferences.putUChar("Access", Access_bit); - preferences.putUChar("CardOffset", CardOffset); - preferences.end(); - } - -#if MQTT - // Update MQTT faster - lastMqttUpdate = 10; -#endif -} - -/** - * Returns the known battery charge rate if the data is not too old. - * Returns 0 if data is too old. - * A positive number means charging, a negative number means discharging --> this means the inverse must be used for calculations - * - * Example: - * homeBatteryCharge == 1000 --> Battery is charging using Solar - * P1 = -500 --> Solar injection to the net but nut sufficient for charging - * - * If the P1 value is added with the inverse battery charge it will inform the EVSE logic there is enough Solar --> -500 + -1000 = -1500 - * - * Note: The user who is posting battery charge data should take this into account, meaning: if he wants a minimum home battery (dis)charge rate he should substract this from the value he is sending. - */ -// -int getBatteryCurrent(void) { - int currentTime = time(NULL) - 60; // The data should not be older than 1 minute - - if (Mode == MODE_SOLAR && homeBatteryLastUpdate > (currentTime)) { - return homeBatteryCurrent; - } else { - homeBatteryCurrent = 0; - homeBatteryLastUpdate = 0; - return 0; - } -} - - - -// Is there at least 6A(configurable MinCurrent) available for a new EVSE? -// Look whether there would be place for one more EVSE if we could lower them all down to MinCurrent -// returns 1 if there is 6A available -// returns 0 if there is no current available -// only runs on the Master or when loadbalancing Disabled -char IsCurrentAvailable(void) { - uint8_t n, ActiveEVSE = 0; - int Baseload, Baseload_EV, TotalCurrent = 0; - - for (n = 0; n < NR_EVSES; n++) if (BalancedState[n] == STATE_C) // must be in STATE_C - { - ActiveEVSE++; // Count nr of active (charging) EVSE's - TotalCurrent += Balanced[n]; // Calculate total of all set charge currents - } - - // Allow solar Charging if surplus current is above 'StartCurrent' (sum of all phases) - // Charging will start after the timeout (chargedelay) period has ended - // Only when StartCurrent configured or Node MinCurrent detected or Node inactive - if (Mode == MODE_SOLAR) { // no active EVSE yet? - if (ActiveEVSE == 0 && Isum >= ((signed int)StartCurrent *-10)) { - _LOG_D("No current available StartCurrent line %d. ActiveEVSE=%i, TotalCurrent=%.1fA, StartCurrent=%iA, Isum=%.1fA, ImportCurrent=%iA.\n", __LINE__, ActiveEVSE, (float) TotalCurrent/10, StartCurrent, (float)Isum/10, ImportCurrent); - return 0; - } - else if ((ActiveEVSE * MinCurrent * 10) > TotalCurrent) { // check if we can split the available current between all active EVSE's - _LOG_D("No current available TotalCurrent line %d. ActiveEVSE=%i, TotalCurrent=%.1fA, StartCurrent=%iA, Isum=%.1fA, ImportCurrent=%iA.\n", __LINE__, ActiveEVSE, (float) TotalCurrent/10, StartCurrent, (float)Isum/10, ImportCurrent); - return 0; - } - else if (ActiveEVSE > 0 && Isum > ((signed int)ImportCurrent * 10) + TotalCurrent - (ActiveEVSE * MinCurrent * 10)) { - _LOG_D("No current available Isum line %d. ActiveEVSE=%i, TotalCurrent=%.1fA, StartCurrent=%iA, Isum=%.1fA, ImportCurrent=%iA.\n", __LINE__, ActiveEVSE, (float) TotalCurrent/10, StartCurrent, (float)Isum/10, ImportCurrent); - return 0; - } - } - - ActiveEVSE++; // Do calculations with one more EVSE - if (ActiveEVSE > NR_EVSES) ActiveEVSE = NR_EVSES; - Baseload = Imeasured - TotalCurrent; // Calculate Baseload (load without any active EVSE) - Baseload_EV = Imeasured_EV - TotalCurrent; // Load on the EV subpanel excluding any active EVSE - if (Baseload < 0) Baseload = 0; // only relevant for Smart/Solar mode - - // Check if the lowest charge current(6A) x ActiveEV's + baseload would be higher then the MaxMains. - if ((ActiveEVSE * (MinCurrent * 10) + Baseload) > (MaxMains * 10)) { - _LOG_D("No current available MaxMains line %d. ActiveEVSE=%i, Baseload=%.1fA, MinCurrent=%iA, MaxMains=%iA.\n", __LINE__, ActiveEVSE, (float) Baseload/10, MinCurrent, MaxMains); - return 0; // Not enough current available!, return with error - } - if ((ActiveEVSE * (MinCurrent * 10) + Baseload_EV) > (MaxCircuit * 10)) { - _LOG_D("No current available MaxCircuit line %d. ActiveEVSE=%i, Baseload_EV=%.1fA, MinCurrent=%iA, MaxCircuit=%iA.\n", __LINE__, ActiveEVSE, (float) Baseload_EV/10, MinCurrent, MaxCircuit); - return 0; // Not enough current available!, return with error - } - //assume the current should be available on all 3 phases - bool must_be_single_phase_charging = (EnableC2 == ALWAYS_OFF || (Mode == MODE_SOLAR && EnableC2 == SOLAR_OFF) || - (Mode == MODE_SOLAR && EnableC2 == AUTO && Switching_To_Single_Phase == AFTER_SWITCH)); - int Phases = must_be_single_phase_charging ? 1 : 3; - if ((Phases * ActiveEVSE * (MinCurrent * 10) + Isum) > (MaxSumMains * 10)) { - _LOG_D("No current available MaxSumMains line %d. ActiveEVSE=%i, MinCurrent=%iA, Isum=%.1fA, MaxSumMains=%iA.\n", __LINE__, ActiveEVSE, MinCurrent, (float)Isum/10, MaxSumMains); - return 0; // Not enough current available!, return with error - } - - _LOG_D("Current available checkpoint D. ActiveEVSE increased by one=%i, TotalCurrent=%.1fA, StartCurrent=%iA, Isum=%.1fA, ImportCurrent=%iA.\n", ActiveEVSE, (float) TotalCurrent/10, StartCurrent, (float)Isum/10, ImportCurrent); - return 1; -} - -// Set global var Nr_Of_Phases_Charging -// 0 = undetected, 1 - 3 nr of phases we are charging -void Set_Nr_of_Phases_Charging(void) { - uint32_t Max_Charging_Prob = 0; - uint32_t Charging_Prob=0; // Per phase, the probability that Charging is done at this phase - Nr_Of_Phases_Charging = 0; -#define THRESHOLD 40 -#define BOTTOM_THRESHOLD 25 - _LOG_D("Detected Charging Phases: ChargeCurrent=%u, Balanced[0]=%u, IsetBalanced=%u.\n", ChargeCurrent, Balanced[0],IsetBalanced); - for (int i=0; i<3; i++) { - if (EVMeter) { - Charging_Prob = 10 * (abs(Irms_EV[i] - IsetBalanced)) / IsetBalanced; //100% means this phase is charging, 0% mwans not charging - //TODO does this work for the slaves too? - _LOG_D("Trying to detect Charging Phases END Irms_EV[%i]=%.1f A.\n", i, (float)Irms_EV[i]/10); - } - Max_Charging_Prob = max(Charging_Prob, Max_Charging_Prob); - - //normalize percentages so they are in the range [0-100] - if (Charging_Prob >= 200) - Charging_Prob = 0; - if (Charging_Prob > 100) - Charging_Prob = 200 - Charging_Prob; - _LOG_I("Detected Charging Phases: Charging_Prob[%i]=%i.\n", i, Charging_Prob); - - if (Charging_Prob == Max_Charging_Prob) { - _LOG_D("Suspect I am charging at phase: L%i.\n", i+1); - Nr_Of_Phases_Charging++; - } - else { - if ( Charging_Prob <= BOTTOM_THRESHOLD ) { - _LOG_D("Suspect I am NOT charging at phase: L%i.\n", i+1); - } - else { - if ( Max_Charging_Prob - Charging_Prob <= THRESHOLD ) { - _LOG_D("Serious candidate for charging at phase: L%i.\n", i+1); - Nr_Of_Phases_Charging++; - } - } - } - } - - // sanity checks - if (EnableC2 != AUTO && EnableC2 != NOT_PRESENT) { // no further sanity checks possible when AUTO or NOT_PRESENT - if (Nr_Of_Phases_Charging != 1 && (EnableC2 == ALWAYS_OFF || (EnableC2 == SOLAR_OFF && Mode == MODE_SOLAR))) { - _LOG_A("Error in detecting phases: EnableC2=%s and Nr_Of_Phases_Charging=%i.\n", StrEnableC2[EnableC2], Nr_Of_Phases_Charging); - Nr_Of_Phases_Charging = 1; - _LOG_A("Setting Nr_Of_Phases_Charging to 1.\n"); - } - if (!Force_Single_Phase_Charging() && Nr_Of_Phases_Charging != 3) {//TODO 2phase charging very rare? - _LOG_A("Possible error in detecting phases: EnableC2=%s and Nr_Of_Phases_Charging=%i.\n", StrEnableC2[EnableC2], Nr_Of_Phases_Charging); - } - } - - _LOG_A("Charging at %i phases.\n", Nr_Of_Phases_Charging); -} - -// Calculates Balanced PWM current for each EVSE -// mod =0 normal -// mod =1 we have a new EVSE requesting to start charging. -// only runs on the Master or when loadbalancing Disabled -void CalcBalancedCurrent(char mod) { - int Average, MaxBalanced, Idifference, Baseload_EV; - int ActiveEVSE = 0; - signed int IsumImport; - int ActiveMax = 0, TotalCurrent = 0, Baseload; - char CurrentSet[NR_EVSES] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t n; - if (BalancedState[0] == STATE_C && MaxCurrent > MaxCapacity && !Config) - ChargeCurrent = MaxCapacity * 10; - else - ChargeCurrent = MaxCurrent * 10; // Instead use new variable ChargeCurrent. - - // Override current temporary if set - if (OverrideCurrent) - ChargeCurrent = OverrideCurrent; - - BalancedMax[0] = ChargeCurrent; - // update BalancedMax[0] if the MAX current was adjusted using buttons or CLI - for (n = 0; n < NR_EVSES; n++) if (BalancedState[n] == STATE_C) { - ActiveEVSE++; // Count nr of Active (Charging) EVSE's - ActiveMax += BalancedMax[n]; // Calculate total Max Amps for all active EVSEs - TotalCurrent += Balanced[n]; // Calculate total of all set charge currents - } - - _LOG_V("Checkpoint 1 Isetbalanced=%.1f A Imeasured=%.1f A MaxCircuit=%i Imeasured_EV=%.1f A, Battery Current = %.1f A, mode=%i.\n", (float)IsetBalanced/10, (float)Imeasured/10, MaxCircuit, (float)Imeasured_EV/10, (float)homeBatteryCurrent/10, Mode); - - // When Load balancing = Master, Limit total current of all EVSEs to MaxCircuit - // Also, when not in Normal Mode, if MaxCircuit is set, it will limit the total current (subpanel configuration) - Baseload_EV = Imeasured_EV - TotalCurrent; // Calculate Baseload (load without any active EVSE) - if (Baseload_EV < 0) - Baseload_EV = 0; - Baseload = Imeasured - TotalCurrent; // Calculate Baseload (load without any active EVSE) - if (Baseload < 0) - Baseload = 0; - - if (Mode == MODE_NORMAL) // Normal Mode - { - if (LoadBl == 1) // Load Balancing = Master? MaxCircuit is max current for all active EVSE's; - IsetBalanced = MaxCircuit * 10 - Baseload_EV; // subpanel option not valid in Normal Mode; - // limiting is per phase so no Nr_Of_Phases_Charging here! - else - IsetBalanced = ChargeCurrent; // No Load Balancing in Normal Mode. Set current to ChargeCurrent (fix: v2.05) - if (ActiveEVSE && mod) { // Only if we have active EVSE's and New EVSE charging - // Set max combined charge current to MaxMains - Baseload, or MaxCircuit - Baseload_EV if that is less - IsetBalanced = min((MaxMains * 10) - Baseload, (MaxCircuit * 10 ) - Baseload_EV); //TODO: why are we checking MaxMains and MaxCircuit while we are in Normal mode? - //TODO: capacity rate limiting here? - } - } //end MODE_NORMAL - else { // start MODE_SOLAR || MODE_SMART - // adapt IsetBalanced in Smart Mode, and ensure the MaxMains/MaxCircuit settings for Solar - - uint8_t Temp_Phases; - Temp_Phases = (Nr_Of_Phases_Charging ? Nr_Of_Phases_Charging : 3); // in case nr of phases not detected, assume 3 - Idifference = min((MaxMains * 10) - Imeasured, min((MaxCircuit * 10) - Imeasured_EV, ((MaxSumMains * 10) - Isum)/Temp_Phases)); - - if (!mod) { // no new EVSE's charging - // For Smart mode, no new EVSE asking for current - // But for Solar mode we _also_ have to guard MaxCircuit and Maxmains! - if (phasesLastUpdateFlag) { // only increase or decrease current if measurements are updated - _LOG_V("phaseLastUpdate=%i.\n", phasesLastUpdate); - if (Idifference > 0) { - if (Mode == MODE_SMART) IsetBalanced += (Idifference / 4); // increase with 1/4th of difference (slowly increase current) - } // in Solar mode we compute increase of current later on! - else - IsetBalanced += Idifference; // last PWM setting + difference (immediately decrease current) (Smart and Solar mode) - } - - if (IsetBalanced < 0) IsetBalanced = 0; - if (IsetBalanced > 800) IsetBalanced = 800; // hard limit 80A (added 11-11-2017) - } - _LOG_V("Checkpoint 2 Isetbalanced=%.1f A, Idifference=%.1f, mod=%i.\n", (float)IsetBalanced/10, (float)Idifference/10, mod); - - if (Mode == MODE_SOLAR) // Solar version - { - IsumImport = Isum - (10 * ImportCurrent); // Allow Import of power from the grid when solar charging - if (Idifference > 0) { // so we had some room for power as far as MaxCircuit and MaxMains are concerned - if (phasesLastUpdateFlag) { // only increase or decrease current if measurements are updated. - if (IsumImport < 0) { - // negative, we have surplus (solar) power available - if (IsumImport < -10 && Idifference > 10) - IsetBalanced = IsetBalanced + 5; // more then 1A available, increase Balanced charge current with 0.5A - else - IsetBalanced = IsetBalanced + 1; // less then 1A available, increase with 0.1A - } else { - // positive, we use more power then is generated - if (IsumImport > 20) - IsetBalanced = IsetBalanced - (IsumImport / 2); // we use atleast 2A more then available, decrease Balanced charge current. - else if (IsumImport > 10) - IsetBalanced = IsetBalanced - 5; // we use 1A more then available, decrease with 0.5A - else if (IsumImport > 3) - IsetBalanced = IsetBalanced - 1; // we still use > 0.3A more then available, decrease with 0.1A - // if we use <= 0.3A we do nothing - } - } - } // we already corrected Isetbalance in case of NOT enough power MaxCircuit/MaxMains - _LOG_V("Checkpoint 3 Isetbalanced=%.1f A, IsumImport=%.1f, Isum=%.1f, ImportCurrent=%i.\n", (float)IsetBalanced/10, (float)IsumImport/10, (float)Isum/10, ImportCurrent); - - // If IsetBalanced is below MinCurrent or negative, make sure it's set to MinCurrent. - if ( (IsetBalanced <= (ActiveEVSE * MinCurrent * 10)) || (IsetBalanced < 0) ) { - IsetBalanced = ActiveEVSE * MinCurrent * 10; - // ----------- Check to see if we have to continue charging on solar power alone ---------- - if (ActiveEVSE && StopTime && (IsumImport > 10)) { - //TODO maybe enable solar switching for loadbl = 1 - if (EnableC2 == AUTO && LoadBl == 0) - Set_Nr_of_Phases_Charging(); - if (Nr_Of_Phases_Charging > 1 && EnableC2 == AUTO && LoadBl == 0) { // when loadbalancing is enabled we don't do forced single phase charging - _LOG_A("Switching to single phase.\n"); // because we wouldnt know which currents to make available to the nodes... - // since we don't know how many phases the nodes are using... - //switching contactor2 off works ok for Skoda Enyaq but Hyundai Ioniq 5 goes into error, so we have to switch more elegantly - if (State == STATE_C) setState(STATE_C1); // tell EV to stop charging - Switching_To_Single_Phase = GOING_TO_SWITCH; - } - else { - if (SolarStopTimer == 0) setSolarStopTimer(StopTime * 60); // Convert minutes into seconds - } - } else { - _LOG_D("Checkpoint a: Resetting SolarStopTimer, IsetBalanced=%.1fA, ActiveEVSE=%i.\n", (float)IsetBalanced/10, ActiveEVSE); - setSolarStopTimer(0); - } - } else { - _LOG_D("Checkpoint b: Resetting SolarStopTimer, IsetBalanced=%.1fA, ActiveEVSE=%i.\n", (float)IsetBalanced/10, ActiveEVSE); - setSolarStopTimer(0); - } - } //end MODE_SOLAR - else { // MODE_SMART - // New EVSE charging, and only if we have active EVSE's - if (mod && ActiveEVSE) { // Set max combined charge current to MaxMains - Baseload - IsetBalanced = min((MaxMains * 10) - Baseload, min((MaxCircuit * 10 ) - Baseload_EV, ((MaxSumMains * 10) - Isum)/3)); //assume the current should be available on all 3 phases - } - } //end MODE_SMART - } // end MODE_SOLAR || MODE_SMART - - // Reset flag that keeps track of new MainsMeter measurements - phasesLastUpdateFlag = false; - - // guard MaxCircuit in all modes; slave doesnt run CalcBalancedCurrent - if (IsetBalanced > (MaxCircuit * 10) - Baseload_EV) - IsetBalanced = MaxCircuit * 10 - Baseload_EV; //limiting is per phase so no Nr_Of_Phases_Charging here! - - _LOG_V("Checkpoint 4 Isetbalanced=%.1f A.\n", (float)IsetBalanced/10); - - if (ActiveEVSE) { // Only if we have active EVSE's - if (IsetBalanced < 0 || IsetBalanced < (ActiveEVSE * MinCurrent * 10)) { - IsetBalanced = ActiveEVSE * MinCurrent * 10; // retain old software behaviour: set minimal "MinCurrent" charge per active EVSE - NoCurrent++; // Flag NoCurrent left - _LOG_I("No Current!!\n"); - } else - NoCurrent = 0; - - if (IsetBalanced > ActiveMax) IsetBalanced = ActiveMax; // limit to total maximum Amps (of all active EVSE's) - // TODO not sure if Nr_Of_Phases_Charging should be involved here - MaxBalanced = IsetBalanced; // convert to Amps - - // Calculate average current per EVSE - n = 0; - while (n < NR_EVSES && ActiveEVSE) { - Average = MaxBalanced / ActiveEVSE; // Average current for all active EVSE's - - // Active EVSE, and current not yet calculated? - if ((BalancedState[n] == STATE_C) && (!CurrentSet[n])) { - - // Check for EVSE's that are starting with Solar charging - if ((Mode == MODE_SOLAR) && (Node[n].IntTimer < SOLARSTARTTIME)) { - Balanced[n] = MinCurrent * 10; // Set to MinCurrent - _LOG_V("[S]Node %u = %u.%u A", n, Balanced[n]/10, Balanced[n]%10); - CurrentSet[n] = 1; // mark this EVSE as set. - ActiveEVSE--; // decrease counter of active EVSE's - MaxBalanced -= Balanced[n]; // Update total current to new (lower) value - IsetBalanced = TotalCurrent; - n = 0; // reset to recheck all EVSE's - continue; // ensure the loop restarts from the beginning - - // Check for EVSE's that have a Max Current that is lower then the average - } else if (Average >= BalancedMax[n]) { - Balanced[n] = BalancedMax[n]; // Set current to Maximum allowed for this EVSE - _LOG_V("[L]Node %u = %u.%u A", n, Balanced[n]/10, Balanced[n]%10); - CurrentSet[n] = 1; // mark this EVSE as set. - ActiveEVSE--; // decrease counter of active EVSE's - MaxBalanced -= Balanced[n]; // Update total current to new (lower) value - n = 0; // reset to recheck all EVSE's - continue; // ensure the loop restarts from the beginning - } - - } - n++; - } - - // All EVSE's which had a Max current lower then the average are set. - // Now calculate the current for the EVSE's which had a higher Max current - n = 0; - while (n < NR_EVSES && ActiveEVSE) { // Check for EVSE's that are not set yet - if ((BalancedState[n] == STATE_C) && (!CurrentSet[n])) { // Active EVSE, and current not yet calculated? - Balanced[n] = MaxBalanced / ActiveEVSE; // Set current to Average - _LOG_V("[H]Node %u = %u.%u A", n, Balanced[n]/10, Balanced[n]%10); - CurrentSet[n] = 1; // mark this EVSE as set. - ActiveEVSE--; // decrease counter of active EVSE's - MaxBalanced -= Balanced[n]; // Update total current to new (lower) value - } //TODO since the average has risen the other EVSE's should be checked for exceeding their MAX's too! - n++; - } - - - } // ActiveEVSE - _LOG_V("Checkpoint 5 Isetbalanced=%.1f A.\n", (float)IsetBalanced/10); - if (LoadBl == 1) { - _LOG_D("Balance: "); - for (n = 0; n < NR_EVSES; n++) { - _LOG_D_NO_FUNC("EVSE%u:%s(%.1fA) ", n, getStateName(BalancedState[n]), (float)Balanced[n]/10); - } - _LOG_D_NO_FUNC("\n"); - } -} //CalcBalancedCurrent - -/** - * Load Balancing Modbus Address LoadBl - Disabled 0x01 0x00 - Master 0x01 0x01 - Node 1 0x02 0x02 - Node 2 0x03 0x03 - Node 3 0x04 0x04 - Node 4 0x05 0x05 - Node 5 0x06 0x06 - Node 6 0x07 0x07 - Node 7 0x08 0x08 - Broadcast to all SmartEVSE with address 0x09. -**/ - -/** - * In order to keep each node happy, and not timeout with a comm-error you will have to send the chargecurrent for each node in a broadcast message to all nodes - * (address 09): - - 09 10 00 20 00 08 10 00 A0 00 00 00 3C 00 00 00 00 00 00 00 00 00 00 99 24 - Node 0 00 A0 = 160 = 16.0A - Node 1 00 00 = 0 = 0.0A - Node 2 00 3C = 60 = 6.0A - etc. - - * Each time this message is received on each node, the timeout timer is reset to 10 seconds. - * The master will usually send this message every two seconds. -**/ - -/** - * Broadcast momentary currents to all Node EVSE's - */ -void BroadcastCurrent(void) { - //prepare registers 0x0020 thru 0x002A (including) to be sent - uint8_t buf[sizeof(Balanced)+ 6], i; - uint8_t *p=buf; - memcpy(p, Balanced, sizeof(Balanced)); - p = p + sizeof(Balanced); - // Irms values, we only send the 16 least significant bits (range -327.6A to +327.6A) per phase - for ( i=0; i<3; i++) { - p[i * 2] = Irms[i] & 0xff; - p[(i * 2) + 1] = Irms[i] >> 8; - } - ModbusWriteMultipleRequest(BROADCAST_ADR, 0x0020, (uint16_t *) buf, 8 + 3); -} - -/** - * EVSE Register 0x02*: System configuration (same on all SmartEVSE in a LoadBalancing setup) - * TODO not sure if this is used anywhere in the code? -Regis Access Description Unit Values -0x0200 R/W EVSE mode 0:Normal / 1:Smart / 2:Solar -0x0201 R/W EVSE Circuit max Current A 10 - 160 -0x0202 R/W Grid type to which the Sensorbox is connected 0:4Wire / 1:3Wire -0x0203 R/W CT calibration value 0.01 Multiplier -0x0204 R/W Max Mains Current A 10 - 200 -0x0205 R/W Surplus energy start Current A 1 - 16 -0x0206 R/W Stop solar charging at 6A after this time min 0:Disable / 1 - 60 -0x0207 R/W Allow grid power when solar charging A 0 - 6 -0x0208 R/W Type of Mains electric meter * -0x0209 R/W Address of Mains electric meter 10 - 247 -//0x020A R/W What does Mains electric meter measure 0:Mains (Home+EVSE+PV) / 1:Home+EVSE -0x020B R/W Type of PV electric meter * -0x020C R/W Address of PV electric meter 10 - 247 -0x020D R/W Byte order of custom electric meter 0:LBF & LWF / 1:LBF & HWF / 2:HBF & LWF / 3:HBF & HWF -0x020E R/W Data type of custom electric meter 0:Integer / 1:Double -0x020F R/W Modbus Function (3/4) of custom electric meter -0x0210 R/W Register for Voltage (V) of custom electric meter 0 - 65530 -0x0211 R/W Divisor for Voltage (V) of custom electric meter 10x 0 - 7 -0x0212 R/W Register for Current (A) of custom electric meter 0 - 65530 -0x0213 R/W Divisor for Current (A) of custom electric meter 10x 0 - 7 -0x0214 R/W Register for Power (W) of custom electric meter 0 - 65534 -0x0215 R/W Divisor for Power (W) of custom electric meter 10x 0 - 7 / -0x0216 R/W Register for Energy (kWh) of custom electric meter 0 - 65534 -0x0217 R/W Divisor for Energy (kWh) of custom electric meter 10x 0 - 7 -0x0218 R/W Maximum register read (Not implemented) -0x0219 R/W WiFi mode -0x021A R/W Limit max current draw on MAINS (sum of phases) A 9:Disable / 10 - 200 -**/ - -/** - * Master requests Node configuration over modbus - * Master -> Node - * - * @param uint8_t NodeNr (1-7) - */ -void requestNodeConfig(uint8_t NodeNr) { - ModbusReadInputRequest(NodeNr + 1u, 4, 0x0108, 2); -} - -/** - * EVSE Node Config layout - * -Reg Access Description Unit Values -0x0100 R/W Configuration 0:Socket / 1:Fixed Cable -0x0101 R/W Cable lock 0:Disable / 1:Solenoid / 2:Motor -0x0102 R/W MIN Charge Current the EV will accept A 6 - 16 -0x0103 R/W MAX Charge Current for this EVSE A 6 - 80 -0x0104 R/W Load Balance 0:Disabled / 1:Master / 2-8:Node -0x0105 R/W External Switch on pin SW 0:Disabled / 1:Access Push-Button / 2:Access Switch / 3:Smart-Solar Push-Button / 4:Smart-Solar Switch -0x0106 R/W Residual Current Monitor on pin RCM 0:Disabled / 1:Enabled -0x0107 R/W Use RFID reader 0:Disabled / 1:Enabled -0x0108 R/W Type of EV electric meter * -0x0109 R/W Address of EV electric meter 10 - 247 -**/ - -/** - * Master receives Node configuration over modbus - * Node -> Master - * - * @param uint8_t NodeNr (1-7) - */ -void receiveNodeConfig(uint8_t *buf, uint8_t NodeNr) { - Node[NodeNr].EVMeter = buf[1]; - Node[NodeNr].EVAddress = buf[3]; - - Node[NodeNr].ConfigChanged = 0; // Reset flag on master - ModbusWriteSingleRequest(NodeNr + 1u, 0x0006, 0); // Reset flag on node -} - -/** - * Master requests Node status over modbus - * Master -> Node - * - * @param uint8_t NodeNr (1-7) - */ -void requestNodeStatus(uint8_t NodeNr) { - if(Node[NodeNr].Online) { - if(Node[NodeNr].Online-- == 1) { - // Reset Node state when node is offline - BalancedState[NodeNr] = STATE_A; - Balanced[NodeNr] = 0; - } - } - - ModbusReadInputRequest(NodeNr + 1u, 4, 0x0000, 8); -} - -/** To have full control over the nodes, you will have to read each node's status registers, and see if it requests to charge. - * for example for node 2: - - Received packet (21 bytes) 03 04 10 00 01 00 00 00 3c 00 01 00 00 00 01 00 01 00 20 4d 8c - 00 01 = state B - 00 00 = no errors - 00 3c = charge current 6.0 A - 00 01 = Smart mode - etc. - - Here the state changes to STATE_COMM_C (00 06) - Received packet (21 bytes) 03 04 10 00 06 00 00 00 3c 00 01 00 00 00 01 00 01 00 20 0a 8e - So the ESVE request to charge. - - You can respond to this request by changing the state of the node to State_C - 03 10 00 00 00 02 04 00 07 00 00 49 D6 - Here it will write 00 07 (STATE_COMM_C_OK) to register 0x0000, and reset the error register 0x0001 - - The node will respond to this by switching to STATE_C (Charging). -**/ - -/** - * EVSE Node status layout - * -Regist Access Description Unit Values -0x0000 R/W State 0:A / 1:B / 2:C / 3:D / 4:Node request B / 5:Master confirm B / 6:Node request C / - 7:Master confirm C / 8:Activation mode / 9:B1 / 10:C1 -0x0001 R/W Error Bit 1:LESS_6A / 2:NO_COMM / 4:TEMP_HIGH / 8:EV_NOCOMM / 16:RCD / 32:NO_SUN -0x0002 R/W Charging current 0.1 A 0:no current available / 6-80 -0x0003 R/W EVSE mode (without saving) 0:Normal / 1:Smart / 2:Solar -0x0004 R/W Solar Timer s -0x0005 R/W Access bit 0:No Access / 1:Access -0x0006 R/W Configuration changed (Not implemented) -0x0007 R Maximum charging current A -0x0008 R/W Number of used phases (Not implemented) 0:Undetected / 1 - 3 -0x0009 R Real charging current (Not implemented) 0.1 A -0x000A R Temperature K -0x000B R Serial number -0x0020 - 0x0027 - W Broadcast charge current. SmartEVSE uses only one value depending on the "Load Balancing" configuration - 0.1 A 0:no current available -0x0028 - 0x0030 - W Broadcast MainsMeter currents L1 - L3. - 0.1 A -**/ - -/** - * Master receives Node status over modbus - * Node -> Master - * - * @param uint8_t NodeAdr (1-7) - */ -void receiveNodeStatus(uint8_t *buf, uint8_t NodeNr) { - Node[NodeNr].Online = 5; - - BalancedState[NodeNr] = buf[1]; // Node State - BalancedError[NodeNr] = buf[3]; // Node Error status - // Update Mode when changed on Node and not Smart/Solar Switch on the Master - // Also make sure we are not in the menu. - Node[NodeNr].Mode = buf[7]; - - if ((Node[NodeNr].Mode != Mode) && Switch != 4 && !LCDNav && !NodeNewMode) { - NodeNewMode = Node[NodeNr].Mode + 1; // Store the new Mode in NodeNewMode, we'll update Mode in 'ProcessAllNodeStates' - } - Node[NodeNr].SolarTimer = (buf[8] * 256) + buf[9]; - Node[NodeNr].ConfigChanged = buf[13] | Node[NodeNr].ConfigChanged; - BalancedMax[NodeNr] = buf[15] * 10; // Node Max ChargeCurrent (0.1A) - _LOG_D("ReceivedNode[%u]Status State:%u Error:%u, BalancedMax:%u, Mode:%u, ConfigChanged:%u.\n", NodeNr, BalancedState[NodeNr], BalancedError[NodeNr], BalancedMax[NodeNr], Node[NodeNr].Mode, Node[NodeNr].ConfigChanged); -} - -/** - * Master checks node status requests, and responds with new state - * Master -> Node - * - * @param uint8_t NodeAdr (1-7) - * @return uint8_t success - */ -uint8_t processAllNodeStates(uint8_t NodeNr) { - uint16_t values[5]; - uint8_t current, write = 0, regs = 2; // registers are written when Node needs updating. - - values[0] = BalancedState[NodeNr]; - - current = IsCurrentAvailable(); - if (current) { // Yes enough current - if (BalancedError[NodeNr] & (LESS_6A|NO_SUN)) { - BalancedError[NodeNr] &= ~(LESS_6A | NO_SUN); // Clear Error flags - write = 1; - } - } - - if ((ErrorFlags & CT_NOCOMM) && !(BalancedError[NodeNr] & CT_NOCOMM)) { - BalancedError[NodeNr] |= CT_NOCOMM; // Send Comm Error on Master to Node - write = 1; - } - - // Check EVSE for request to charge states - switch (BalancedState[NodeNr]) { - case STATE_A: - // Reset Node - Node[NodeNr].IntTimer = 0; - Node[NodeNr].Timer = 0; - Node[NodeNr].Phases = 0; - Node[NodeNr].MinCurrent = 0; - break; - - case STATE_COMM_B: // Request to charge A->B - _LOG_I("Node %u State A->B request ", NodeNr); - if (current) { // check if we have enough current - // Yes enough current.. - BalancedState[NodeNr] = STATE_B; // Mark Node EVSE as active (State B) - Balanced[NodeNr] = MinCurrent * 10; // Initially set current to lowest setting - values[0] = STATE_COMM_B_OK; - write = 1; - _LOG_I("- OK!\n"); - } else { // We do not have enough current to start charging - Balanced[NodeNr] = 0; // Make sure the Node does not start charging by setting current to 0 - if ((BalancedError[NodeNr] & (LESS_6A|NO_SUN)) == 0) { // Error flags cleared? - if (Mode == MODE_SOLAR) BalancedError[NodeNr] |= NO_SUN; // Solar mode: No Solar Power available - else BalancedError[NodeNr] |= LESS_6A; // Normal or Smart Mode: Not enough current available - write = 1; - } - _LOG_I("- Not enough current!\n"); - } - break; - - case STATE_COMM_C: // request to charge B->C - _LOG_I("Node %u State B->C request\n", NodeNr); - Balanced[NodeNr] = 0; // For correct baseload calculation set current to zero - if (current) { // check if we have enough current - // Yes - BalancedState[NodeNr] = STATE_C; // Mark Node EVSE as Charging (State C) - CalcBalancedCurrent(1); // Calculate charge current for all connected EVSE's - values[0] = STATE_COMM_C_OK; - write = 1; - _LOG_I("- OK!\n"); - } else { // We do not have enough current to start charging - if ((BalancedError[NodeNr] & (LESS_6A|NO_SUN)) == 0) { // Error flags cleared? - if (Mode == MODE_SOLAR) BalancedError[NodeNr] |= NO_SUN; // Solar mode: No Solar Power available - else BalancedError[NodeNr] |= LESS_6A; // Normal or Smart Mode: Not enough current available - write = 1; - } - _LOG_I("- Not enough current!\n"); - } - break; - - default: - break; - - } - - // Here we set the Masters Mode to the one we received from a Slave/Node - if (NodeNewMode) { - setMode(NodeNewMode -1); - NodeNewMode = 0; - } - - // Error Flags - values[1] = BalancedError[NodeNr]; - // Charge Current - values[2] = 0; // This does nothing for Nodes. Currently the Chargecurrent can only be written to the Master - // Mode - if (Node[NodeNr].Mode != Mode) { - regs = 4; - write = 1; - } - values[3] = Mode; - - // SolarStopTimer - if (abs((int16_t)SolarStopTimer - (int16_t)Node[NodeNr].SolarTimer) > 3) { // Write SolarStoptimer to Node if time is off by 3 seconds or more. - regs = 5; - write = 1; - values[4] = SolarStopTimer; - } - - if (write) { - _LOG_D("processAllNode[%u]States State:%u, BalancedError:%u, Mode:%u, SolarStopTimer:%u\n",NodeNr, BalancedState[NodeNr], BalancedError[NodeNr], Mode, SolarStopTimer); - ModbusWriteMultipleRequest(NodeNr+1 , 0x0000, values, regs); // Write State, Error, Charge Current, Mode and Solar Timer to Node - } - - return write; -} - - -/** - * Check minimum and maximum of a value and set the variable - * - * @param uint8_t MENU_xxx - * @param uint16_t value - * @return uint8_t success - */ -uint8_t setItemValue(uint8_t nav, uint16_t val) { - if (nav < MENU_EXIT) { - if (val < MenuStr[nav].Min || val > MenuStr[nav].Max) return 0; - } - - switch (nav) { - case MENU_MAX_TEMP: - maxTemp = val; - break; - case MENU_C2: - EnableC2 = (EnableC2_t) val; - break; - case MENU_CONFIG: - Config = val; - break; - case STATUS_MODE: - setMode(val); - break; - case MENU_MODE: - Mode = val; - break; - case MENU_START: - StartCurrent = val; - break; - case MENU_STOP: - StopTime = val; - break; - case MENU_IMPORT: - ImportCurrent = val; - break; - case MENU_LOADBL: - ConfigureModbusMode(val); - LoadBl = val; - break; - case MENU_MAINS: - MaxMains = val; - break; - case MENU_SUMMAINS: - MaxSumMains = val; - break; - case MENU_MIN: - MinCurrent = val; - break; - case MENU_MAX: - MaxCurrent = val; - break; - case MENU_CIRCUIT: - MaxCircuit = val; - break; - case MENU_LOCK: - Lock = val; - break; - case MENU_SWITCH: - Switch = val; - break; - case MENU_RCMON: - RCmon = val; - break; - case MENU_CAL: - ICal = val; - break; - case MENU_GRID: - Grid = val; - break; - case MENU_MAINSMETER: - MainsMeter = val; - break; - case MENU_MAINSMETERADDRESS: - MainsMeterAddress = val; - break; - case MENU_EVMETER: - EVMeter = val; - break; - case MENU_EVMETERADDRESS: - EVMeterAddress = val; - break; - case MENU_EMCUSTOM_ENDIANESS: - EMConfig[EM_CUSTOM].Endianness = val; - break; - case MENU_EMCUSTOM_DATATYPE: - EMConfig[EM_CUSTOM].DataType = (mb_datatype)val; - break; - case MENU_EMCUSTOM_FUNCTION: - EMConfig[EM_CUSTOM].Function = val; - break; - case MENU_EMCUSTOM_UREGISTER: - EMConfig[EM_CUSTOM].URegister = val; - break; - case MENU_EMCUSTOM_UDIVISOR: - EMConfig[EM_CUSTOM].UDivisor = val; - break; - case MENU_EMCUSTOM_IREGISTER: - EMConfig[EM_CUSTOM].IRegister = val; - break; - case MENU_EMCUSTOM_IDIVISOR: - EMConfig[EM_CUSTOM].IDivisor = val; - break; - case MENU_EMCUSTOM_PREGISTER: - EMConfig[EM_CUSTOM].PRegister = val; - break; - case MENU_EMCUSTOM_PDIVISOR: - EMConfig[EM_CUSTOM].PDivisor = val; - break; - case MENU_EMCUSTOM_EREGISTER: - EMConfig[EM_CUSTOM].ERegister = val; - break; - case MENU_EMCUSTOM_EDIVISOR: - EMConfig[EM_CUSTOM].EDivisor = val; - break; - case MENU_RFIDREADER: - RFIDReader = val; - break; - case MENU_WIFI: - WIFImode = val; - break; - - // Status writeable - case STATUS_STATE: - if (val != State) setState(val); - break; - case STATUS_ERROR: - ErrorFlags = val; - if (ErrorFlags) { // Is there an actual Error? Maybe the error got cleared? - if (ErrorFlags & CT_NOCOMM) MainsMeterTimeout = 0; // clear MainsMeterTimeout on a CT_NOCOMM error, so the error will be immediate. - setStatePowerUnavailable(); - ChargeDelay = CHARGEDELAY; - _LOG_V("Error message received!\n"); - } else { - _LOG_V("Errors Cleared received!\n"); - } - break; - case STATUS_CURRENT: - OverrideCurrent = val; - if (LoadBl < 2) MainsMeterTimeout = COMM_TIMEOUT; // reset timeout when register is written - break; - case STATUS_SOLAR_TIMER: - setSolarStopTimer(val); - break; - case STATUS_ACCESS: - if (val == 0 || val == 1) { - setAccess(val); - } - break; - case STATUS_CONFIG_CHANGED: - ConfigChanged = val; - break; - - default: - return 0; - } - - return 1; -} - -/** - * Get the variable - * - * @param uint8_t MENU_xxx - * @return uint16_t value - */ -uint16_t getItemValue(uint8_t nav) { - switch (nav) { - case MENU_MAX_TEMP: - return maxTemp; - case MENU_C2: - return EnableC2; - case MENU_CONFIG: - return Config; - case MENU_MODE: - case STATUS_MODE: - return Mode; - case MENU_START: - return StartCurrent; - case MENU_STOP: - return StopTime; - case MENU_IMPORT: - return ImportCurrent; - case MENU_LOADBL: - return LoadBl; - case MENU_MAINS: - return MaxMains; - case MENU_SUMMAINS: - return MaxSumMains; - case MENU_MIN: - return MinCurrent; - case MENU_MAX: - return MaxCurrent; - case MENU_CIRCUIT: - return MaxCircuit; - case MENU_LOCK: - return Lock; - case MENU_SWITCH: - return Switch; - case MENU_RCMON: - return RCmon; - case MENU_CAL: - return ICal; - case MENU_GRID: - return Grid; - case MENU_MAINSMETER: - return MainsMeter; - case MENU_MAINSMETERADDRESS: - return MainsMeterAddress; - case MENU_EVMETER: - return EVMeter; - case MENU_EVMETERADDRESS: - return EVMeterAddress; - case MENU_EMCUSTOM_ENDIANESS: - return EMConfig[EM_CUSTOM].Endianness; - case MENU_EMCUSTOM_DATATYPE: - return EMConfig[EM_CUSTOM].DataType; - case MENU_EMCUSTOM_FUNCTION: - return EMConfig[EM_CUSTOM].Function; - case MENU_EMCUSTOM_UREGISTER: - return EMConfig[EM_CUSTOM].URegister; - case MENU_EMCUSTOM_UDIVISOR: - return EMConfig[EM_CUSTOM].UDivisor; - case MENU_EMCUSTOM_IREGISTER: - return EMConfig[EM_CUSTOM].IRegister; - case MENU_EMCUSTOM_IDIVISOR: - return EMConfig[EM_CUSTOM].IDivisor; - case MENU_EMCUSTOM_PREGISTER: - return EMConfig[EM_CUSTOM].PRegister; - case MENU_EMCUSTOM_PDIVISOR: - return EMConfig[EM_CUSTOM].PDivisor; - case MENU_EMCUSTOM_EREGISTER: - return EMConfig[EM_CUSTOM].ERegister; - case MENU_EMCUSTOM_EDIVISOR: - return EMConfig[EM_CUSTOM].EDivisor; - case MENU_RFIDREADER: - return RFIDReader; - case MENU_WIFI: - return WIFImode; - - // Status writeable - case STATUS_STATE: - return State; - case STATUS_ERROR: - return ErrorFlags; - case STATUS_CURRENT: - return Balanced[0]; - case STATUS_SOLAR_TIMER: - return SolarStopTimer; - case STATUS_ACCESS: - return Access_bit; - case STATUS_CONFIG_CHANGED: - return ConfigChanged; - - // Status readonly - case STATUS_MAX: - return min(MaxCapacity,MaxCurrent); - case STATUS_TEMP: - return (signed int)TempEVSE; - case STATUS_SERIAL: - return serialnr; - - default: - return 0; - } -} - - -void printStatus(void) -{ - _LOG_I ("STATE: %s Error: %u StartCurrent: -%i ChargeDelay: %u SolarStopTimer: %u NoCurrent: %u Imeasured: %.1f A IsetBalanced: %.1f A, MainsMeterTimeout=%u, EVMeterTimeout=%u.\n", getStateName(State), ErrorFlags, StartCurrent, ChargeDelay, SolarStopTimer, NoCurrent, (float)Imeasured/10, (float)IsetBalanced/10, MainsMeterTimeout, EVMeterTimeout); - _LOG_I("L1: %.1f A L2: %.1f A L3: %.1f A Isum: %.1f A\n", (float)Irms[0]/10, (float)Irms[1]/10, (float)Irms[2]/10, (float)Isum/10); -} - -// Recompute State of Charge, in case we have a known initial state of charge -// This function is called by kWh logic and after an EV state update through API, Serial or MQTT -void RecomputeSoC(void) { - if (InitialSoC > 0 && FullSoC > 0 && EnergyCapacity > 0) { - if (InitialSoC == FullSoC) { - // We're already at full SoC - ComputedSoC = FullSoC; - RemainingSoC = 0; - TimeUntilFull = -1; - } else { - int EnergyRemaining = -1; - int TargetEnergyCapacity = (FullSoC / 100.f) * EnergyCapacity; - - if (EnergyRequest > 0) { - // Attempt to use EnergyRequest to determine SoC with greater accuracy - EnergyRemaining = EnergyCharged > 0 ? (EnergyRequest - EnergyCharged) : EnergyRequest; - } else { - // We use a rough estimation based on FullSoC and EnergyCapacity - EnergyRemaining = TargetEnergyCapacity - (EnergyCharged + (InitialSoC / 100.f) * EnergyCapacity); - } - - RemainingSoC = ((FullSoC * EnergyRemaining) / TargetEnergyCapacity); - ComputedSoC = RemainingSoC > 1 ? (FullSoC - RemainingSoC) : FullSoC; - - // Only attempt to compute the SoC and TimeUntilFull if we have a EnergyRemaining and PowerMeasured - if (EnergyRemaining > -1) { - int TimeToGo = -1; - // Do a very simple estimation in seconds until car would reach FullSoC according to current charging power - if (PowerMeasured > 0) { - // Use real-time PowerMeasured data if available - TimeToGo = (3600 * EnergyRemaining) / PowerMeasured; - } else if (Nr_Of_Phases_Charging > 0) { - // Else, fall back on the theoretical maximum of the cable + nr of phases - TimeToGo = (3600 * EnergyRemaining) / (MaxCapacity * (Nr_Of_Phases_Charging * 230)); - } - - // Wait until we have a somewhat sensible estimation while still respecting granny chargers - if (TimeToGo < 100000) { - TimeUntilFull = TimeToGo; - } - } - - // We can't possibly charge to over 100% SoC - if (ComputedSoC > FullSoC) { - ComputedSoC = FullSoC; - RemainingSoC = 0; - TimeUntilFull = -1; - } - - _LOG_I("SoC: EnergyRemaining %i RemaningSoC %i EnergyRequest %i EnergyCharged %i EnergyCapacity %i ComputedSoC %i FullSoC %i TimeUntilFull %i TargetEnergyCapacity %i\n", EnergyRemaining, RemainingSoC, EnergyRequest, EnergyCharged, EnergyCapacity, ComputedSoC, FullSoC, TimeUntilFull, TargetEnergyCapacity); - } - } else { - if (TimeUntilFull != -1) TimeUntilFull = -1; - } - // There's also the possibility an external API/app is used for SoC info. In such case, we allow setting ComputedSoC directly. -} - -// EV disconnected from charger. Triggered after 60 seconds of disconnect -// This is done so we can "re-plug" the car in the Modem process without triggering disconnect events -void DisconnectEvent(void){ - _LOG_A("EV disconnected for a while. Resetting SoC states"); - ModemStage = 0; // Enable Modem states again - InitialSoC = -1; - FullSoC = -1; - RemainingSoC = -1; - ComputedSoC = -1; - EnergyCapacity = -1; - EnergyRequest = -1; - TimeUntilFull = -1; - strncpy(EVCCID, "", sizeof(EVCCID)); -} - -void CalcImeasured_EV(void) { - // Initialize Imeasured (max power used) to first channel. - Imeasured_EV = Irms_EV[0]; - for (int x = 1; x < 3; x++) { - if (Irms_EV[x] > Imeasured_EV) Imeasured_EV = Irms_EV[x]; - } -} - -void CalcIsum(void) { - phasesLastUpdate = time(NULL); - phasesLastUpdateFlag = true; // Set flag if a new Irms measurement is received. - int batteryPerPhase = getBatteryCurrent() / 3; - Isum = 0; -#if FAKE_SUNNY_DAY - int32_t temp[3]={0, 0, 0}; - temp[0] = INJECT_CURRENT_L1 * 10; //Irms is in units of 100mA - temp[1] = INJECT_CURRENT_L2 * 10; - temp[2] = INJECT_CURRENT_L3 * 10; -#endif - - // Initialize Imeasured (max power used) to first channel. - Imeasured = Irms[0]; - for (int x = 0; x < 3; x++) { -#if FAKE_SUNNY_DAY - Irms[x] = Irms[x] - temp[x]; -#endif - IrmsOriginal[x] = Irms[x]; - Irms[x] -= batteryPerPhase; - Isum = Isum + Irms[x]; - // Imeasured holds highest Irms of all channels - if (Irms[x] > Imeasured) Imeasured = Irms[x]; - } -} - - -// CheckSwitch (SW input) -// -void CheckSwitch(void) -{ - static uint8_t RB2count = 0, RB2last = 1, RB2low = 0; - static unsigned long RB2Timer = 0; // 1500ms - - // External switch changed state? - if ( (digitalRead(PIN_SW_IN) != RB2last) || RB2low) { - // make sure that noise on the input does not switch - if (RB2count++ > 20 || RB2low) { - RB2last = digitalRead(PIN_SW_IN); - if (RB2last == 0) { - // Switch input pulled low - switch (Switch) { - case 1: // Access Button - setAccess(!Access_bit); // Toggle Access bit on/off - _LOG_I("Access: %d\n", Access_bit); - break; - case 2: // Access Switch - setAccess(true); - break; - case 3: // Smart-Solar Button or hold button for 1,5 second to STOP charging - if (RB2low == 0) { - RB2low = 1; - RB2Timer = millis(); - } - if (RB2low && millis() > RB2Timer + 1500) { - if (State == STATE_C) { - setState(STATE_C1); - if (!TestState) ChargeDelay = 15; // Keep in State B for 15 seconds, so the Charge cable can be removed. - RB2low = 2; - } - } - break; - case 4: // Smart-Solar Switch - if (Mode == MODE_SOLAR) { - setMode(MODE_SMART); - setSolarStopTimer(0); // Also make sure the SolarTimer is disabled. - } - break; - default: - if (State == STATE_C) { // Menu option Access is set to Disabled - setState(STATE_C1); - if (!TestState) ChargeDelay = 15; // Keep in State B for 15 seconds, so the Charge cable can be removed. - } - break; - } - - // Reset RCM error when button is pressed - // RCM was tripped, but RCM level is back to normal - if (RCmon == 1 && (ErrorFlags & RCM_TRIPPED) && digitalRead(PIN_RCM_FAULT) == LOW) { - // Clear RCM error - ErrorFlags &= ~RCM_TRIPPED; - } - // Also light up the LCD backlight - // BacklightTimer = BACKLIGHT; // Backlight ON - - } else { - // Switch input released - switch (Switch) { - case 2: // Access Switch - setAccess(false); - break; - case 3: // Smart-Solar Button - if (RB2low != 2) { - if (Mode == MODE_SMART) { - setMode(MODE_SOLAR); - } else if (Mode == MODE_SOLAR) { - setMode(MODE_SMART); - } - ErrorFlags &= ~(NO_SUN | LESS_6A); // Clear All errors - ChargeDelay = 0; // Clear any Chargedelay - setSolarStopTimer(0); // Also make sure the SolarTimer is disabled. - LCDTimer = 0; - } - RB2low = 0; - break; - case 4: // Smart-Solar Switch - if (Mode == MODE_SMART) setMode(MODE_SOLAR); - break; - default: - break; - } - } - - RB2count = 0; - } - } else RB2count = 0; - - // Residual current monitor active, and DC current > 6mA ? - if (RCmon == 1 && digitalRead(PIN_RCM_FAULT) == HIGH) { - delay(1); - // check again, to prevent voltage spikes from tripping the RCM detection - if (digitalRead(PIN_RCM_FAULT) == HIGH) { - if (State) setState(STATE_B1); - ErrorFlags = RCM_TRIPPED; - LCDTimer = 0; // display the correct error message on the LCD - } - } - - -} - - - -// Task that handles EVSE State Changes -// Reads buttons, and updates the LCD. -// -// called every 10ms -void EVSEStates(void * parameter) { - - //uint8_t n; - uint8_t leftbutton = 5; - uint8_t DiodeCheck = 0; - uint16_t StateTimer = 0; // When switching from State B to C, make sure pilot is at 6v for 100ms - - // infinite loop - while(1) { - - - // Sample the three < o > buttons. - // As the buttons are shared with the SPI lines going to the LCD, - // we have to make sure that this does not interfere by write actions to the LCD. - // Therefore updating the LCD is also done in this task. - - pinMatrixOutDetach(PIN_LCD_SDO_B3, false, false); // disconnect MOSI pin - pinMode(PIN_LCD_SDO_B3, INPUT); - pinMode(PIN_LCD_A0_B2, INPUT); - // sample buttons < o > - if (digitalRead(PIN_LCD_SDO_B3)) ButtonState = 4; // > (right) - else ButtonState = 0; - if (digitalRead(PIN_LCD_A0_B2)) ButtonState |= 2; // o (middle) - if (digitalRead(PIN_IO0_B1)) ButtonState |= 1; // < (left) - - pinMode(PIN_LCD_SDO_B3, OUTPUT); - pinMatrixOutAttach(PIN_LCD_SDO_B3, VSPID_IN_IDX, false, false); // re-attach MOSI pin - pinMode(PIN_LCD_A0_B2, OUTPUT); - - - // When one or more button(s) are pressed, we call GLCDMenu - if ((ButtonState != 0x07) || (ButtonState != OldButtonState)) GLCDMenu(ButtonState); - - // Update/Show Helpmenu - if (LCDNav > MENU_ENTER && LCDNav < MENU_EXIT && (ScrollTimer + 5000 < millis() ) && (!SubMenu)) GLCDHelp(); - - // Left button pressed, Loadbalancing is Master or Disabled, switch is set to "Sma-Sol B" and Mode is Smart or Solar? - if ((!LCDNav || LCDNav == MENU_OFF) && ButtonState == 0x6 && Mode && !leftbutton && Switch == 3) { - setMode(~Mode & 0x3); // Change from Solar to Smart mode and vice versa. - ErrorFlags &= ~(NO_SUN | LESS_6A); // Clear All errors - ChargeDelay = 0; // Clear any Chargedelay - setSolarStopTimer(0); // Also make sure the SolarTimer is disabled. - LCDTimer = 0; - leftbutton = 5; - } else if (leftbutton && ButtonState == 0x7) leftbutton--; - - // Check the external switch and RCM sensor - CheckSwitch(); - - // sample the Pilot line - pilot = Pilot(); - - // ############### EVSE State A ################# - - if (State == STATE_A || State == STATE_COMM_B || State == STATE_B1) { - // When the pilot line is disconnected, wait for PilotDisconnectTime, then reconnect - if (PilotDisconnected) { - if (PilotDisconnectTime == 0 && pilot == PILOT_NOK ) { // Pilot should be ~ 0V when disconnected - PILOT_CONNECTED; - PilotDisconnected = false; - _LOG_A("Pilot Connected\n"); - } - } else if (pilot == PILOT_12V) { // Check if we are disconnected, or forced to State A, but still connected to the EV - // If the RFID reader is set to EnableOne or EnableAll mode, and the Charging cable is disconnected - // We start a timer to re-lock the EVSE (and unlock the cable) after 60 seconds. - if ((RFIDReader == 2 || RFIDReader == 1) && AccessTimer == 0 && Access_bit == 1) AccessTimer = RFIDLOCKTIME; - - if (State != STATE_A) setState(STATE_A); // reset state, incase we were stuck in STATE_COMM_B - ChargeDelay = 0; // Clear ChargeDelay when disconnected. - - if (!ResetKwh) ResetKwh = 1; // when set, reset EV kWh meter on state B->C change. - } else if ( pilot == PILOT_9V && ErrorFlags == NO_ERROR - && ChargeDelay == 0 && Access_bit && State != STATE_COMM_B -#if MODEM - && State != STATE_MODEM_REQUEST && State != STATE_MODEM_WAIT && State != STATE_MODEM_DONE // switch to State B ? -#endif - ) - { // Allow to switch to state C directly if STATE_A_TO_C is set to PILOT_6V (see EVSE.h) - DiodeCheck = 0; - - ProximityPin(); // Sample Proximity Pin - - _LOG_I("Cable limit: %uA Max: %uA\n", MaxCapacity, MaxCurrent); - if (MaxCurrent > MaxCapacity) ChargeCurrent = MaxCapacity * 10; // Do not modify Max Cable Capacity or MaxCurrent (fix 2.05) - else ChargeCurrent = MinCurrent * 10; // Instead use new variable ChargeCurrent - - // Load Balancing : Node - if (LoadBl > 1) { // Send command to Master, followed by Max Charge Current - setState(STATE_COMM_B); // Node wants to switch to State B - - // Load Balancing: Master or Disabled - } else if (IsCurrentAvailable()) { - BalancedMax[0] = MaxCapacity * 10; - Balanced[0] = ChargeCurrent; // Set pilot duty cycle to ChargeCurrent (v2.15) - if (Modem == EXPERIMENT && ModemStage == 0){ - setState(STATE_MODEM_REQUEST); - }else{ - setState(STATE_B); // switch to State B - } - ActivationMode = 30; // Activation mode is triggered if state C is not entered in 30 seconds. - AccessTimer = 0; - } else if (Mode == MODE_SOLAR) { // Not enough power: - ErrorFlags |= NO_SUN; // Not enough solar power - } else ErrorFlags |= LESS_6A; // Not enough power available - } else if (pilot == PILOT_9V && State != STATE_B1 && State != STATE_COMM_B && Access_bit) { - setState(STATE_B1); - } - } // State == STATE_A || State == STATE_COMM_B || State == STATE_B1 - - if (State == STATE_COMM_B_OK) { - setState(STATE_B); - ActivationMode = 30; // Activation mode is triggered if state C is not entered in 30 seconds. - AccessTimer = 0; - } - - // ############### EVSE State B ################# - - if (State == STATE_B || State == STATE_COMM_C) { - - if (pilot == PILOT_12V) { // Disconnected? - setState(STATE_A); // switch to STATE_A - - } else if (pilot == PILOT_6V && ++StateTimer > 50) { // When switching from State B to C, make sure pilot is at 6V for at least 500ms - // Fixes https://github.com/dingo35/SmartEVSE-3.5/issues/40 - if ((DiodeCheck == 1) && (ErrorFlags == NO_ERROR) && (ChargeDelay == 0)) { - if (EVMeter && ResetKwh) { - EnergyMeterStart = EnergyEV; // store kwh measurement at start of charging. - EnergyCharged = EnergyEV - EnergyMeterStart; // Calculate Energy - ResetKwh = 0; // clear flag, will be set when disconnected from EVSE (State A) - } - - // Load Balancing : Node - if (LoadBl > 1) { - if (State != STATE_COMM_C) setState(STATE_COMM_C); // Send command to Master, followed by Charge Current - - // Load Balancing: Master or Disabled - } else { - BalancedMax[0] = ChargeCurrent; - if (IsCurrentAvailable()) { - - Balanced[0] = 0; // For correct baseload calculation set current to zero - CalcBalancedCurrent(1); // Calculate charge current for all connected EVSE's - - DiodeCheck = 0; // (local variable) - setState(STATE_C); // switch to STATE_C - if (!LCDNav) GLCD(); // Don't update the LCD if we are navigating the menu - // immediately update LCD (20ms) - } - else if (Mode == MODE_SOLAR) { // Not enough power: - ErrorFlags |= NO_SUN; // Not enough solar power - } else ErrorFlags |= LESS_6A; // Not enough power available - } - } - - // PILOT_9V - } else if (pilot == PILOT_9V) { - - StateTimer = 0; // Reset State B->C transition timer - if (ActivationMode == 0) { - setState(STATE_ACTSTART); - ActivationTimer = 3; - - SetCPDuty(0); // PWM off, channel 0, duty cycle 0% - // Control pilot static -12V - } - } - if (pilot == PILOT_DIODE) { - DiodeCheck = 1; // Diode found, OK - _LOG_A("Diode OK\n"); - timerAlarmWrite(timerA, PWM_5, false); // Enable Timer alarm, set to start of CP signal (5%) - } - - } - - // ############### EVSE State C1 ################# - - if (State == STATE_C1) - { - if (pilot == PILOT_12V) - { // Disconnected or connected to EV without PWM - setState(STATE_A); // switch to STATE_A - GLCD_init(); // Re-init LCD - } - else if (pilot == PILOT_9V) - { - setState(STATE_B1); // switch to State B1 - GLCD_init(); // Re-init LCD - } - } - - - if (State == STATE_ACTSTART && ActivationTimer == 0) { - setState(STATE_B); // Switch back to State B - ActivationMode = 255; // Disable ActivationMode - } - - if (State == STATE_COMM_C_OK) { - DiodeCheck = 0; - setState(STATE_C); // switch to STATE_C - // Don't update the LCD if we are navigating the menu - if (!LCDNav) GLCD(); // immediately update LCD - } - - // ############### EVSE State C ################# - - if (State == STATE_C) { - - if (pilot == PILOT_12V) { // Disconnected ? - setState(STATE_A); // switch back to STATE_A - GLCD_init(); // Re-init LCD - - } else if (pilot == PILOT_9V) { - setState(STATE_B); // switch back to STATE_B - DiodeCheck = 0; - GLCD_init(); // Re-init LCD (200ms delay) - // Mark EVSE as inactive (still State B) - } - - } // end of State C code - - // update LCD (every 1000ms) when not in the setup menu - if (LCDupdate) { - // This is also the ideal place for debug messages that should not be printed every 10ms - //_LOG_A("EVSEStates task free ram: %u\n", uxTaskGetStackHighWaterMark( NULL )); - GLCD(); - LCDupdate = 0; - } - - // Pause the task for 10ms - vTaskDelay(10 / portTICK_PERIOD_MS); - } // while(1) loop -} - -/** - * Send Energy measurement request over modbus - * - * @param uint8_t Meter - * @param uint8_t Address - * @param bool Export (if exported energy is requested) - */ -void requestEnergyMeasurement(uint8_t Meter, uint8_t Address, bool Export) { - switch (Meter) { - case EM_SOLAREDGE: - // Note: - // - SolarEdge uses 16-bit values, except for this measurement it uses 32bit int format - // - EM_SOLAREDGE should not be used for EV Energy Measurements - if (Export) ModbusReadInputRequest(Address, EMConfig[Meter].Function, EMConfig[Meter].ERegister_Exp, 2); - else ModbusReadInputRequest(Address, EMConfig[Meter].Function, EMConfig[Meter].ERegister, 2); - break; - case EM_ABB: - // Note: - // - ABB uses 64bit values for this register (size 2) - if (Export) requestMeasurement(Meter, Address, EMConfig[Meter].ERegister_Exp, 2); - else requestMeasurement(Meter, Address, EMConfig[Meter].ERegister, 2); - break; - case EM_FINDER_7E: - case EM_EASTRON3P: - case EM_EASTRON1P: - case EM_WAGO: - if (Export) requestMeasurement(Meter, Address, EMConfig[Meter].ERegister_Exp, 1); - else requestMeasurement(Meter, Address, EMConfig[Meter].ERegister, 1); - break; - case EM_EASTRON3P_INV: - if (Export) requestMeasurement(Meter, Address, EMConfig[Meter].ERegister, 1); - else requestMeasurement(Meter, Address, EMConfig[Meter].ERegister_Exp, 1); - break; - default: - if (!Export) //refuse to do a request on exported energy if the meter doesnt support it - requestMeasurement(Meter, Address, EMConfig[Meter].ERegister, 1); - break; - } -} - - -// Task that handles the Cable Lock and modbus -// -// called every 100ms -// -void Timer100ms(void * parameter) { - -unsigned int locktimer = 0, unlocktimer = 0, energytimer = 0; -uint8_t PollEVNode = NR_EVSES, updated = 0; - - - while(1) // infinite loop - { - // Check if the cable lock is used - if (Lock) { // Cable lock enabled? - // UnlockCable takes precedence over LockCable - if ((RFIDReader == 2 && Access_bit == 0) || // One RFID card can Lock/Unlock the charging socket (like a public charging station) - State == STATE_A) { // The charging socket is unlocked when unplugged from the EV - if (unlocktimer == 0) { // 600ms pulse - ACTUATOR_UNLOCK; - } else if (unlocktimer == 6) { - ACTUATOR_OFF; - } - if (unlocktimer++ > 7) { - if (digitalRead(PIN_LOCK_IN) == lock1 ) // still locked... - { - if (unlocktimer > 50) unlocktimer = 0; // try to unlock again in 5 seconds - } else unlocktimer = 7; - } - locktimer = 0; - // Lock Cable - } else if (State != STATE_A) { // Lock cable when connected to the EV - if (locktimer == 0) { // 600ms pulse - ACTUATOR_LOCK; - } else if (locktimer == 6) { - ACTUATOR_OFF; - } - if (locktimer++ > 7) { - if (digitalRead(PIN_LOCK_IN) == lock2 ) // still unlocked... - { - if (locktimer > 50) locktimer = 0; // try to lock again in 5 seconds - } else locktimer = 7; - } - unlocktimer = 0; - } - } - - - - // Every 2 seconds, request measurements from modbus meters - if (ModbusRequest) { // Slaves all have ModbusRequest at 0 so they never enter here - switch (ModbusRequest) { // State - case 1: // PV kwh meter - ModbusRequest++; - // fall through - case 2: // Sensorbox or kWh meter that measures -all- currents - if (MainsMeter && MainsMeter != EM_API) { // we don't want modbus meter currents to conflict with EM_API currents - _LOG_D("ModbusRequest %u: Request MainsMeter Measurement\n", ModbusRequest); - requestCurrentMeasurement(MainsMeter, MainsMeterAddress); - break; - } - ModbusRequest++; - // fall through - case 3: - // Find next online SmartEVSE - do { - PollEVNode++; - if (PollEVNode >= NR_EVSES) PollEVNode = 0; - } while(!Node[PollEVNode].Online); - - // Request Configuration if changed - if (Node[PollEVNode].ConfigChanged) { - _LOG_D("ModbusRequest %u: Request Configuration Node %u\n", ModbusRequest, PollEVNode); - // This will do the following: - // - Send a modbus request to the Node for it's EVmeter - // - Node responds with the Type and Address of the EVmeter - // - Master writes configuration flag reset value to Node - // - Node acks with the exact same message - // This takes around 50ms in total - requestNodeConfig(PollEVNode); - break; - } - ModbusRequest++; - // fall through - case 4: // EV kWh meter, Energy measurement (total charged kWh) - // Request Energy if EV meter is configured - if (Node[PollEVNode].EVMeter && Node[PollEVNode].EVMeter != EM_API) { - _LOG_D("ModbusRequest %u: Request Energy Node %u\n", ModbusRequest, PollEVNode); - requestEnergyMeasurement(Node[PollEVNode].EVMeter, Node[PollEVNode].EVAddress, 0); - break; - } - ModbusRequest++; - // fall through - case 5: // EV kWh meter, Power measurement (momentary power in Watt) - // Request Power if EV meter is configured - if (Node[PollEVNode].EVMeter && Node[PollEVNode].EVMeter != EM_API) { - requestMeasurement(Node[PollEVNode].EVMeter, Node[PollEVNode].EVAddress,EMConfig[Node[PollEVNode].EVMeter].PRegister, 1); - break; - } - ModbusRequest++; - // fall through - case 6: // Node 1 - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - if (LoadBl == 1) { - requestNodeStatus(ModbusRequest - 5u); // Master, Request Node 1-8 status - break; - } - ModbusRequest = 13; - // fall through - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - case 19: - // Here we write State, Error, Mode and SolarTimer to Online Nodes - updated = 0; - if (LoadBl == 1) { - do { - if (Node[ModbusRequest - 12u].Online) { // Skip if not online - if (processAllNodeStates(ModbusRequest - 12u) ) { - updated = 1; // Node updated - break; - } - } - } while (++ModbusRequest < 20); - - } else ModbusRequest = 20; - if (updated) break; // break when Node updated - // fall through - case 20: // EV kWh meter, Current measurement - // Request Current if EV meter is configured - if (Node[PollEVNode].EVMeter && Node[PollEVNode].EVMeter != EM_API) { - _LOG_D("ModbusRequest %u: Request EVMeter Current Measurement Node %u\n", ModbusRequest, PollEVNode); - requestCurrentMeasurement(Node[PollEVNode].EVMeter, Node[PollEVNode].EVAddress); - break; - } - ModbusRequest++; - // fall through - case 21: - // Request active energy if Mainsmeter is configured - if (MainsMeter && (MainsMeter != EM_API) && (MainsMeter != EM_SENSORBOX) ) { // EM_API and Sensorbox do not support energy postings - energytimer++; //this ticks approx every second?!? - if (energytimer == 30) { - _LOG_D("ModbusRequest %u: Request MainsMeter Import Active Energy Measurement\n", ModbusRequest); - requestEnergyMeasurement(MainsMeter, MainsMeterAddress, 0); - break; - } - if (energytimer >= 60) { - _LOG_D("ModbusRequest %u: Request MainsMeter Export Active Energy Measurement\n", ModbusRequest); - requestEnergyMeasurement(MainsMeter, MainsMeterAddress, 1); - energytimer = 0; - break; - } - } - ModbusRequest++; - // fall through - default: - // slave never gets here - // what about normal mode with no meters attached? - CalcBalancedCurrent(0); - // No current left, or Overload (2x Maxmains)? - if (Mode && (NoCurrent > 2 || Imeasured > (MaxMains * 20))) { // I guess we don't want to set this flag in Normal mode, we just want to charge ChargeCurrent - // STOP charging for all EVSE's - // Display error message - ErrorFlags |= LESS_6A; //NOCURRENT; - // Broadcast Error code over RS485 - ModbusWriteSingleRequest(BROADCAST_ADR, 0x0001, ErrorFlags); - NoCurrent = 0; - } - if (LoadBl == 1 && !(ErrorFlags & CT_NOCOMM) ) BroadcastCurrent(); // When there is no Comm Error, Master sends current to all connected EVSE's - - if ((State == STATE_B || State == STATE_C) && !CPDutyOverride) SetCurrent(Balanced[0]); // set PWM output for Master //mind you, the !CPDutyOverride was not checked in Smart/Solar mode, but I think this was a bug! - printStatus(); //for debug purposes - ModbusRequest = 0; - //_LOG_A("Timer100ms task free ram: %u\n", uxTaskGetStackHighWaterMark( NULL )); - break; - } //switch - if (ModbusRequest) ModbusRequest++; - } - - - // Pause the task for 100ms - vTaskDelay(100 / portTICK_PERIOD_MS); - - } //while(1) loop - -} - -#if MQTT -void mqtt_receive_callback(const String topic, const String payload) { - if (topic == MQTTprefix + "/Set/Mode") { - if (payload == "Off") { - ToModemWaitStateTimer = 0; - ToModemDoneStateTimer = 0; - LeaveModemDoneStateTimer = 0; - setAccess(0); - } else if (payload == "Normal") { - setMode(MODE_NORMAL); - } else if (payload == "Solar") { - OverrideCurrent = 0; - setMode(MODE_SOLAR); - } else if (payload == "Smart") { - OverrideCurrent = 0; - setMode(MODE_SMART); - } - } else if (topic == MQTTprefix + "/Set/CurrentOverride") { - uint16_t RequestedCurrent = payload.toInt(); - if (RequestedCurrent == 0) { - OverrideCurrent = 0; - } else if (LoadBl < 2 && (Mode == MODE_NORMAL || Mode == MODE_SMART)) { // OverrideCurrent not possible on Slave - if (RequestedCurrent >= (MinCurrent * 10) && RequestedCurrent <= (MaxCurrent * 10)) { - OverrideCurrent = RequestedCurrent; - } - } - } else if (topic == MQTTprefix + "/Set/CurrentMaxSumMains" && LoadBl < 2) { - uint16_t RequestedCurrent = payload.toInt(); - if (RequestedCurrent == 0) { - MaxSumMains = 0; - } else if (RequestedCurrent >= 10 && RequestedCurrent <= 600) { - MaxSumMains = RequestedCurrent; - } - } else if (topic == MQTTprefix + "/Set/CPPWMOverride") { - int pwm = payload.toInt(); - if (pwm == -1) { - SetCPDuty(1024); - CP_ON; - CPDutyOverride = false; - } else if (pwm == 0) { - SetCPDuty(0); - CP_OFF; - CPDutyOverride = true; - } else if (pwm <= 1024) { - SetCPDuty(pwm); - CP_ON; - CPDutyOverride = true; - } - } else if (topic == MQTTprefix + "/Set/MainsMeter") { - if (MainsMeter != EM_API || LoadBl >= 2) - return; - - int32_t L1, L2, L3; - int n = sscanf(payload.c_str(), "%d:%d:%d", &L1, &L2, &L3); - - // MainsMeter can measure -200A to +200A per phase - if (n == 3 && (L1 > -2000 && L1 < 2000) && (L2 > -2000 && L2 < 2000) && (L3 > -2000 && L3 < 2000)) { - if (LoadBl < 2) - MainsMeterTimeout = COMM_TIMEOUT; - Irms[0] = L1; - Irms[1] = L2; - Irms[2] = L3; - CalcIsum(); - } - } else if (topic == MQTTprefix + "/Set/EVMeter") { - if (EVMeter != EM_API) - return; - - int32_t L1, L2, L3, W, WH; - int n = sscanf(payload.c_str(), "%d:%d:%d:%d:%d", &L1, &L2, &L3, &W, &WH); - - // We expect 5 values (and accept -1 for unknown values) - if (n == 5) { - if ((L1 > -1 && L1 < 1000) && (L2 > -1 && L2 < 1000) && (L3 > -1 && L3 < 1000)) { - // RMS currents - Irms_EV[0] = L1; - Irms_EV[1] = L2; - Irms_EV[2] = L3; - CalcImeasured_EV(); - EVMeterTimeout = COMM_EVTIMEOUT; - } - - if (W > -1) { - // Power measurement - PowerMeasured = W; - } - - if (WH > -1) { - // Energy measurement - EnergyEV = WH; - if (ResetKwh == 2) - EnergyMeterStart = EnergyEV; // At powerup, set EnergyEV to kwh meter value - EnergyCharged = EnergyEV - EnergyMeterStart; // Calculate Energy - RecomputeSoC(); // Recalculate SoC - } - } - } else if (topic == MQTTprefix + "/Set/HomeBatteryCurrent") { - if (LoadBl >= 2) - return; - homeBatteryCurrent = payload.toInt(); - homeBatteryLastUpdate = time(NULL); - } else if (topic == MQTTprefix + "/Set/RequiredEVCCID") { - strncpy(RequiredEVCCID, payload.c_str(), sizeof(RequiredEVCCID)); - if (preferences.begin("settings", false) ) { //false = write mode - preferences.putString("RequiredEVCCID", String(RequiredEVCCID)); - preferences.end(); - } - } - - // Make sure MQTT updates directly to prevent debounces - lastMqttUpdate = 10; -} - -//wrapper so MQTTClient::Publish works -static struct mg_connection *s_conn; // Client connection -class MQTTclient_t { -private: - struct mg_mqtt_opts default_opts; -public: - //constructor - MQTTclient_t () { - memset(&default_opts, 0, sizeof(default_opts)); - default_opts.qos = 0; - default_opts.retain = false; - } - - void publish(const String &topic, const String &payload, bool retained, int qos); - void subscribe(const String &topic, int qos); - bool connected; - void disconnect(void) { mg_mqtt_disconnect(s_conn, &default_opts); }; -}; - -void MQTTclient_t::publish(const String &topic, const String &payload, bool retained, int qos) { - if (s_conn) { - struct mg_mqtt_opts opts = default_opts; - opts.topic = mg_str(topic.c_str()); - opts.message = mg_str(payload.c_str()); - opts.qos = qos; - opts.retain = retained; - mg_mqtt_pub(s_conn, &opts); - } -} - -void MQTTclient_t::subscribe(const String &topic, int qos) { - if (s_conn) { - struct mg_mqtt_opts opts = default_opts; - opts.topic = mg_str(topic.c_str()); - opts.qos = qos; - mg_mqtt_sub(s_conn, &opts); - } -} - -MQTTclient_t MQTTclient; - -void SetupMQTTClient() { - // Set up subscriptions - MQTTclient.subscribe(MQTTprefix + "/Set/#",1); - MQTTclient.publish(MQTTprefix+"/connected", "online", true, 0); - - //publish MQTT discovery topics - //we need something to make all this JSON stuff readable, without doing all this assign and serialize stuff -#define jsn(x, y) String(R"(")") + x + R"(" : ")" + y + R"(")" - //jsn(device_class, current) expands to: - // R"("device_class" : "current")" - -#define jsna(x, y) String(R"(, )") + jsn(x, y) - //json add expansion, same as above but now with a comma prepended - - //first all device stuff: - const String device_payload = String(R"("device": {)") + jsn("model","SmartEVSE v3") + jsna("identifiers", MQTTprefix) + jsna("name", MQTTprefix) + jsna("manufacturer","Stegen") + jsna("configuration_url", "http://" + WiFi.localIP().toString().c_str()) + jsna("sw_version", String(VERSION)) + "}"; - //a device SmartEVSE-1001 consists of multiple entities, and an entity can be in the domains sensor, number, select etc. - String entity_suffix, entity_name, optional_payload; - - //some self-updating variables here: -#define entity_id String(MQTTprefix + "-" + entity_suffix) -#define entity_path String(MQTTprefix + "/" + entity_suffix) -#define entity_name(x) entity_name = x; entity_suffix = entity_name; entity_suffix.replace(" ", ""); - - //create template to announce an entity in it's own domain: -#define announce(x, entity_domain) entity_name(x); \ - MQTTclient.publish("homeassistant/" + String(entity_domain) + "/" + entity_id + "/config", \ - "{" \ - + jsn("name", entity_name) \ - + jsna("object_id", entity_id) \ - + jsna("unique_id", entity_id) \ - + jsna("state_topic", entity_path) \ - + jsna("availability_topic",String(MQTTprefix+"/connected")) \ - + ", " + device_payload + optional_payload \ - + "}", \ - true, 0); // Retain + QoS 0 - - //set the parameters for and announce sensors with device class 'current': - optional_payload = jsna("device_class","current") + jsna("unit_of_measurement","A") + jsna("value_template", R"({{ value | int / 10 }})"); - announce("Charge Current", "sensor"); - announce("Max Current", "sensor"); - if (MainsMeter) { - announce("Mains Current L1", "sensor"); - announce("Mains Current L2", "sensor"); - announce("Mains Current L3", "sensor"); - } - if (EVMeter) { - announce("EV Current L1", "sensor"); - announce("EV Current L2", "sensor"); - announce("EV Current L3", "sensor"); - } - if (homeBatteryLastUpdate) { - announce("Home Battery Current", "sensor"); - } - - if (Modem) { - //set the parameters for modem/SoC sensor entities: - optional_payload = jsna("unit_of_measurement","%") + jsna("value_template", R"({{ none if (value | int == -1) else (value | int) }})"); - announce("EV Initial SoC", "sensor"); - announce("EV Full SoC", "sensor"); - announce("EV Computed SoC", "sensor"); - announce("EV Remaining SoC", "sensor"); - - optional_payload = jsna("device_class","duration") + jsna("unit_of_measurement","m") + jsna("value_template", R"({{ none if (value | int == -1) else (value | int / 60) | round }})"); - announce("EV Time Until Full", "sensor"); - - optional_payload = jsna("device_class","energy") + jsna("unit_of_measurement","Wh") + jsna("value_template", R"({{ none if (value | int == -1) else (value | int) }})"); - announce("EV Energy Capacity", "sensor"); - announce("EV Energy Request", "sensor"); - - optional_payload = jsna("value_template", R"({{ none if (value == '') else value }})"); - announce("EVCCID", "sensor"); - optional_payload = jsna("state_topic", String(MQTTprefix + "/RequiredEVCCID")) + jsna("command_topic", String(MQTTprefix + "/Set/RequiredEVCCID")); - announce("Required EVCCID", "text"); - } - - if (EVMeter) { - //set the parameters for and announce other sensor entities: - optional_payload = jsna("device_class","power") + jsna("unit_of_measurement","W"); - announce("EV Charge Power", "sensor"); - optional_payload = jsna("device_class","energy") + jsna("unit_of_measurement","Wh"); - announce("EV Energy Charged", "sensor"); - optional_payload = jsna("device_class","energy") + jsna("unit_of_measurement","Wh") + jsna("state_class","total_increasing"); - announce("EV Total Energy Charged", "sensor"); - } - - //set the parameters for and announce sensor entities without device_class or unit_of_measurement: - optional_payload = ""; - announce("EV Plug State", "sensor"); - announce("Access", "sensor"); - announce("State", "sensor"); - announce("RFID", "sensor"); - announce("RFIDLastRead", "sensor"); - - //set the parameters for and announce diagnostic sensor entities: - optional_payload = jsna("entity_category","diagnostic"); - announce("Error", "sensor"); - announce("WiFi SSID", "sensor"); - announce("WiFi BSSID", "sensor"); - optional_payload = jsna("entity_category","diagnostic") + jsna("device_class","signal_strength") + jsna("unit_of_measurement","dBm"); - announce("WiFi RSSI", "sensor"); - optional_payload = jsna("entity_category","diagnostic") + jsna("device_class","temperature") + jsna("unit_of_measurement","°C"); - announce("ESP Temp", "sensor"); - optional_payload = jsna("entity_category","diagnostic") + jsna("device_class","duration") + jsna("unit_of_measurement","s") + jsna("entity_registry_enabled_default","False"); - announce("ESP Uptime", "sensor"); - -#if MODEM - if (Modem) { - optional_payload = jsna("unit_of_measurement","%") + jsna("value_template", R"({{ (value | int / 1024 * 100) | round(0) }})"); - announce("CP PWM", "sensor"); - - optional_payload = jsna("value_template", R"({{ none if (value | int == -1) else (value | int / 1024 * 100) | round }})"); - optional_payload += jsna("command_topic", String(MQTTprefix + "/Set/CPPWMOverride")) + jsna("min", "-1") + jsna("max", "100") + jsna("mode","slider"); - optional_payload += jsna("command_template", R"({{ (value | int * 1024 / 100) | round }})"); - announce("CP PWM Override", "number"); - } -#endif - //set the parameters for and announce select entities, overriding automatic state_topic: - optional_payload = jsna("state_topic", String(MQTTprefix + "/Mode")) + jsna("command_topic", String(MQTTprefix + "/Set/Mode")); - optional_payload += String(R"(, "options" : ["Off", "Normal", "Smart", "Solar"])"); - announce("Mode", "select"); - - //set the parameters for and announce number entities: - optional_payload = jsna("command_topic", String(MQTTprefix + "/Set/CurrentOverride")) + jsna("min", "0") + jsna("max", MaxCurrent ) + jsna("mode","slider"); - optional_payload += jsna("value_template", R"({{ none if (value | int == 0) else (value | int / 10) }})") + jsna("command_template", R"({{ value | int * 10 }})"); - announce("Charge Current Override", "number"); -} - -void mqttPublishData() { - lastMqttUpdate = 0; - - if (MainsMeter) { - MQTTclient.publish(MQTTprefix + "/MainsCurrentL1", String(Irms[0]), false, 0); - MQTTclient.publish(MQTTprefix + "/MainsCurrentL2", String(Irms[1]), false, 0); - MQTTclient.publish(MQTTprefix + "/MainsCurrentL3", String(Irms[2]), false, 0); - } - if (EVMeter) { - MQTTclient.publish(MQTTprefix + "/EVCurrentL1", String(Irms_EV[0]), false, 0); - MQTTclient.publish(MQTTprefix + "/EVCurrentL2", String(Irms_EV[1]), false, 0); - MQTTclient.publish(MQTTprefix + "/EVCurrentL3", String(Irms_EV[2]), false, 0); - } - MQTTclient.publish(MQTTprefix + "/ESPUptime", String((esp_timer_get_time() / 1000000)), false, 0); - MQTTclient.publish(MQTTprefix + "/ESPTemp", String(TempEVSE), false, 0); - MQTTclient.publish(MQTTprefix + "/Mode", Access_bit == 0 ? "Off" : Mode > 3 ? "N/A" : StrMode[Mode], true, 0); - MQTTclient.publish(MQTTprefix + "/MaxCurrent", String(MaxCurrent * 10), true, 0); - MQTTclient.publish(MQTTprefix + "/ChargeCurrent", String(Balanced[0]), true, 0); - MQTTclient.publish(MQTTprefix + "/ChargeCurrentOverride", String(OverrideCurrent), true, 0); - MQTTclient.publish(MQTTprefix + "/Access", String(StrAccessBit[Access_bit]), true, 0); - MQTTclient.publish(MQTTprefix + "/RFID", !RFIDReader ? "Not Installed" : RFIDstatus >= 8 ? "NOSTATUS" : StrRFIDStatusWeb[RFIDstatus], true, 0); - if (RFIDReader) { - char buf[13]; - sprintf(buf, "%02X%02X%02X%02X%02X%02X", RFID[1], RFID[2], RFID[3], RFID[4], RFID[5], RFID[6]); - MQTTclient.publish(MQTTprefix + "/RFIDLastRead", buf, true, 0); - } - MQTTclient.publish(MQTTprefix + "/State", getStateNameWeb(State), true, 0); - MQTTclient.publish(MQTTprefix + "/Error", getErrorNameWeb(ErrorFlags), true, 0); - MQTTclient.publish(MQTTprefix + "/EVPlugState", (pilot != PILOT_12V) ? "Connected" : "Disconnected", true, 0); - MQTTclient.publish(MQTTprefix + "/WiFiSSID", String(WiFi.SSID()), true, 0); - MQTTclient.publish(MQTTprefix + "/WiFiBSSID", String(WiFi.BSSIDstr()), true, 0); - MQTTclient.publish(MQTTprefix + "/WiFiRSSI", String(WiFi.RSSI()), false, 0); -#if MODEM - if (Modem) { - MQTTclient.publish(MQTTprefix + "/CPPWM", String(CurrentPWM), false, 0); - MQTTclient.publish(MQTTprefix + "/CPPWMOverride", String(CPDutyOverride ? String(CurrentPWM) : "-1"), true, 0); - MQTTclient.publish(MQTTprefix + "/EVInitialSoC", String(InitialSoC), true, 0); - MQTTclient.publish(MQTTprefix + "/EVFullSoC", String(FullSoC), true, 0); - MQTTclient.publish(MQTTprefix + "/EVComputedSoC", String(ComputedSoC), true, 0); - MQTTclient.publish(MQTTprefix + "/EVRemainingSoC", String(RemainingSoC), true, 0); - MQTTclient.publish(MQTTprefix + "/EVTimeUntilFull", String(TimeUntilFull), false, 0); - MQTTclient.publish(MQTTprefix + "/EVEnergyCapacity", String(EnergyCapacity), true, 0); - MQTTclient.publish(MQTTprefix + "/EVEnergyRequest", String(EnergyRequest), true, 0); - MQTTclient.publish(MQTTprefix + "/EVCCID", String(EVCCID), true, 0); - MQTTclient.publish(MQTTprefix + "/RequiredEVCCID", String(RequiredEVCCID), true, 0); - } -#endif - if (EVMeter) { - MQTTclient.publish(MQTTprefix + "/EVChargePower", String(PowerMeasured), false, 0); - MQTTclient.publish(MQTTprefix + "/EVEnergyCharged", String(EnergyCharged), true, 0); - MQTTclient.publish(MQTTprefix + "/EVTotalEnergyCharged", String(EnergyEV), false, 0); - } - if (homeBatteryLastUpdate) - MQTTclient.publish(MQTTprefix + "/HomeBatteryCurrent", String(homeBatteryCurrent), false, 0); -} -#endif - -// task 1000msTimer -void Timer1S(void * parameter) { - - uint8_t Broadcast = 1; - //uint8_t Timer5sec = 0; - uint8_t x; - - while(1) { // infinite loop - - if (BacklightTimer) BacklightTimer--; // Decrease backlight counter every second. - - // wait for Activation mode to start - if (ActivationMode && ActivationMode != 255) { - ActivationMode--; // Decrease ActivationMode every second. - } - - // activation Mode is active - if (ActivationTimer) ActivationTimer--; // Decrease ActivationTimer every second. -#if MODEM - if (State == STATE_MODEM_REQUEST){ - if (ToModemWaitStateTimer) ToModemWaitStateTimer--; - else{ - setState(STATE_MODEM_WAIT); // switch to state Modem 2 - GLCD(); - } - } - - if (State == STATE_MODEM_WAIT){ - if (ToModemDoneStateTimer) ToModemDoneStateTimer--; - else{ - setState(STATE_MODEM_DONE); - GLCD(); - } - } - - if (State == STATE_MODEM_DONE){ - if (LeaveModemDoneStateTimer) LeaveModemDoneStateTimer--; - else{ - // Here's what happens: - // - State STATE_MODEM_DONE set the CP pin off, to reset connection with car. Since some cars don't support AC charging via ISO15118, SoC is extracted via DC. - // - Negotiation fails between pyPLC and car. Some cars then won't accept charge via AC it seems after, so we just "re-plug" and start charging without the modem communication protocol - // - State STATE_B will enable CP pin again, if disabled. - // This stage we are now in is just before we enable CP_PIN and resume via STATE_B - - // Reset CP to idle & turn off, it will be turned on again later for another try - SetCPDuty(1024); - CP_OFF; - - // Check whether the EVCCID matches the one required - if (strcmp(RequiredEVCCID, "") == 0 || strcmp(RequiredEVCCID, EVCCID) == 0) { - // We satisfied the EVCCID requirements, skip modem stages next time - ModemStage = 1; - - setState(STATE_B); // switch to STATE_B - GLCD(); // Re-init LCD (200ms delay) - } else { - // We actually do not want to continue charging and re-start at modem request after 60s - ModemStage = 0; - LeaveModemDeniedStateTimer = 60; - - // Change to MODEM_DENIED state - setState(STATE_MODEM_DENIED); - GLCD(); // Re-init LCD (200ms delay) - } - } - } - - if (State == STATE_MODEM_DENIED){ - if (LeaveModemDeniedStateTimer) LeaveModemDeniedStateTimer--; - else{ - LeaveModemDeniedStateTimer = -1; // reset ModemStateDeniedTimer - setState(STATE_A); // switch to STATE_B - CP_ON; - GLCD(); // Re-init LCD (200ms delay) - } - } - -#endif - if (State == STATE_C1) { - if (C1Timer) C1Timer--; // if the EV does not stop charging in 6 seconds, we will open the contactor. - else { - _LOG_A("State C1 timeout!\n"); - setState(STATE_B1); // switch back to STATE_B1 - GLCD_init(); // Re-init LCD (200ms delay) - } - } - -#if MODEM - // Normally, the modem is enabled when Modem == Experiment. However, after a succesfull communication has been set up, EVSE will restart communication by replugging car and moving back to state B. - // This time, communication is not initiated. When a car is disconnected, we want to enable the modem states again, but using 12V signal is not reliable (we just "replugged" via CP pin, remember). - // This counter just enables the state after 3 seconds of success. - if (DisconnectTimeCounter >= 0){ - DisconnectTimeCounter++; - } - - if (DisconnectTimeCounter > 3){ - pilot = Pilot(); - if (pilot == PILOT_12V){ - DisconnectTimeCounter = -1; - DisconnectEvent(); - } else{ // Run again - DisconnectTimeCounter = 0; - } - } -#endif - - // once a second, measure temperature - // range -40 .. +125C - TempEVSE = TemperatureSensor(); - - - // Check if there is a RFID card in front of the reader - CheckRFID(); - - - // When Solar Charging, once the current drops to MINcurrent a timer is started. - // Charging is stopped when the timer reaches the time set in 'StopTime' (in minutes) - // Except when Stoptime =0, then charging will continue. - - if (SolarStopTimer) { - SolarStopTimer--; - if (SolarStopTimer == 0) { - - if (State == STATE_C) setState(STATE_C1); // tell EV to stop charging - ErrorFlags |= NO_SUN; // Set error: NO_SUN - } - } - - if (ChargeDelay) ChargeDelay--; // Decrease Charge Delay counter - if (PilotDisconnectTime) PilotDisconnectTime--; // Decrease PilotDisconnectTimer - - if (AccessTimer && State == STATE_A) { - if (--AccessTimer == 0) { - setAccess(false); // re-lock EVSE - } - } else AccessTimer = 0; // Not in state A, then disable timer - - if ((TempEVSE < (maxTemp - 10)) && (ErrorFlags & TEMP_HIGH)) { // Temperature below limit? - ErrorFlags &= ~TEMP_HIGH; // clear Error - } - - if ( (ErrorFlags & (LESS_6A|NO_SUN) ) && (LoadBl < 2) && (IsCurrentAvailable())) { - ErrorFlags &= ~LESS_6A; // Clear Errors if there is enough current available, and Load Balancing is disabled or we are Master - ErrorFlags &= ~NO_SUN; - _LOG_I("No sun/current Errors Cleared.\n"); - } - - - // Charge timer - for (x = 0; x < NR_EVSES; x++) { - if (BalancedState[x] == STATE_C) { - Node[x].IntTimer++; - Node[x].Timer++; - } else Node[x].IntTimer = 0; // Reset IntervalTime when not charging - } - - if (MainsMeter) { - if ( MainsMeterTimeout == 0 && !(ErrorFlags & CT_NOCOMM) && Mode != MODE_NORMAL) { // timeout if current measurement takes > 10 secs - // In Normal mode do not timeout; there might be MainsMeter/EVMeter configured that can be retrieved through the API, - // but in Normal mode we just want to charge ChargeCurrent, irrespective of communication problems. - ErrorFlags |= CT_NOCOMM; - setStatePowerUnavailable(); - _LOG_W("Error, MainsMeter communication error!\n"); - } else { - if (MainsMeterTimeout) MainsMeterTimeout--; - } - } else - MainsMeterTimeout = COMM_TIMEOUT; - - if (EVMeter) { - if ( EVMeterTimeout == 0 && !(ErrorFlags & EV_NOCOMM) && Mode != MODE_NORMAL) { - ErrorFlags |= EV_NOCOMM; - setStatePowerUnavailable(); - _LOG_W("Error, EV Meter communication error!\n"); - } else { - if (EVMeterTimeout) EVMeterTimeout--; - } - } else - EVMeterTimeout = COMM_EVTIMEOUT; - - // Clear communication error, if present - if ((ErrorFlags & CT_NOCOMM) && MainsMeterTimeout) ErrorFlags &= ~CT_NOCOMM; - - if ((ErrorFlags & EV_NOCOMM) && EVMeterTimeout) ErrorFlags &= ~EV_NOCOMM; - - - if (TempEVSE > maxTemp && !(ErrorFlags & TEMP_HIGH)) // Temperature too High? - { - ErrorFlags |= TEMP_HIGH; - setStatePowerUnavailable(); - _LOG_W("Error, temperature %i C !\n", TempEVSE); - } - - if (ErrorFlags & (NO_SUN | LESS_6A)) { - if (ChargeDelay == 0) { - if (Mode == MODE_SOLAR) { _LOG_I("Waiting for Solar power...\n"); } - else { _LOG_I("Not enough current available!\n"); } - } - setStatePowerUnavailable(); - ChargeDelay = CHARGEDELAY; // Set Chargedelay - } - - // set flag to update the LCD once every second - LCDupdate = 1; - - // Every two seconds request measurement data from sensorbox/kwh meters. - // and send broadcast to Node controllers. - if (LoadBl < 2 && !Broadcast--) { // Load Balancing mode: Master or Disabled - if (!ModbusRequest) ModbusRequest = 1; // Start with state 1, also in Normal mode we want MainsMeter and EVmeter updated - //timeout = COMM_TIMEOUT; not sure if necessary, statement was missing in original code // reset timeout counter (not checked for Master) - Broadcast = 1; // repeat every two seconds - } - - // for Slave modbusrequest loop is never called, so we have to show debug info here... - if (LoadBl > 1) - printStatus(); //for debug purposes - - //_LOG_A("Timer1S task free ram: %u\n", uxTaskGetStackHighWaterMark( NULL )); - - -#if MQTT - if (lastMqttUpdate++ >= 10) { - // Publish latest data, every 10 seconds - // We will try to publish data faster if something has changed - mqttPublishData(); - } -#endif - - // Pause the task for 1 Sec - vTaskDelay(1000 / portTICK_PERIOD_MS); - - } // while(1) -} - -/** - * Read energy measurement from modbus - * - * @param pointer to buf - * @param uint8_t Meter - * @return signed int Energy (Wh) - */ -signed int receiveEnergyMeasurement(uint8_t *buf, uint8_t Meter) { - switch (Meter) { - case EM_ABB: - // Note: - // - ABB uses 32-bit values, except for this measurement it uses 64bit unsigned int format - // We skip the first 4 bytes (effectivaly creating uint 32). Will work as long as the value does not exeed roughly 20 million - return receiveMeasurement(buf, 1, EMConfig[Meter].Endianness, MB_DATATYPE_INT32, EMConfig[Meter].EDivisor-3); - case EM_SOLAREDGE: - // Note: - // - SolarEdge uses 16-bit values, except for this measurement it uses 32bit int format - // - EM_SOLAREDGE should not be used for EV Energy Measurements - return receiveMeasurement(buf, 0, EMConfig[Meter].Endianness, MB_DATATYPE_INT32, EMConfig[Meter].EDivisor - 3); - default: - return receiveMeasurement(buf, 0, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, EMConfig[Meter].EDivisor - 3); - } -} - -/** - * Read Power measurement from modbus - * - * @param pointer to buf - * @param uint8_t Meter - * @return signed int Power (W) - */ -signed int receivePowerMeasurement(uint8_t *buf, uint8_t Meter) { - switch (Meter) { - case EM_SOLAREDGE: - { - // Note: - // - SolarEdge uses 16-bit values, with a extra 16-bit scaling factor - // - EM_SOLAREDGE should not be used for EV power measurements, only PV power measurements are supported - int scalingFactor = -(int)receiveMeasurement( - buf, - 1, - EMConfig[Meter].Endianness, - EMConfig[Meter].DataType, - 0 - ); - return receiveMeasurement(buf, 0, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, scalingFactor); - } - case EM_EASTRON3P_INV: - return -receiveMeasurement(buf, 0, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, EMConfig[Meter].PDivisor); - default: - return receiveMeasurement(buf, 0, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, EMConfig[Meter].PDivisor); - } -} - - -// Modbus functions - -// stores energy responses; returns 0 if it stored a value, returns 1 if the response didnt match -int StoreEnergyResponse(uint8_t Meter, int32_t& Import, int32_t& Export ) { - if (MB.Register == EMConfig[Meter].ERegister) { - //import active energy - if (Meter == EM_EASTRON3P_INV) - Export = receiveEnergyMeasurement(MB.Data, Meter); - else - Import = receiveEnergyMeasurement(MB.Data, Meter); - return 0; - } - else if (MB.Register == EMConfig[Meter].ERegister_Exp) { - //export active energy - if (Meter == EM_EASTRON3P_INV) - Import = receiveEnergyMeasurement(MB.Data, Meter); - else - Export = receiveEnergyMeasurement(MB.Data, Meter); - return 0; - } - return 1; -} - -// Monitor EV Meter responses, and update Enery and Power and Current measurements -// Both the Master and Nodes will receive their own EV meter measurements here. -// Does not send any data back. -// -ModbusMessage MBEVMeterResponse(ModbusMessage request) { - - uint8_t x; - int32_t EV[3]={0, 0, 0}; - - ModbusDecode( (uint8_t*)request.data(), request.size()); - - if (MB.Type == MODBUS_RESPONSE) { - // _LOG_A("EVMeter Response\n"); - // Packet from EV electric meter - if (!StoreEnergyResponse(EVMeter, EV_import_active_energy, EV_export_active_energy)) { - // Energy measurement - EnergyEV = EV_import_active_energy - EV_export_active_energy; - if (ResetKwh == 2) EnergyMeterStart = EnergyEV; // At powerup, set EnergyEV to kwh meter value - EnergyCharged = EnergyEV - EnergyMeterStart; // Calculate Energy - if (Modem) - RecomputeSoC(); - } else if (MB.Register == EMConfig[EVMeter].PRegister) { - // Power measurement - PowerMeasured = receivePowerMeasurement(MB.Data, EVMeter); - } else if (MB.Register == EMConfig[EVMeter].IRegister) { - // Current measurement - x = receiveCurrentMeasurement(MB.Data, EVMeter, EV ); - - if (x) EVMeterTimeout = COMM_EVTIMEOUT; // only reset EVtimeout when data is ok - for (x = 0; x < 3; x++) { - // CurrentMeter and PV values are MILLI AMPERE - Irms_EV[x] = (signed int)(EV[x] / 100); // Convert to AMPERE * 10 - } - CalcImeasured_EV(); - } - } - // As this is a response to an earlier request, do not send response. - - return NIL_RESPONSE; -} - -// -// Monitor Mains Meter responses, and update Irms values -// Does not send any data back. -// Only runs on master, slave gets the MainsMeter currents via MBbroadcast -ModbusMessage MBMainsMeterResponse(ModbusMessage request) { - uint8_t x; - ModbusMessage response; // response message to be sent back - - ModbusDecode( (uint8_t*)request.data(), request.size()); - - // process only Responses, as otherwise MB.Data is unitialized, and it will throw an exception - if (MB.Type == MODBUS_RESPONSE) { - if (MB.Register == EMConfig[MainsMeter].IRegister) { - - //_LOG_A("Mains Meter Response\n"); - x = receiveCurrentMeasurement(MB.Data, MainsMeter, CM); - if (x) MainsMeterTimeout = COMM_TIMEOUT; // only reset timeout when data is ok - - // Convert Irms from mA to (A * 10) - for (x = 0; x < 3; x++) { - // Calculate difference of Mains and PV electric meter - Irms[x] = (signed int)(CM[x] / 100); // Convert to AMPERE * 10 - } - CalcIsum(); - } - else - StoreEnergyResponse(MainsMeter, Mains_import_active_energy, Mains_export_active_energy); - } - - // As this is a response to an earlier request, do not send response. - return NIL_RESPONSE; -} - - -// Request handler for modbus messages addressed to -this- Node/Slave EVSE. -// Sends response back to Master -// -ModbusMessage MBNodeRequest(ModbusMessage request) { - ModbusMessage response; // response message to be sent back - uint8_t ItemID; - uint8_t i, OK = 0; - uint16_t value, values[MODBUS_MAX_REGISTER_READ]; - - // Check if the call is for our current ServerID, or maybe for an old ServerID? - if (LoadBl != request.getServerID()) return NIL_RESPONSE; - - - ModbusDecode( (uint8_t*)request.data(), request.size()); - ItemID = mapModbusRegister2ItemID(); - - switch (MB.Function) { - case 0x03: // (Read holding register) - case 0x04: // (Read input register) - // ReadItemValueResponse(); - if (ItemID) { - response.add(MB.Address, MB.Function, (uint8_t)(MB.RegisterCount * 2)); - - _LOG_D("Node answering NodeStatus request"); - for (i = 0; i < MB.RegisterCount; i++) { - values[i] = getItemValue(ItemID + i); - response.add(values[i]); - _LOG_V_NO_FUNC(" value[%u]=%u", i, values[i]); - } - _LOG_D_NO_FUNC("\n"); - //ModbusReadInputResponse(MB.Address, MB.Function, values, MB.RegisterCount); - } else { - response.setError(MB.Address, MB.Function, ILLEGAL_DATA_ADDRESS); - } - break; - case 0x06: // (Write single register) - //WriteItemValueResponse(); - if (ItemID) { - OK = setItemValue(ItemID, MB.Value); - } - - if (OK && ItemID < STATUS_STATE) write_settings(); - - if (MB.Address != BROADCAST_ADR || LoadBl == 0) { - if (!ItemID) { - response.setError(MB.Address, MB.Function, ILLEGAL_DATA_ADDRESS); - } else if (!OK) { - response.setError(MB.Address, MB.Function, ILLEGAL_DATA_VALUE); - } else { - return ECHO_RESPONSE; - } - } - break; - case 0x10: // (Write multiple register)) - // WriteMultipleItemValueResponse(); - if (ItemID) { - for (i = 0; i < MB.RegisterCount; i++) { - value = (MB.Data[i * 2] <<8) | MB.Data[(i * 2) + 1]; - OK += setItemValue(ItemID + i, value); - } - } - - if (OK && ItemID < STATUS_STATE) write_settings(); - - if (MB.Address != BROADCAST_ADR || LoadBl == 0) { - if (!ItemID) { - response.setError(MB.Address, MB.Function, ILLEGAL_DATA_ADDRESS); - } else if (!OK) { - response.setError(MB.Address, MB.Function, ILLEGAL_DATA_VALUE); - } else { - response.add(MB.Address, MB.Function, (uint16_t)MB.Register, (uint16_t)OK); - } - } - break; - default: - break; - } - - return response; -} - -// The Node/Server receives a broadcast message from the Master -// Does not send any data back. -ModbusMessage MBbroadcast(ModbusMessage request) { - uint8_t ItemID, i, OK = 0; - uint16_t value; - int16_t combined; - - ModbusDecode( (uint8_t*)request.data(), request.size()); - ItemID = mapModbusRegister2ItemID(); - - if (MB.Type == MODBUS_REQUEST) { - - // Broadcast or addressed to this device - switch (MB.Function) { - // FC 03 and 04 are not possible with broadcast messages. - case 0x06: // (Write single register) - //WriteItemValueResponse(); - if (ItemID) { - OK = setItemValue(ItemID, MB.Value); - } - - if (OK && ItemID < STATUS_STATE) write_settings(); - _LOG_V("Broadcast received FC06 Item:%u val:%u\n",ItemID, MB.Value); - break; - case 0x10: // (Write multiple register)) - // 0x0020: Balance currents - if (MB.Register == 0x0020 && LoadBl > 1) { // Message for Node(s) - Balanced[0] = (MB.Data[(LoadBl - 1) * 2] <<8) | MB.Data[(LoadBl - 1) * 2 + 1]; - if (Balanced[0] == 0 && State == STATE_C) setState(STATE_C1); // tell EV to stop charging if charge current is zero - else if ((State == STATE_B) || (State == STATE_C)) SetCurrent(Balanced[0]); // Set charge current, and PWM output - MainsMeterTimeout = COMM_TIMEOUT; // reset 10 second timeout - _LOG_V("Broadcast received, Node %.1f A, MainsMeter Irms ", (float) Balanced[0]/10); - - //now decode registers 0x0028-0x002A - if (MB.DataLength >= 16+6) { - Isum = 0; - for (i=0; i<3; i++ ) { - combined = (MB.Data[(i * 2) + 16] <<8) + MB.Data[(i * 2) + 17]; - Isum = Isum + combined; - Irms[i] = combined; - _LOG_V_NO_FUNC("L%i=%.1fA,", i+1, (float)Irms[i]/10); - } - _LOG_V_NO_FUNC("\n"); - } - } else { - - //WriteMultipleItemValueResponse(); - if (ItemID) { - for (i = 0; i < MB.RegisterCount; i++) { - value = (MB.Data[i * 2] <<8) | MB.Data[(i * 2) + 1]; - OK += setItemValue(ItemID + i, value); - } - } - - if (OK && ItemID < STATUS_STATE) write_settings(); - _LOG_V("Other Broadcast received\n"); - } - break; - default: - break; - } - } - - // As it is a broadcast message, do not send response. - return NIL_RESPONSE; -} - -// Data handler for Master -// Responses from Slaves/Nodes are handled here -void MBhandleData(ModbusMessage msg, uint32_t token) -{ - uint8_t Address = msg.getServerID(); // returns Server ID or 0 if MM_data is shorter than 3 - if (Address == MainsMeterAddress) { - //_LOG_A("MainsMeter data\n"); - MBMainsMeterResponse(msg); - } else if (Address == EVMeterAddress) { - //_LOG_A("EV Meter data\n"); - MBEVMeterResponse(msg); - // Only responses to FC 03/04 are handled here. FC 06/10 response is only a acknowledge. - } else { - //_LOG_V("Received Packet with ServerID=%i, FunctionID=%i, token=%08x.\n", msg.getServerID(), msg.getFunctionCode(), token); - ModbusDecode( (uint8_t*)msg.data(), msg.size()); - // ModbusDecode does NOT always decodes the register correctly. - // This bug manifested itself as the : - - // (Timer100ms)(C1) ModbusRequest 4: Request Configuration Node 1 - // (D) (ModbusSend8)(C1) Sent packet address: 02, function: 04, reg: 0108, data: 0002. - // (D) (ModbusDecode)(C0) Received packet (7 bytes) 02 04 04 00 00 00 0c - // (V) (ModbusDecode)(C0) valid Modbus packet: Address 02 Function 04 Register 0000 Response - // (D) (receiveNodeStatus)(C0) ReceivedNode[1]Status State:0 Error:12, BalancedMax:2530, Mode:186, ConfigChanged:253. - - // The response is the response for a request of node config 0x0108, but is interpreted as a request for node status 0x0000 - // - // Using a global variable struct ModBus MB is not a good idea, but localizing it does not - // solve the problem. - - // Luckily we have coded the register in the token we sent.... - // token: first byte address, second byte function, third and fourth reg - uint8_t token_function = (token & 0x00FF0000) >> 16; - uint8_t token_address = token >> 24; - if (token_address != MB.Address) { - _LOG_A("ERROR: Address=%u, MB.Address=%u, token_address=%u.\n", Address, MB.Address, token_address); - } - if (token_function != MB.Function) { - _LOG_A("ERROR: MB.Function=%u, token_function=%u.\n", MB.Function, token_function); - } - uint16_t reg = (token & 0x0000FFFF); - MB.Register = reg; - - if (MB.Address > 1 && MB.Address <= NR_EVSES && (MB.Function == 03 || MB.Function == 04)) { - - // Packet from Node EVSE - if (MB.Register == 0x0000) { - // Node status - // _LOG_A("Node Status received\n"); - receiveNodeStatus(MB.Data, MB.Address - 1u); - } else if (MB.Register == 0x0108) { - // Node EV meter settings - // _LOG_A("Node EV Meter settings received\n"); - receiveNodeConfig(MB.Data, MB.Address - 1u); - } - } - } - -} - - -void MBhandleError(Error error, uint32_t token) -{ - // ModbusError wraps the error code and provides a readable error message for it - ModbusError me(error); - uint8_t address, function; - uint16_t reg; - address = token >> 24; - function = (token >> 16); - reg = token & 0xFFFF; - - if (LoadBl == 1 && address>=2 && address <=8 && function == 4 && reg == 0) { //master sends out messages to nodes 2-8, if no EVSE is connected with that address - //a timeout will be generated. This is legit! - _LOG_V("Error response: %02X - %s, address: %02x, function: %02x, reg: %04x.\n", error, (const char *)me, address, function, reg); - } - else { - _LOG_A("Error response: %02X - %s, address: %02x, function: %02x, reg: %04x.\n", error, (const char *)me, address, function, reg); - } -} - - - -void ConfigureModbusMode(uint8_t newmode) { - - _LOG_A("changing LoadBl from %u to %u\n",LoadBl, newmode); - - if ((LoadBl < 2 && newmode > 1) || (LoadBl > 1 && newmode < 2) || (newmode == 255) ) { - - if (newmode != 255 ) LoadBl = newmode; - - // Setup Modbus workers for Node - if (LoadBl > 1 ) { - - _LOG_A("Setup MBserver/Node workers, end Master/Client\n"); - // Stop Master background task (if active) - if (newmode != 255 ) MBclient.end(); - _LOG_A("ConfigureModbusMode1 task free ram: %u\n", uxTaskGetStackHighWaterMark( NULL )); - - // Register worker. at serverID 'LoadBl', all function codes - MBserver.registerWorker(LoadBl, ANY_FUNCTION_CODE, &MBNodeRequest); - // Also add handler for all broadcast messages from Master. - MBserver.registerWorker(BROADCAST_ADR, ANY_FUNCTION_CODE, &MBbroadcast); - - if (EVMeter && EVMeter != EM_API) MBserver.registerWorker(EVMeterAddress, ANY_FUNCTION_CODE, &MBEVMeterResponse); - - // Start ModbusRTU Node background task - MBserver.begin(Serial1); - - } else if (LoadBl < 2 ) { - // Setup Modbus workers as Master - // Stop Node background task (if active) - _LOG_A("Setup Modbus as Master/Client, stop Server/Node handler\n"); - - if (newmode != 255) MBserver.end(); - _LOG_A("ConfigureModbusMode2 task free ram: %u\n", uxTaskGetStackHighWaterMark( NULL )); - - MBclient.setTimeout(85); // Set modbus timeout to 85ms. 15ms lower then modbusRequestloop time of 100ms. - MBclient.onDataHandler(&MBhandleData); - MBclient.onErrorHandler(&MBhandleError); - // Start ModbusRTU Master background task - MBclient.begin(Serial1, 1); //pinning it to core1 reduces modbus problems - } - } else if (newmode > 1) { - // Register worker. at serverID 'LoadBl', all function codes - _LOG_A("Registering new LoadBl worker at id %u\n", newmode); - LoadBl = newmode; - MBserver.registerWorker(newmode, ANY_FUNCTION_CODE, &MBNodeRequest); - } - -} - - -// Generate random password for AP -void SetRandomAPpassword(void) { - uint8_t i, c; - // Set random password - for (i=0; i<8 ;i++) { - c = random(16) + '0'; - if (c > '9') c += 'a'-'9'-1; - APpassword[i] = c; - } -} - -/** - * Validate setting ranges and dependencies - */ -void validate_settings(void) { - uint8_t i; - uint16_t value; - - // If value is out of range, reset it to default value - for (i = MENU_ENTER + 1;i < MENU_EXIT; i++){ - value = getItemValue(i); - // _LOG_A("value %s set to %i\n",MenuStr[i].LCD, value ); - if (value > MenuStr[i].Max || value < MenuStr[i].Min) { - value = MenuStr[i].Default; - // _LOG_A("set default value for %s to %i\n",MenuStr[i].LCD, value ); - setItemValue(i, value); - } - } - - // Sensorbox v2 has always address 0x0A - if (MainsMeter == EM_SENSORBOX) MainsMeterAddress = 0x0A; - // set Lock variables for Solenoid or Motor - if (Lock == 1) { lock1 = LOW; lock2 = HIGH; } // Solenoid - else if (Lock == 2) { lock1 = HIGH; lock2 = LOW; } // Motor - // Erase all RFID cards from ram + eeprom if set to EraseAll - if (RFIDReader == 5) { - DeleteAllRFID(); - setItemValue(MENU_RFIDREADER, 0); // RFID Reader Disabled - } - - // We disabled CAL in the menu. - // Make sure the stored CAL value is reset to the default value - ICal = ICAL; - - // Update master node config - if (LoadBl < 2) { - Node[0].EVMeter = EVMeter; - Node[0].EVAddress = EVMeterAddress; - } - - // Check if AP password is unitialized. - // Create random AP password. - if (!Initialized) { - SetRandomAPpassword(); - Initialized = 1; - } - - // Default to modbus input registers - if (EMConfig[EM_CUSTOM].Function != 3) EMConfig[EM_CUSTOM].Function = 4; - - // Backward compatibility < 2.20 - if (EMConfig[EM_CUSTOM].IRegister == 8 || EMConfig[EM_CUSTOM].URegister == 8 || EMConfig[EM_CUSTOM].PRegister == 8 || EMConfig[EM_CUSTOM].ERegister == 8) { - EMConfig[EM_CUSTOM].DataType = MB_DATATYPE_FLOAT32; - EMConfig[EM_CUSTOM].IRegister = 0; - EMConfig[EM_CUSTOM].URegister = 0; - EMConfig[EM_CUSTOM].PRegister = 0; - EMConfig[EM_CUSTOM].ERegister = 0; - } - - // If the address of the MainsMeter or EVmeter on a Node has changed, we must re-register the Modbus workers. - if (LoadBl > 1) { - if (EVMeter && EVMeter != EM_API) MBserver.registerWorker(EVMeterAddress, ANY_FUNCTION_CODE, &MBEVMeterResponse); - } - MainsMeterTimeout = COMM_TIMEOUT; - EVMeterTimeout = COMM_TIMEOUT; // Short Delay, to clear the error message for ~10 seconds. - -} - -void read_settings() { - - // Open preferences. true = read only, false = read/write - // If "settings" does not exist, it will be created, and initialized with the default values - if (preferences.begin("settings", false) ) { - Initialized = preferences.getUChar("Initialized", INITIALIZED); - Config = preferences.getUChar("Config", CONFIG); - Lock = preferences.getUChar("Lock", LOCK); - Mode = preferences.getUChar("Mode", MODE); - Access_bit = preferences.getUChar("Access", ACCESS_BIT); - CardOffset = preferences.getUChar("CardOffset", CARD_OFFSET); - LoadBl = preferences.getUChar("LoadBl", LOADBL); - MaxMains = preferences.getUShort("MaxMains", MAX_MAINS); - MaxSumMains = preferences.getUShort("MaxSumMains", MAX_SUMMAINS); - MaxCurrent = preferences.getUShort("MaxCurrent", MAX_CURRENT); - MinCurrent = preferences.getUShort("MinCurrent", MIN_CURRENT); - MaxCircuit = preferences.getUShort("MaxCircuit", MAX_CIRCUIT); - ICal = preferences.getUShort("ICal", ICAL); - Switch = preferences.getUChar("Switch", SWITCH); - RCmon = preferences.getUChar("RCmon", RC_MON); - StartCurrent = preferences.getUShort("StartCurrent", START_CURRENT); - StopTime = preferences.getUShort("StopTime", STOP_TIME); - ImportCurrent = preferences.getUShort("ImportCurrent",IMPORT_CURRENT); - Grid = preferences.getUChar("Grid",GRID); - RFIDReader = preferences.getUChar("RFIDReader",RFID_READER); - - MainsMeter = preferences.getUChar("MainsMeter", MAINS_METER); - MainsMeterAddress = preferences.getUChar("MainsMAddress",MAINS_METER_ADDRESS); - EVMeter = preferences.getUChar("EVMeter",EV_METER); - EVMeterAddress = preferences.getUChar("EVMeterAddress",EV_METER_ADDRESS); - EMConfig[EM_CUSTOM].Endianness = preferences.getUChar("EMEndianness",EMCUSTOM_ENDIANESS); - EMConfig[EM_CUSTOM].IRegister = preferences.getUShort("EMIRegister",EMCUSTOM_IREGISTER); - EMConfig[EM_CUSTOM].IDivisor = preferences.getUChar("EMIDivisor",EMCUSTOM_IDIVISOR); - EMConfig[EM_CUSTOM].URegister = preferences.getUShort("EMURegister",EMCUSTOM_UREGISTER); - EMConfig[EM_CUSTOM].UDivisor = preferences.getUChar("EMUDivisor",EMCUSTOM_UDIVISOR); - EMConfig[EM_CUSTOM].PRegister = preferences.getUShort("EMPRegister",EMCUSTOM_PREGISTER); - EMConfig[EM_CUSTOM].PDivisor = preferences.getUChar("EMPDivisor",EMCUSTOM_PDIVISOR); - EMConfig[EM_CUSTOM].ERegister = preferences.getUShort("EMERegister",EMCUSTOM_EREGISTER); - EMConfig[EM_CUSTOM].EDivisor = preferences.getUChar("EMEDivisor",EMCUSTOM_EDIVISOR); - EMConfig[EM_CUSTOM].DataType = (mb_datatype)preferences.getUChar("EMDataType",EMCUSTOM_DATATYPE); - EMConfig[EM_CUSTOM].Function = preferences.getUChar("EMFunction",EMCUSTOM_FUNCTION); - WIFImode = preferences.getUChar("WIFImode",WIFI_MODE); - APpassword = preferences.getString("APpassword",AP_PASSWORD); - DelayedStartTime.epoch2 = preferences.getULong("DelayedStartTim", DELAYEDSTARTTIME); //epoch2 is 4 bytes long on arduino; NVS key has reached max size - DelayedStopTime.epoch2 = preferences.getULong("DelayedStopTime", DELAYEDSTOPTIME); //epoch2 is 4 bytes long on arduino - TZinfo = preferences.getString("TimezoneInfo",""); - if (TZinfo != "") { - setenv("TZ",TZinfo.c_str(),1); - tzset(); - } - - - EnableC2 = (EnableC2_t) preferences.getUShort("EnableC2", ENABLE_C2); -#if MODEM - Modem = EXPERIMENT; -#else - Modem = NOTPRESENT; -#endif - strncpy(RequiredEVCCID, preferences.getString("RequiredEVCCID", "").c_str(), sizeof(RequiredEVCCID)); - maxTemp = preferences.getUShort("maxTemp", MAX_TEMPERATURE); - -#if MQTT - MQTTpassword = preferences.getString("MQTTpassword"); - MQTTuser = preferences.getString("MQTTuser"); - MQTTprefix = preferences.getString("MQTTprefix", APhostname); - MQTTHost = preferences.getString("MQTTHost", ""); - MQTTPort = preferences.getUShort("MQTTPort", 1883); -#endif - - preferences.end(); - - // Store settings when not initialized - if (!Initialized) write_settings(); - - } else { - _LOG_A("Can not open preferences!\n"); - } -} - -void write_settings(void) { - - validate_settings(); - - if (preferences.begin("settings", false) ) { - - preferences.putUChar("Config", Config); - preferences.putUChar("Lock", Lock); - preferences.putUChar("Mode", Mode); - preferences.putUChar("Access", Access_bit); - preferences.putUChar("CardOffset", CardOffset); - preferences.putUChar("LoadBl", LoadBl); - preferences.putUShort("MaxMains", MaxMains); - preferences.putUShort("MaxSumMains", MaxSumMains); - preferences.putUShort("MaxCurrent", MaxCurrent); - preferences.putUShort("MinCurrent", MinCurrent); - preferences.putUShort("MaxCircuit", MaxCircuit); - preferences.putUShort("ICal", ICal); - preferences.putUChar("Switch", Switch); - preferences.putUChar("RCmon", RCmon); - preferences.putUShort("StartCurrent", StartCurrent); - preferences.putUShort("StopTime", StopTime); - preferences.putUShort("ImportCurrent", ImportCurrent); - preferences.putUChar("Grid", Grid); - preferences.putUChar("RFIDReader", RFIDReader); - - preferences.putUChar("MainsMeter", MainsMeter); - preferences.putUChar("MainsMAddress", MainsMeterAddress); - preferences.putUChar("EVMeter", EVMeter); - preferences.putUChar("EVMeterAddress", EVMeterAddress); - preferences.putUChar("EMEndianness", EMConfig[EM_CUSTOM].Endianness); - preferences.putUShort("EMIRegister", EMConfig[EM_CUSTOM].IRegister); - preferences.putUChar("EMIDivisor", EMConfig[EM_CUSTOM].IDivisor); - preferences.putUShort("EMURegister", EMConfig[EM_CUSTOM].URegister); - preferences.putUChar("EMUDivisor", EMConfig[EM_CUSTOM].UDivisor); - preferences.putUShort("EMPRegister", EMConfig[EM_CUSTOM].PRegister); - preferences.putUChar("EMPDivisor", EMConfig[EM_CUSTOM].PDivisor); - preferences.putUShort("EMERegister", EMConfig[EM_CUSTOM].ERegister); - preferences.putUChar("EMEDivisor", EMConfig[EM_CUSTOM].EDivisor); - preferences.putUChar("EMDataType", EMConfig[EM_CUSTOM].DataType); - preferences.putUChar("EMFunction", EMConfig[EM_CUSTOM].Function); - preferences.putUChar("WIFImode", WIFImode); - preferences.putString("APpassword", APpassword); - preferences.putUChar("Initialized", Initialized); - preferences.putULong("DelayedStartTim", DelayedStartTime.epoch2); //epoch2 only needs 4 bytes; NVS key has reached max size - preferences.putULong("DelayedStopTime", DelayedStopTime.epoch2); //epoch2 only needs 4 bytes - - preferences.putUShort("EnableC2", EnableC2); - preferences.putString("RequiredEVCCID", String(RequiredEVCCID)); - preferences.putUShort("maxTemp", maxTemp); - -#if MQTT - preferences.putString("MQTTpassword", MQTTpassword); - preferences.putString("MQTTuser", MQTTuser); - preferences.putString("MQTTprefix", MQTTprefix); - preferences.putString("MQTTHost", MQTTHost); - preferences.putUShort("MQTTPort", MQTTPort); -#endif - - preferences.end(); - - _LOG_I("settings saved\n"); - - } else { - _LOG_A("Can not open preferences!\n"); - } - - - if (LoadBl == 1) { // Master mode - uint16_t i, values[MODBUS_SYS_CONFIG_COUNT]; - for (i = 0; i < MODBUS_SYS_CONFIG_COUNT; i++) { - values[i] = getItemValue(MENU_MODE + i); - } - // Broadcast settings to other controllers - ModbusWriteMultipleRequest(BROADCAST_ADR, MODBUS_SYS_CONFIG_START, values, MODBUS_SYS_CONFIG_COUNT); - } - - ConfigChanged = 1; -} -/* -//github.com L1 - const char* root_ca_github = R"ROOT_CA( ------BEGIN CERTIFICATE----- -MIID0zCCArugAwIBAgIQVmcdBOpPmUxvEIFHWdJ1lDANBgkqhkiG9w0BAQwFADB7 -MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD -VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE -AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4 -MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5 -MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO -ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEGqxUWqn5aCPnetUkb1PGWthL -q8bVttHmc3Gu3ZzWDGH926CJA7gFFOxXzu5dP+Ihs8731Ip54KODfi2X0GHE8Znc -JZFjq38wo7Rw4sehM5zzvy5cU7Ffs30yf4o043l5o4HyMIHvMB8GA1UdIwQYMBaA -FKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1 -xmNjmjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zARBgNVHSAECjAI -MAYGBFUdIAAwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5j -b20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEEKDAmMCQG -CCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEM -BQADggEBABns652JLCALBIAdGN5CmXKZFjK9Dpx1WywV4ilAbe7/ctvbq5AfjJXy -ij0IckKJUAfiORVsAYfZFhr1wHUrxeZWEQff2Ji8fJ8ZOd+LygBkc7xGEJuTI42+ -FsMuCIKchjN0djsoTI0DQoWz4rIjQtUfenVqGtF8qmchxDM6OW1TyaLtYiKou+JV -bJlsQ2uRl9EMC5MCHdK8aXdJ5htN978UeAOwproLtOGFfy/cQjutdAFI3tZs4RmY -CV4Ks2dH/hzg1cEo70qLRDEmBDeNiXQ2Lu+lIg+DdEmSx/cQwgwp+7e9un/jX9Wf -8qn0dNW44bOwgeThpWOjzOoEeJBuv/c= ------END CERTIFICATE----- -)ROOT_CA"; -*/ -HTTPClient _http; -WiFiClientSecure _client; - -/* -// get version nr. of latest release of off github -// input: -// owner_repo format: dingo35/SmartEVSE-3.5 -// asset name format: one of firmware.bin, firmware.debug.bin, firmware.signed.bin, firmware.debug.signed.bin -// output: -// version -- null terminated string with latest version of this repo -// downloadUrl -- global pointer to null terminated string with the url where this version can be downloaded -bool getLatestVersion(String owner_repo, String asset_name, char *version) { - String useURL = "https://api.github.com/repos/" + owner_repo + "/releases/latest"; - _http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); - - const char* url = useURL.c_str(); - _LOG_A("Connecting to: %s.\n", url ); - if( String(url).startsWith("https") ) { - _client.setCACert(root_ca_github); // OR - //_client.setInsecure(); - _http.begin( _client, url ); - } else { - _http.begin( url ); - } - _http.addHeader("User-Agent", "SmartEVSE-v3"); - _http.addHeader("Accept", "application/vnd.github+json"); - _http.addHeader("X-GitHub-Api-Version", "2022-11-28" ); - const char* get_headers[] = { "Content-Length", "Content-type", "Accept-Ranges" }; - _http.collectHeaders( get_headers, sizeof(get_headers)/sizeof(const char*) ); - int httpCode = _http.GET(); //Make the request - - // only handle 200/301, fail on everything else - if( httpCode != HTTP_CODE_OK && httpCode != HTTP_CODE_MOVED_PERMANENTLY ) { - // This error may be a false positive or a consequence of the network being disconnected. - // Since the network is controlled from outside this class, only significant error messages are reported. - if( httpCode > 0 ) { - _LOG_A("Error on HTTP request (httpCode=%i)\n", httpCode); - } else { - _LOG_A("Unknown HTTP response"); - } - _http.end(); - return false; - } - // The filter: it contains "true" for each value we want to keep - DynamicJsonDocument filter(100); - filter["tag_name"] = true; - filter["assets"][0]["browser_download_url"] = true; - filter["assets"][0]["name"] = true; - - // Deserialize the document - DynamicJsonDocument doc2(1500); - DeserializationError error = deserializeJson(doc2, _http.getStream(), DeserializationOption::Filter(filter)); - - if (error) { - _LOG_A("deserializeJson() failed: %s\n", error.c_str()); - _http.end(); // We're done with HTTP - free the resources - return false; - } - const char* tag_name = doc2["tag_name"]; // "v3.6.1" - if (!tag_name) { - //no version found - _LOG_A("ERROR: LatestVersion of repo %s not found.\n", owner_repo.c_str()); - _http.end(); // We're done with HTTP - free the resources - return false; - } - else - //duplicate value so it won't get lost out of scope - strlcpy(version, tag_name, 32); - //strlcpy(version, tag_name, sizeof(version)); - _LOG_V("Found latest version:%s.\n", version); - for (JsonObject asset : doc2["assets"].as()) { - String name = asset["name"] | ""; - if (name == asset_name) { - const char* asset_browser_download_url = asset["browser_download_url"]; - if (!asset_browser_download_url) { - // no download url found - _LOG_A("ERROR: Downloadurl of asset %s in repo %s not found.\n", asset_name.c_str(), owner_repo.c_str()); - _http.end(); // We're done with HTTP - free the resources - return false; - } else { - asprintf(&downloadUrl, "%s", asset_browser_download_url); //will be freed in FirmwareUpdate() - _LOG_V("Found asset: name=%s, url=%s.\n", name.c_str(), downloadUrl); - _http.end(); // We're done with HTTP - free the resources - return true; - } - } - } - _LOG_A("ERROR: could not find asset %s in repo %s at version %s.\n", asset_name.c_str(), owner_repo.c_str(), version); - _http.end(); // We're done with HTTP - free the resources - return false; -} -*/ - -// esp32fota esp32fota("", , , ); -esp32FOTA FOTA("esp32-fota-http", 1, false, true); - -// put firmware update in separate task so we can feed progress to the html page -void FirmwareUpdate(void *parameter) { - _LOG_A("DINGO: url=%s.\n", downloadUrl); - if (FOTA.forceUpdate(downloadUrl, 1)) { - _LOG_A("Firmware update succesfull.\n"); - downloadProgress = -1; - } else { - _LOG_A("ERROR: Firmware update failed; rebooting.\n"); - downloadProgress = -2; - delay(5000); - ESP.restart(); - } - if (downloadUrl) free(downloadUrl); - vTaskDelete(NULL); //end this task so it will not take up resources -} - -void RunFirmwareUpdate(void) { - _LOG_V("Starting firmware update from downloadUrl=%s.\n", downloadUrl); - xTaskCreate( - FirmwareUpdate, // Function that should be called - "FirmwareUpdate",// Name of the task (for debugging) - 4096, // Stack size (bytes) - NULL, // Parameter to pass - 3, // Task priority - high - NULL // Task handle - ); -} - -// Downloads firmware, flashes it, and reboot -bool AutoUpdate(String owner, String repo, int debug) { - bool ret = true; - asprintf(&downloadUrl, "%s/%s_%s.%s", FW_DOWNLOAD_PATH, (owner == OWNER_FACT)? "fact":"comm", "firmware", debug ? "debug.signed.bin": "signed.bin"); //will be freed in FirmwareUpdate() ; format: http://s3.com/fact_firmware.debug.signed.bin -/* - if () { //github routine - // not expiring github auth for minimal rate limiting on github - char version[32] = ""; - char asset_name[32] = ""; - if (debug == 1) - strlcpy(asset_name, "firmware.debug.bin", sizeof(asset_name)); - else - strlcpy(asset_name, "firmware.bin", sizeof(asset_name)); - ret = getLatestVersion(owner + "/" + repo, asset_name, version); - } - }*/ - if (ret) { - RunFirmwareUpdate(); - } - return ret; -} - -/* Takes TimeString in format - * String = "2023-04-14T11:31" - * and store it in the DelayedTimeStruct - * returns 0 on success, 1 on failure -*/ -int StoreTimeString(String DelayedTimeStr, DelayedTimeStruct *DelayedTime) { - // Parse the time string - tm delayedtime_tm = {}; - if (strptime(DelayedTimeStr.c_str(), "%Y-%m-%dT%H:%M", &delayedtime_tm)) { - delayedtime_tm.tm_isdst = -1; //so mktime is going to figure out whether DST is there or not - DelayedTime->epoch2 = mktime(&delayedtime_tm) - EPOCH2_OFFSET; - // Compare the times - time_t now = time(nullptr); //get current local time - DelayedTime->diff = DelayedTime->epoch2 - (mktime(localtime(&now)) - EPOCH2_OFFSET); - return 0; - } - //error TODO not sure whether we keep the old time or reset it to zero? - //DelayedTime.epoch2 = 0; - //DelayedTime.diff = 0; - return 1; -} - -// takes TZname (format: Europe/Berlin) , gets TZ_INFO (posix string, format: CET-1CEST,M3.5.0,M10.5.0/3) and sets and stores timezonestring accordingly -void setTimeZone(char *tzname) { - - struct mg_fs *fs = &mg_fs_packed; - //struct mg_str mg_file_read(struct mg_fs *fs, const char *path) { - void *fp; - size_t filelen, filepos = 0; - const char *path = "/data/zones.csv"; - fs->st(path, &filelen, NULL); - if ((fp = fs->op(path, MG_FS_READ)) != NULL) { - bool found = false; - char line[80]; - int pos = 0; - char c; - do { - pos = 0; - do { - fs->rd(fp, &c, 1); - if (filepos < filelen) - line[pos]=c; - pos++; - filepos++; - } while (pos < sizeof(line) - 1 && c != '\n' && filepos < filelen); - //terminate with NULL character - line[pos]=0; - found = strstr(line, tzname); - if (found) { - char *pos = strstr(line, ","); - pos = strstr(pos, "\""); - char *tz_info = pos + 1; - pos = strstr(pos, "\"") - 1; - pos = NULL; //end string with null char - _LOG_A("Detected Timezone info: TZname = %s, tz_info=%s.\n", tzname, tz_info); - setenv("TZ",tz_info,1); - TZinfo = String(tz_info); - tzset(); - if (preferences.begin("settings", false) ) { - preferences.putString("TimezoneInfo", tz_info); - preferences.end(); - } - break; - } - } while (filepos < filelen && !found); - fs->cl(fp); - } -} - -// wrapper so hasParam and getParam still work -class webServerRequest { -private: - struct mg_http_message *hm_internal; - String _value; - char temp[64]; - -public: - void setMessage(struct mg_http_message *hm); - bool hasParam(const char *param); - webServerRequest* getParam(const char *param); // Return pointer to self - const String& value(); // Return the string value -}; - -void webServerRequest::setMessage(struct mg_http_message *hm) { - hm_internal = hm; -} - -bool webServerRequest::hasParam(const char *param) { - return (mg_http_get_var(&hm_internal->query, param, temp, sizeof(temp)) > 0); -} - -webServerRequest* webServerRequest::getParam(const char *param) { - _value = ""; // Clear previous value - if (mg_http_get_var(&hm_internal->query, param, temp, sizeof(temp)) > 0) { - _value = temp; - } - return this; // Return pointer to self -} - -const String& webServerRequest::value() { - return _value; // Return the string value -} -//end of wrapper - -struct mg_str empty = mg_str_n("", 0UL); - -#if MQTT -char s_mqtt_url[80]; -//TODO perhaps integrate multiple fn callback functions? -static void fn_mqtt(struct mg_connection *c, int ev, void *ev_data) { - if (ev == MG_EV_OPEN) { - _LOG_V("%lu CREATED", c->id); - // c->is_hexdumping = 1; - } else if (ev == MG_EV_ERROR) { - // On error, log error message - _LOG_A("%lu ERROR %s", c->id, (char *) ev_data); - } else if (ev == MG_EV_CONNECT) { - // If target URL is SSL/TLS, command client connection to use TLS - if (mg_url_is_ssl(s_mqtt_url)) { - struct mg_tls_opts opts = {.ca = empty, .cert = empty, .key = empty, .name = mg_url_host(s_mqtt_url)}; - //struct mg_tls_opts opts = {.ca = empty}; - mg_tls_init(c, &opts); - } - } else if (ev == MG_EV_MQTT_OPEN) { - // MQTT connect is successful - _LOG_V("%lu CONNECTED to %s", c->id, s_mqtt_url); - MQTTclient.connected = true; - SetupMQTTClient(); - } else if (ev == MG_EV_MQTT_MSG) { - // When we get echo response, print it - struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data; - _LOG_V("%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len, mm->data.ptr, (int) mm->topic.len, mm->topic.ptr); - //somehow topic is not null terminated - String topic2 = String(mm->topic.ptr).substring(0,mm->topic.len); - mqtt_receive_callback(topic2, mm->data.ptr); - } else if (ev == MG_EV_CLOSE) { - _LOG_V("%lu CLOSED", c->id); - MQTTclient.connected = false; - s_conn = NULL; // Mark that we're closed - } -} - -// Timer function - recreate client connection if it is closed -static void timer_fn(void *arg) { - struct mg_mgr *mgr = (struct mg_mgr *) arg; - struct mg_mqtt_opts opts; - memset(&opts, 0, sizeof(opts)); - opts.clean = false; - // set will topic - String temp = MQTTprefix + "/connected"; - opts.topic = mg_str(temp.c_str()); - opts.message = mg_str("offline"); - opts.retain = true; - opts.keepalive = 15; // so we will timeout after 15s - opts.version = 4; - opts.client_id=mg_str(MQTTprefix.c_str()); - opts.user=mg_str(MQTTuser.c_str()); - opts.pass=mg_str(MQTTpassword.c_str()); - - //prepare MQTT url - //mqtt[s]://[username][:password]@host.domain[:port] - snprintf(s_mqtt_url, sizeof(s_mqtt_url), "mqtt://%s:%i", MQTTHost.c_str(), MQTTPort); - - if (s_conn == NULL) s_conn = mg_mqtt_connect(mgr, s_mqtt_url, &opts, fn_mqtt, NULL); -} -#endif - -//mongoose http_client for picking up the timezone -//url to get current timezone in Europe/Berlin format: -static const char *s_url = "http://worldtimeapi.org/api/ip"; -//urls for converting timezone to posix string: -//static const char *s_url = "https://raw.githubusercontent.com/nayarsystems/posix_tz_db/master/zones.csv"; -static const char *s_post_data = NULL; // POST data -static const uint64_t s_timeout_ms = 1500; // Connect timeout in milliseconds - -// Print HTTP response and signal that we're done -static void fn_client(struct mg_connection *c, int ev, void *ev_data) { - if (ev == MG_EV_OPEN) { - // Connection created. Store connect expiration time in c->data - *(uint64_t *) c->data = mg_millis() + s_timeout_ms; - } else if (ev == MG_EV_POLL) { - if (mg_millis() > *(uint64_t *) c->data && (c->is_connecting || c->is_resolving)) { - mg_error(c, "Connect timeout"); - } - } else if (ev == MG_EV_CONNECT) { - // Connected to server. Extract host name from URL - struct mg_str host = mg_url_host(s_url); - - if (mg_url_is_ssl(s_url)) { - struct mg_tls_opts opts = {.ca = empty, .cert = empty, .key = empty, .name = mg_url_host(s_url)}; - mg_tls_init(c, &opts); - } - - // Send request - int content_length = s_post_data ? strlen(s_post_data) : 0; - mg_printf(c, - "%s %s HTTP/1.0\r\n" - "Host: %.*s\r\n" - "Content-Type: octet-stream\r\n" - "Content-Length: %d\r\n" - "\r\n", - s_post_data ? "POST" : "GET", mg_url_uri(s_url), (int) host.len, - host.ptr, content_length); - mg_send(c, s_post_data, content_length); - } else if (ev == MG_EV_HTTP_MSG) { - // Response is received. Print it - struct mg_http_message *hm = (struct mg_http_message *) ev_data; - if (hm->message.len > 1) { - struct mg_str json = hm->body; - char *tz = mg_json_get_str(json, "$.timezone"); - _LOG_A("Timezone detected: tz=%s.\n", tz); - setTimeZone(tz); - } else { - _LOG_A("Could not detect Timezone.\n"); - } - c->is_draining = 1; // Tell mongoose to close this connection - *(bool *) c->fn_data = true; // Tell event loop to stop - } else if (ev == MG_EV_ERROR) { - *(bool *) c->fn_data = true; // Error, tell event loop to stop - } -} - -unsigned char *signature = NULL; -#define SIGNATURE_LENGTH 512 -// Connection event handler function -// indenting lower level two spaces to stay compatible with old StartWebServer -// We use the same event handler function for HTTP and HTTPS connections -// fn_data is NULL for plain HTTP, and non-NULL for HTTPS -static void fn_http_server(struct mg_connection *c, int ev, void *ev_data) { - // close this listener if the portal is active - if (WIFImode == 2) { - _LOG_A("Closing mongoose http listener!!\n"); - c->is_closing = 1; - } - if (ev == MG_EV_ACCEPT && c->fn_data != NULL) { - struct mg_tls_opts opts = { .ca = empty, .cert = mg_unpacked("/data/cert.pem"), .key = mg_unpacked("/data/key.pem"), .name = empty}; - mg_tls_init(c, &opts); - } - if (ev == MG_EV_HTTP_MSG) { // New HTTP request received - struct mg_http_message *hm = (struct mg_http_message *) ev_data; // Parsed HTTP request - webServerRequest* request = new webServerRequest(); - request->setMessage(hm); - if (mg_http_match_uri(hm, "/erasesettings")) { - mg_http_reply(c, 200, "Content-Type: text/plain\r\n", "Erasing settings, rebooting"); - if ( preferences.begin("settings", false) ) { // our own settings - preferences.clear(); - preferences.end(); - } - if (preferences.begin("nvs.net80211", false) ) { // WiFi settings used by ESP - preferences.clear(); - preferences.end(); - } - ESP.restart(); - } else if (mg_http_match_uri(hm, "/autoupdate")) { - char url[40]; - char buf[8]; - int debug; - mg_http_get_var(&hm->query, "url", url, sizeof(url)); - mg_http_get_var(&hm->query, "debug", buf, sizeof(buf)); - debug = strtol(buf, NULL, 0); - if (!memcmp(url, "factory", sizeof("factory"))) { - if (AutoUpdate(OWNER_FACT, REPO_FACT, debug)) { - struct mg_http_serve_opts opts = {.root_dir = "/data", .ssi_pattern = NULL, .extra_headers = NULL, .mime_types = NULL, .page404 = NULL, .fs = &mg_fs_packed }; - mg_http_serve_file(c, hm, "/data/update3.html", &opts); - } else - mg_http_reply(c, 400, "Content-Type: text/plain\r\n", "Autoupdate failed."); - } else if (!memcmp(url, "community", sizeof("community"))) { - if (AutoUpdate(OWNER_COMM, REPO_COMM, debug)) { - struct mg_http_serve_opts opts = {.root_dir = "/data", .ssi_pattern = NULL, .extra_headers = NULL, .mime_types = NULL, .page404 = NULL, .fs = &mg_fs_packed }; - mg_http_serve_file(c, hm, "/data/update3.html", &opts); - } else - mg_http_reply(c, 400, "Content-Type: text/plain\r\n", "Autoupdate failed."); - } else - mg_http_reply(c, 400, "Content-Type: text/plain\r\n", "Autoupdate wrong parameter."); - } else if (mg_http_match_uri(hm, "/autoupdate_progress")) { -/* char *Str; - asprintf(&Str,"Autoupdating %i / %i.\n", downloadProgress, downloadSize); - mg_http_reply(c, 200, "Content-Type: text/plain\r\n", Str); - free(Str); -*/ - DynamicJsonDocument doc(64); // https://arduinojson.org/v6/assistant/ - doc["progress"] = downloadProgress; - doc["size"] = downloadSize; - String json; - serializeJson(doc, json); - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\n", json.c_str()); // Yes. Respond JSON - } else if (mg_http_match_uri(hm, "/update")) { - //modified version of mg_http_upload - char buf[20] = "0", file[40]; - size_t max_size = 0x1B0000; //from partition_custom.csv - long res = 0, offset, size; - mg_http_get_var(&hm->query, "offset", buf, sizeof(buf)); - mg_http_get_var(&hm->query, "file", file, sizeof(file)); - offset = strtol(buf, NULL, 0); - buf[0] = '0'; - mg_http_get_var(&hm->query, "size", buf, sizeof(buf)); - size = strtol(buf, NULL, 0); - if (hm->body.len == 0) { - struct mg_http_serve_opts opts = {.root_dir = "/data", .ssi_pattern = NULL, .extra_headers = NULL, .mime_types = NULL, .page404 = NULL, .fs = &mg_fs_packed }; - mg_http_serve_file(c, hm, "/data/update2.html", &opts); - } else if (file[0] == '\0') { - mg_http_reply(c, 400, "", "file required"); - res = -1; - } else if (offset < 0) { - mg_http_reply(c, 400, "", "offset required"); - res = -3; - } else if ((size_t) offset + hm->body.len > max_size) { - mg_http_reply(c, 400, "", "over max size of %lu", (unsigned long) max_size); - res = -4; - } else if (size <= 0) { - mg_http_reply(c, 400, "", "size required"); - res = -5; - } else { - if (!memcmp(file,"firmware.bin", sizeof("firmware.bin")) || !memcmp(file,"firmware.debug.bin", sizeof("firmware.debug.bin"))) { - if(!offset) { - _LOG_A("Update Start: %s\n", file); - if(!Update.begin((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000), U_FLASH) { - Update.printError(Serial); - } - } - if(!Update.hasError()) { - if(Update.write((uint8_t*) hm->body.ptr, hm->body.len) != hm->body.len) { - Update.printError(Serial); - } else { - _LOG_A("bytes written %lu\r", offset + hm->body.len); - } - } - if (offset + hm->body.len >= size) { //EOF - if(Update.end(true)) { - _LOG_A("\nUpdate Success\n"); - delay(1000); - ESP.restart(); - } else { - Update.printError(Serial); - } - } - } else //end of firmware.bin - if (!memcmp(file,"firmware.signed.bin", sizeof("firmware.signed.bin")) || !memcmp(file,"firmware.debug.signed.bin", sizeof("firmware.debug.signed.bin"))) { -#define dump(X) for (int i= 0; i< SIGNATURE_LENGTH; i++) _LOG_A_NO_FUNC("%02x", X[i]); _LOG_A_NO_FUNC(".\n"); - if(!offset) { - _LOG_A("Update Start: %s\n", file); - signature = (unsigned char *) malloc(SIGNATURE_LENGTH); //tried to free in in all exit scenarios, RISK of leakage!!! - memcpy(signature, hm->body.ptr, SIGNATURE_LENGTH); //signature is prepended to firmware.bin - hm->body.ptr = hm->body.ptr + SIGNATURE_LENGTH; - hm->body.len = hm->body.len - SIGNATURE_LENGTH; - _LOG_A("Firmware signature:"); - dump(signature); - if(!Update.begin((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000), U_FLASH) { - Update.printError(Serial); - } - } - if(!Update.hasError()) { - if(Update.write((uint8_t*) hm->body.ptr, hm->body.len) != hm->body.len) { - Update.printError(Serial); - FREE(signature); - } else { - _LOG_A("bytes written %lu\r", offset + hm->body.len); - } - } - if (offset + hm->body.len >= size) { //EOF - //esp_err_t err; - const esp_partition_t* target_partition = esp_ota_get_next_update_partition(NULL); // the newly updated partition - if (!target_partition) { - _LOG_A("ERROR: Can't access firmware partition to check signature!"); - mg_http_reply(c, 400, "", "firmware.signed.bin update failed!"); - } - const esp_partition_t* running_partition = esp_ota_get_running_partition(); - _LOG_V("Running off of partition %s, trying to update partition %s.\n", running_partition->label, target_partition->label); - esp_ota_set_boot_partition( running_partition ); // make sure we have not switched boot partitions - - bool verification_result = false; - if(Update.end(true)) { - verification_result = FOTA.validate_sig( target_partition, signature, size - SIGNATURE_LENGTH); - FREE(signature); - if (verification_result) { - _LOG_A("Signature is valid!\n"); - esp_ota_set_boot_partition( target_partition ); - _LOG_A("\nUpdate Success\n"); - shouldReboot = true; - //ESP.restart(); does not finish the call to fn_http_server, so the last POST of apps.js gets no response.... - //which results in a "verify failed" message on the /update screen AFTER the reboot :-) - } - } -_LOG_A("DINGO: boot partition=%s.\n", esp_ota_get_boot_partition()->label); - if (!verification_result) { - _LOG_A("Update failed!\n"); - Update.printError(Serial); - //Update.abort(); //not sure this does anything in this stage - //Update.rollBack(); - _LOG_V("Running off of partition %s, erasing partition %s.\n", running_partition->label, target_partition->label); -_LOG_A("DINGO: checkpoint 1 boot partition=%s.\n", esp_ota_get_boot_partition()->label); - esp_partition_erase_range( target_partition, target_partition->address, target_partition->size ); - esp_ota_set_boot_partition( running_partition ); -_LOG_A("DINGO: checkpoint 2 boot partition=%s.\n", esp_ota_get_boot_partition()->label); - mg_http_reply(c, 400, "", "firmware.signed.bin update failed!"); - } - FREE(signature); - } - } else //end of firmware.signed.bin - if (!memcmp(file,"rfid.txt", sizeof("rfid.txt"))) { - if (offset != 0) { - mg_http_reply(c, 400, "", "rfid.txt too big, only 120 rfid's allowed!"); - } - else { - //we are overwriting all stored RFID's with the ones uploaded - DeleteAllRFID(); - res = offset + hm->body.len; - unsigned int RFID_UID[8] = {1, 0, 0, 0, 0, 0, 0, 0}; - char RFIDtxtstring[18]; // 17 characters + NULL terminator - int r, pos = 0; - int beginpos = 0; - while (pos <= hm->body.len) { - char c; - c = *(hm->body.ptr + pos); - //_LOG_A_NO_FUNC("%c", c); - if (c == '\n' || pos == hm->body.len) { - strncpy(RFIDtxtstring, hm->body.ptr + beginpos, 17); // in case of DOS the 0x0D is stripped off here - RFIDtxtstring[17] = '\0'; - r = sscanf(RFIDtxtstring,"%02x%02x%02x%02x%02x%02x", &RFID_UID[1], &RFID_UID[2], &RFID_UID[3], &RFID_UID[4], &RFID_UID[5], &RFID_UID[6]); - RFID_UID[7]=crc8((unsigned char *) RFID_UID,7); - if (r == 6) { - _LOG_A("Store RFID_UID %02x%02x%02x%02x%02x%02x, crc=%02x.\n", RFID_UID[1], RFID_UID[2], RFID_UID[3], RFID_UID[4], RFID_UID[5], RFID_UID[6], RFID_UID[7]); - LoadandStoreRFID(RFID_UID); - } - beginpos = pos + 1; - } - pos++; - } - } - } else //end of rfid.txt - mg_http_reply(c, 400, "", "only allowed to flash firmware.bin, firmware.debug.bin, firmware.signed.bin, firmware.debug.signed.bin or rfid.txt"); - mg_http_reply(c, 200, "", "%ld", res); - } - } else if (mg_http_match_uri(hm, "/settings")) { // REST API call? - if (!memcmp("GET", hm->method.ptr, hm->method.len)) { // if GET - String mode = "N/A"; - int modeId = -1; - if(Access_bit == 0) { - mode = "OFF"; - modeId=0; - } else { - switch(Mode) { - case MODE_NORMAL: mode = "NORMAL"; modeId=1; break; - case MODE_SOLAR: mode = "SOLAR"; modeId=2; break; - case MODE_SMART: mode = "SMART"; modeId=3; break; - } - } - String backlight = "N/A"; - switch(BacklightSet) { - case 0: backlight = "OFF"; break; - case 1: backlight = "ON"; break; - case 2: backlight = "DIMMED"; break; - } - String evstate = StrStateNameWeb[State]; - String error = getErrorNameWeb(ErrorFlags); - int errorId = getErrorId(ErrorFlags); - - if (ErrorFlags & NO_SUN) { - evstate += " - " + error; - error = "None"; - errorId = 0; - } - - boolean evConnected = pilot != PILOT_12V; //when access bit = 1, p.ex. in OFF mode, the STATEs are no longer updated - - DynamicJsonDocument doc(1600); // https://arduinojson.org/v6/assistant/ - doc["version"] = String(VERSION); - doc["serialnr"] = serialnr; - doc["mode"] = mode; - doc["mode_id"] = modeId; - doc["car_connected"] = evConnected; - - if(WiFi.isConnected()) { - switch(WiFi.status()) { - case WL_NO_SHIELD: doc["wifi"]["status"] = "WL_NO_SHIELD"; break; - case WL_IDLE_STATUS: doc["wifi"]["status"] = "WL_IDLE_STATUS"; break; - case WL_NO_SSID_AVAIL: doc["wifi"]["status"] = "WL_NO_SSID_AVAIL"; break; - case WL_SCAN_COMPLETED: doc["wifi"]["status"] = "WL_SCAN_COMPLETED"; break; - case WL_CONNECTED: doc["wifi"]["status"] = "WL_CONNECTED"; break; - case WL_CONNECT_FAILED: doc["wifi"]["status"] = "WL_CONNECT_FAILED"; break; - case WL_CONNECTION_LOST: doc["wifi"]["status"] = "WL_CONNECTION_LOST"; break; - case WL_DISCONNECTED: doc["wifi"]["status"] = "WL_DISCONNECTED"; break; - default: doc["wifi"]["status"] = "UNKNOWN"; break; - } - - doc["wifi"]["ssid"] = WiFi.SSID(); - doc["wifi"]["rssi"] = WiFi.RSSI(); - doc["wifi"]["bssid"] = WiFi.BSSIDstr(); - } - - doc["evse"]["temp"] = TempEVSE; - doc["evse"]["temp_max"] = maxTemp; - doc["evse"]["connected"] = evConnected; - doc["evse"]["access"] = Access_bit == 1; - doc["evse"]["mode"] = Mode; - doc["evse"]["loadbl"] = LoadBl; - doc["evse"]["pwm"] = CurrentPWM; - doc["evse"]["solar_stop_timer"] = SolarStopTimer; - doc["evse"]["state"] = evstate; - doc["evse"]["state_id"] = State; - doc["evse"]["error"] = error; - doc["evse"]["error_id"] = errorId; - doc["evse"]["rfid"] = !RFIDReader ? "Not Installed" : RFIDstatus >= 8 ? "NOSTATUS" : StrRFIDStatusWeb[RFIDstatus]; - if (RFIDReader) { - char buf[13]; - sprintf(buf, "%02X%02X%02X%02X%02X%02X", RFID[1], RFID[2], RFID[3], RFID[4], RFID[5], RFID[6]); - doc["evse"]["rfid_lastread"] = buf; - } - - doc["settings"]["charge_current"] = Balanced[0]; - doc["settings"]["override_current"] = OverrideCurrent; - doc["settings"]["current_min"] = MinCurrent; - doc["settings"]["current_max"] = MaxCurrent; - doc["settings"]["current_main"] = MaxMains; - doc["settings"]["current_max_circuit"] = MaxCircuit; - doc["settings"]["current_max_sum_mains"] = MaxSumMains; - doc["settings"]["solar_max_import"] = ImportCurrent; - doc["settings"]["solar_start_current"] = StartCurrent; - doc["settings"]["solar_stop_time"] = StopTime; - doc["settings"]["enable_C2"] = StrEnableC2[EnableC2]; - doc["settings"]["modem"] = StrModem[Modem]; - doc["settings"]["mains_meter"] = EMConfig[MainsMeter].Desc; - doc["settings"]["starttime"] = (DelayedStartTime.epoch2 ? DelayedStartTime.epoch2 + EPOCH2_OFFSET : 0); - doc["settings"]["stoptime"] = (DelayedStopTime.epoch2 ? DelayedStopTime.epoch2 + EPOCH2_OFFSET : 0); - doc["settings"]["repeat"] = DelayedRepeat; -#if MODEM - if (Modem) { - doc["settings"]["required_evccid"] = RequiredEVCCID; - doc["ev_state"]["initial_soc"] = InitialSoC; - doc["ev_state"]["remaining_soc"] = RemainingSoC; - doc["ev_state"]["full_soc"] = FullSoC; - doc["ev_state"]["energy_capacity"] = EnergyCapacity > 0 ? round((float)EnergyCapacity / 100)/10 : -1; //in kWh, precision 1 decimal; - doc["ev_state"]["energy_request"] = EnergyRequest > 0 ? round((float)EnergyRequest / 100)/10 : -1; //in kWh, precision 1 decimal - doc["ev_state"]["computed_soc"] = ComputedSoC; - doc["ev_state"]["evccid"] = EVCCID; - doc["ev_state"]["time_until_full"] = TimeUntilFull; - } -#endif - -#if MQTT - doc["mqtt"]["host"] = MQTTHost; - doc["mqtt"]["port"] = MQTTPort; - doc["mqtt"]["topic_prefix"] = MQTTprefix; - doc["mqtt"]["username"] = MQTTuser; - doc["mqtt"]["password_set"] = MQTTpassword != ""; - - if (MQTTclient.connected) { - doc["mqtt"]["status"] = "Connected"; - } else { - doc["mqtt"]["status"] = "Disconnected"; - } -#endif - - doc["home_battery"]["current"] = homeBatteryCurrent; - doc["home_battery"]["last_update"] = homeBatteryLastUpdate; - - doc["ev_meter"]["description"] = EMConfig[EVMeter].Desc; - doc["ev_meter"]["address"] = EVMeterAddress; - doc["ev_meter"]["import_active_power"] = round((float)PowerMeasured / 100)/10; //in kW, precision 1 decimal - doc["ev_meter"]["total_kwh"] = round((float)EnergyEV / 100)/10; //in kWh, precision 1 decimal - doc["ev_meter"]["charged_kwh"] = round((float)EnergyCharged / 100)/10; //in kWh, precision 1 decimal - doc["ev_meter"]["currents"]["TOTAL"] = Irms_EV[0] + Irms_EV[1] + Irms_EV[2]; - doc["ev_meter"]["currents"]["L1"] = Irms_EV[0]; - doc["ev_meter"]["currents"]["L2"] = Irms_EV[1]; - doc["ev_meter"]["currents"]["L3"] = Irms_EV[2]; - doc["ev_meter"]["import_active_energy"] = round((float)EV_import_active_energy / 100)/10; //in kWh, precision 1 decimal - doc["ev_meter"]["export_active_energy"] = round((float)EV_export_active_energy / 100)/10; //in kWh, precision 1 decimal - - doc["mains_meter"]["import_active_energy"] = round((float)Mains_import_active_energy / 100)/10; //in kWh, precision 1 decimal - doc["mains_meter"]["export_active_energy"] = round((float)Mains_export_active_energy / 100)/10; //in kWh, precision 1 decimal - - doc["phase_currents"]["TOTAL"] = Irms[0] + Irms[1] + Irms[2]; - doc["phase_currents"]["L1"] = Irms[0]; - doc["phase_currents"]["L2"] = Irms[1]; - doc["phase_currents"]["L3"] = Irms[2]; - doc["phase_currents"]["last_data_update"] = phasesLastUpdate; - doc["phase_currents"]["original_data"]["TOTAL"] = IrmsOriginal[0] + IrmsOriginal[1] + IrmsOriginal[2]; - doc["phase_currents"]["original_data"]["L1"] = IrmsOriginal[0]; - doc["phase_currents"]["original_data"]["L2"] = IrmsOriginal[1]; - doc["phase_currents"]["original_data"]["L3"] = IrmsOriginal[2]; - - doc["backlight"]["timer"] = BacklightTimer; - doc["backlight"]["status"] = backlight; - - String json; - serializeJson(doc, json); - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\n", json.c_str()); // Yes. Respond JSON - } else if (!memcmp("POST", hm->method.ptr, hm->method.len)) { // if POST - DynamicJsonDocument doc(512); // https://arduinojson.org/v6/assistant/ - - if(request->hasParam("backlight")) { - int backlight = request->getParam("backlight")->value().toInt(); - BacklightTimer = backlight * BACKLIGHT; - doc["Backlight"] = backlight; - } - - if(request->hasParam("current_min")) { - int current = request->getParam("current_min")->value().toInt(); - if(current >= MIN_CURRENT && current <= 16 && LoadBl < 2) { - MinCurrent = current; - doc["current_min"] = MinCurrent; - write_settings(); - } else { - doc["current_min"] = "Value not allowed!"; - } - } - - if(request->hasParam("current_max_sum_mains")) { - int current = request->getParam("current_max_sum_mains")->value().toInt(); - if(current >= 10 && current <= 600 && LoadBl < 2) { - MaxSumMains = current; - doc["current_max_sum_mains"] = MaxSumMains; - write_settings(); - } else { - doc["current_max_sum_mains"] = "Value not allowed!"; - } - } - - if(request->hasParam("disable_override_current")) { - OverrideCurrent = 0; - doc["disable_override_current"] = "OK"; - } - - if(request->hasParam("mode")) { - String mode = request->getParam("mode")->value(); - - //first check if we have a delayed mode switch - if(request->hasParam("starttime")) { - String DelayedStartTimeStr = request->getParam("starttime")->value(); - //string time_str = "2023-04-14T11:31"; - if (!StoreTimeString(DelayedStartTimeStr, &DelayedStartTime)) { - //parse OK - if (DelayedStartTime.diff > 0) - setAccess(0); //switch to OFF, we are Delayed Charging - else {//we are in the past so no delayed charging - DelayedStartTime.epoch2 = DELAYEDSTARTTIME; - DelayedStopTime.epoch2 = DELAYEDSTOPTIME; - DelayedRepeat = 0; - } - } - else { - //we couldn't parse the string, so we are NOT Delayed Charging - DelayedStartTime.epoch2 = DELAYEDSTARTTIME; - DelayedStopTime.epoch2 = DELAYEDSTOPTIME; - DelayedRepeat = 0; - } - - // so now we might have a starttime and we might be Delayed Charging - if (DelayedStartTime.epoch2) { - //we only accept a DelayedStopTime if we have a valid DelayedStartTime - if(request->hasParam("stoptime")) { - String DelayedStopTimeStr = request->getParam("stoptime")->value(); - //string time_str = "2023-04-14T11:31"; - if (!StoreTimeString(DelayedStopTimeStr, &DelayedStopTime)) { - //parse OK - if (DelayedStopTime.diff <= 0 || DelayedStopTime.epoch2 <= DelayedStartTime.epoch2) - //we are in the past or DelayedStopTime before DelayedStartTime so no DelayedStopTime - DelayedStopTime.epoch2 = DELAYEDSTOPTIME; - } - else - //we couldn't parse the string, so no DelayedStopTime - DelayedStopTime.epoch2 = DELAYEDSTOPTIME; - doc["stoptime"] = (DelayedStopTime.epoch2 ? DelayedStopTime.epoch2 + EPOCH2_OFFSET : 0); - if(request->hasParam("repeat")) { - int Repeat = request->getParam("repeat")->value().toInt(); - if (Repeat >= 0 && Repeat <= 1) { //boundary check - DelayedRepeat = Repeat; - doc["repeat"] = Repeat; - } - } - } - - } - doc["starttime"] = (DelayedStartTime.epoch2 ? DelayedStartTime.epoch2 + EPOCH2_OFFSET : 0); - } else - DelayedStartTime.epoch2 = DELAYEDSTARTTIME; - - - switch(mode.toInt()) { - case 0: // OFF - ToModemWaitStateTimer = 0; - ToModemDoneStateTimer = 0; - LeaveModemDoneStateTimer = 0; - LeaveModemDeniedStateTimer = 0; - setAccess(0); - break; - case 1: - setMode(MODE_NORMAL); - break; - case 2: - setMode(MODE_SOLAR); - break; - case 3: - setMode(MODE_SMART); - break; - default: - mode = "Value not allowed!"; - } - doc["mode"] = mode; - } - - if(request->hasParam("enable_C2")) { - EnableC2 = (EnableC2_t) request->getParam("enable_C2")->value().toInt(); - write_settings(); - doc["settings"]["enable_C2"] = StrEnableC2[EnableC2]; - } - - if(request->hasParam("modem")) { - Modem = (Modem_t) request->getParam("modem")->value().toInt(); - doc["settings"]["modem"] = StrModem[Modem]; - } - - if(request->hasParam("stop_timer")) { - int stop_timer = request->getParam("stop_timer")->value().toInt(); - - if(stop_timer >= 0 && stop_timer <= 60) { - StopTime = stop_timer; - doc["stop_timer"] = true; - write_settings(); - } else { - doc["stop_timer"] = false; - } - - } - - if(Mode == MODE_NORMAL || Mode == MODE_SMART) { - if(request->hasParam("override_current")) { - int current = request->getParam("override_current")->value().toInt(); - if (LoadBl < 2 && (current == 0 || (current >= ( MinCurrent * 10 ) && current <= ( MaxCurrent * 10 )))) { //OverrideCurrent not possible on Slave - OverrideCurrent = current; - doc["override_current"] = OverrideCurrent; - } else { - doc["override_current"] = "Value not allowed!"; - } - } - } - - if(request->hasParam("solar_start_current")) { - int current = request->getParam("solar_start_current")->value().toInt(); - if(current >= 0 && current <= 48) { - StartCurrent = current; - doc["solar_start_current"] = StartCurrent; - write_settings(); - } else { - doc["solar_start_current"] = "Value not allowed!"; - } - } - - if(request->hasParam("solar_max_import")) { - int current = request->getParam("solar_max_import")->value().toInt(); - if(current >= 0 && current <= 48) { - ImportCurrent = current; - doc["solar_max_import"] = ImportCurrent; - write_settings(); - } else { - doc["solar_max_import"] = "Value not allowed!"; - } - } - - //special section to post stuff for experimenting with an ISO15118 modem - if(request->hasParam("override_pwm")) { - int pwm = request->getParam("override_pwm")->value().toInt(); - if (pwm == 0){ - CP_OFF; - CPDutyOverride = true; - } else if (pwm < 0){ - CP_ON; - CPDutyOverride = false; - pwm = 100; // 10% until next loop, to be safe, corresponds to 6A - } else{ - CP_ON; - CPDutyOverride = true; - } - - SetCPDuty(pwm); - doc["override_pwm"] = pwm; - } - - //allow basic plug 'n charge based on evccid - //if required_evccid is set to a value, SmartEVSE will only allow charging requests from said EVCCID - if(request->hasParam("required_evccid")) { - if (request->getParam("required_evccid")->value().length() <= 32) { - strncpy(RequiredEVCCID, request->getParam("required_evccid")->value().c_str(), sizeof(RequiredEVCCID)); - doc["required_evccid"] = RequiredEVCCID; - write_settings(); - } else { - doc["required_evccid"] = "EVCCID too long (max 32 char)"; - } - } - -#if MQTT - if(request->hasParam("mqtt_update")) { - if (request->getParam("mqtt_update")->value().toInt() == 1) { - - if(request->hasParam("mqtt_host")) { - MQTTHost = request->getParam("mqtt_host")->value(); - doc["mqtt_host"] = MQTTHost; - } - - if(request->hasParam("mqtt_port")) { - MQTTPort = request->getParam("mqtt_port")->value().toInt(); - if (MQTTPort == 0) MQTTPort = 1883; - doc["mqtt_port"] = MQTTPort; - } - - if(request->hasParam("mqtt_topic_prefix")) { - MQTTprefix = request->getParam("mqtt_topic_prefix")->value(); - if (!MQTTprefix || MQTTprefix == "") { - MQTTprefix = APhostname; - } - doc["mqtt_topic_prefix"] = MQTTprefix; - } - - if(request->hasParam("mqtt_username")) { - MQTTuser = request->getParam("mqtt_username")->value(); - if (!MQTTuser || MQTTuser == "") { - MQTTuser.clear(); - } - doc["mqtt_username"] = MQTTuser; - } - - if(request->hasParam("mqtt_password")) { - MQTTpassword = request->getParam("mqtt_password")->value(); - if (!MQTTpassword || MQTTpassword == "") { - MQTTpassword.clear(); - } - doc["mqtt_password_set"] = (MQTTpassword != ""); - } - // disconnect mqtt so it will automatically reconnect with then new params - MQTTclient.disconnect(); - write_settings(); - } - } -#endif - - String json; - serializeJson(doc, json); - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\n", json.c_str()); // Yes. Respond JSON - } else { - mg_http_reply(c, 404, "", "Not Found\n"); - } - } else if (mg_http_match_uri(hm, "/currents") && !memcmp("POST", hm->method.ptr, hm->method.len)) { - DynamicJsonDocument doc(200); - - if(request->hasParam("battery_current")) { - if (LoadBl < 2) { - homeBatteryCurrent = request->getParam("battery_current")->value().toInt(); - homeBatteryLastUpdate = time(NULL); - doc["battery_current"] = homeBatteryCurrent; - } else - doc["battery_current"] = "not allowed on slave"; - } - - if(MainsMeter == EM_API) { - if(request->hasParam("L1") && request->hasParam("L2") && request->hasParam("L3")) { - if (LoadBl < 2) { - Irms[0] = request->getParam("L1")->value().toInt(); - Irms[1] = request->getParam("L2")->value().toInt(); - Irms[2] = request->getParam("L3")->value().toInt(); - - CalcIsum(); - for (int x = 0; x < 3; x++) { - doc["original"]["L" + x] = IrmsOriginal[x]; - doc["L" + x] = Irms[x]; - } - doc["TOTAL"] = Isum; - - MainsMeterTimeout = COMM_TIMEOUT; - - } else - doc["TOTAL"] = "not allowed on slave"; - } - } - - String json; - serializeJson(doc, json); - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\r\n", json.c_str()); // Yes. Respond JSON - - } else if (mg_http_match_uri(hm, "/ev_meter") && !memcmp("POST", hm->method.ptr, hm->method.len)) { - DynamicJsonDocument doc(200); - - if(EVMeter == EM_API) { - if(request->hasParam("L1") && request->hasParam("L2") && request->hasParam("L3")) { - - Irms_EV[0] = request->getParam("L1")->value().toInt(); - Irms_EV[1] = request->getParam("L2")->value().toInt(); - Irms_EV[2] = request->getParam("L3")->value().toInt(); - CalcImeasured_EV(); - EVMeterTimeout = COMM_EVTIMEOUT; - for (int x = 0; x < 3; x++) - doc["ev_meter"]["currents"]["L" + x] = Irms_EV[x]; - doc["ev_meter"]["currents"]["TOTAL"] = Irms_EV[0] + Irms_EV[1] + Irms_EV[2]; - } - - if(request->hasParam("import_active_energy") && request->hasParam("export_active_energy") && request->hasParam("import_active_power")) { - - EV_import_active_energy = request->getParam("import_active_energy")->value().toInt(); - EV_export_active_energy = request->getParam("export_active_energy")->value().toInt(); - - PowerMeasured = request->getParam("import_active_power")->value().toInt(); - - EnergyEV = EV_import_active_energy - EV_export_active_energy; - if (ResetKwh == 2) EnergyMeterStart = EnergyEV; // At powerup, set EnergyEV to kwh meter value - EnergyCharged = EnergyEV - EnergyMeterStart; // Calculate Energy - if (Modem) - RecomputeSoC(); - doc["ev_meter"]["import_active_power"] = PowerMeasured; - doc["ev_meter"]["import_active_energy"] = EV_import_active_energy; - doc["ev_meter"]["export_active_energy"] = EV_export_active_energy; - doc["ev_meter"]["total_kwh"] = EnergyEV; - doc["ev_meter"]["charged_kwh"] = EnergyCharged; - } - } - - String json; - serializeJson(doc, json); - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\r\n", json.c_str()); // Yes. Respond JSON - - } else if (mg_http_match_uri(hm, "/reboot") && !memcmp("POST", hm->method.ptr, hm->method.len)) { - DynamicJsonDocument doc(20); - - ESP.restart(); - doc["reboot"] = true; - - String json; - serializeJson(doc, json); - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\r\n", json.c_str()); // Yes. Respond JSON - - } else if (mg_http_match_uri(hm, "/ev_state") && !memcmp("POST", hm->method.ptr, hm->method.len)) { - DynamicJsonDocument doc(200); - - //State of charge posting - int current_soc = request->getParam("current_soc")->value().toInt(); - int full_soc = request->getParam("full_soc")->value().toInt(); - - // Energy requested by car - int energy_request = request->getParam("energy_request")->value().toInt(); - - // Total energy capacity of car's battery - int energy_capacity = request->getParam("energy_capacity")->value().toInt(); - - // Update EVCCID of car - if (request->hasParam("evccid")) { - if (request->getParam("evccid")->value().length() <= 32) { - strncpy(EVCCID, request->getParam("evccid")->value().c_str(), sizeof(EVCCID)); - doc["evccid"] = EVCCID; - } - } - - if (full_soc >= FullSoC) // Only update if we received it, since sometimes it's there, sometimes it's not - FullSoC = full_soc; - - if (energy_capacity >= EnergyCapacity) // Only update if we received it, since sometimes it's there, sometimes it's not - EnergyCapacity = energy_capacity; - - if (energy_request >= EnergyRequest) // Only update if we received it, since sometimes it's there, sometimes it's not - EnergyRequest = energy_request; - - if (current_soc >= 0 && current_soc <= 100) { - // We set the InitialSoC for our own calculations - InitialSoC = current_soc; - - // We also set the ComputedSoC to allow for app integrations - ComputedSoC = current_soc; - - // Skip waiting, charge since we have what we've got - if (State == STATE_MODEM_REQUEST || State == STATE_MODEM_WAIT || State == STATE_MODEM_DONE){ - _LOG_A("Received SoC via REST. Shortcut to State Modem Done\n"); - setState(STATE_MODEM_DONE); // Go to State B, which means in this case setting PWM - } - } - - RecomputeSoC(); - - doc["current_soc"] = current_soc; - doc["full_soc"] = full_soc; - doc["energy_capacity"] = energy_capacity; - doc["energy_request"] = energy_request; - - String json; - serializeJson(doc, json); - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\r\n", json.c_str()); // Yes. Respond JSON - -#if FAKE_RFID - //this can be activated by: http://smartevse-xxx.lan/debug?showrfid=1 - } else if (mg_http_match_uri(hm, "/debug") && !memcmp("GET", hm->method.ptr, hm->method.len)) { - if(request->hasParam("showrfid")) { - Show_RFID = strtol(request->getParam("showrfid")->value().c_str(),NULL,0); - } - _LOG_A("DEBUG: Show_RFID=%u.\n",Show_RFID); - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\r\n", ""); //json request needs json response -#endif - -#if AUTOMATED_TESTING - //this can be activated by: http://smartevse-xxx.lan/automated_testing?current_max=100 - //WARNING: because of automated testing, no limitations here! - //THAT IS DANGEROUS WHEN USED IN PRODUCTION ENVIRONMENT - //FOR SMARTEVSE's IN A TESTING BENCH ONLY!!!! - } else if (mg_http_match_uri(hm, "/automated_testing") && !memcmp("POST", hm->method.ptr, hm->method.len)) { - if(request->hasParam("current_max")) { - MaxCurrent = strtol(request->getParam("current_max")->value().c_str(),NULL,0); - } - if(request->hasParam("current_main")) { - MaxMains = strtol(request->getParam("current_main")->value().c_str(),NULL,0); - } - if(request->hasParam("current_max_circuit")) { - MaxCircuit = strtol(request->getParam("current_max_circuit")->value().c_str(),NULL,0); - } - if(request->hasParam("mainsmeter")) { - MainsMeter = strtol(request->getParam("mainsmeter")->value().c_str(),NULL,0); - } - if(request->hasParam("evmeter")) { - EVMeter = strtol(request->getParam("evmeter")->value().c_str(),NULL,0); - } - if(request->hasParam("config")) { - Config = strtol(request->getParam("config")->value().c_str(),NULL,0); - setState(STATE_A); // so the new value will actually be read - } - if(request->hasParam("loadbl")) { - int LBL = strtol(request->getParam("loadbl")->value().c_str(),NULL,0); - ConfigureModbusMode(LBL); - LoadBl = LBL; - } - mg_http_reply(c, 200, "Content-Type: application/json\r\n", "%s\r\n", ""); //json request needs json response -#endif - } else { // if everything else fails, serve static page - struct mg_http_serve_opts opts = {.root_dir = "/data", .ssi_pattern = NULL, .extra_headers = NULL, .mime_types = NULL, .page404 = NULL, .fs = &mg_fs_packed }; - //opts.fs = NULL; - mg_http_serve_dir(c, hm, &opts); - } - delete request; - } -} - -void onWifiEvent(WiFiEvent_t event) { - switch (event) { - case WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP: - _LOG_A("Connected to AP: %s\nLocal IP: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str()); - break; - case WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED: - _LOG_A("Connected or reconnected to WiFi\n"); - delay(1000); - //load dhcp dns ip4 address into mongoose - static char dns4url[]="udp://123.123.123.123:53"; - sprintf(dns4url, "udp://%s:53", WiFi.dnsIP().toString().c_str()); - mgr.dns4.url = dns4url; - -#if MQTT - mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, &mgr); -#endif - mg_log_set(MG_LL_NONE); - //mg_log_set(MG_LL_VERBOSE); - - if (TZinfo == "") { - bool done = false; // Event handler flips it to true - mg_http_connect(&mgr, s_url, fn_client, &done); // Create client connection - } - //end mongoose - mg_http_listen(&mgr, "http://0.0.0.0:80", fn_http_server, NULL); // Setup listener - mg_http_listen(&mgr, "http://0.0.0.0:443", fn_http_server, (void *) 1); // Setup listener - _LOG_A("HTTP server started\n"); - -#if DBG == 1 - // if we start RemoteDebug with no wifi credentials installed we get in a bootloop - // so we start it here - // Initialize the server (telnet or web socket) of RemoteDebug - Debug.begin(APhostname, 23, 1); - Debug.showColors(true); // Colors -#endif - break; - case WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED: - if (WIFImode == 1) { - delay(1500); // so mg_mgr_poll has timed out -#if MQTT - //mg_timer_free(&mgr); -#endif - _LOG_A("WiFi Disconnected. Reconnecting...\n"); - } - break; - default: break; - } -} - -// turns out getLocalTime only checks if the current year > 2016, and if so, decides NTP must have synced; -// this callback function actually checks if we are synced! -void timeSyncCallback(struct timeval *tv) -{ - LocalTimeSet = true; - _LOG_A("Synced clock to NTP server!"); // somehow adding a \n here hangs the device after printing this message ?!? -} - -// Setup Wifi -void WiFiSetup(void) { - mg_mgr_init(&mgr); // Initialise event manager - - const char* rsa_key_pub = mg_unpacked("/data/rsa_key.pub").ptr; - CryptoMemAsset *MyRSAKey = new CryptoMemAsset("RSA Key", rsa_key_pub, strlen(rsa_key_pub)+1 ); - auto cfg = FOTA.getConfig(); - //cfg.name = fota_name; - //cfg.manifest_url = "https://api.github.com/repos/dingo35/SmartEVSE-3.5/releases/latest"; - //cfg.sem = SemverClass( 1, 0, 0 ); // major, minor, patch - //cfg.check_sig = false; // verify signed firmware with rsa public key - cfg.check_sig = true; // verify signed firmware with rsa public key - cfg.unsafe = true; // disable certificate check when using TLS - //cfg.root_ca = MyRootCA; - cfg.pub_key = MyRSAKey; - //cfg.use_device_id = false; - FOTA.setConfig( cfg ); - //FOTA.printConfig(); - - // callback function prevents serial comm error - FOTA.setProgressCb( [](size_t progress, size_t size) { - _LOG_V("Firmware update progress %i/%i.\n", progress, size); - //move this data to global var - downloadProgress = progress; - downloadSize = size; - //give background tasks some air - vTaskDelay(100 / portTICK_PERIOD_MS); - }); - - // we abuse the downloadProgress indicator for status info: - // downloadProgress = -1 : success - // downloadProgress = -2 : fail - FOTA.setUpdateFinishedCb( [](int partition, bool restart_after) { - _LOG_V("Update succesfully completed at %s partition\n", partition==U_SPIFFS ? "spiffs" : "firmware" ); - downloadProgress = -1; - }); - - FOTA.setUpdateBeginFailCb( [](int partition) { - _LOG_A("ERROR: Update failed at %s partition\n", partition==U_SPIFFS ? "spiffs" : "firmware" ); - downloadProgress = -2; - }); - - //FOTA.setExtraHTTPHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0"); - FOTA.setExtraHTTPHeader("User-Agent", "SmartEVSE-v3"); - FOTA.setExtraHTTPHeader("Accept", "application/vnd.github+json"); - FOTA.setExtraHTTPHeader("X-GitHub-Api-Version", "2022-11-28" ); - //FOTA.setRootCA( MyRootCA ); - - //wifiManager.setDebugOutput(true); - wifiManager.setMinimumSignalQuality(-1); - WiFi.setAutoReconnect(true); - //WiFi.persistent(true); - WiFi.onEvent(onWifiEvent); - handleWIFImode(); //go into the mode that was saved in nonvolatile memory - - // Start the mDNS responder so that the SmartEVSE can be accessed using a local hostame: http://SmartEVSE-xxxxxx.local - if (!MDNS.begin(APhostname.c_str())) { - _LOG_A("Error setting up MDNS responder!\n"); - } else { - _LOG_A("mDNS responder started. http://%s.local\n",APhostname.c_str()); - MDNS.addService("http", "tcp", 80); // announce Web server - } - - // Init and get the time - // First option to get time from local ntp server blocks the second fallback option since 2021: - // See https://github.com/espressif/arduino-esp32/issues/4964 - //sntp_servermode_dhcp(1); //try to get the ntp server from dhcp - sntp_setservername(1, "europe.pool.ntp.org"); //fallback server - sntp_set_time_sync_notification_cb(timeSyncCallback); - sntp_init(); -} - -void SetupPortalTask(void * parameter) { - _LOG_A("Start Portal...\n"); - WiFi.disconnect(true); - wifiManager.setAPStaticIPConfig(IPAddress(192,168,4,1), IPAddress(192,168,4,1), IPAddress(255,255,255,0)); - //wifiManager.setTitle(String title); - - //don't show firmware update buttons in portal - std::vector wmMenuItems = { "wifi", "info", "erase", "exit" }; - wifiManager.setMenu(wmMenuItems); - wifiManager.setShowInfoUpdate(false); - wifiManager.setShowStaticFields(true); // force show static ip fields - wifiManager.setShowDnsFields(true); // force show dns field always - - wifiManager.setConfigPortalTimeout(120); // Portal will be available 2 minutes to connect to, then close. (if connected within this time, it will remain active) - mg_mgr_free(&mgr); - delay(1000); - wifiManager.startConfigPortal(APhostname.c_str(), APpassword.c_str()); - //_LOG_A("SetupPortalTask free ram: %u\n", uxTaskGetStackHighWaterMark( NULL )); - WiFi.disconnect(true); - - WIFImode = 1; - //mongoose - mg_mgr_init(&mgr); // Initialise event manager - handleWIFImode(); - write_settings(); - LCDNav = 0; - vTaskDelete(NULL); //end this task so it will not take up resources -} - -void handleWIFImode() { - - if (WIFImode == 2 && WiFi.getMode() != WIFI_AP_STA) - //now start the portal in the background, so other tasks keep running - xTaskCreate( - SetupPortalTask, // Function that should be called - "SetupPortalTask", // Name of the task (for debugging) - 10000, // Stack size (bytes) // printf needs atleast 1kb - NULL, // Parameter to pass - 1, // Task priority - NULL // Task handleCTReceive - ); - - if (WIFImode == 1 && WiFi.getMode() == WIFI_OFF) { - _LOG_A("Starting WiFi..\n"); - WiFi.mode(WIFI_STA); - WiFi.begin(); - } - - if (WIFImode == 0 && WiFi.getMode() != WIFI_OFF) { - _LOG_A("Stopping WiFi..\n"); - WiFi.disconnect(true); - } -} - - -void setup() { - - pinMode(PIN_CP_OUT, OUTPUT); // CP output - pinMode(PIN_SW_IN, INPUT); // SW Switch input - pinMode(PIN_SSR, OUTPUT); // SSR1 output - pinMode(PIN_SSR2, OUTPUT); // SSR2 output - pinMode(PIN_RCM_FAULT, INPUT_PULLUP); - - pinMode(PIN_LCD_LED, OUTPUT); // LCD backlight - pinMode(PIN_LCD_RST, OUTPUT); // LCD reset - pinMode(PIN_IO0_B1, INPUT); // < button - pinMode(PIN_LCD_A0_B2, OUTPUT); // o Select button + A0 LCD - pinMode(PIN_LCD_SDO_B3, OUTPUT); // > button + SDA/MOSI pin - - pinMode(PIN_LOCK_IN, INPUT); // Locking Solenoid input - pinMode(PIN_LEDR, OUTPUT); // Red LED output - pinMode(PIN_LEDG, OUTPUT); // Green LED output - pinMode(PIN_LEDB, OUTPUT); // Blue LED output - pinMode(PIN_ACTA, OUTPUT); // Actuator Driver output R - pinMode(PIN_ACTB, OUTPUT); // Actuator Driver output W - pinMode(PIN_CPOFF, OUTPUT); // Disable CP output (active high) - pinMode(PIN_RS485_RX, INPUT); - pinMode(PIN_RS485_TX, OUTPUT); - pinMode(PIN_RS485_DIR, OUTPUT); - - digitalWrite(PIN_LEDR, LOW); - digitalWrite(PIN_LEDG, LOW); - digitalWrite(PIN_LEDB, LOW); - digitalWrite(PIN_ACTA, LOW); - digitalWrite(PIN_ACTB, LOW); - digitalWrite(PIN_SSR, LOW); // SSR1 OFF - digitalWrite(PIN_SSR2, LOW); // SSR2 OFF - digitalWrite(PIN_LCD_LED, HIGH); // LCD Backlight ON - CP_OFF; // CP signal OFF - - - // Uart 0 debug/program port - Serial.begin(115200); - while (!Serial); - _LOG_A("\nSmartEVSE v3 powerup\n"); - - // configure SPI connection to LCD - // only the SPI_SCK and SPI_MOSI pins are used - SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI, SPI_SS); - // the ST7567's max SPI Clock frequency is 20Mhz at 3.3V/25C - // We choose 10Mhz here, to reserve some room for error. - // SPI mode is MODE3 (Idle = HIGH, clock in on rising edge) - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE3)); - - - // The CP (control pilot) output is a fixed 1khz square-wave (+6..9v / -12v). - // It's pulse width varies between 10% and 96% indicating 6A-80A charging current. - // to detect state changes we should measure the CP signal while it's at ~5% (so 50uS after the positive pulse started) - // we use an i/o interrupt at the CP pin output, and a one shot timer interrupt to start the ADC conversion. - // would be nice if there was an easier way... - - // setup timer, and one shot timer interrupt to 50us - timerA = timerBegin(0, 80, true); - timerAttachInterrupt(timerA, &onTimerA, false); - // we start in STATE A, with a static +12V CP signal - // set alarm to trigger every 1mS, and let it reload every 1ms - timerAlarmWrite(timerA, PWM_100, true); - // when PWM is active, we sample the CP pin after 5% - timerAlarmEnable(timerA); - - - // Setup ADC on CP, PP and Temperature pin - adc1_config_width(ADC_WIDTH_BIT_10); // 10 bits ADC resolution is enough - adc1_config_channel_atten(ADC1_CHANNEL_3, ADC_ATTEN_DB_11); // setup the CP pin input attenuation to 11db - adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_6); // setup the PP pin input attenuation to 6db - adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_6); // setup the Temperature input attenuation to 6db - - //Characterize the ADC at particular attentuation for each channel - adc_chars_CP = (esp_adc_cal_characteristics_t *) calloc(1, sizeof(esp_adc_cal_characteristics_t)); - adc_chars_PP = (esp_adc_cal_characteristics_t *) calloc(1, sizeof(esp_adc_cal_characteristics_t)); - adc_chars_Temperature = (esp_adc_cal_characteristics_t *) calloc(1, sizeof(esp_adc_cal_characteristics_t)); - esp_adc_cal_value_t val_type = esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_10, 1100, adc_chars_CP); - esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_6, ADC_WIDTH_BIT_10, 1100, adc_chars_PP); - esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_6, ADC_WIDTH_BIT_10, 1100, adc_chars_Temperature); - - - // Setup PWM on channel 0, 1000Hz, 10 bits resolution - ledcSetup(CP_CHANNEL, 1000, 10); // channel 0 => Group: 0, Channel: 0, Timer: 0 - // setup the RGB led PWM channels - // as PWM channel 1 is used by the same timer as the CP timer (channel 0), we start with channel 2 - ledcSetup(RED_CHANNEL, 5000, 8); // R channel 2, 5kHz, 8 bit - ledcSetup(GREEN_CHANNEL, 5000, 8); // G channel 3, 5kHz, 8 bit - ledcSetup(BLUE_CHANNEL, 5000, 8); // B channel 4, 5kHz, 8 bit - ledcSetup(LCD_CHANNEL, 5000, 8); // LCD channel 5, 5kHz, 8 bit - - // attach the channels to the GPIO to be controlled - ledcAttachPin(PIN_CP_OUT, CP_CHANNEL); - //pinMode(PIN_CP_OUT, OUTPUT); // Re-init the pin to output, required in order for attachInterrupt to work (2.0.2) - // not required/working on master branch.. - // see https://github.com/espressif/arduino-esp32/issues/6140 - ledcAttachPin(PIN_LEDR, RED_CHANNEL); - ledcAttachPin(PIN_LEDG, GREEN_CHANNEL); - ledcAttachPin(PIN_LEDB, BLUE_CHANNEL); - ledcAttachPin(PIN_LCD_LED, LCD_CHANNEL); - - SetCPDuty(1024); // channel 0, duty cycle 100% - ledcWrite(RED_CHANNEL, 255); - ledcWrite(GREEN_CHANNEL, 0); - ledcWrite(BLUE_CHANNEL, 255); - ledcWrite(LCD_CHANNEL, 0); - - // Setup PIN interrupt on rising edge - // the timer interrupt will be reset in the ISR. - attachInterrupt(PIN_CP_OUT, onCPpulse, RISING); - - // Uart 1 is used for Modbus @ 9600 8N1 - RTUutils::prepareHardwareSerial(Serial1); - Serial1.begin(MODBUS_BAUDRATE, SERIAL_8N1, PIN_RS485_RX, PIN_RS485_TX); - - - //Check type of calibration value used to characterize ADC - _LOG_A("Checking eFuse Vref settings: "); - if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) { - _LOG_A("OK\n"); - } else if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) { - _LOG_A("Two Point\n"); - } else { - _LOG_A("not programmed!!!\n"); - } - - // We might need some sort of authentication in the future. - // SmartEVSE v3 have programmed ECDSA-256 keys stored in nvs - // Unused for now. - if (preferences.begin("KeyStorage", true) ) { // true = readonly -//prevent compiler warning -#if DBG != 0 - uint16_t hwversion = preferences.getUShort("hwversion"); // 0x0101 (01 = SmartEVSE, 01 = hwver 01) -#endif - serialnr = preferences.getUInt("serialnr"); - String ec_private = preferences.getString("ec_private"); - String ec_public = preferences.getString("ec_public"); - preferences.end(); - - _LOG_A("hwversion %04x serialnr:%u \n",hwversion, serialnr); - //_LOG_A(ec_public); - } else { - _LOG_A("No KeyStorage found in nvs!\n"); - if (!serialnr) serialnr = MacId() & 0xffff; // when serialnr is not programmed (anymore), we use the Mac address - } - // overwrite APhostname if serialnr is programmed - APhostname = "SmartEVSE-" + String( serialnr & 0xffff, 10); // SmartEVSE access point Name = SmartEVSE-xxxxx - WiFi.setHostname(APhostname.c_str()); - - // Read all settings from non volatile memory; MQTTprefix will be overwritten if stored in NVS - read_settings(); // initialize with default data when starting for the first time - validate_settings(); - ReadRFIDlist(); // Read all stored RFID's from storage - _LOG_A("APpassword: %s\n",APpassword.c_str()); - - // Create Task EVSEStates, that handles changes in the CP signal - xTaskCreate( - EVSEStates, // Function that should be called - "EVSEStates", // Name of the task (for debugging) - 4096, // Stack size (bytes) // printf needs atleast 1kb - NULL, // Parameter to pass - 5, // Task priority - high - NULL // Task handle - ); - - // Create Task BlinkLed (10ms) - xTaskCreate( - BlinkLed, // Function that should be called - "BlinkLed", // Name of the task (for debugging) - 1024, // Stack size (bytes) // printf needs atleast 1kb - NULL, // Parameter to pass - 1, // Task priority - low - NULL // Task handle - ); - - // Create Task 100ms Timer - xTaskCreate( - Timer100ms, // Function that should be called - "Timer100ms", // Name of the task (for debugging) - 4608, // Stack size (bytes) - NULL, // Parameter to pass - 3, // Task priority - medium - NULL // Task handle - ); - - // Create Task Second Timer (1000ms) - xTaskCreate( - Timer1S, // Function that should be called - "Timer1S", // Name of the task (for debugging) - 4096, // Stack size (bytes) - NULL, // Parameter to pass - 3, // Task priority - medium - NULL // Task handle - ); - - // Setup WiFi, webserver and firmware OTA - // Please be aware that after doing a OTA update, its possible that the active partition is set to OTA1. - // Uploading a new firmware through USB will however update OTA0, and you will not notice any changes... - WiFiSetup(); - - // Set eModbus LogLevel to 1, to suppress possible E5 errors - MBUlogLvl = LOG_LEVEL_CRITICAL; - ConfigureModbusMode(255); - - BacklightTimer = BACKLIGHT; - GLCD_init(); - - CP_ON; // CP signal ACTIVE - - -} - -void loop() { - //this loop is for non-time critical stuff that needs to run approx 1 / second - if (WiFi.isConnected()) - mg_mgr_poll(&mgr, 1000); - else - vTaskDelay(1000 / portTICK_PERIOD_MS); - - getLocalTime(&timeinfo, 1000U); - if (!LocalTimeSet && WIFImode == 1) { - _LOG_A("Time not synced with NTP yet.\n"); - } - - if (shouldReboot) { - delay(1000); - ESP.restart(); - } - -#ifndef DEBUG_DISABLED - // Remote debug over WiFi - Debug.handle(); -#endif - - // TODO move this to a once a minute loop? - if (DelayedStartTime.epoch2 && LocalTimeSet) { - // Compare the times - time_t now = time(nullptr); //get current local time - DelayedStartTime.diff = DelayedStartTime.epoch2 - (mktime(localtime(&now)) - EPOCH2_OFFSET); - if (DelayedStartTime.diff > 0) { - if (Access_bit != 0 && (DelayedStopTime.epoch2 == 0 || DelayedStopTime.epoch2 > DelayedStartTime.epoch2)) - setAccess(0); //switch to OFF, we are Delayed Charging - } - else { - //starttime is in the past so we are NOT Delayed Charging, or we are Delayed Charging but the starttime has passed! - if (DelayedRepeat == 1) - DelayedStartTime.epoch2 += 24 * 3600; //add 24 hours so we now have a new starttime - else - DelayedStartTime.epoch2 = DELAYEDSTARTTIME; - setAccess(1); - } - } - //only update StopTime.diff if starttime has already passed - if (DelayedStopTime.epoch2 && LocalTimeSet) { - // Compare the times - time_t now = time(nullptr); //get current local time - DelayedStopTime.diff = DelayedStopTime.epoch2 - (mktime(localtime(&now)) - EPOCH2_OFFSET); - if (DelayedStopTime.diff <= 0) { - //DelayedStopTime has passed - if (DelayedRepeat == 1) //we are on a daily repetition schedule - DelayedStopTime.epoch2 += 24 * 3600; //add 24 hours so we now have a new starttime - else - DelayedStopTime.epoch2 = DELAYEDSTOPTIME; - setAccess(0); //switch to OFF - } - } -} diff --git a/SmartEVSE-3/SmartEVSE-3/src/font.cpp b/SmartEVSE-3/SmartEVSE-3/src/font.cpp deleted file mode 100644 index 5ec6dec..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/font.cpp +++ /dev/null @@ -1,266 +0,0 @@ -#include "glcd.h" - -#ifdef GLCD_FULL_CHARSET -const unsigned char font[0x100][5] = { -#else -const unsigned char font[0x7F][5] = { -#endif - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x00 - {0x00, 0x12, 0x1F, 0x10, 0x00}, // 0x01 � - {0x00, 0x19, 0x1D, 0x17, 0x12}, // 0x02 � - {0x00, 0x11, 0x15, 0x1F, 0x0A}, // 0x03 � - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x04 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x05 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x06 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x07 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x08 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x09 - {0x08, 0x1C, 0x1C, 0x1C, 0x08}, // 0x0A Energy blob - {0x63, 0x55, 0x49, 0x41, 0x63}, // 0x0B Sum - {0x00, 0x02, 0x05, 0x02, 0x00}, // 0x0C � - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x0D - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x0E - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x0F - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x10 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x11 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x12 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x13 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x14 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x15 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x16 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x17 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x18 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x19 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x1A - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x1B - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x1C - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x1D - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x1E - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x1F - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x20 Space - {0x00, 0x00, 0x5F, 0x00, 0x00}, // 0x21 ! - {0x00, 0x07, 0x00, 0x07, 0x00}, // 0x22 " - {0x14, 0x7F, 0x14, 0x7F, 0x14}, // 0x23 # - {0x24, 0x2A, 0x7F, 0x2A, 0x12}, // 0x24 $ - {0x23, 0x13, 0x08, 0x64, 0x62}, // 0x25 % - {0x36, 0x49, 0x56, 0x20, 0x50}, // 0x26 & - {0x00, 0x08, 0x07, 0x03, 0x00}, // 0x27 ' - {0x00, 0x1C, 0x22, 0x41, 0x00}, // 0x28 ( - {0x00, 0x41, 0x22, 0x1C, 0x00}, // 0x29 ) - {0x2A, 0x1C, 0x7F, 0x1C, 0x2A}, // 0x2A * - {0x08, 0x08, 0x3E, 0x08, 0x08}, // 0x2B + - {0x00, 0x80, 0x70, 0x30, 0x00}, // 0x2C , - {0x08, 0x08, 0x08, 0x08, 0x08}, // 0x2D - - {0x00, 0x00, 0x60, 0x60, 0x00}, // 0x2E . - {0x20, 0x10, 0x08, 0x04, 0x02}, // 0x2F / - {0x3E, 0x51, 0x49, 0x45, 0x3E}, // 0x30 0 - {0x00, 0x42, 0x7F, 0x40, 0x00}, // 0x31 1 - {0x72, 0x49, 0x49, 0x49, 0x46}, // 0x32 2 - {0x21, 0x41, 0x49, 0x4D, 0x33}, // 0x33 3 - {0x18, 0x14, 0x12, 0x7F, 0x10}, // 0x34 4 - {0x27, 0x45, 0x45, 0x45, 0x39}, // 0x35 5 - {0x3C, 0x4A, 0x49, 0x49, 0x31}, // 0x36 6 - {0x41, 0x21, 0x11, 0x09, 0x07}, // 0x37 7 - {0x36, 0x49, 0x49, 0x49, 0x36}, // 0x38 8 - {0x46, 0x49, 0x49, 0x29, 0x1E}, // 0x39 9 - {0x00, 0x00, 0x14, 0x00, 0x00}, // 0x3A : - {0x00, 0x40, 0x34, 0x00, 0x00}, // 0x3B ; - {0x00, 0x08, 0x14, 0x22, 0x41}, // 0x3C < - {0x14, 0x14, 0x14, 0x14, 0x14}, // 0x3D = - {0x00, 0x41, 0x22, 0x14, 0x08}, // 0x3E > - {0x02, 0x01, 0x59, 0x09, 0x06}, // 0x3F ? - {0x3E, 0x41, 0x5D, 0x59, 0x4E}, // 0x40 @ - {0x7C, 0x12, 0x11, 0x12, 0x7C}, // 0x41 A - {0x7F, 0x49, 0x49, 0x49, 0x36}, // 0x42 B - {0x3E, 0x41, 0x41, 0x41, 0x22}, // 0x43 C - {0x7F, 0x41, 0x41, 0x41, 0x3E}, // 0x44 D - {0x7F, 0x49, 0x49, 0x49, 0x41}, // 0x45 E - {0x7F, 0x09, 0x09, 0x09, 0x01}, // 0x46 F - {0x3E, 0x41, 0x41, 0x51, 0x73}, // 0x47 G - {0x7F, 0x08, 0x08, 0x08, 0x7F}, // 0x48 H - {0x00, 0x41, 0x7F, 0x41, 0x00}, // 0x49 I - {0x20, 0x40, 0x41, 0x3F, 0x01}, // 0x4A J - {0x7F, 0x08, 0x14, 0x22, 0x41}, // 0x4B K - {0x7F, 0x40, 0x40, 0x40, 0x40}, // 0x4C L - {0x7F, 0x02, 0x1C, 0x02, 0x7F}, // 0x4D M - {0x7F, 0x04, 0x08, 0x10, 0x7F}, // 0x4E N - {0x3E, 0x41, 0x41, 0x41, 0x3E}, // 0x4F O - {0x7F, 0x09, 0x09, 0x09, 0x06}, // 0x50 P - {0x3E, 0x41, 0x51, 0x21, 0x5E}, // 0x51 Q - {0x7F, 0x09, 0x19, 0x29, 0x46}, // 0x52 R - {0x26, 0x49, 0x49, 0x49, 0x32}, // 0x53 S - {0x03, 0x01, 0x7F, 0x01, 0x03}, // 0x54 T - {0x3F, 0x40, 0x40, 0x40, 0x3F}, // 0x55 U - {0x1F, 0x20, 0x40, 0x20, 0x1F}, // 0x56 V - {0x3F, 0x40, 0x38, 0x40, 0x3F}, // 0x57 W - {0x63, 0x14, 0x08, 0x14, 0x63}, // 0x58 X - {0x03, 0x04, 0x78, 0x04, 0x03}, // 0x59 Y - {0x61, 0x59, 0x49, 0x4D, 0x43}, // 0x5A Z - {0x00, 0x7F, 0x41, 0x41, 0x41}, // 0x5B [ - {0x02, 0x04, 0x08, 0x10, 0x20}, // 0x5C Backslash - {0x00, 0x41, 0x41, 0x41, 0x7F}, // 0x5D ] - {0x04, 0x02, 0x01, 0x02, 0x04}, // 0x5E ^ - {0x40, 0x40, 0x40, 0x40, 0x40}, // 0x5F _ - {0x00, 0x03, 0x07, 0x08, 0x00}, // 0x60 ` - {0x20, 0x54, 0x54, 0x78, 0x40}, // 0x61 a - {0x7F, 0x28, 0x44, 0x44, 0x38}, // 0x62 b - {0x38, 0x44, 0x44, 0x44, 0x28}, // 0x63 c - {0x38, 0x44, 0x44, 0x28, 0x7F}, // 0x64 d - {0x38, 0x54, 0x54, 0x54, 0x18}, // 0x65 e - {0x00, 0x08, 0x7E, 0x09, 0x02}, // 0x66 f - {0x18, 0xA4, 0xA4, 0x9C, 0x78}, // 0x67 g - {0x7F, 0x08, 0x04, 0x04, 0x78}, // 0x68 h - {0x00, 0x44, 0x7D, 0x40, 0x00}, // 0x69 i - {0x20, 0x40, 0x40, 0x3D, 0x00}, // 0x6A j - {0x7F, 0x10, 0x28, 0x44, 0x00}, // 0x6B k - {0x00, 0x41, 0x7F, 0x40, 0x00}, // 0x6C l - {0x7C, 0x04, 0x78, 0x04, 0x78}, // 0x6D m - {0x7C, 0x08, 0x04, 0x04, 0x78}, // 0x6E n - {0x38, 0x44, 0x44, 0x44, 0x38}, // 0x6F o - {0xFC, 0x18, 0x24, 0x24, 0x18}, // 0x70 p - {0x18, 0x24, 0x24, 0x18, 0xFC}, // 0x71 q - {0x7C, 0x08, 0x04, 0x04, 0x08}, // 0x72 r - {0x48, 0x54, 0x54, 0x54, 0x24}, // 0x73 s - {0x04, 0x04, 0x3F, 0x44, 0x24}, // 0x74 t - {0x3C, 0x40, 0x40, 0x20, 0x7C}, // 0x75 u - {0x1C, 0x20, 0x40, 0x20, 0x1C}, // 0x76 v - {0x3C, 0x40, 0x30, 0x40, 0x3C}, // 0x77 w - {0x44, 0x28, 0x10, 0x28, 0x44}, // 0x78 x - {0x4C, 0x90, 0x90, 0x90, 0x7C}, // 0x79 y - {0x44, 0x64, 0x54, 0x4C, 0x44}, // 0x7A z - {0x00, 0x08, 0x36, 0x41, 0x00}, // 0x7B { - {0x00, 0x00, 0x77, 0x00, 0x00}, // 0x7C | - {0x00, 0x41, 0x36, 0x08, 0x00}, // 0x7D } - {0x02, 0x01, 0x02, 0x04, 0x02}, // 0x7E ~ -#ifdef GLCD_FULL_CHARSET - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x7F Delete - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x80 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x81 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x82 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x83 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x84 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x85 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x86 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x87 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x88 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x89 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8A - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8B - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8C - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8D - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8E - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8F - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x90 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x91 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x92 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x93 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x94 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x95 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x96 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x97 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x98 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x99 - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9A - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9B - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9C - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9D - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9E - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9F - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA0 - {0x00, 0x00, 0xFA, 0x00, 0x00}, // 0xA1 � - {0x3C, 0x24, 0xFF, 0x24, 0x24}, // 0xA2 � - {0x48, 0x7E, 0x49, 0x43, 0x66}, // 0xA3 � - {0x1C, 0x36, 0x55, 0x41, 0x22}, // 0xA4 � - {0x2B, 0x2F, 0xFC, 0x2F, 0x2B}, // 0xA5 � - {0x08, 0x55, 0x56, 0x55, 0x20}, // 0xA6 � - {0x00, 0x66, 0x89, 0x95, 0x6A}, // 0xA7 � - {0x00, 0x59, 0x7A, 0x69, 0x00}, // 0xA8 � - {0x38, 0x7C, 0x6C, 0x44, 0x38}, // 0xA9 � - {0x26, 0x29, 0x29, 0x2F, 0x28}, // 0xAA � - {0x08, 0x14, 0x2A, 0x14, 0x22}, // 0xAB � - {0x08, 0x08, 0x08, 0x08, 0x38}, // 0xAC � - {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xAD � - {0x38, 0x7C, 0x5C, 0x64, 0x38}, // 0xAE � - {0x00, 0x01, 0x01, 0x01, 0x00}, // 0xAF � - {0x00, 0x02, 0x05, 0x02, 0x00}, // 0xB0 � - {0x44, 0x44, 0x5F, 0x44, 0x44}, // 0xB1 � - {0x00, 0x19, 0x1D, 0x17, 0x12}, // 0xB2 � - {0x00, 0x11, 0x15, 0x1F, 0x0A}, // 0xB3 � - {0x44, 0x65, 0x56, 0x4D, 0x44}, // 0xB4 � - {0x40, 0x7E, 0x20, 0x1E, 0x20}, // 0xB5 � - {0x06, 0x09, 0x7F, 0x01, 0x7F}, // 0xB6 � - {0x00, 0x00, 0x08, 0x00, 0x00}, // 0xB7 � - {0x00, 0x69, 0x7A, 0x59, 0x00}, // 0xB8 � - {0x00, 0x12, 0x1F, 0x10, 0x00}, // 0xB9 � - {0x26, 0x29, 0x29, 0x29, 0x26}, // 0xBA � - {0x22, 0x14, 0x2A, 0x14, 0x08}, // 0xBB � - {0x3E, 0x41, 0x7F, 0x49, 0x41}, // 0xBC � - {0x38, 0x44, 0x38, 0x54, 0x18}, // 0xBD � - {0x04, 0x09, 0x70, 0x09, 0x04}, // 0xBE � - {0x30, 0x48, 0x4D, 0x40, 0x20}, // 0xBF � - {0x70, 0x28, 0x25, 0x2A, 0x70}, // 0xC0 � - {0x70, 0x2A, 0x25, 0x28, 0x70}, // 0xC1 � - {0x70, 0x2A, 0x25, 0x2A, 0x70}, // 0xC2 � - {0x70, 0x2A, 0x25, 0x2A, 0x71}, // 0xC3 � - {0x70, 0x29, 0x24, 0x29, 0x70}, // 0xC4 � - {0x70, 0x28, 0x25, 0x28, 0x70}, // 0xC5 � - {0x7C, 0x12, 0x7F, 0x49, 0x41}, // 0xC6 � - {0x1E, 0xA1, 0xA1, 0x61, 0x12}, // 0xC7 � - {0x7C, 0x54, 0x55, 0x46, 0x00}, // 0xC8 � - {0x7C, 0x56, 0x55, 0x44, 0x00}, // 0xC9 � - {0x7C, 0x56, 0x55, 0x46, 0x00}, // 0xCA � - {0x7C, 0x55, 0x54, 0x45, 0x00}, // 0xCB � - {0x00, 0x44, 0x7D, 0x46, 0x00}, // 0xCC � - {0x00, 0x46, 0x7D, 0x44, 0x00}, // 0xCD � - {0x00, 0x46, 0x7D, 0x46, 0x00}, // 0xCE � - {0x00, 0x45, 0x7C, 0x45, 0x00}, // 0xCF � - {0x7F, 0x49, 0x41, 0x41, 0x3E}, // 0xD0 � - {0x7C, 0x0E, 0x19, 0x32, 0x7D}, // 0xD1 � - {0x38, 0x44, 0x45, 0x46, 0x38}, // 0xD2 � - {0x38, 0x46, 0x45, 0x44, 0x38}, // 0xD3 � - {0x38, 0x46, 0x45, 0x46, 0x38}, // 0xD4 � - {0x38, 0x46, 0x45, 0x46, 0x39}, // 0xD5 � - {0x38, 0x45, 0x44, 0x45, 0x38}, // 0xD6 � - {0x00, 0x14, 0x08, 0x14, 0x00}, // 0xD7 � - {0x3C, 0x32, 0x2A, 0x26, 0x1E}, // 0xD8 � - {0x3C, 0x40, 0x41, 0x42, 0x3C}, // 0xD9 � - {0x3C, 0x42, 0x41, 0x40, 0x3C}, // 0xDA � - {0x3C, 0x42, 0x41, 0x42, 0x3C}, // 0xDB � - {0x3C, 0x41, 0x40, 0x41, 0x3C}, // 0xDC � - {0x04, 0x0A, 0x71, 0x08, 0x04}, // 0xDD � - {0x7E, 0x24, 0x24, 0x24, 0x18}, // 0xDE � - {0x7C, 0x2A, 0x2A, 0x3E, 0x14}, // 0xDF � - {0x20, 0x54, 0x55, 0x7A, 0x40}, // 0xE0 � - {0x20, 0x56, 0x55, 0x78, 0x40}, // 0xE1 � - {0x20, 0x56, 0x55, 0x7A, 0x40}, // 0xE2 � - {0x20, 0x56, 0x55, 0x7A, 0x41}, // 0xE3 � - {0x20, 0x55, 0x54, 0x79, 0x40}, // 0xE4 � - {0x20, 0x54, 0x55, 0x78, 0x40}, // 0xE5 � - {0x20, 0x54, 0x38, 0x54, 0x18}, // 0xE6 � - {0x18, 0x3C, 0xA4, 0xE4, 0x24}, // 0xE7 � - {0x38, 0x54, 0x55, 0x56, 0x18}, // 0xE8 � - {0x38, 0x56, 0x55, 0x54, 0x18}, // 0xE9 � - {0x38, 0x56, 0x55, 0x56, 0x18}, // 0xEA � - {0x38, 0x55, 0x54, 0x55, 0x18}, // 0xEB � - {0x00, 0x44, 0x7D, 0x42, 0x00}, // 0xEC � - {0x00, 0x46, 0x7D, 0x40, 0x00}, // 0xED � - {0x00, 0x46, 0x7D, 0x42, 0x00}, // 0xEE � - {0x00, 0x45, 0x7C, 0x41, 0x00}, // 0xEF � - {0x38, 0x45, 0x45, 0x47, 0x38}, // 0xF0 � - {0x7C, 0x0A, 0x05, 0x06, 0x79}, // 0xF1 � - {0x38, 0x44, 0x45, 0x46, 0x38}, // 0xF2 � - {0x38, 0x46, 0x45, 0x44, 0x38}, // 0xF3 � - {0x38, 0x46, 0x45, 0x46, 0x38}, // 0xF4 � - {0x38, 0x46, 0x45, 0x46, 0x39}, // 0xF5 � - {0x38, 0x45, 0x44, 0x45, 0x38}, // 0xF6 � - {0x08, 0x08, 0x6B, 0x6B, 0x08}, // 0xF7 � - {0x3C, 0x32, 0x2A, 0x26, 0x1E}, // 0xF8 � - {0x3C, 0x40, 0x41, 0x22, 0x7C}, // 0xF9 � - {0x3C, 0x42, 0x41, 0x20, 0x7C}, // 0xFA � - {0x3C, 0x42, 0x41, 0x22, 0x7C}, // 0xFB � - {0x3C, 0x41, 0x40, 0x21, 0x7C}, // 0xFC � - {0x4C, 0x92, 0x91, 0x90, 0x7C}, // 0xFD � - {0xFF, 0x22, 0x22, 0x22, 0x1C}, // 0xFE � - {0x4C, 0x91, 0x90, 0x91, 0x7C}, // 0xFF � -#endif -}; diff --git a/SmartEVSE-3/SmartEVSE-3/src/font2.cpp b/SmartEVSE-3/SmartEVSE-3/src/font2.cpp deleted file mode 100644 index 837ee08..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/font2.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#include "glcd.h" - -#ifdef GLCD_HIRES_FONT - -#ifdef GLCD_FULL_CHARSET -const unsigned char font2[0x100][23] = { -#else -const unsigned char font2[0x7F][23] = { -#endif - {0x0}, // 0x00 - {0x0}, // 0x01 - {0x0}, // 0x02 - {0x0}, // 0x03 - {0x0}, // 0x04 - {0x0}, // 0x05 - {0x0}, // 0x06 - {0x0}, // 0x07 - {0x0}, // 0x08 - {0x0}, // 0x09 - {0x0}, // 0x0A - {0x0}, // 0x0B - {0x0}, // 0x0C - {0x0}, // 0x0D - {0x0}, // 0x0E - {0x0}, // 0x0F - {0x0}, // 0x10 - {0x0}, // 0x11 - {0x0}, // 0x12 - {0x0}, // 0x13 - {0x0}, // 0x14 - {0x0}, // 0x15 - {0x0}, // 0x16 - {0x0}, // 0x17 - {0x0}, // 0x18 - {0x0}, // 0x19 - {0x0}, // 0x1A - {0x0}, // 0x1B - {0x0}, // 0x1C - {0x0}, // 0x1D - {0x0}, // 0x1E - {0x0}, // 0x1F - {0x3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 0x20 Space - {0x4, 0x7C, 0x00, 0xFF, 0x33, 0xFF, 0x33, 0x7C, 0x00}, // 0x21 ! - {0x6, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00}, // 0x22 " - {0xB, 0x00, 0x02, 0x10, 0x1E, 0x90, 0x1F, 0xF0, 0x03, 0x7E, 0x02, 0x1E, 0x1E, 0x90, 0x1F, 0xF0, 0x03, 0x7E, 0x02, 0x1E, 0x00, 0x10, 0x00}, // 0x23 # - {0x8, 0x78, 0x04, 0xFC, 0x0C, 0xCC, 0x0C, 0xFF, 0x3F, 0xFF, 0x3F, 0xCC, 0x0C, 0xCC, 0x0F, 0x88, 0x07}, // 0x24 $ - {0xB, 0x00, 0x30, 0x38, 0x38, 0x38, 0x1C, 0x38, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x38, 0x70, 0x38, 0x38, 0x38, 0x1C, 0x00}, // 0x25 % - {0x9, 0x00, 0x1F, 0xB8, 0x3F, 0xFC, 0x31, 0xC6, 0x21, 0xE2, 0x37, 0x3E, 0x1E, 0x1C, 0x1C, 0x00, 0x36, 0x00, 0x22}, // 0x26 & - {0x3, 0x27, 0x00, 0x3F, 0x00, 0x1F, 0x00}, // 0x27 ' - {0x6, 0xF0, 0x03, 0xFC, 0x0F, 0xFE, 0x1F, 0x07, 0x38, 0x01, 0x20, 0x01, 0x20}, // 0x28 ( - {0x6, 0x01, 0x20, 0x01, 0x20, 0x07, 0x38, 0xFE, 0x1F, 0xFC, 0x0F, 0xF0, 0x03}, // 0x29 ) - {0x8, 0x98, 0x0C, 0xB8, 0x0E, 0xE0, 0x03, 0xF8, 0x0F, 0xF8, 0x0F, 0xE0, 0x03, 0xB8, 0x0E, 0x98, 0x0C}, // 0x2A * - {0x8, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xF0, 0x0F, 0xF0, 0x0F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01}, // 0x2B + - {0x3, 0x00, 0xB8, 0x00, 0xF8, 0x00, 0x78}, // 0x2C , - {0x8, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01}, // 0x2D - - {0x3, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38}, // 0x2E . - {0xB, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00}, // 0x2F / - {0xB, 0xF8, 0x07, 0xFE, 0x1F, 0x06, 0x1E, 0x03, 0x33, 0x83, 0x31, 0xC3, 0x30, 0x63, 0x30, 0x33, 0x30, 0x1E, 0x18, 0xFE, 0x1F, 0xF8, 0x07}, // 0x30 0 - {0xB, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x30, 0x0C, 0x30, 0x0E, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00}, // 0x31 1 - {0xB, 0x1C, 0x30, 0x1E, 0x38, 0x07, 0x3C, 0x03, 0x3E, 0x03, 0x37, 0x83, 0x33, 0xC3, 0x31, 0xE3, 0x30, 0x77, 0x30, 0x3E, 0x30, 0x1C, 0x30}, // 0x32 2 - {0xB, 0x0C, 0x0C, 0x0E, 0x1C, 0x07, 0x38, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xE7, 0x39, 0x7E, 0x1F, 0x3C, 0x0E}, // 0x33 3 - {0xB, 0xC0, 0x03, 0xE0, 0x03, 0x70, 0x03, 0x38, 0x03, 0x1C, 0x03, 0x0E, 0x03, 0x07, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x03, 0x00, 0x03}, // 0x34 4 - {0xB, 0x3F, 0x0C, 0x7F, 0x1C, 0x63, 0x38, 0x63, 0x30, 0x63, 0x30, 0x63, 0x30, 0x63, 0x30, 0x63, 0x30, 0xE3, 0x38, 0xC3, 0x1F, 0x83, 0x0F}, // 0x35 5 - {0xB, 0xC0, 0x0F, 0xF0, 0x1F, 0xF8, 0x39, 0xDC, 0x30, 0xCE, 0x30, 0xC7, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x39, 0x80, 0x1F, 0x00, 0x0F}, // 0x36 6 - {0xB, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x30, 0x03, 0x3C, 0x03, 0x0F, 0xC3, 0x03, 0xF3, 0x00, 0x3F, 0x00, 0x0F, 0x00, 0x03, 0x00}, // 0x37 7 - {0xB, 0x00, 0x0F, 0xBC, 0x1F, 0xFE, 0x39, 0xE7, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xE7, 0x30, 0xFE, 0x39, 0xBC, 0x1F, 0x00, 0x0F}, // 0x38 8 - {0xB, 0x3C, 0x00, 0x7E, 0x00, 0xE7, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x38, 0xC3, 0x1C, 0xC3, 0x0E, 0xE7, 0x07, 0xFE, 0x03, 0xFC, 0x00}, // 0x39 9 - {0x3, 0x70, 0x1C, 0x70, 0x1C, 0x70, 0x1C}, // 0x3A : - {0x3, 0x70, 0x9C, 0x70, 0xFC, 0x70, 0x7C}, // 0x3B ; - {0x8, 0xC0, 0x00, 0xE0, 0x01, 0xF0, 0x03, 0x38, 0x07, 0x1C, 0x0E, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30}, // 0x3C < - {0x9, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06}, // 0x3D = - {0x8, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0x1C, 0x0E, 0x38, 0x07, 0xF0, 0x03, 0xE0, 0x01, 0xC0, 0x00}, // 0x3E > - {0xA, 0x1C, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0x00, 0x83, 0x37, 0xC3, 0x37, 0xE3, 0x00, 0x77, 0x00, 0x3E, 0x00, 0x1C, 0x00}, // 0x3F ? - {0xB, 0xF8, 0x0F, 0xFE, 0x1F, 0x07, 0x18, 0xF3, 0x33, 0xFB, 0x37, 0x1B, 0x36, 0xFB, 0x37, 0xFB, 0x37, 0x07, 0x36, 0xFE, 0x03, 0xF8, 0x01}, // 0x40 @ - {0xA, 0x00, 0x38, 0x00, 0x3F, 0xE0, 0x07, 0xFC, 0x06, 0x1F, 0x06, 0x1F, 0x06, 0xFC, 0x06, 0xE0, 0x07, 0x00, 0x3F, 0x00, 0x38}, // 0x41 A - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xE7, 0x30, 0xFE, 0x39, 0xBC, 0x1F, 0x00, 0x0F}, // 0x42 B - {0xA, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0x0C, 0x0C}, // 0x43 C - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0xFC, 0x0F, 0xF0, 0x03}, // 0x44 D - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x03, 0x30, 0x03, 0x30}, // 0x45 E - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x03, 0x00, 0x03, 0x00}, // 0x46 F - {0xA, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC7, 0x3F, 0xC6, 0x3F}, // 0x47 G - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0x3F, 0xFF, 0x3F}, // 0x48 H - {0x6, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30}, // 0x49 I - {0xA, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x38, 0xFF, 0x1F, 0xFF, 0x07}, // 0x4A J - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xE0, 0x01, 0xF0, 0x03, 0x38, 0x07, 0x1C, 0x0E, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30}, // 0x4B K - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30}, // 0x4C L - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0x1E, 0x00, 0x78, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0x78, 0x00, 0x1E, 0x00, 0xFF, 0x3F, 0xFF, 0x3F}, // 0x4D M - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0x0E, 0x00, 0x38, 0x00, 0xF0, 0x00, 0xC0, 0x03, 0x00, 0x07, 0x00, 0x1C, 0xFF, 0x3F, 0xFF, 0x3F}, // 0x4E N - {0xA, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0xFC, 0x0F, 0xF0, 0x03}, // 0x4F O - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0x83, 0x01, 0x83, 0x01, 0x83, 0x01, 0x83, 0x01, 0x83, 0x01, 0xC7, 0x01, 0xFE, 0x00, 0x7C, 0x00}, // 0x50 P - {0xA, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x03, 0x36, 0x07, 0x3E, 0x0E, 0x1C, 0xFC, 0x3F, 0xF0, 0x33}, // 0x51 Q - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0x83, 0x01, 0x83, 0x01, 0x83, 0x03, 0x83, 0x07, 0x83, 0x0F, 0xC7, 0x1D, 0xFE, 0x38, 0x7C, 0x30}, // 0x52 R - {0xA, 0x3C, 0x0C, 0x7E, 0x1C, 0xE7, 0x38, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC7, 0x39, 0x8E, 0x1F, 0x0C, 0x0F}, // 0x53 S - {0x8, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00}, // 0x54 T - {0xA, 0xFF, 0x07, 0xFF, 0x1F, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x38, 0xFF, 0x1F, 0xFF, 0x07}, // 0x55 U - {0xA, 0x07, 0x00, 0x3F, 0x00, 0xF8, 0x01, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x3E, 0xC0, 0x0F, 0xF8, 0x01, 0x3F, 0x00, 0x07, 0x00}, // 0x56 V - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x1C, 0x00, 0x06, 0x80, 0x03, 0x80, 0x03, 0x00, 0x06, 0x00, 0x1C, 0xFF, 0x3F, 0xFF, 0x3F}, // 0x57 W - {0xA, 0x03, 0x30, 0x0F, 0x3C, 0x1C, 0x0E, 0x30, 0x03, 0xE0, 0x01, 0xE0, 0x01, 0x30, 0x03, 0x1C, 0x0E, 0x0F, 0x3C, 0x03, 0x30}, // 0x58 X - {0xA, 0x03, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x00}, // 0x59 Y - {0xA, 0x03, 0x30, 0x03, 0x3C, 0x03, 0x3E, 0x03, 0x33, 0xC3, 0x31, 0xE3, 0x30, 0x33, 0x30, 0x1F, 0x30, 0x0F, 0x30, 0x03, 0x30}, // 0x5A Z - {0x6, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30}, // 0x5B [ - {0xB, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x18}, // 0x5C Backslash - {0x6, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F}, // 0x5D ] - {0xB, 0x60, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0x60, 0x00}, // 0x5E ^ - {0xB, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0}, // 0x5F _ - {0x3, 0x3E, 0x00, 0x7E, 0x00, 0x4E, 0x00}, // 0x60 ` - {0xA, 0x00, 0x1C, 0x40, 0x3E, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0xE0, 0x3F, 0xC0, 0x3F}, // 0x61 a - {0xA, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xE0, 0x38, 0xC0, 0x1F, 0x80, 0x0F}, // 0x62 b - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xC0, 0x18, 0x80, 0x08}, // 0x63 c - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xE0, 0x30, 0xC0, 0x30, 0xFF, 0x3F, 0xFF, 0x3F}, // 0x64 d - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x3B, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0xC0, 0x13, 0x80, 0x01}, // 0x65 e - {0x8, 0xC0, 0x00, 0xC0, 0x00, 0xFC, 0x3F, 0xFE, 0x3F, 0xC7, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x03, 0x00}, // 0x66 f - {0xA, 0x80, 0x03, 0xC0, 0xC7, 0xE0, 0xCE, 0x60, 0xCC, 0x60, 0xCC, 0x60, 0xCC, 0x60, 0xCC, 0x60, 0xE6, 0xE0, 0x7F, 0xE0, 0x3F}, // 0x67 g - {0x9, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0x80, 0x3F}, // 0x68 h - {0x6, 0x00, 0x30, 0x60, 0x30, 0xEC, 0x3F, 0xEC, 0x3F, 0x00, 0x30, 0x00, 0x30}, // 0x69 i - {0x6, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x60, 0xC0, 0xEC, 0xFF, 0xEC, 0x7F}, // 0x6A j - {0x8, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x1C, 0x60, 0x38, 0x00, 0x30}, // 0x6B k - {0x6, 0x00, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30}, // 0x6C l - {0xA, 0xE0, 0x3F, 0xC0, 0x3F, 0xE0, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, 0xE0, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0x80, 0x3F}, // 0x6D m - {0x9, 0xE0, 0x3F, 0xE0, 0x3F, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0x80, 0x3F}, // 0x6E n - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xE0, 0x38, 0xC0, 0x1F, 0x80, 0x0F}, // 0x6F o - {0xA, 0xE0, 0xFF, 0xE0, 0xFF, 0x60, 0x0C, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0xE0, 0x1C, 0xC0, 0x0F, 0x80, 0x07}, // 0x70 p - {0xA, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x1C, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x0C, 0xE0, 0xFF, 0xE0, 0xFF}, // 0x71 q - {0x9, 0xE0, 0x3F, 0xE0, 0x3F, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x00}, // 0x72 r - {0x8, 0xC0, 0x11, 0xE0, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x3F, 0x40, 0x1E}, // 0x73 s - {0x8, 0x60, 0x00, 0x60, 0x00, 0xFE, 0x1F, 0xFE, 0x3F, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x00, 0x30}, // 0x74 t - {0xA, 0xE0, 0x0F, 0xE0, 0x1F, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0xE0, 0x3F, 0xE0, 0x3F}, // 0x75 u - {0xA, 0x60, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x38, 0x00, 0x1E, 0x80, 0x07, 0xE0, 0x01, 0x60, 0x00}, // 0x76 v - {0xA, 0xE0, 0x07, 0xE0, 0x1F, 0x00, 0x38, 0x00, 0x1C, 0xE0, 0x0F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0xE0, 0x1F, 0xE0, 0x07}, // 0x77 w - {0x9, 0x60, 0x30, 0xE0, 0x38, 0xC0, 0x1D, 0x80, 0x0F, 0x00, 0x07, 0x80, 0x0F, 0xC0, 0x1D, 0xE0, 0x38, 0x60, 0x30}, // 0x78 x - {0x8, 0x60, 0x00, 0xE0, 0x81, 0x80, 0xE7, 0x00, 0x7E, 0x00, 0x1E, 0x80, 0x07, 0xE0, 0x01, 0x60, 0x00}, // 0x79 y - {0x9, 0x60, 0x30, 0x60, 0x38, 0x60, 0x3C, 0x60, 0x36, 0x60, 0x33, 0xE0, 0x31, 0xE0, 0x30, 0x60, 0x30, 0x20, 0x30}, // 0x7A z - {0x8, 0x80, 0x00, 0xC0, 0x01, 0xFC, 0x1F, 0x7E, 0x3F, 0x07, 0x70, 0x03, 0x60, 0x03, 0x60, 0x03, 0x60}, // 0x7B { - {0x2, 0xBF, 0x3F, 0xBF, 0x3F}, // 0x7C | - {0x8, 0x03, 0x60, 0x03, 0x60, 0x03, 0x60, 0x07, 0x70, 0x7E, 0x3F, 0xFC, 0x1F, 0xC0, 0x01, 0x80, 0x00}, // 0x7D } - {0xA, 0x10, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x10, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x04, 0x00}, // 0x7E ~ -#ifdef GLCD_FULL_CHARSET - {0xA, 0x00, 0x0F, 0x80, 0x0F, 0xC0, 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x60, 0x0C, 0xC0, 0x0C, 0x80, 0x0F, 0x00, 0x0F}, // 0x7F Delete - {0x0}, // 0x80 - {0x0}, // 0x81 - {0x0}, // 0x82 - {0x0}, // 0x83 - {0x0}, // 0x84 - {0x0}, // 0x85 - {0x0}, // 0x86 - {0x0}, // 0x87 - {0x0}, // 0x88 - {0x0}, // 0x89 - {0x0}, // 0x8A - {0x0}, // 0x8B - {0x0}, // 0x8C - {0x0}, // 0x8D - {0x0}, // 0x8E - {0x0}, // 0x8F - {0x0}, // 0x90 - {0x0}, // 0x91 - {0x0}, // 0x92 - {0x0}, // 0x93 - {0x0}, // 0x94 - {0x0}, // 0x95 - {0x0}, // 0x96 - {0x0}, // 0x97 - {0x0}, // 0x98 - {0x0}, // 0x99 - {0x0}, // 0x9A - {0x0}, // 0x9B - {0x0}, // 0x9C - {0x0}, // 0x9D - {0x0}, // 0x9E - {0x0}, // 0x9F - {0x0}, // 0xA0 - {0x4, 0x80, 0x0F, 0xF3, 0x3F, 0xF3, 0x3F, 0x80, 0x0F}, // 0xA1 � - {0x8, 0xE0, 0x03, 0xF0, 0x07, 0x38, 0x0E, 0xFE, 0x3F, 0xFE, 0x3F, 0x18, 0x0C, 0x38, 0x0E, 0x30, 0x06}, // 0xA2 � - {0x9, 0x00, 0x18, 0x80, 0x1C, 0xF8, 0x1F, 0xFC, 0x0B, 0x8C, 0x18, 0x8C, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x00, 0x08}, // 0xA3 � - {0x9, 0x20, 0x01, 0xF0, 0x03, 0xFC, 0x0F, 0x2E, 0x1D, 0x27, 0x39, 0x23, 0x31, 0x23, 0x30, 0x07, 0x38, 0x0E, 0x1C}, // 0xA4 � - {0xA, 0x03, 0x00, 0x0F, 0x0A, 0x3C, 0x0A, 0xF0, 0x0A, 0xC0, 0x3F, 0xC0, 0x3F, 0xF0, 0x0A, 0x3C, 0x0A, 0x0F, 0x0A, 0x03, 0x00}, // 0xA5 � - {0xA, 0x60, 0x0C, 0xF0, 0x1C, 0xF9, 0x39, 0x9B, 0x31, 0x9E, 0x31, 0x9E, 0x31, 0x9B, 0x31, 0xB9, 0x3B, 0x30, 0x1F, 0x20, 0x0E}, // 0xA6 � - {0x8, 0xDC, 0x08, 0xFE, 0x19, 0x22, 0x11, 0x22, 0x11, 0x22, 0x11, 0x22, 0x11, 0xE6, 0x1F, 0xC4, 0x0E}, // 0xA7 � - {0x8, 0xC0, 0x11, 0xE2, 0x33, 0x66, 0x33, 0x6C, 0x33, 0x6C, 0x33, 0x66, 0x33, 0x62, 0x3F, 0x40, 0x1E}, // 0xA8 � - {0xB, 0xF0, 0x07, 0xF8, 0x0F, 0x1C, 0x1C, 0xCC, 0x19, 0xEC, 0x1B, 0x2C, 0x1A, 0x6C, 0x1B, 0x4C, 0x19, 0x1C, 0x1C, 0xF8, 0x0F, 0xF0, 0x07}, // 0xA9 � - {0xA, 0x70, 0x00, 0xFA, 0x06, 0xDB, 0x06, 0xDB, 0x06, 0xDB, 0x06, 0xDB, 0x06, 0xDB, 0x06, 0xDB, 0x06, 0xFF, 0x06, 0xFE, 0x00}, // 0xAA � - {0x9, 0x80, 0x00, 0xC0, 0x01, 0x60, 0x03, 0x20, 0x02, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x01, 0x60, 0x03, 0x20, 0x02}, // 0xAB � - {0xA, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xF8, 0x03, 0xF8, 0x03}, // 0xAC � - {0x6, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00}, // 0xAD � - {0xB, 0xF0, 0x07, 0xF8, 0x0F, 0x1C, 0x1C, 0xEC, 0x1B, 0xEC, 0x1B, 0xAC, 0x18, 0xEC, 0x1B, 0x4C, 0x1B, 0x1C, 0x1C, 0xF8, 0x0F, 0xF0, 0x07}, // 0xAE � - {0x4, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00}, // 0xAF � - {0x6, 0x1E, 0x00, 0x3F, 0x00, 0x33, 0x00, 0x33, 0x00, 0x3F, 0x00, 0x1E, 0x00}, // 0xB0 � - {0x6, 0xC0, 0x18, 0xC0, 0x18, 0xF0, 0x1B, 0xF0, 0x1B, 0xC0, 0x18, 0xC0, 0x18}, // 0xB1 � - {0x5, 0x19, 0x00, 0x1D, 0x00, 0x15, 0x00, 0x17, 0x00, 0x12, 0x00}, // 0xB2 � - {0x5, 0x11, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1F, 0x00, 0x0A, 0x00}, // 0xB3 � - {0xA, 0x18, 0x30, 0x18, 0x38, 0x19, 0x3C, 0x1B, 0x36, 0x1E, 0x33, 0x9E, 0x31, 0xDB, 0x30, 0x79, 0x30, 0x38, 0x30, 0x18, 0x30}, // 0xB4 � - {0x9, 0xF0, 0xFF, 0xF0, 0xFF, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x06, 0xF0, 0x0F, 0xF0, 0x0F}, // 0xB5 � - {0xA, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0x82, 0x00, 0xFE, 0x3F, 0xFE, 0x3F, 0x02, 0x00, 0xFE, 0x3F, 0xFE, 0x3F, 0x02, 0x00}, // 0xB6 � - {0x3, 0x80, 0x01, 0xC0, 0x03, 0x80, 0x01}, // 0xB7 � - {0x9, 0x60, 0x30, 0x62, 0x38, 0x66, 0x3C, 0x6C, 0x36, 0x6C, 0x33, 0xE6, 0x31, 0xE2, 0x30, 0x60, 0x30, 0x20, 0x30}, // 0xB8 � - {0x3, 0x02, 0x00, 0x1F, 0x00, 0x1F, 0x00}, // 0xB9 � - {0xA, 0x3C, 0x00, 0x7E, 0x06, 0xE7, 0x06, 0xC3, 0x06, 0xC3, 0x06, 0xC3, 0x06, 0xC3, 0x06, 0xE7, 0x06, 0x7E, 0x06, 0x3C, 0x00}, // 0xBA � - {0x9, 0x20, 0x02, 0x60, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x20, 0x02, 0x60, 0x03, 0xC0, 0x01, 0x80, 0x00}, // 0xBB � - {0xA, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30}, // 0xBC � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0xC0, 0x1F, 0xE0, 0x3B, 0x60, 0x33, 0x60, 0x33, 0xC0, 0x13, 0x80, 0x01}, // 0xBD � - {0xA, 0x08, 0x00, 0x18, 0x00, 0x33, 0x00, 0x63, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, 0x63, 0x00, 0x33, 0x00, 0x18, 0x00, 0x08, 0x00}, // 0xBE � - {0xA, 0x00, 0x0E, 0x00, 0x1F, 0x80, 0x3B, 0xC0, 0x31, 0xFB, 0x30, 0x7B, 0x30, 0x00, 0x30, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x0E}, // 0xBF � - {0xA, 0x00, 0x38, 0x00, 0x3E, 0x80, 0x0F, 0xE1, 0x0D, 0x7B, 0x0C, 0x7E, 0x0C, 0xE4, 0x0D, 0x80, 0x0F, 0x00, 0x3E, 0x00, 0x38}, // 0xC0 � - {0xA, 0x00, 0x38, 0x00, 0x3E, 0x80, 0x0F, 0xE4, 0x0D, 0x7E, 0x0C, 0x7B, 0x0C, 0xE1, 0x0D, 0x80, 0x0F, 0x00, 0x3E, 0x00, 0x38}, // 0xC1 � - {0xA, 0x00, 0x38, 0x00, 0x3E, 0x84, 0x0F, 0xE6, 0x0D, 0x7B, 0x0C, 0x7B, 0x0C, 0xE6, 0x0D, 0x84, 0x0F, 0x00, 0x3E, 0x00, 0x38}, // 0xC2 � - {0xA, 0x00, 0x38, 0x00, 0x3E, 0x82, 0x0F, 0xE3, 0x0D, 0x79, 0x0C, 0x7B, 0x0C, 0xE2, 0x0D, 0x83, 0x0F, 0x01, 0x3E, 0x00, 0x38}, // 0xC3 � - {0xA, 0x00, 0x38, 0x00, 0x3E, 0x83, 0x0F, 0xE3, 0x0D, 0x78, 0x0C, 0x78, 0x0C, 0xE3, 0x0D, 0x83, 0x0F, 0x00, 0x3E, 0x00, 0x38}, // 0xC4 � - {0xA, 0x00, 0x38, 0x00, 0x3E, 0x80, 0x0F, 0xE2, 0x0D, 0x75, 0x0C, 0x75, 0x0C, 0xE2, 0x0D, 0x80, 0x0F, 0x00, 0x3E, 0x00, 0x38}, // 0xC5 � - {0xA, 0x00, 0x3C, 0x80, 0x3F, 0xF0, 0x07, 0x7C, 0x06, 0x1F, 0x06, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0x03, 0x30}, // 0xC6 � - {0xA, 0xF0, 0x01, 0xFC, 0x07, 0x0E, 0xCE, 0x07, 0xDC, 0x03, 0xF8, 0x03, 0xF8, 0x03, 0x18, 0x07, 0x1C, 0x1E, 0x0E, 0x1C, 0x06}, // 0xC7 � - {0xA, 0xF8, 0x3F, 0xF8, 0x3F, 0x99, 0x31, 0x9B, 0x31, 0x9E, 0x31, 0x9C, 0x31, 0x98, 0x31, 0x98, 0x31, 0x18, 0x30, 0x18, 0x30}, // 0xC8 � - {0xA, 0xF8, 0x3F, 0xF8, 0x3F, 0x98, 0x31, 0x98, 0x31, 0x9C, 0x31, 0x9E, 0x31, 0x9B, 0x31, 0x99, 0x31, 0x18, 0x30, 0x18, 0x30}, // 0xC9 � - {0xA, 0xF8, 0x3F, 0xF8, 0x3F, 0x9C, 0x31, 0x9E, 0x31, 0x9B, 0x31, 0x9B, 0x31, 0x9E, 0x31, 0x9C, 0x31, 0x18, 0x30, 0x18, 0x30}, // 0xCA � - {0xA, 0xF8, 0x3F, 0xF8, 0x3F, 0x9B, 0x31, 0x9B, 0x31, 0x98, 0x31, 0x98, 0x31, 0x9B, 0x31, 0x9B, 0x31, 0x18, 0x30, 0x18, 0x30}, // 0xCB � - {0x6, 0x19, 0x30, 0x1B, 0x30, 0xFE, 0x3F, 0xFC, 0x3F, 0x18, 0x30, 0x18, 0x30}, // 0xCC � - {0x6, 0x18, 0x30, 0x18, 0x30, 0xFC, 0x3F, 0xFE, 0x3F, 0x1B, 0x30, 0x19, 0x30}, // 0xCD � - {0x6, 0x1C, 0x30, 0x1E, 0x30, 0xFB, 0x3F, 0xFB, 0x3F, 0x1E, 0x30, 0x1C, 0x30}, // 0xCE � - {0x6, 0x1B, 0x30, 0x1B, 0x30, 0xF8, 0x3F, 0xF8, 0x3F, 0x1B, 0x30, 0x1B, 0x30}, // 0xCF � - {0xA, 0xC0, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0x03, 0x30, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0xFC, 0x0F, 0xF0, 0x03}, // 0xD0 � - {0xA, 0xF8, 0x3F, 0xF8, 0x3F, 0x72, 0x00, 0xE3, 0x00, 0xC1, 0x01, 0x83, 0x03, 0x02, 0x07, 0x03, 0x0E, 0xF9, 0x3F, 0xF8, 0x3F}, // 0xD1 � - {0xA, 0xE0, 0x0F, 0xF0, 0x1F, 0x39, 0x38, 0x1B, 0x30, 0x1E, 0x30, 0x1C, 0x30, 0x18, 0x30, 0x38, 0x38, 0xF0, 0x1F, 0xE0, 0x0F}, // 0xD2 � - {0xA, 0xE0, 0x0F, 0xF0, 0x1F, 0x38, 0x38, 0x18, 0x30, 0x1C, 0x30, 0x1E, 0x30, 0x1B, 0x30, 0x39, 0x38, 0xF0, 0x1F, 0xE0, 0x0F}, // 0xD3 � - {0xA, 0xE0, 0x0F, 0xF0, 0x1F, 0x3C, 0x38, 0x1E, 0x30, 0x1B, 0x30, 0x1B, 0x30, 0x1E, 0x30, 0x3C, 0x38, 0xF0, 0x1F, 0xE0, 0x0F}, // 0xD4 � - {0xA, 0xE0, 0x0F, 0xF0, 0x1F, 0x3A, 0x38, 0x1B, 0x30, 0x19, 0x30, 0x1B, 0x30, 0x1A, 0x30, 0x3B, 0x38, 0xF1, 0x1F, 0xE0, 0x0F}, // 0xD5 � - {0xA, 0xE0, 0x0F, 0xF0, 0x1F, 0x3B, 0x38, 0x1B, 0x30, 0x18, 0x30, 0x18, 0x30, 0x1B, 0x30, 0x3B, 0x38, 0xF0, 0x1F, 0xE0, 0x0F}, // 0xD6 � - {0x8, 0x10, 0x04, 0x30, 0x06, 0x60, 0x03, 0xC0, 0x01, 0xC0, 0x01, 0x60, 0x03, 0x30, 0x06, 0x10, 0x04}, // 0xD7 � - {0xA, 0xF0, 0x2F, 0xF8, 0x3F, 0x1C, 0x18, 0x0C, 0x3E, 0x8C, 0x37, 0xEC, 0x31, 0x7C, 0x30, 0x18, 0x38, 0xFC, 0x1F, 0xF4, 0x0F}, // 0xD8 � - {0xA, 0xF8, 0x07, 0xF8, 0x1F, 0x01, 0x38, 0x03, 0x30, 0x06, 0x30, 0x04, 0x30, 0x00, 0x30, 0x00, 0x38, 0xF8, 0x1F, 0xF8, 0x07}, // 0xD9 � - {0xA, 0xF8, 0x07, 0xF8, 0x1F, 0x00, 0x38, 0x00, 0x30, 0x04, 0x30, 0x06, 0x30, 0x03, 0x30, 0x01, 0x38, 0xF8, 0x1F, 0xF8, 0x07}, // 0xDA � - {0xA, 0xF8, 0x07, 0xF8, 0x1F, 0x04, 0x38, 0x06, 0x30, 0x03, 0x30, 0x03, 0x30, 0x06, 0x30, 0x04, 0x38, 0xF8, 0x1F, 0xF8, 0x07}, // 0xDB � - {0xA, 0xE0, 0x0F, 0xE0, 0x1F, 0x0C, 0x38, 0x0C, 0x30, 0x00, 0x30, 0x00, 0x30, 0x0C, 0x30, 0x0C, 0x18, 0xE0, 0x3F, 0xE0, 0x3F}, // 0xDC � - {0xA, 0x08, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC4, 0x3F, 0xC6, 0x3F, 0x63, 0x00, 0x31, 0x00, 0x18, 0x00, 0x08, 0x00}, // 0xDD � - {0x8, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x1B, 0x36, 0x18, 0x06, 0x18, 0x06, 0xF8, 0x07, 0xF0, 0x03}, // 0xDE � - {0x8, 0xC0, 0xFF, 0xE0, 0xFF, 0x30, 0x21, 0x10, 0x21, 0x10, 0x21, 0x30, 0x33, 0xE0, 0x3F, 0xC0, 0x1E}, // 0xDF � - {0xA, 0x00, 0x1C, 0x40, 0x3E, 0x60, 0x33, 0x62, 0x33, 0x66, 0x33, 0x6C, 0x33, 0x68, 0x33, 0x60, 0x33, 0xE0, 0x3F, 0xC0, 0x3F}, // 0xE0 � - {0xA, 0x00, 0x1C, 0x40, 0x3E, 0x60, 0x33, 0x68, 0x33, 0x6C, 0x33, 0x66, 0x33, 0x62, 0x33, 0x60, 0x33, 0xE0, 0x3F, 0xC0, 0x3F}, // 0xE1 � - {0xA, 0x00, 0x1C, 0x40, 0x3E, 0x68, 0x33, 0x6C, 0x33, 0x66, 0x33, 0x66, 0x33, 0x6C, 0x33, 0x68, 0x33, 0xE0, 0x3F, 0xC0, 0x3F}, // 0xE2 � - {0xA, 0x00, 0x1C, 0x40, 0x3E, 0x68, 0x33, 0x6C, 0x33, 0x64, 0x33, 0x6C, 0x33, 0x68, 0x33, 0x6C, 0x33, 0xE4, 0x3F, 0xC0, 0x3F}, // 0xE3 � - {0xA, 0x00, 0x1C, 0x40, 0x3E, 0x6C, 0x33, 0x6C, 0x33, 0x60, 0x33, 0x60, 0x33, 0x6C, 0x33, 0x6C, 0x33, 0xE0, 0x3F, 0xC0, 0x3F}, // 0xE4 � - {0xA, 0x00, 0x1C, 0x40, 0x3E, 0x60, 0x33, 0x64, 0x33, 0x6A, 0x33, 0x6A, 0x33, 0x64, 0x33, 0x60, 0x33, 0xE0, 0x3F, 0xC0, 0x3F}, // 0xE5 � - {0xA, 0x80, 0x1C, 0xC0, 0x3E, 0x40, 0x22, 0x40, 0x22, 0xC0, 0x1F, 0x80, 0x3F, 0x40, 0x22, 0x40, 0x22, 0xC0, 0x33, 0x80, 0x11}, // 0xE6 � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0xB8, 0x60, 0xB0, 0x60, 0xF0, 0x60, 0xF0, 0x60, 0x30, 0xE0, 0x38, 0xC0, 0x18, 0x80, 0x08}, // 0xE7 � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x33, 0x62, 0x33, 0x66, 0x33, 0x6C, 0x33, 0x68, 0x33, 0x60, 0x33, 0xC0, 0x13, 0x80, 0x03}, // 0xE8 � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x3B, 0x60, 0x33, 0x68, 0x33, 0x6C, 0x33, 0x66, 0x33, 0x62, 0x33, 0xC0, 0x13, 0x80, 0x03}, // 0xE9 � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE8, 0x33, 0x6C, 0x33, 0x66, 0x33, 0x66, 0x33, 0x6C, 0x33, 0x68, 0x33, 0xC0, 0x13, 0x80, 0x03}, // 0xEA � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xEC, 0x33, 0x6C, 0x33, 0x60, 0x33, 0x60, 0x33, 0x6C, 0x33, 0x6C, 0x33, 0xC0, 0x13, 0x80, 0x03}, // 0xEB � - {0x6, 0x00, 0x30, 0x62, 0x30, 0xE6, 0x3F, 0xEC, 0x3F, 0x08, 0x30, 0x00, 0x30}, // 0xEC � - {0x6, 0x00, 0x30, 0x68, 0x30, 0xEC, 0x3F, 0xE6, 0x3F, 0x02, 0x30, 0x00, 0x30}, // 0xED � - {0x6, 0x08, 0x30, 0x6C, 0x30, 0xE6, 0x3F, 0xE6, 0x3F, 0x0C, 0x30, 0x08, 0x30}, // 0xEE � - {0x6, 0x0C, 0x30, 0x6C, 0x30, 0xE0, 0x3F, 0xEC, 0x3F, 0x0C, 0x30, 0x00, 0x30}, // 0xEF � - {0x6, 0x78, 0x1C, 0xFC, 0x3E, 0xCC, 0x33, 0x8C, 0x33, 0x0C, 0x3F, 0x18, 0x1E}, // 0xF0 � - {0x9, 0xE0, 0x3F, 0xE8, 0x3F, 0x6C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x68, 0x00, 0xEC, 0x00, 0xC4, 0x3F, 0x80, 0x3F}, // 0xF1 � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x62, 0x30, 0x66, 0x30, 0x6C, 0x30, 0x68, 0x30, 0xE0, 0x38, 0xC0, 0x1F, 0x80, 0x0F}, // 0xF2 � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x68, 0x30, 0x6C, 0x30, 0x66, 0x30, 0x62, 0x30, 0xE0, 0x38, 0xC0, 0x1F, 0x80, 0x0F}, // 0xF3 � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xE8, 0x38, 0x6C, 0x30, 0x66, 0x30, 0x66, 0x30, 0x6C, 0x30, 0xE8, 0x38, 0xC0, 0x1F, 0x80, 0x0F}, // 0xF4 � - {0xA, 0x80, 0x0F, 0xC8, 0x1F, 0xEC, 0x38, 0x64, 0x30, 0x6C, 0x30, 0x68, 0x30, 0x6C, 0x30, 0xE4, 0x38, 0xC0, 0x1F, 0x80, 0x0F}, // 0xF5 � - {0xA, 0x80, 0x0F, 0xC0, 0x1F, 0xEC, 0x38, 0x6C, 0x30, 0x60, 0x30, 0x60, 0x30, 0x6C, 0x30, 0xEC, 0x38, 0xC0, 0x1F, 0x80, 0x0F}, // 0xF6 � - {0x8, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xB0, 0x0D, 0xB0, 0x0D, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01}, // 0xF7 � - {0xA, 0x80, 0x2F, 0xC0, 0x3F, 0xE0, 0x18, 0x60, 0x3C, 0x60, 0x36, 0x60, 0x33, 0xE0, 0x31, 0xC0, 0x38, 0xE0, 0x1F, 0xA0, 0x0F}, // 0xF8 � - {0xA, 0xE0, 0x0F, 0xE0, 0x1F, 0x00, 0x38, 0x02, 0x30, 0x06, 0x30, 0x0C, 0x30, 0x08, 0x30, 0x00, 0x18, 0xE0, 0x3F, 0xE0, 0x3F}, // 0xF9 � - {0xA, 0xE0, 0x0F, 0xE0, 0x1F, 0x00, 0x38, 0x08, 0x30, 0x0C, 0x30, 0x06, 0x30, 0x02, 0x30, 0x00, 0x18, 0xE0, 0x3F, 0xE0, 0x3F}, // 0xFA � - {0xA, 0xE0, 0x0F, 0xE0, 0x1F, 0x08, 0x38, 0x0C, 0x30, 0x06, 0x30, 0x06, 0x30, 0x0C, 0x30, 0x08, 0x18, 0xE0, 0x3F, 0xE0, 0x3F}, // 0xFB � - {0xA, 0xE0, 0x0F, 0xE0, 0x1F, 0x0C, 0x38, 0x0C, 0x30, 0x00, 0x30, 0x00, 0x30, 0x0C, 0x30, 0x0C, 0x18, 0xE0, 0x3F, 0xE0, 0x3F}, // 0xFC � - {0x8, 0x60, 0x00, 0xE0, 0x81, 0x80, 0xE7, 0x10, 0x7E, 0x18, 0x1E, 0x8C, 0x07, 0xE4, 0x01, 0x60, 0x00}, // 0xFD � - {0x8, 0x0C, 0x30, 0xFC, 0x3F, 0xFC, 0x3F, 0x6C, 0x36, 0x60, 0x06, 0x60, 0x06, 0xE0, 0x07, 0xC0, 0x03}, // 0xFE � - {0x8, 0x60, 0x00, 0xEC, 0x81, 0x8C, 0xE7, 0x00, 0x7E, 0x00, 0x1E, 0x8C, 0x07, 0xEC, 0x01, 0x60, 0x00}, // 0xFF � -#endif -}; - -#endif diff --git a/SmartEVSE-3/SmartEVSE-3/src/glcd.cpp b/SmartEVSE-3/SmartEVSE-3/src/glcd.cpp deleted file mode 100644 index 1d83240..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/glcd.cpp +++ /dev/null @@ -1,1215 +0,0 @@ -/* -; Project: Smart EVSE -; -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include - -#include "evse.h" -#include "glcd.h" -#include "utils.h" - -#include "font.cpp" -#include "font2.cpp" - - -const unsigned char LCD_Flow [] = { -0x00, 0x00, 0x98, 0xCC, 0x66, 0x22, 0x22, 0x22, 0xF2, 0xAA, 0x26, 0x2A, 0xF2, 0x22, 0x22, 0x22, -0x66, 0xCC, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x60, 0xC0, -0x90, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x04, 0xE0, 0x10, 0x08, -0x0B, 0x08, 0x10, 0xE0, 0x04, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x4F, -0x49, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x40, 0x61, 0x31, 0x18, 0x08, 0x08, 0x08, 0x08, 0xFF, 0x08, 0x8D, 0x4A, 0xFF, 0x08, 0x08, 0x08, -0x08, 0x18, 0x31, 0x61, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x03, 0x06, 0x0C, 0x19, 0x32, 0x64, 0xC8, 0x10, 0x00, 0x00, 0x08, 0x04, 0x00, 0x01, 0x02, -0x1A, 0x02, 0x01, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x05, 0x88, 0x50, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xFF, 0x00, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0xF0, 0x10, -0x10, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x80, 0x60, 0x10, 0x08, 0x04, 0x02, 0x82, 0x81, 0x81, 0x81, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x8C, 0x88, 0x88, 0x10, 0x10, 0x20, 0x40, 0x80, 0x00, -0x00, 0x00, 0x00, 0x40, 0x60, 0x30, 0x18, 0x0C, 0x07, 0x05, 0x04, 0x04, 0x07, 0x0C, 0x18, 0x30, -0x68, 0x48, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -0x08, 0x08, 0x00, 0x7F, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x7F, 0x40, -0x40, 0x40, 0x42, 0x40, 0x7F, 0x40, 0x40, 0x7F, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -0x00, 0x06, 0x19, 0x10, 0x10, 0x1C, 0x02, 0x19, 0x24, 0x42, 0x42, 0x24, 0x19, 0x02, 0x1C, 0x10, -0x10, 0x10, 0x10, 0x1C, 0x02, 0x19, 0x24, 0x42, 0x42, 0x24, 0x19, 0x02, 0x1C, 0x10, 0x10, 0x1F -}; - -uint8_t LCDpos = 0; -bool LCDToggle = false; // Toggle display between two values -unsigned char LCDText = 0; // Cycle through text messages -unsigned int GLCDx, GLCDy; -uint8_t GLCDbuf[512]; // GLCD buffer (half of the display) -tm DelayedStartTimeTM; -time_t DelayedStartTime_Old; - -void st7565_command(unsigned char data) { - _A0_0; - SPI.transfer(data); -} - -void st7565_data(unsigned char data) { - _A0_1; - SPI.transfer(data); -} - -void goto_row(unsigned char y) { - unsigned char pattern; - pattern = 0xB0 | (y & 0xBF); // put row address on data port set command - st7565_command(pattern); -} -//-------------------- - -void goto_col(unsigned char x) { - unsigned char pattern; - pattern = ((0xF0 & x) >> 4) | 0x10; - st7565_command(pattern); // set high byte column command - pattern = ((0x0F & x)) | 0x00; - st7565_command(pattern); // set low byte column command; -} -//-------------------- - -void goto_xy(unsigned char x, unsigned char y) { - goto_col(x); - goto_row(y); -} - -void glcd_clrln(unsigned char ln, unsigned char data) { - unsigned char i; - goto_xy(0, ln); - for (i = 0; i < 128; i++) { - st7565_data(data); // put data on data port - } -} - -/* -void glcd_clrln_buffer(unsigned char ln) { - unsigned char i; - if (ln > 7) return; - for (i = 0; i < 128; i++) { - GLCDbuf[i+ (ln * 128)] = 0; - } -} -*/ -void glcd_clear(void) { - unsigned char i; - for (i = 0; i < 8; i++) { - glcd_clrln(i, 0); - } -} - -void GLCD_buffer_clr(void) { - unsigned char x = 0; - do { - GLCDbuf[x++] = 0; // clear first 256 bytes of GLCD buffer - } while (x != 0); -} - -void GLCD_sendbuf(unsigned char RowAdr, unsigned char Rows) { - unsigned char i, y = 0; - unsigned int x = 0; - - do { - goto_xy(0, RowAdr + y); - for (i = 0; i < 128; i++) st7565_data(GLCDbuf[x++]); // put data on data port - } while (++y < Rows); -} - -void GLCD_font_condense(unsigned char c, unsigned char *start, unsigned char *end, unsigned char space) { - if(c >= '0' && c <= '9') return; - if(c == ' ' && space) return; - if(font[c][0] == 0) { - if(font[c][1] == 0) *start = 2; - else *start = 1; - } - if(font[c][4] == 0) *end = 4; -} - -unsigned char GLCD_text_length(const char *str) { - unsigned char i = 0, length = 0; - unsigned char s, e; - - while (str[i]) { - s = 0; - e = 5; - GLCD_font_condense(str[i], &s, &e, 0); - length += (e - s) + 1; - i++; - } - - return length - 1; -} - -#ifdef GLCD_HIRES_FONT -unsigned char GLCD_text_length2(const char *str) { - unsigned char i = 0, length = 0; - - while (str[i]) { - length += font2[(int) str[i]][0] + 2; - i++; - } - - return length - 2; -} -#endif - -/** - * Write character to buffer - * - * @param c - * @param 00000000 Options - * |+++ Shift font down - * +--- Merge with buffer content -*/ -void GLCD_write_buf(unsigned int c, unsigned char Options) { - unsigned int f, x; - unsigned char i = 0, m = 5, shift = 0; - bool merge = false; - - x = 128 * GLCDy; - x += GLCDx; - - GLCD_font_condense(c, &i, &m, 1); // remove whitespace from font - GLCDx += (m - i) + 1; - - if (Options) { - shift = Options & 0b00000111; - if (Options & GLCD_MERGE) merge = true; - } - - do { - f = font[c][i]; - if(shift) f <<= shift; - if(merge) f |= GLCDbuf[x]; - GLCDbuf[x] = f; - x++; - } while (++i < m); -} - -// Write one double height character to the GLCD buffer -// special characters '.' and ' ' will use reduced width in the buffer -void GLCD_write_buf2(unsigned int c) { -#ifdef GLCD_HIRES_FONT - unsigned char i = 1; - - while ((i < (font2[c][0] * 2)) && (GLCDx < 128)) { - GLCDbuf[GLCDx] = font2[c][i]; - GLCDbuf[GLCDx + 128] = font2[c][i + 1]; - i += 2; - GLCDx ++; - } -#else - unsigned char i = 0, m = 5, ch, z1; - - GLCD_font_condense(c, &i, &m, 0); - - while ((i < m) && (GLCDx < 127)) { - z1 = 0; - ch = font[c][i]; - if (ch & 0x01u) z1 |= 0x3u; - if (ch & 0x02u) z1 |= 0xcu; - if (ch & 0x04u) z1 |= 0x30u; - if (ch & 0x08u) z1 |= 0xc0u; - GLCDbuf[GLCDx] = z1; - GLCDbuf[GLCDx + 1] = z1; - z1 = 0; - ch = ch >> 4; - if (ch & 0x01u) z1 |= 0x3u; - if (ch & 0x02u) z1 |= 0xcu; - if (ch & 0x04u) z1 |= 0x30u; - if (ch & 0x08u) z1 |= 0xc0u; - GLCDbuf[GLCDx + 128] = z1; - GLCDbuf[GLCDx + 129] = z1; - i++; - GLCDx += 2; - }; -#endif - GLCDx += 2; -} - -/** - * Write a string to LCD buffer - * - * @param str - * @param x - * @param y - * @param Options - */ -void GLCD_write_buf_str(unsigned char x, unsigned char y, const char* str, unsigned char Options) { - unsigned char i = 0; - - switch(Options) { - case GLCD_ALIGN_LEFT: - GLCDx = x; - break; - case GLCD_ALIGN_CENTER: - GLCDx = x - (GLCD_text_length(str) / 2); - break; - case GLCD_ALIGN_RIGHT: - GLCDx = x - GLCD_text_length(str); - break; - } - - GLCDy = y; - while (str[i]) { - GLCD_write_buf(str[i++], 0); - } -} - -void GLCD_write_buf_str2(const char *str, unsigned char Options) { - unsigned char i = 0; - -#ifdef GLCD_HIRES_FONT - if (Options == GLCD_ALIGN_CENTER) GLCDx = 64 - GLCD_text_length2(str) / 2; -#else - if (Options == GLCD_ALIGN_CENTER) GLCDx = 64 - GLCD_text_length(str); -#endif - else GLCDx = 2; - - while (str[i]) { - GLCD_write_buf2(str[i++]); - } -} - -void GLCD_print_buf(unsigned char y, const char *str) { - GLCD_buffer_clr(); // Clear buffer - GLCD_write_buf_str(0, y, str, GLCD_ALIGN_LEFT); - GLCD_sendbuf(y, 1); // copy buffer to LCD -} - -// uses buffer -void GLCD_print_buf2_left(const char *data) { - GLCD_buffer_clr(); // Clear buffer - GLCD_write_buf_str2(data, GLCD_ALIGN_LEFT); - GLCD_sendbuf(2, 2); // copy buffer to LCD -} - -void GLCD_print_buf2(unsigned char y, const char* str) { - GLCD_buffer_clr(); // Clear buffer - GLCD_write_buf_str2(str, GLCD_ALIGN_CENTER); - GLCD_sendbuf(y, 2); // copy buffer to LCD -} - -// Write Menu to buffer, then send to GLCD -void GLCD_print_menu(unsigned char y, const char* str) { - GLCD_buffer_clr(); // Clear buffer - GLCD_write_buf_str2(str, GLCD_ALIGN_CENTER); - - if ((SubMenu && y == 4) || (!SubMenu && y == 2)) { // navigation arrows - GLCDx = 0; - GLCD_write_buf2('<'); - GLCDx = 10 * 12; // last character of line - GLCD_write_buf2('>'); - } - - GLCD_sendbuf(y, 2); -} - - -/** - * Increase or decrease int value - * - * @param unsigned int Buttons - * @param unsigned int Value - * @param unsigned int Min - * @param unsigned int Max - * @return unsigned int Value - */ -unsigned int MenuNavInt(unsigned char Buttons, unsigned int Value, unsigned int Min, unsigned int Max) { - if (Buttons == 0x3) { - if (Value >= Max) Value = Min; - else Value++; - } else if (Buttons == 0x6) { - if (Value <= Min) Value = Max; - else Value--; - } - - return Value; -} - -/** - * Get to next or previous value of an char array - * - * @param unsigned char Buttons - * @param unsigned char Value - * @param unsigned char Count - * @param unsigned char array Values - * @return unsigned char Value - */ -unsigned char MenuNavCharArray(unsigned char Buttons, unsigned char Value, unsigned char Values[], unsigned char Count) { - unsigned int i; - - for (i = 0; i < Count; i++) { - if (Value == Values[i]) break; - } - i = MenuNavInt(Buttons, i, 0, Count - 1u); - - return Values[i]; -} - -// uses buffer -void GLCDHelp(void) // Display/Scroll helptext on LCD -{ - unsigned int x; - - x = strlen(MenuStr[LCDNav].Desc); - GLCD_print_buf2_left(MenuStr[LCDNav].Desc + LCDpos); - - if (LCDpos++ == 0) ScrollTimer = millis() - 4000; - else if (LCDpos > (x - 10)) { - ScrollTimer = millis() - 3000; - LCDpos = 0; - } else ScrollTimer = millis() - 4700; -} - - -// called once a second -void GLCD(void) { - unsigned char x; - unsigned int seconds, minutes; - static unsigned char energy_mains = 20; // X position - static unsigned char energy_ev = 74; // X position - char Str[26]; - - LCDTimer++; - - if (LCDNav) { - GLCD_buffer_clr(); - // top line - if (LCDNav == MENU_RFIDREADER && SubMenu) { - if (RFIDstatus == 2) GLCD_print_buf(0, (const char*) "Card Stored"); - else if (RFIDstatus == 3) GLCD_print_buf(0, (const char*) "Card Deleted"); - else if (RFIDstatus == 4) GLCD_print_buf(0, (const char*) "Card already stored!"); - else if (RFIDstatus == 5) GLCD_print_buf(0, (const char*) "Card not in storage!"); - else if (RFIDstatus == 6) GLCD_print_buf(0, (const char*) "Card storage full!"); - else glcd_clrln(0, 0x00); // Clear line - LCDTimer = 0; // reset timer, so it will not exit the menu when learning/deleting cards - } else { - // When connected to Wifi, display IP and time in top row - uint8_t WIFImode = getItemValue(MENU_WIFI); - if (WIFImode == 1 ) { // Wifi Enabled - - if (WiFi.status() == WL_CONNECTED) { - sprintf(Str, "%s",WiFi.localIP().toString().c_str()); - GLCD_write_buf_str(0,0, Str, GLCD_ALIGN_LEFT); - if (LocalTimeSet) sprintf(Str, "%02u:%02u",timeinfo.tm_hour, timeinfo.tm_min); - else sprintf(Str, "--:--"); - GLCD_write_buf_str(127,0, Str, GLCD_ALIGN_RIGHT); - } else GLCD_write_buf_str(0,0, "Not connected to WiFi", GLCD_ALIGN_LEFT); - - // When Wifi Setup is selected, show password and SSID of the Access Point - } else if (WIFImode == 2) { - if (SubMenu && WiFi.getMode() != WIFI_AP_STA) { // Do not show if AP_STA mode is started - sprintf(Str, "O button starts portal"); - GLCD_write_buf_str(0,0, Str, GLCD_ALIGN_LEFT); - } else { - // Show Access Point name - sprintf(Str, "AP:%u", serialnr); - GLCD_write_buf_str(0,0, Str, GLCD_ALIGN_LEFT); - // and password - sprintf(Str, "PW:%s", APpassword.c_str()); - GLCD_write_buf_str(127,0, Str, GLCD_ALIGN_RIGHT); - } - } - } - // update LCD - GLCD_sendbuf(0, 1); - - if (LCDTimer > 120) { - LCDNav = 0; // Exit Setup menu after 120 seconds. - read_settings(); // don't save, but restore settings - } else return; // disable LCD status messages when navigating LCD Menu - } // if LCDNav - - if (LCDTimer == 1) { - LCDText = 0; - } else if (LCDTimer > 4) { - LCDTimer = 1; - LCDToggle = 1u - LCDToggle; - LCDText++; - } - - if (ErrorFlags) { // We switch backlight on, as we exit after displaying the error - BacklightTimer = BACKLIGHT; // Backlight timer is set to 120 seconds - - if (ErrorFlags & (CT_NOCOMM | EV_NOCOMM)) { // No serial communication for 10 seconds - - if (ErrorFlags & EV_NOCOMM) { - GLCD_print_buf2(0, (const char *) "CAN'T READ"); - GLCD_print_buf2(2, (const char *) "EV METER"); - } else { - GLCD_print_buf2(0, (const char *) "ERROR NO"); - GLCD_print_buf2(2, (const char *) "SERIAL COM"); - } - GLCD_print_buf2(4, (const char *) "CHECK CFG"); - GLCD_print_buf2(6, (const char *) "OR WIRING"); - return; - } else if (ErrorFlags & TEMP_HIGH) { // Temperature reached 65C - GLCD_print_buf2(0, (const char *) "HIGH TEMP"); - GLCD_print_buf2(2, (const char *) "ERROR"); - GLCD_print_buf2(4, (const char *) "CHARGING"); - GLCD_print_buf2(6, (const char *) "STOPPED"); - return; - } else if (ErrorFlags & RCM_TRIPPED) { // Residual Current Sensor tripped - if (!LCDToggle) { - GLCD_print_buf2(0, (const char *) "RESIDUAL"); - GLCD_print_buf2(2, (const char *) "FAULT"); - GLCD_print_buf2(4, (const char *) "CURRENT"); - GLCD_print_buf2(6, (const char *) "DETECTED"); - } else { - GLCD_print_buf2(0, (const char *) "PRESS"); - GLCD_print_buf2(2, (const char *) "BUTTON"); - GLCD_print_buf2(4, (const char *) "TO"); - GLCD_print_buf2(6, (const char *) "RESET"); - } - return; - } else if (ErrorFlags & Test_IO) { // Only used when testing the module - GLCD_print_buf2(2, (const char *) "IO Test"); - sprintf(Str, "FAILED! %u", TestState); - GLCD_print_buf2(4, Str); - return; - } else if (ErrorFlags & BL_FLASH) { // Bootloader update error - GLCD_print_buf2(2, (const char *) "BOOTLOADER"); - GLCD_print_buf2(4, (const char *) "UPDATE ERR"); - return; - } - } // end of ERROR() // more specific error handling in the code below - - if (TestState == 80) { // Only used when testing the module - GLCD_print_buf2(2, (const char *) "IO Test"); - GLCD_print_buf2(4, (const char *) "Passed"); - return; - } - - // MODE NORMAL - if (Mode == MODE_NORMAL || !Access_bit) { - - glcd_clrln(0, 0x00); - glcd_clrln(1, 0x04); // horizontal line - glcd_clrln(6, 0x10); // horizontal line - glcd_clrln(7, 0x00); - - if (ErrorFlags & LESS_6A) { - GLCD_print_buf2(2, (const char *) "WAITING"); - GLCD_print_buf2(4, (const char *) "FOR POWER"); - } else if (State == STATE_MODEM_REQUEST || State == STATE_MODEM_WAIT || State == STATE_MODEM_DONE) { // Modem states - - BacklightTimer = BACKLIGHT; - - GLCD_print_buf2(2, (const char *) "MODEM"); - GLCD_print_buf2(4, (const char *) "COMM"); - } else if (State == STATE_MODEM_DENIED) { // Modem denied state - - BacklightTimer = BACKLIGHT; - - GLCD_print_buf2(2, (const char *) "MODEM"); - GLCD_print_buf2(4, (const char *) "DENIED"); - } else if (State == STATE_C) { // STATE C - - BacklightTimer = BACKLIGHT; - - GLCD_print_buf2(2, (const char *) "CHARGING"); - sprintf(Str, "%u.%uA",Balanced[0] / 10, Balanced[0] % 10); - GLCD_print_buf2(4, Str); - } else { // STATE A and STATE B - if (Access_bit) { - GLCD_print_buf2(2, (const char *) "READY TO"); - sprintf(Str, "CHARGE %u", ChargeDelay); - if (ChargeDelay) { - // BacklightTimer = BACKLIGHT; - } else Str[6] = '\0'; - GLCD_print_buf2(4, Str); - } else { - if (getItemValue(MENU_RFIDREADER)) { - if (RFIDstatus == 7) { - GLCD_print_buf2(2, (const char *) "INVALID"); - GLCD_print_buf2(4, (const char *) "RFID CARD"); - } else { - GLCD_print_buf2(2, (const char *) "PRESENT"); - GLCD_print_buf2(4, (const char *) "RFID CARD"); - } - } else { - if (DelayedStartTime.epoch2) { - GLCD_print_buf2(2, (const char *) "STARTING @"); -#define _24H 24*60*60 -#define _WEEK 7*_24H - String StrFormat; - if (DelayedStartTime.diff <= _24H) - //if it starts in the next 24 hours, just print hours : minutes - StrFormat = "%R"; - else { - //if it starts in the next week, print day of week, day of month, hours: minutes - if (DelayedStartTime.diff <= _WEEK) - StrFormat = "%a %e %R"; - else - //if it starts later, print day of week, day of month, month, year perhaps scrolling hours/minutes? - StrFormat = "%a %e %b"; - //StrFormat = "%a %e %b '%C %R"; - } - if (DelayedStartTime.epoch2 && LocalTimeSet && DelayedStartTime.epoch2 != DelayedStartTime_Old) { - time_t epoch = DelayedStartTime.epoch2 + EPOCH2_OFFSET; - DelayedStartTimeTM = *localtime(&epoch); - } - if (!strftime(Str, 26, StrFormat.c_str(), &DelayedStartTimeTM)) - sprintf(Str, "later..."); - GLCD_print_buf2(4, Str); - //print current time - if (LocalTimeSet) { - GLCD_buffer_clr(); - if (strftime(Str, 26, "%a %e %b '%y %R", &timeinfo)) - GLCD_write_buf_str(0,0, Str, GLCD_ALIGN_LEFT); - GLCD_sendbuf(7, 1); - } - } else { - GLCD_print_buf2(2, (const char *) "ACCESS"); - GLCD_print_buf2(4, (const char *) "DENIED"); - } - } - } - } - } // MODE SMART or SOLAR - else if ((Mode == MODE_SMART) || (Mode == MODE_SOLAR)) { - - memcpy (GLCDbuf, LCD_Flow, 512); // copy Flow Menu to LCD buffer - - if (Mode == MODE_SMART) { // remove the Sun from the LCD buffer - for (x=0; x<13; x++) { - GLCDbuf[x+74u] = 0; - GLCDbuf[x+74u+128u] = 0; - } - } - if (SolarStopTimer) { - seconds = SolarStopTimer; // display remaining time before charging is stopped - minutes = seconds / 60; - seconds = seconds % 60; - sprintf(Str, "%02u:%02u", minutes, seconds); - GLCD_write_buf_str(100, 0, Str, GLCD_ALIGN_LEFT); // print to buffer - } else { - for (x = 0; x < 8; x++) GLCDbuf[x + 92u] = 0; // remove the clock from the LCD buffer - } - - - if (Isum < 0) { - energy_mains -= 3; // animate the flow of Mains energy on LCD. - if (energy_mains < 20) energy_mains = 44; // Only in Mode: Smart or Solar - } else { - energy_mains += 3; - if (energy_mains > 44) energy_mains = 20; - } - - GLCDx = energy_mains; - GLCDy = 3; - - if (abs(Isum) >3 ) GLCD_write_buf(0x0A, 0); // Show energy flow 'blob' between Grid and House - // If current flow is < 0.3A don't show the blob - - if (EVMeter) { // If we have a EV kWh meter configured, Show total charged energy in kWh on LCD. - sprintfl(Str, "%2u.%1ukWh", EnergyCharged, 3, 1); // Will reset to 0.0kWh when charging cable reconnected, and state change from STATE B->C - GLCD_write_buf_str(89, 1, Str,GLCD_ALIGN_LEFT); // print to buffer - } - - // Write number of used phases into the car - /* if (Node[0].Phases) { - GLCDx = 110; - GLCDy = 2; - GLCD_write_buf(Node[0].Phases, 2 | GLCD_MERGE); - } -*/ - if (State == STATE_C) { - BacklightTimer = BACKLIGHT; - - energy_ev += 3; // animate energy flow to EV - if (energy_ev > 89) energy_ev = 74; - - GLCDx = energy_ev; - GLCDy = 3; - GLCD_write_buf(0x0A, 0); // Show energy flow 'blob' between House and Car - - if (LCDToggle && EVMeter) { - if (PowerMeasured < 9950) { - sprintfl(Str, "%1u.%1ukW", PowerMeasured, 3, 1); - } else { - sprintfl(Str, "%ukW", PowerMeasured, 3, 0); - } - } else { - sprintfl(Str, "%uA", Balanced[0], 1, 0); - } - GLCD_write_buf_str(85, 2, Str, GLCD_ALIGN_CENTER); - } else if (State == STATE_A) { - // Remove line between House and Car - for (x = 73; x < 96; x++) GLCDbuf[3u * 128u + x] = 0; - } - - if (LCDToggle && Mode == MODE_SOLAR) { // Show Sum of currents when solar charging. - GLCDx = 41; - GLCDy = 1; - GLCD_write_buf(0x0B, 0); // Sum symbol - - sprintfl(Str, "%dA", Isum, 1, 0); - GLCD_write_buf_str(46, 2, Str, GLCD_ALIGN_RIGHT); // print to buffer - } else { // Displayed only in Smart and Solar modes - for (x = 0; x < 3; x++) { // Display L1, L2 and L3 currents on LCD - sprintfl(Str, "%dA", Irms[x], 1, 0); - GLCD_write_buf_str(46, x, Str, GLCD_ALIGN_RIGHT); // print to buffer - } - } - GLCD_sendbuf(0, 4); // Copy LCD buffer to GLCD - - glcd_clrln(4, 0); // Clear line 4 - if (ErrorFlags & LESS_6A) { - if (!LCDToggle) { - GLCD_print_buf2(5, (const char *) "WAITING"); - } else GLCD_print_buf2(5, (const char *) "FOR POWER"); - } else if (ErrorFlags & NO_SUN) { - if (!LCDToggle) { - GLCD_print_buf2(5, (const char *) "WAITING"); - } else GLCD_print_buf2(5, (const char *) "FOR SOLAR"); - } else if (State == STATE_MODEM_REQUEST || State == STATE_MODEM_WAIT || State == STATE_MODEM_DONE) { // Modem states - GLCD_print_buf2(5, (const char *) "MODEM"); - } else if (State != STATE_C) { - switch (Switching_To_Single_Phase) { - case FALSE: - sprintf(Str, "READY %u", ChargeDelay); - if (!ChargeDelay) Str[5] = '\0'; - break; - case GOING_TO_SWITCH: - sprintf(Str, "3F -> 1F %u", ChargeDelay); - if (!ChargeDelay) Str[7] = '\0'; - break; - case AFTER_SWITCH: // never getting here, just preventing compiler warning - break; - } - GLCD_print_buf2(5, Str); - } else if (State == STATE_C) { - switch (LCDText) { - default: - LCDText = 0; - if (Mode != MODE_NORMAL) { - if (Mode == MODE_SOLAR) sprintf(Str, "SOLAR"); - else sprintf(Str, "SMART"); - if (Nr_Of_Phases_Charging != 0) { - sprintf(Str+5," %uF", Nr_Of_Phases_Charging); - } - GLCD_print_buf2(5, Str); - break; - } else LCDText++; - // fall through - case 1: - GLCD_print_buf2(5, (const char *) "CHARGING"); - break; - case 2: - if (EVMeter) { - sprintfl(Str, "%u.%01u kW", PowerMeasured, 3, 1); - GLCD_print_buf2(5, Str); - break; - } else LCDText++; - // fall through - case 3: - if (EVMeter) { - sprintfl(Str, "%u.%02u kWh", EnergyCharged, 3, 2); - GLCD_print_buf2(5, Str); - break; - } else LCDText++; - // fall through - case 4: - sprintf(Str, "%u.%u A", Balanced[0] / 10, Balanced[0] % 10); - GLCD_print_buf2(5, Str); - break; - } - } - glcd_clrln(7, 0x00); - } // End Mode SMART or SOLAR - -} - - -/** - * Counts nr of menu options currently available - * - * @param unsigned char count - * @return unsigned char postion - */ -unsigned char GetPosInMenu (unsigned char count) { - unsigned char i; - - for (i = 0; i < count; i++) { - if (MenuItems[i] == LCDNav) return i + 1u; - } - return 0; -} - - -/** - * Get active option of an menu item - * - * @param uint8_t nav - * @return uint8_t[] MenuItemOption - */ -const char * getMenuItemOption(uint8_t nav) { - static char Str[12]; // must be declared static, since it's referenced outside of function scope - - // Text - const static char StrFixed[] = "Fixed"; - const static char StrSocket[] = "Socket"; - const static char StrSmart[] = "Smart"; - const static char StrNormal[] = "Normal"; - const static char StrSolar[] = "Solar"; - const static char StrSolenoid[] = "Solenoid"; - const static char StrMotor[] = "Motor"; - const static char StrDisabled[] = "Disabled"; - const static char StrLoadBl[9][9] = {"Disabled", "Master", "Node 1", "Node 2", "Node 3", "Node 4", "Node 5", "Node 6", "Node 7"}; - const static char StrSwitch[5][10] = {"Disabled", "Access B", "Access S", "Sma-Sol B", "Sma-Sol S"}; - const static char StrGrid[2][10] = {"4Wire", "3Wire"}; - const static char StrEnabled[] = "Enabled"; - const static char StrExitMenu[] = "MENU"; - const static char StrRFIDReader[6][10] = {"Disabled", "EnableAll", "EnableOne", "Learn", "Delete", "DeleteAll"}; - const static char StrWiFi[3][10] = {"Disabled", "Enabled", "SetupWifi"}; - - unsigned int value = getItemValue(nav); - - switch (nav) { - case MENU_MAX_TEMP: - sprintf(Str, "%2u C", value); - return Str; - case MENU_C2: - return StrEnableC2[value]; - case MENU_CONFIG: - if (value) return StrFixed; - else return StrSocket; - case MENU_MODE: - if (Mode == MODE_SMART) return StrSmart; - else if (Mode == MODE_SOLAR) return StrSolar; - else return StrNormal; - case MENU_START: - sprintf(Str, "-%2u A", value); - return Str; - case MENU_STOP: - if (value) { - sprintf(Str, "%2u min", value); - return Str; - } else return StrDisabled; - case MENU_LOADBL: - return StrLoadBl[LoadBl]; - case MENU_MAINS: - case MENU_SUMMAINS: - case MENU_MIN: - case MENU_MAX: - case MENU_CIRCUIT: - case MENU_IMPORT: - sprintf(Str, "%2u A", value); - return Str; - case MENU_LOCK: - if (value == 1) return StrSolenoid; - else if (value == 2) return StrMotor; - else return StrDisabled; - case MENU_SWITCH: - return StrSwitch[value]; - case MENU_RCMON: - if (value) return StrEnabled; - else return StrDisabled; - case MENU_MAINSMETER: - case MENU_EVMETER: - return (const char*)EMConfig[value].Desc; - case MENU_GRID: - return StrGrid[value]; - case MENU_MAINSMETERADDRESS: - case MENU_EVMETERADDRESS: - case MENU_EMCUSTOM_UREGISTER: - case MENU_EMCUSTOM_IREGISTER: - case MENU_EMCUSTOM_PREGISTER: - case MENU_EMCUSTOM_EREGISTER: - if(value < 0x1000) sprintf(Str, "%u (%02X)", value, value); // This just fits on the LCD. - else sprintf(Str, "%u %X", value, value); - return Str; - case MENU_EMCUSTOM_ENDIANESS: - switch(value) { - case 0: return "LBF & LWF"; - case 1: return "LBF & HWF"; - case 2: return "HBF & LWF"; - case 3: return "HBF & HWF"; - default: return ""; - } - case MENU_EMCUSTOM_DATATYPE: - switch (value) { - case MB_DATATYPE_INT16: return "INT16"; - case MB_DATATYPE_INT32: return "INT32"; - case MB_DATATYPE_FLOAT32: return "FLOAT32"; - } - // fall through - case MENU_EMCUSTOM_FUNCTION: - switch (value) { - case 3: return "3:Hold. Reg"; - case 4: return "4:Input Reg"; - default: return ""; - } - case MENU_EMCUSTOM_UDIVISOR: - case MENU_EMCUSTOM_IDIVISOR: - case MENU_EMCUSTOM_PDIVISOR: - case MENU_EMCUSTOM_EDIVISOR: - sprintf(Str, "%lu", pow_10[value]); - return Str; - case MENU_RFIDREADER: - return StrRFIDReader[value]; - case MENU_WIFI: - return StrWiFi[value]; - case MENU_EXIT: - return StrExitMenu; - default: - return ""; - } -} - - -/** - * Create an array of available menu items - * Depends on configuration settings like CONFIG/MODE/LoadBL - * - * @return uint8_t MenuItemCount - */ -uint8_t getMenuItems (void) { - uint8_t m = 0; - - uint8_t MainsMeter = getItemValue(MENU_MAINSMETER); - MenuItems[m++] = MENU_MODE; // EVSE mode (0:Normal / 1:Smart / 2: Solar) - MenuItems[m++] = MENU_CONFIG; // Configuration (0:Socket / 1:Fixed Cable) - if (!getItemValue(MENU_CONFIG)) { // ? Fixed Cable? - MenuItems[m++] = MENU_LOCK; // - Cable lock (0:Disable / 1:Solenoid / 2:Motor) - } - MenuItems[m++] = MENU_LOADBL; // Load Balance Setting (0:Disable / 1:Master / 2-8:Node) - if (Mode) { // ? Smart or Solar mode? - if (LoadBl < 2) { // - ? Load Balancing Disabled/Master? - MenuItems[m++] = MENU_MAINSMETER; // - - Type of Mains electric meter (0: Disabled / Constants EM_*) - if (MainsMeter == EM_SENSORBOX) { // - - ? Sensorbox? - if (GridActive == 1) MenuItems[m++] = MENU_GRID; -// if (CalActive == 1) MenuItems[m++] = MENU_CAL; // - - - Sensorbox CT measurement calibration - } else if (MainsMeter && MainsMeter != EM_API) { // - - ? Other? - MenuItems[m++] = MENU_MAINSMETERADDRESS; // - - - Address of Mains electric meter (9 - 247) - } - } - MenuItems[m++] = MENU_EVMETER; // - Type of EV electric meter (0: Disabled / Constants EM_*) - if (EVMeter && EVMeter != EM_API) { // - ? EV meter configured? - MenuItems[m++] = MENU_EVMETERADDRESS; // - - Address of EV electric meter (9 - 247) - } - if (LoadBl < 2) { // - ? Load Balancing Disabled/Master? - if (MainsMeter == EM_CUSTOM || EVMeter == EM_CUSTOM) { // ? Custom electric meter used? - MenuItems[m++] = MENU_EMCUSTOM_ENDIANESS; // - - Byte order of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_DATATYPE; // - - Data type of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_FUNCTION; // - - Modbus Function of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_UREGISTER; // - - Starting register for voltage of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_UDIVISOR; // - - Divisor for voltage of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_IREGISTER; // - - Starting register for current of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_IDIVISOR; // - - Divisor for current of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_PREGISTER; // - - Starting register for power of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_PDIVISOR; // - - Divisor for power of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_EREGISTER; // - - Starting register for energy of custom electric meter - MenuItems[m++] = MENU_EMCUSTOM_EDIVISOR; // - - Divisor for energy of custom electric meter - } - if (MainsMeter) { // Mainsmeter is configured and Load Balancing Disabled/Master? - MenuItems[m++] = MENU_MAINS; // - Max Mains Amps (hard limit, limited by the MAINS connection) (A) (Mode:Smart/Solar) - MenuItems[m++] = MENU_MIN; // - Minimal current the EV is happy with (A) (Mode:Smart/Solar or LoadBl:Master) - } - } - } - MenuItems[m++] = MENU_MAX; // Max Charge current (A) - if (LoadBl == 1 || (LoadBl == 0 && Mode != MODE_NORMAL && EVMeter)) { // ? Load balancing Master? - // Also, when not in Normal Mode and that EV meter is present, MaxCircuit will limit - // the total current (subpanel configuration) - MenuItems[m++] = MENU_CIRCUIT; // - Max current of the EVSE circuit (A) - } - if (Mode == MODE_SOLAR && LoadBl < 2) { // ? Solar mode and Load Balancing Disabled/Master? - MenuItems[m++] = MENU_START; // - Start Surplus Current (A) - MenuItems[m++] = MENU_STOP; // - Stop time (min) - MenuItems[m++] = MENU_IMPORT; // - Import Current from Grid (A) - MenuItems[m++] = MENU_C2; - } - MenuItems[m++] = MENU_SWITCH; // External Switch on SW (0:Disable / 1:Access / 2:Smart-Solar) - MenuItems[m++] = MENU_RCMON; // Residual Current Monitor on RCM (0:Disable / 1:Enable) - MenuItems[m++] = MENU_RFIDREADER; // RFID Reader connected to SW (0:Disable / 1:Enable / 2:Learn / 3:Delete / 4:Delate All) - MenuItems[m++] = MENU_WIFI; // Wifi Disabled / Enabled / Portal - MenuItems[m++] = MENU_MAX_TEMP; - if (MainsMeter && LoadBl < 2) - MenuItems[m++] = MENU_SUMMAINS; - MenuItems[m++] = MENU_EXIT; - - return m; -} - - - -/** - * Called when one of the SmartEVSE buttons is pressed - * - * @param Buttons: < o > - * Value: 1 2 4 - * Bit: 0:Pressed / 1:Released - */ -void GLCDMenu(uint8_t Buttons) { - static unsigned long ButtonTimer = 0; - static uint8_t ButtonRelease = 0; // keeps track of LCD Menu Navigation - static uint16_t CT1, value, ButtonRepeat = 0; - char Str[24]; - - unsigned char MenuItemsCount = getMenuItems(); - - // Main Menu Navigation - BacklightTimer = BACKLIGHT; // delay before LCD backlight turns off. - - // Disable buttons when access switch is configured and access is denied - if ((getItemValue(MENU_SWITCH) == 1 || getItemValue(MENU_SWITCH) == 2) && Access_bit == 0 && LCDNav == 0) - return; - - if (getItemValue(MENU_RCMON) == 1 && (ErrorFlags & RCM_TRIPPED) && RCMFAULT == LOW) { // RCM was tripped, but RCM level is back to normal - ErrorFlags &= ~RCM_TRIPPED; // Clear RCM error bit, by pressing any button - } - - if ((LCDNav == 0) && (Buttons == 0x5) && (ButtonRelease == 0)) { // Button 2 pressed ? - LCDNav = MENU_ENTER; // about to enter menu - ButtonTimer = millis(); - } else if (LCDNav == MENU_ENTER && ((ButtonTimer + 2000) < millis() )) { // - LCDNav = MenuItems[0]; // Main Menu entered - ButtonRelease = 1; - } else if ((LCDNav == MENU_ENTER) && (Buttons == 0x7)) { // Button 2 released before entering menu? - LCDNav = 0; - ButtonRelease = 0; - GLCD(); - // stop charging if < button is pressed longer then 2 seconds - } else if ((LCDNav == 0) && (Buttons == 0x6) && (ButtonRelease == 0)) { // Button 1 pressed ? - LCDNav = MENU_OFF; // about to cancel charging - ButtonTimer = millis(); - } else if (LCDNav == MENU_OFF && ((ButtonTimer + 2000) < millis() )) { - LCDNav = 0; // Charging canceled - setAccess(false); - ButtonRelease = 1; - } else if ((LCDNav == MENU_OFF) && (Buttons == 0x7)) { // Button 1 released before entering menu? - LCDNav = 0; - ButtonRelease = 0; - GLCD(); - // start charging if > button is pressed longer then 2 seconds - } else if ((Access_bit == 0) && (LCDNav == 0) && (Buttons == 0x3) && (ButtonRelease == 0)) { // Button 3 pressed ? - LCDNav = MENU_ON; // about to start charging - ButtonTimer = millis(); - } else if (LCDNav == MENU_ON && ((ButtonTimer + 2000) < millis() )) { - LCDNav = 0; // Charging canceled - setAccess(true); - ButtonRelease = 1; - } else if ((LCDNav == MENU_ON) && (Buttons == 0x7)) { // Button 1 released before entering menu? - LCDNav = 0; - ButtonRelease = 0; - GLCD(); - //////////////// - } else if (Buttons == 0x2 && (ButtonRelease < 2)) { // Buttons < and > pressed ? - if ((LCDNav == MENU_CAL) && SubMenu ) { // While in CT CAL submenu ? - ICal = ICAL; // reset Calibration value - SubMenu = 0; // Exit Submenu - } else if (LCDNav == 0) GLCD_init(); // When not in Menu, re-initialize LCD - ButtonRelease = 1; - } else if ((LCDNav > 1) && LCDNav != MENU_OFF && LCDNav != MENU_ON && (Buttons == 0x2 || Buttons == 0x3 || Buttons == 0x6)) { // Buttons < or > or both pressed - if (ButtonRelease == 0) { // We are navigating between sub menu options - if (SubMenu) { - value = getItemValue(LCDNav); - switch (LCDNav) { - case MENU_CAL: - CT1 = MenuNavInt(Buttons, CT1, 60, 999); // range 6.0 - 99.9A - break; - case MENU_MAINSMETER: - do { - value = MenuNavInt(Buttons, value, MenuStr[LCDNav].Min, MenuStr[LCDNav].Max); - } while (value >= EM_UNUSED_SLOT1 && value <= EM_UNUSED_SLOT4); - setItemValue(LCDNav, value); - break; - case MENU_EVMETER: // do not display the Sensorbox or unused slots here - do { - value = MenuNavInt(Buttons, value, MenuStr[LCDNav].Min, MenuStr[LCDNav].Max); - } while (value == EM_SENSORBOX || (value >= EM_UNUSED_SLOT1 && value <= EM_UNUSED_SLOT4)); - setItemValue(LCDNav, value); - break; - case MENU_WIFI: - value = MenuNavInt(Buttons, value, MenuStr[LCDNav].Min, MenuStr[LCDNav].Max); - setItemValue(LCDNav, value); - if (value !=2 ) - handleWIFImode(); //postpone handling WIFImode == 2 to moving to upper line - break; - default: - value = MenuNavInt(Buttons, value, MenuStr[LCDNav].Min, MenuStr[LCDNav].Max); - setItemValue(LCDNav, value); - break; - } - } else { - LCDNav = MenuNavCharArray(Buttons, LCDNav, MenuItems, MenuItemsCount); - } - ButtonRelease = 1; - // Repeat button after 0.5 second - } else if (ButtonRelease == 2 && ButtonRepeat == 0) { - ButtonRepeat = 500; - ButtonTimer = millis() + ButtonRepeat; - } else if (ButtonRepeat && millis() > ButtonTimer) { - ButtonRelease = 0; - if (ButtonRepeat > 1) { - ButtonRepeat -= (ButtonRepeat / 8); - ButtonTimer = millis() + ButtonRepeat; - } - } - } else if (LCDNav > 1 && LCDNav != MENU_OFF && LCDNav != MENU_ON && Buttons == 0x5 && ButtonRelease == 0) { // Button 2 pressed? - ButtonRelease = 1; - if (SubMenu) { // We are currently in Submenu - SubMenu = 0; // Exit Submenu now - if (LCDNav == MENU_CAL && Iuncal) { // Exit CT1 calibration? check if Iuncal is not zero - ICal = ((unsigned long)CT1 * 10 + 5) * ICAL / Iuncal; // Calculate new Calibration value - Irms[0] = CT1; // Set the Irms value, so the LCD update is instant - } - uint8_t WIFImode = getItemValue(MENU_WIFI); - if (LCDNav == MENU_WIFI && WIFImode == 2) - handleWIFImode(); - } else { // We are currently not in Submenu. - SubMenu = 1; // Enter Submenu now - if (LCDNav == MENU_CAL) { // CT1 calibration start - CT1 = (unsigned int) abs(Irms[0]); // make working copy of CT1 value - } else if (LCDNav == MENU_EXIT) { // Exit Main Menu - LCDNav = 0; - SubMenu = 0; - ErrorFlags = NO_ERROR; // Clear All Errors when exiting the Main Menu - TestState = 0; // Clear TestState - ChargeDelay = 0; // Clear ChargeDelay - setSolarStopTimer(0); // Disable Solar Timer - GLCD(); - write_settings(); // Write to eeprom - ButtonRelease = 2; // Skip updating of the LCD - } - } - - } else if (Buttons == 0x7) { // Buttons released - ButtonRelease = 0; - ButtonRepeat = 0; - delay(10); // debounce keys (blocking) - } - - // - // here we update the LCD - // - String HoldStr = ""; - switch (LCDNav) { - case 1: - HoldStr = "for Menu"; - break; - case MENU_OFF: - HoldStr = "to Stop"; - break; - case MENU_ON: - HoldStr = "to Start"; - break; - case MENU_CAL: - if (ButtonRelease == 1) { - GLCD_print_menu(2, MenuStr[LCDNav].LCD); // add navigation arrows on both sides - if (SubMenu) { - sprintf(Str, "%u.%uA", CT1 / 10, CT1 % 10); - } else { - sprintf(Str, "%u.%uA",((unsigned int) abs(Irms[0]) / 10), ((unsigned int) abs(Irms[0]) % 10) ); - } - GLCD_print_menu(4, Str); - } - break; - default: - //so we are anything else then 1, MENU_OFF, MENU_ON - if (ButtonRelease == 1) { - GLCD_print_menu(4, getMenuItemOption(LCDNav)); // print Menu - if (LCDNav != 0) { - GLCD_print_menu(2, MenuStr[LCDNav].LCD); // add navigation arrows on both sides - // Bottom row of the GLCD - GLCD_buffer_clr(); - sprintf(Str, "%i%cC", getItemValue(STATUS_TEMP), 0x0C); // ° Degree symbol - GLCD_write_buf_str(0, 0, Str, GLCD_ALIGN_LEFT); // show the internal temperature - sprintf(Str, "%.19s",(const char *) VERSION); - GLCD_write_buf_str(127, 0, Str, GLCD_ALIGN_RIGHT);// show software version in bottom right corner. - GLCD_sendbuf(7, 1); - } - ButtonRelease = 2; // Set value to 2, so that LCD will be updated only once - } - } - - if (HoldStr != "") { - glcd_clrln(0, 0x00); - glcd_clrln(1, 0x04); // horizontal line - GLCD_print_buf2(2, (const char *) "Hold 2 sec"); - GLCD_print_buf2(4, HoldStr.c_str()); - glcd_clrln(6, 0x10); // horizontal line - glcd_clrln(7, 0x00); - ButtonRelease = 2; // Set value to 2, so that LCD will be updated only once - } - - ScrollTimer = millis(); // reset timer for HelpMenu text - LCDpos = 0; // reset position of scrolling text - OldButtonState = Buttons; - LCDTimer = 0; -} - - -void GLCD_init(void) { - delay(200); // transients on the line could have garbled the LCD, wait 200ms then re-init. - _A0_0; // A0=0 - _RSTB_0; // Reset GLCD module - delayMicroseconds(4); - _RSTB_1; // Reset line high - delayMicroseconds(4); - - st7565_command(0xA2); // (11) set bias at duty cycle 1.65 (0xA2=1.9 0xA3=1.6) - st7565_command(0xA0); // (8) SEG direction (0xA0 or 0xA1) - st7565_command(0xC8); // (15) comm direction normal =0xC0 comm reverse= 0xC8 - - st7565_command(0x20 | 0x04); // (17) set Regulation Ratio (0-7) - - st7565_command(0xF8); // (19) send Booster command - st7565_command(0x01); // set Booster value 00=4x 01=5x - - st7565_command(0x81); // (18) send Electronic Volume command 0x81 - st7565_command(0x24); // set Electronic volume (0x00-0x3f) - - st7565_command(0xA6); // (9) Inverse display (0xA7=inverse 0xA6=normal) - st7565_command(0xA4); // (10) ALL pixel on (A4=normal, A5=all ON) - - st7565_command(0x28 | 0x07); // (16) ALL Power Control ON - - glcd_clear(); // clear internal GLCD buffer - goto_row(0x00); // (3) Set page address - goto_col(0x00); // (4) Set column addr LSB - - st7565_command(0xAF); // (1) ON command - -} - diff --git a/SmartEVSE-3/SmartEVSE-3/src/modbus.cpp b/SmartEVSE-3/SmartEVSE-3/src/modbus.cpp deleted file mode 100644 index 895e489..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/modbus.cpp +++ /dev/null @@ -1,690 +0,0 @@ -/* -; Project: Smart EVSE -; -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. -*/ - -#include -#include -#include -#include "ModbusServerRTU.h" -#include "ModbusClientRTU.h" -#include "driver/uart.h" - -#include "evse.h" -#include "modbus.h" -#include "utils.h" - -extern struct ModBus MB; - -// ########################## Modbus helper functions ########################## - -/** - * Send single value over modbus - * - * @param uint8_t address - * @param uint8_t function - * @param uint16_t register - * @param uint16_t data - */ -void ModbusSend8(uint8_t address, uint8_t function, uint16_t reg, uint16_t data) { - // 0x12345678 is a token to keep track of modbus requests/responses. - // token: first byte address, second byte function, third and fourth reg - uint32_t token; - token = reg; - token += address << 24; - token += function << 16; - Error err = MBclient.addRequest(token, address, function, reg, data); - if (err!=SUCCESS) { - ModbusError e(err); - _LOG_A("Error creating request: 0x%02x - %s\n", (int)e, (const char *)e); - } - else { - _LOG_V("Sent packet"); - } - _LOG_V_NO_FUNC(" address: 0x%02x, function: 0x%02x, reg: 0x%04x, token:0x%08x, data: 0x%04x.\n", address, function, reg, token, data); -} - -/** - * Combine Bytes received over modbus - * - * @param pointer to var - * @param pointer to buf - * @param uint8_t pos - * @param uint8_t endianness:\n - * 0: low byte first, low word first (little endian)\n - * 1: low byte first, high word first\n - * 2: high byte first, low word first\n - * 3: high byte first, high word first (big endian) - * @param MBDataType dataType: used to determine how many bytes should be combined - */ -void combineBytes(void *var, uint8_t *buf, uint8_t pos, uint8_t endianness, MBDataType dataType) { - char *pBytes; - pBytes = (char *)var; - - // ESP32 is little endian - switch(endianness) { - case ENDIANESS_LBF_LWF: // low byte first, low word first (little endian) - *pBytes++ = (uint8_t)buf[pos + 0]; - *pBytes++ = (uint8_t)buf[pos + 1]; - if (dataType != MB_DATATYPE_INT16) { - *pBytes++ = (uint8_t)buf[pos + 2]; - *pBytes = (uint8_t)buf[pos + 3]; - } - break; - case ENDIANESS_LBF_HWF: // low byte first, high word first - if (dataType != MB_DATATYPE_INT16) { - *pBytes++ = (uint8_t)buf[pos + 2]; - *pBytes++ = (uint8_t)buf[pos + 3]; - } - *pBytes++ = (uint8_t)buf[pos + 0]; - *pBytes = (uint8_t)buf[pos + 1]; - break; - case ENDIANESS_HBF_LWF: // high byte first, low word first - *pBytes++ = (uint8_t)buf[pos + 1]; - *pBytes++ = (uint8_t)buf[pos + 0]; - if (dataType != MB_DATATYPE_INT16) { - *pBytes++ = (uint8_t)buf[pos + 3]; - *pBytes = (uint8_t)buf[pos + 2]; - } - break; - case ENDIANESS_HBF_HWF: // high byte first, high word first (big endian) - if (dataType != MB_DATATYPE_INT16) { - *pBytes++ = (uint8_t)buf[pos + 3]; - *pBytes++ = (uint8_t)buf[pos + 2]; - } - *pBytes++ = (uint8_t)buf[pos + 1]; - *pBytes = (uint8_t)buf[pos + 0]; - break; - default: - break; - } -} - - - -// ########################### Modbus main functions ########################### - - - -/** - * Request read holding (FC=3) or read input register (FC=04) to a device over modbus - * - * @param uint8_t address - * @param uint8_t function - * @param uint16_t register - * @param uint16_t quantity - */ -void ModbusReadInputRequest(uint8_t address, uint8_t function, uint16_t reg, uint16_t quantity) { - MB.RequestAddress = address; - MB.RequestFunction = function; - MB.RequestRegister = reg; - ModbusSend8(address, function, reg, quantity); -} - - -/** - * Response read holding (FC=3) or read input register (FC=04) to a device over modbus - * - * @param uint8_t address - * @param uint8_t function - * @param uint16_t pointer to values - * @param uint8_t count of values - */ -void ModbusReadInputResponse(uint8_t address, uint8_t function, uint16_t *values, uint8_t count) { - _LOG_A("ModbusReadInputResponse, to do!\n"); - //ModbusSend(address, function, count * 2u, values, count); -} - -/** - * Request write single register (FC=06) to a device over modbus - * - * @param uint8_t address - * @param uint16_t register - * @param uint16_t value - */ -void ModbusWriteSingleRequest(uint8_t address, uint16_t reg, uint16_t value) { - MB.RequestAddress = address; - MB.RequestFunction = 0x06; - MB.RequestRegister = reg; - ModbusSend8(address, 0x06, reg, value); -} - -/** - * Request write multiple register (FC=16) to a device over modbus - * - * @param uint8_t address - * @param uint16_t register - * @param uint8_t pointer to data - * @param uint8_t count of data - */ -void ModbusWriteMultipleRequest(uint8_t address, uint16_t reg, uint16_t *values, uint8_t count) { - - MB.RequestAddress = address; - MB.RequestFunction = 0x10; - MB.RequestRegister = reg; - // 0x12345678 is a token to keep track of modbus requests/responses. - // token: first byte address, second byte function, third and fourth reg - uint32_t token; - token = reg; - token += address << 24; - token += 0x10 << 16; - Error err = MBclient.addRequest(token, address, 0x10, reg, (uint16_t) count, count * 2u, values); - if (err!=SUCCESS) { - ModbusError e(err); - _LOG_A("Error creating request: 0x%02x - %s\n", (int)e, (const char *)e); - } - _LOG_V("Sent packet address: 0x%02x, function: 0x10, reg: 0x%04x, token: 0x%08x count: %u, values:", address, reg, token, count); - for (uint16_t i = 0; i < count; i++) { - _LOG_V_NO_FUNC(" %04x", values[i]); - } - _LOG_V_NO_FUNC("\n"); -} - -/** - * Response an exception - * - * @param uint8_t address - * @param uint8_t function - * @param uint8_t exeption - */ -void ModbusException(uint8_t address, uint8_t function, uint8_t exception) { - //uint16_t temp[1]; - _LOG_A("ModbusException, to do!\n"); - //ModbusSend(address, function, exception, temp, 0); -} - -/** - * Decode received modbus packet - * - * @param uint8_t pointer to buffer - * @param uint8_t length of buffer - */ -void ModbusDecode(uint8_t * buf, uint8_t len) { - // Clear old values - MB.Address = 0; - MB.Function = 0; - MB.Register = 0; - MB.RegisterCount = 0; - MB.Value = 0; - MB.DataLength = 0; - MB.Type = MODBUS_INVALID; - MB.Exception = 0; - - _LOG_V("Received packet (%i bytes)", len); - for (uint8_t x=0; x= 6) { - // Modbus device address - MB.Address = buf[0]; - // Modbus function - MB.Function = buf[1]; - - _LOG_V(" valid Modbus packet: Address 0x%02x Function 0x%02x", MB.Address, MB.Function); - switch (MB.Function) { - case 0x03: // (Read holding register) - case 0x04: // (Read input register) - if (len == 6) { - // request packet - MB.Type = MODBUS_REQUEST; - // Modbus register - MB.Register = (uint16_t)(buf[2] <<8) | buf[3]; - // Modbus register count - MB.RegisterCount = (uint16_t)(buf[4] <<8) | buf[5]; - } else { - // Modbus datacount - MB.DataLength = buf[2]; - if (MB.DataLength == len - 3) { - // packet length OK - // response packet - MB.Type = MODBUS_RESPONSE; - } else { - _LOG_W("Invalid modbus FC=04 packet\n"); - } - } - break; - case 0x06: - // (Write single register) - if (len == 6) { - // request and response packet are the same - MB.Type = MODBUS_OK; - // Modbus register - MB.Register = (uint16_t)(buf[2] <<8) | buf[3]; - // Modbus register count - MB.RegisterCount = 1; - // value - MB.Value = (uint16_t)(buf[4] <<8) | buf[5]; - } else { - _LOG_W("Invalid modbus FC=06 packet\n"); - } - break; - case 0x10: - // (Write multiple register)) - // Modbus register - MB.Register = (uint16_t)(buf[2] <<8) | buf[3]; - // Modbus register count - MB.RegisterCount = (uint16_t)(buf[4] <<8) | buf[5]; - if (len == 6) { - // response packet - MB.Type = MODBUS_RESPONSE; - } else { - // Modbus datacount - MB.DataLength = buf[6]; - if (MB.DataLength == len - 7) { - // packet length OK - // request packet - MB.Type = MODBUS_REQUEST; - } else { - _LOG_W("Invalid modbus FC=16 packet\n"); - } - } - break; - default: - break; - } - - // MB.Data - if (MB.Type && MB.DataLength) { - // Set pointer to Data - MB.Data = buf; - // Modbus data is always at the end ahead the checksum - MB.Data = MB.Data + (len - MB.DataLength); - } - - // Request - Response check - switch (MB.Type) { - case MODBUS_REQUEST: - MB.RequestAddress = MB.Address; - MB.RequestFunction = MB.Function; - MB.RequestRegister = MB.Register; - break; - case MODBUS_RESPONSE: - // If address and function identical with last send or received request, it is a valid response - if (MB.Address == MB.RequestAddress && MB.Function == MB.RequestFunction) { - if (MB.Function == 0x03 || MB.Function == 0x04) - MB.Register = MB.RequestRegister; - } - MB.RequestAddress = 0; - MB.RequestFunction = 0; - MB.RequestRegister = 0; - break; - case MODBUS_OK: - // If address and function identical with last send or received request, it is a valid response - if (MB.Address == MB.RequestAddress && MB.Function == MB.RequestFunction && MB.Address != BROADCAST_ADR) { - MB.Type = MODBUS_RESPONSE; - MB.RequestAddress = 0; - MB.RequestFunction = 0; - MB.RequestRegister = 0; - } else { - MB.Type = MODBUS_REQUEST; - MB.RequestAddress = MB.Address; - MB.RequestFunction = MB.Function; - MB.RequestRegister = MB.Register; - } - default: - break; - } - } - if(MB.Type) { - _LOG_V_NO_FUNC(" Register 0x%04x", MB.Register); - } - switch (MB.Type) { - case MODBUS_REQUEST: - _LOG_V_NO_FUNC(" Request\n"); - break; - case MODBUS_RESPONSE: - _LOG_V_NO_FUNC(" Response\n"); - break; - } -} - - - -// ########################### EVSE modbus functions ########################### - - -/** - * Send measurement request over modbus - * - * @param uint8_t Meter - * @param uint8_t Address - * @param uint16_t Register - * @param uint8_t Count - */ -void requestMeasurement(uint8_t Meter, uint8_t Address, uint16_t Register, uint8_t Count) { - ModbusReadInputRequest(Address, EMConfig[Meter].Function, Register, (EMConfig[Meter].DataType == MB_DATATYPE_INT16 ? Count : (Count * 2u))); -} - -/** - * Decode measurement value - * - * @param pointer to buf - * @param uint8_t Count - * @param uint8_t Endianness - * @param MBDataType dataType - * @param signed char Divisor - * @return signed int Measurement - */ -signed int receiveMeasurement(uint8_t *buf, uint8_t Count, uint8_t Endianness, MBDataType dataType, signed char Divisor) { - float dCombined; - signed int lCombined; - - if (dataType == MB_DATATYPE_FLOAT32) { - combineBytes(&dCombined, buf, Count * (dataType == MB_DATATYPE_INT16 ? 2u : 4u), Endianness, dataType); - if (Divisor >= 0) { - lCombined = (signed int)(dCombined / (signed int)pow_10[(unsigned)Divisor]); - } else { - lCombined = (signed int)(dCombined * (signed int)pow_10[(unsigned)-Divisor]); - } - } else { - combineBytes(&lCombined, buf, Count * (dataType == MB_DATATYPE_INT16 ? 2u : 4u), Endianness, dataType); - if (dataType == MB_DATATYPE_INT16) { - lCombined = (signed int)((int16_t)lCombined); /* sign extend 16bit into 32bit */ - } - if (Divisor >= 0) { - lCombined = lCombined / (signed int)pow_10[(unsigned)Divisor]; - } else { - lCombined = lCombined * (signed int)pow_10[(unsigned)-Divisor]; - } - } - - return lCombined; -} - -/** - * Send current measurement request over modbus - * - * @param uint8_t Meter - * @param uint8_t Address - */ -void requestCurrentMeasurement(uint8_t Meter, uint8_t Address) { - switch(Meter) { - case EM_API: - break; - case EM_SENSORBOX: - ModbusReadInputRequest(Address, 4, 0, 20); - break; - case EM_EASTRON1P: - case EM_EASTRON3P: - case EM_EASTRON3P_INV: - // Phase 1-3 current: Register 0x06 - 0x0B (unsigned) - // Phase 1-3 power: Register 0x0C - 0x11 (signed) - ModbusReadInputRequest(Address, 4, 0x06, 12); - break; - case EM_ABB: - // Phase 1-3 current: Register 0x5B0C - 0x5B11 (unsigned) - // Phase 1-3 power: Register 0x5B16 - 0x5B1B (signed) - ModbusReadInputRequest(Address, 3, 0x5B0C, 16); - break; - case EM_SOLAREDGE: - // Read 3 Current values + scaling factor - ModbusReadInputRequest(Address, EMConfig[Meter].Function, EMConfig[Meter].IRegister, 4); - break; - case EM_FINDER_7M: - // Phase 1-3 current: Register 2516 - 2521 (unsigned) - // Phase 1-3 power: Register 2530 - 2535 (signed) - ModbusReadInputRequest(Address, 4, 2516, 20); - break; - default: - // Read 3 Current values - requestMeasurement(Meter, Address, EMConfig[Meter].IRegister, 3); - break; - } -} - -/** - * Read current measurement from modbus - * - * @param pointer to buf - * @param uint8_t Meter - * @param pointer to Current (mA) - * @return uint8_t error - */ -uint8_t receiveCurrentMeasurement(uint8_t *buf, uint8_t Meter, signed int *var) { - uint8_t x, offset; - - // No CAL option in Menu - CalActive = 0; - - switch(Meter) { - case EM_API: - break; - case EM_SENSORBOX: - // return immediately if the data contains no new P1 or CT measurement - if (buf[3] == 0) return 0; // error!! - // determine if there is P1 data present, otherwise use CT data - if (buf[3] & 0x80) offset = 4; // P1 data present - else offset = 7; // Use CTs - // offset 16 is Smart meter P1 current - for (x = 0; x < 3; x++) { - // SmartEVSE works with Amps * 10 - var[x] = receiveMeasurement(buf, offset + x, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, EMConfig[Meter].IDivisor - 3u); - // When using CT's , adjust the measurements with calibration value - if (offset == 7) { - if (x == 0) Iuncal = abs((var[x] / 10)); // Store uncalibrated CT1 measurement (10mA) - var[x] = var[x] * (signed int)ICal / ICAL; - // When MaxMains is set to >100A, it's assumed 200A:50ma CT's are used. - if (getItemValue(MENU_MAINS) > 100) var[x] = var[x] * 2; // Multiply measured currents with 2 - // very small negative currents are shown as zero. - if ((var[x] > -1) && (var[x] < 1)) var[x] = 0; - CalActive = 1; // Enable CAL option in Menu - } - } - // Set Sensorbox 2 to 3/4 Wire configuration (and phase Rotation) (v2.16) - if (buf[1] >= 0x10 && offset == 7) { - GridActive = 1; // Enable the GRID menu option - if ((buf[1] & 0x3) != (Grid << 1) && (LoadBl < 2)) ModbusWriteSingleRequest(0x0A, 0x800, Grid << 1); - } else GridActive = 0; - break; - case EM_SOLAREDGE: - { - // Need to handle the extra scaling factor - int scalingFactor = -(int)receiveMeasurement( - buf, - 3, - EMConfig[Meter].Endianness, - EMConfig[Meter].DataType, - 0 - ); - // Now decode the three Current values using that scaling factor - for (x = 0; x < 3; x++) { - var[x] = receiveMeasurement( - buf, - x, - EMConfig[Meter].Endianness, - EMConfig[Meter].DataType, - scalingFactor - 3 - ); - } - break; - } - default: - for (x = 0; x < 3; x++) { - var[x] = receiveMeasurement( - buf, - x, - EMConfig[Meter].Endianness, - EMConfig[Meter].DataType, - EMConfig[Meter].IDivisor - 3 - ); - } - break; - } - - // Get sign from power measurement on some electric meters - switch(Meter) { - case EM_EASTRON1P: // for some reason the EASTRON1P also needs to loop through the 3 var[x] - // if you only loop through x=0, the minus sign of the current is incorrect - // when exporting current - case EM_EASTRON3P: - for (x = 0; x < 3; x++) { - if (receiveMeasurement(buf, x + 3u, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, EMConfig[Meter].PDivisor) < 0) var[x] = -var[x]; - } - break; - case EM_EASTRON3P_INV: - for (x = 0; x < 3; x++) { - if (receiveMeasurement(buf, x + 3u, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, EMConfig[Meter].PDivisor) > 0) var[x] = -var[x]; - } - break; - case EM_ABB: - for (x = 0; x < 3; x++) { - if (receiveMeasurement(buf, x + 5u, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, EMConfig[Meter].PDivisor) < 0) var[x] = -var[x]; - } - break; - case EM_FINDER_7M: - for (x = 0; x < 3; x++) { - if (receiveMeasurement(buf, x + 7u, EMConfig[Meter].Endianness, EMConfig[Meter].DataType, EMConfig[Meter].PDivisor) < 0) var[x] = -var[x]; - } - break; - } - - // all OK - return 1; -} - -/** - * Map a Modbus register to an item ID (MENU_xxx or STATUS_xxx) - * - * @return uint8_t ItemID - */ -uint8_t mapModbusRegister2ItemID() { - uint16_t RegisterStart, ItemStart, Count; - - // Register 0x00*: Status - if (MB.Register < (MODBUS_EVSE_STATUS_START + MODBUS_EVSE_STATUS_COUNT)) { - RegisterStart = MODBUS_EVSE_STATUS_START; - ItemStart = STATUS_STATE; - Count = MODBUS_EVSE_STATUS_COUNT; - - // Register 0x01*: Node specific configuration - } else if (MB.Register >= MODBUS_EVSE_CONFIG_START && MB.Register < (MODBUS_EVSE_CONFIG_START + MODBUS_EVSE_CONFIG_COUNT)) { - RegisterStart = MODBUS_EVSE_CONFIG_START; - ItemStart = MENU_CONFIG; - Count = MODBUS_EVSE_CONFIG_COUNT; - - // Register 0x02*: System configuration (same on all SmartEVSE in a LoadBalancing setup) - } else if (MB.Register >= MODBUS_SYS_CONFIG_START && MB.Register < (MODBUS_SYS_CONFIG_START + MODBUS_SYS_CONFIG_COUNT)) { - RegisterStart = MODBUS_SYS_CONFIG_START; - ItemStart = MENU_MODE; - Count = MODBUS_SYS_CONFIG_COUNT; - - } else { - return 0; - } - - if (MB.RegisterCount <= (RegisterStart + Count) - MB.Register) { - return (MB.Register - RegisterStart + ItemStart); - } else { - return 0; - } -} - -/** - * Read item values and send modbus response - */ -/* -void ReadItemValueResponse(void) { - uint8_t ItemID; - uint8_t i; - uint16_t values[MODBUS_MAX_REGISTER_READ]; - - ItemID = mapModbusRegister2ItemID(); - if (ItemID) { - for (i = 0; i < MB.RegisterCount; i++) { - values[i] = getItemValue(ItemID + i); - } - ModbusReadInputResponse(MB.Address, MB.Function, values, MB.RegisterCount); - } else { - ModbusException(MB.Address, MB.Function, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS); - } -} -*/ - -/** - * Write item values and send modbus response - */ -/* -void WriteItemValueResponse(void) { - uint8_t ItemID; - uint8_t OK = 0; - - ItemID = mapModbusRegister2ItemID(); - if (ItemID) { - OK = setItemValue(ItemID, MB.Value); - } - - if (OK && ItemID < STATUS_STATE) write_settings(); - - if (MB.Address != BROADCAST_ADR || LoadBl == 0) { - if (!ItemID) { - ModbusException(MB.Address, MB.Function, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS); - } else if (!OK) { - ModbusException(MB.Address, MB.Function, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE); - } else { - ModbusWriteSingleResponse(MB.Address, MB.Register, MB.Value); - } - } -} -*/ - -/** - * Write multiple item values and send modbus response - */ -/* -void WriteMultipleItemValueResponse(void) { - uint8_t ItemID; - uint16_t i, OK = 0, value; - - ItemID = mapModbusRegister2ItemID(); - if (ItemID) { - for (i = 0; i < MB.RegisterCount; i++) { - value = (MB.Data[i * 2] <<8) | MB.Data[(i * 2) + 1]; - OK += setItemValue(ItemID + i, value); - } - } - - if (OK && ItemID < STATUS_STATE) write_settings(); - - if (MB.Address != BROADCAST_ADR || LoadBl == 0) { - if (!ItemID) { - ModbusException(MB.Address, MB.Function, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS); - } else if (!OK) { - ModbusException(MB.Address, MB.Function, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE); - } else { - ModbusWriteMultipleResponse(MB.Address, MB.Register, OK); - } - } -} -*/ diff --git a/SmartEVSE-3/SmartEVSE-3/src/mongoose.c b/SmartEVSE-3/SmartEVSE-3/src/mongoose.c deleted file mode 100644 index 62fde56..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/mongoose.c +++ /dev/null @@ -1,15692 +0,0 @@ -// Copyright (c) 2004-2013 Sergey Lyubka -// Copyright (c) 2013-2024 Cesanta Software Limited -// All rights reserved -// -// This software is dual-licensed: you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. For the terms of this -// license, see http://www.gnu.org/licenses/ -// -// You are free to use this software under the terms of the GNU General -// Public License, but WITHOUT ANY WARRANTY; without even the implied -// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU General Public License for more details. -// -// Alternatively, you can license this software under a commercial -// license, as set out in https://www.mongoose.ws/licensing/ -// -// SPDX-License-Identifier: GPL-2.0-only or commercial - -#include "mongoose.h" - -#ifdef MG_ENABLE_LINES -#line 1 "src/base64.c" -#endif - - -static int mg_base64_encode_single(int c) { - if (c < 26) { - return c + 'A'; - } else if (c < 52) { - return c - 26 + 'a'; - } else if (c < 62) { - return c - 52 + '0'; - } else { - return c == 62 ? '+' : '/'; - } -} - -static int mg_base64_decode_single(int c) { - if (c >= 'A' && c <= 'Z') { - return c - 'A'; - } else if (c >= 'a' && c <= 'z') { - return c + 26 - 'a'; - } else if (c >= '0' && c <= '9') { - return c + 52 - '0'; - } else if (c == '+') { - return 62; - } else if (c == '/') { - return 63; - } else if (c == '=') { - return 64; - } else { - return -1; - } -} - -size_t mg_base64_update(unsigned char ch, char *to, size_t n) { - unsigned long rem = (n & 3) % 3; - if (rem == 0) { - to[n] = (char) mg_base64_encode_single(ch >> 2); - to[++n] = (char) ((ch & 3) << 4); - } else if (rem == 1) { - to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 4)); - to[++n] = (char) ((ch & 15) << 2); - } else { - to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 6)); - to[++n] = (char) mg_base64_encode_single(ch & 63); - n++; - } - return n; -} - -size_t mg_base64_final(char *to, size_t n) { - size_t saved = n; - // printf("---[%.*s]\n", n, to); - if (n & 3) n = mg_base64_update(0, to, n); - if ((saved & 3) == 2) n--; - // printf(" %d[%.*s]\n", n, n, to); - while (n & 3) to[n++] = '='; - to[n] = '\0'; - return n; -} - -size_t mg_base64_encode(const unsigned char *p, size_t n, char *to, size_t dl) { - size_t i, len = 0; - if (dl > 0) to[0] = '\0'; - if (dl < ((n / 3) + (n % 3 ? 1 : 0)) * 4 + 1) return 0; - for (i = 0; i < n; i++) len = mg_base64_update(p[i], to, len); - len = mg_base64_final(to, len); - return len; -} - -size_t mg_base64_decode(const char *src, size_t n, char *dst, size_t dl) { - const char *end = src == NULL ? NULL : src + n; // Cannot add to NULL - size_t len = 0; - if (dl < n / 4 * 3 + 1) goto fail; - while (src != NULL && src + 3 < end) { - int a = mg_base64_decode_single(src[0]), - b = mg_base64_decode_single(src[1]), - c = mg_base64_decode_single(src[2]), - d = mg_base64_decode_single(src[3]); - if (a == 64 || a < 0 || b == 64 || b < 0 || c < 0 || d < 0) { - goto fail; - } - dst[len++] = (char) ((a << 2) | (b >> 4)); - if (src[2] != '=') { - dst[len++] = (char) ((b << 4) | (c >> 2)); - if (src[3] != '=') dst[len++] = (char) ((c << 6) | d); - } - src += 4; - } - dst[len] = '\0'; - return len; -fail: - if (dl > 0) dst[0] = '\0'; - return 0; -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/device_ch32v307.c" -#endif - - - -#if MG_DEVICE == MG_DEVICE_CH32V307 -// RM: https://www.wch-ic.com/downloads/CH32FV2x_V3xRM_PDF.html - -#define FLASH_BASE 0x40022000 -#define FLASH_ACTLR (FLASH_BASE + 0) -#define FLASH_KEYR (FLASH_BASE + 4) -#define FLASH_OBKEYR (FLASH_BASE + 8) -#define FLASH_STATR (FLASH_BASE + 12) -#define FLASH_CTLR (FLASH_BASE + 16) -#define FLASH_ADDR (FLASH_BASE + 20) -#define FLASH_OBR (FLASH_BASE + 28) -#define FLASH_WPR (FLASH_BASE + 32) - -void *mg_flash_start(void) { - return (void *) 0x08000000; -} -size_t mg_flash_size(void) { - return 480 * 1024; // First 320k is 0-wait -} -size_t mg_flash_sector_size(void) { - return 4096; -} -size_t mg_flash_write_align(void) { - return 4; -} -int mg_flash_bank(void) { - return 0; -} -void mg_device_reset(void) { - *((volatile uint32_t *) 0xbeef0000) |= 1U << 7; // NVIC_SystemReset() -} -static void flash_unlock(void) { - static bool unlocked; - if (unlocked == false) { - MG_REG(FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_KEYR) = 0xcdef89ab; - unlocked = true; - } -} -static void flash_wait(void) { - while (MG_REG(FLASH_STATR) & MG_BIT(0)) (void) 0; -} - -bool mg_flash_erase(void *addr) { - //MG_INFO(("%p", addr)); - flash_unlock(); - flash_wait(); - MG_REG(FLASH_ADDR) = (uint32_t) addr; - MG_REG(FLASH_CTLR) |= MG_BIT(1) | MG_BIT(6); // PER | STRT; - flash_wait(); - return true; -} - -static bool is_page_boundary(const void *addr) { - uint32_t val = (uint32_t) addr; - return (val & (mg_flash_sector_size() - 1)) == 0; -} - -bool mg_flash_write(void *addr, const void *buf, size_t len) { - //MG_INFO(("%p %p %lu", addr, buf, len)); - //mg_hexdump(buf, len); - flash_unlock(); - const uint16_t *src = (uint16_t *) buf, *end = &src[len / 2]; - uint16_t *dst = (uint16_t *) addr; - MG_REG(FLASH_CTLR) |= MG_BIT(0); // Set PG - //MG_INFO(("CTLR: %#lx", MG_REG(FLASH_CTLR))); - while (src < end) { - if (is_page_boundary(dst)) mg_flash_erase(dst); - *dst++ = *src++; - flash_wait(); - } - MG_REG(FLASH_CTLR) &= ~MG_BIT(0); // Clear PG - return true; -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/device_dummy.c" -#endif - - -#if MG_DEVICE == MG_DEVICE_NONE -void *mg_flash_start(void) { - return NULL; -} -size_t mg_flash_size(void) { - return 0; -} -size_t mg_flash_sector_size(void) { - return 0; -} -size_t mg_flash_write_align(void) { - return 0; -} -int mg_flash_bank(void) { - return 0; -} -bool mg_flash_erase(void *location) { - (void) location; - return false; -} -bool mg_flash_swap_bank(void) { - return true; -} -bool mg_flash_write(void *addr, const void *buf, size_t len) { - (void) addr, (void) buf, (void) len; - return false; -} -void mg_device_reset(void) { -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/device_flash.c" -#endif - - -#if MG_DEVICE == MG_DEVICE_STM32H7 || MG_DEVICE == MG_DEVICE_STM32H5 || \ - MG_DEVICE == MG_DEVICE_RT1020 || MG_DEVICE == MG_DEVICE_RT1060 -// Flash can be written only if it is erased. Erased flash is 0xff (all bits 1) -// Writes must be mg_flash_write_align() - aligned. Thus if we want to save an -// object, we pad it at the end for alignment. -// -// Objects in the flash sector are stored sequentially: -// | 32-bit size | 32-bit KEY | ..data.. | ..pad.. | 32-bit size | ...... -// -// In order to get to the next object, read its size, then align up. - -// Traverse the list of saved objects -size_t mg_flash_next(char *p, char *end, uint32_t *key, size_t *size) { - size_t aligned_size = 0, align = mg_flash_write_align(), left = end - p; - uint32_t *p32 = (uint32_t *) p, min_size = sizeof(uint32_t) * 2; - if (p32[0] != 0xffffffff && left > MG_ROUND_UP(min_size, align)) { - if (size) *size = (size_t) p32[0]; - if (key) *key = p32[1]; - aligned_size = MG_ROUND_UP(p32[0] + sizeof(uint32_t) * 2, align); - if (left < aligned_size) aligned_size = 0; // Out of bounds, fail - } - return aligned_size; -} - -// Return the last sector of Bank 2 -static char *flash_last_sector(void) { - size_t ss = mg_flash_sector_size(), size = mg_flash_size(); - char *base = (char *) mg_flash_start(), *last = base + size - ss; - if (mg_flash_bank() == 2) last -= size / 2; - return last; -} - -// Find a saved object with a given key -bool mg_flash_load(void *sector, uint32_t key, void *buf, size_t len) { - char *base = (char *) mg_flash_start(), *s = (char *) sector, *res = NULL; - size_t ss = mg_flash_sector_size(), ofs = 0, n, sz; - bool ok = false; - if (s == NULL) s = flash_last_sector(); - if (s < base || s >= base + mg_flash_size()) { - MG_ERROR(("%p is outsize of flash", sector)); - } else if (((s - base) % ss) != 0) { - MG_ERROR(("%p is not a sector boundary", sector)); - } else { - uint32_t k, scanned = 0; - while ((n = mg_flash_next(s + ofs, s + ss, &k, &sz)) > 0) { - // MG_DEBUG((" > obj %lu, ofs %lu, key %x/%x", scanned, ofs, k, key)); - // mg_hexdump(s + ofs, n); - if (k == key && sz == len) { - res = s + ofs + sizeof(uint32_t) * 2; - memcpy(buf, res, len); // Copy object - ok = true; // Keep scanning for the newer versions of it - } - ofs += n, scanned++; - } - MG_DEBUG(("Scanned %u objects, key %x is @ %p", scanned, key, res)); - } - return ok; -} - -// For all saved objects in the sector, delete old versions of objects -static void mg_flash_sector_cleanup(char *sector) { - // Buffer all saved objects into an IO buffer (backed by RAM) - // erase sector, and re-save them. - struct mg_iobuf io = {0, 0, 0, 2048}; - size_t ss = mg_flash_sector_size(); - size_t n, size, size2, ofs = 0, hs = sizeof(uint32_t) * 2; - uint32_t key; - // Traverse all objects - MG_DEBUG(("Cleaning up sector %p", sector)); - while ((n = mg_flash_next(sector + ofs, sector + ss, &key, &size)) > 0) { - // Delete an old copy of this object in the cache - for (size_t o = 0; o < io.len; o += size2 + hs) { - uint32_t k = *(uint32_t *) (io.buf + o + sizeof(uint32_t)); - size2 = *(uint32_t *) (io.buf + o); - if (k == key) { - mg_iobuf_del(&io, o, size2 + hs); - break; - } - } - // And add the new copy - mg_iobuf_add(&io, io.len, sector + ofs, size + hs); - ofs += n; - } - // All objects are cached in RAM now - if (mg_flash_erase(sector)) { // Erase sector. If successful, - for (ofs = 0; ofs < io.len; ofs += size + hs) { // Traverse cached objects - size = *(uint32_t *) (io.buf + ofs); - key = *(uint32_t *) (io.buf + ofs + sizeof(uint32_t)); - mg_flash_save(sector, key, io.buf + ofs + hs, size); // Save to flash - } - } - mg_iobuf_free(&io); -} - -// Save an object with a given key - append to the end of an object list -bool mg_flash_save(void *sector, uint32_t key, const void *buf, size_t len) { - char *base = (char *) mg_flash_start(), *s = (char *) sector; - size_t ss = mg_flash_sector_size(), ofs = 0, n; - bool ok = false; - if (s == NULL) s = flash_last_sector(); - if (s < base || s >= base + mg_flash_size()) { - MG_ERROR(("%p is outsize of flash", sector)); - } else if (((s - base) % ss) != 0) { - MG_ERROR(("%p is not a sector boundary", sector)); - } else { - char ab[mg_flash_write_align()]; // Aligned write block - uint32_t hdr[2] = {(uint32_t) len, key}; - size_t needed = sizeof(hdr) + len; - size_t needed_aligned = MG_ROUND_UP(needed, sizeof(ab)); - while ((n = mg_flash_next(s + ofs, s + ss, NULL, NULL)) > 0) ofs += n; - - // If there is not enough space left, cleanup sector and re-eval ofs - if (ofs + needed_aligned >= ss) { - mg_flash_sector_cleanup(s); - ofs = 0; - while ((n = mg_flash_next(s + ofs, s + ss, NULL, NULL)) > 0) ofs += n; - } - - if (ofs + needed_aligned <= ss) { - // Enough space to save this object - if (sizeof(ab) < sizeof(hdr)) { - // Flash write granularity is 32 bit or less, write with no buffering - ok = mg_flash_write(s + ofs, hdr, sizeof(hdr)); - if (ok) mg_flash_write(s + ofs + sizeof(hdr), buf, len); - } else { - // Flash granularity is sizeof(hdr) or more. We need to save in - // 3 chunks: initial block, bulk, rest. This is because we have - // two memory chunks to write: hdr and buf, on aligned boundaries. - n = sizeof(ab) - sizeof(hdr); // Initial chunk that we write - if (n > len) n = len; // is - memset(ab, 0xff, sizeof(ab)); // initialized to all-one - memcpy(ab, hdr, sizeof(hdr)); // contains the header (key + size) - memcpy(ab + sizeof(hdr), buf, n); // and an initial part of buf - MG_INFO(("saving initial block of %lu", sizeof(ab))); - ok = mg_flash_write(s + ofs, ab, sizeof(ab)); - if (ok && len > n) { - size_t n2 = MG_ROUND_DOWN(len - n, sizeof(ab)); - if (n2 > 0) { - MG_INFO(("saving bulk, %lu", n2)); - ok = mg_flash_write(s + ofs + sizeof(ab), (char *) buf + n, n2); - } - if (ok && len > n) { - size_t n3 = len - n - n2; - if (n3 > sizeof(ab)) n3 = sizeof(ab); - memset(ab, 0xff, sizeof(ab)); - memcpy(ab, (char *) buf + n + n2, n3); - MG_INFO(("saving rest, %lu", n3)); - ok = mg_flash_write(s + ofs + sizeof(ab) + n2, ab, sizeof(ab)); - } - } - } - MG_DEBUG(("Saved %lu/%lu bytes @ %p, key %x: %d", len, needed_aligned, - s + ofs, key, ok)); - MG_DEBUG(("Sector space left: %lu bytes", ss - ofs - needed_aligned)); - } else { - MG_ERROR(("Sector is full")); - } - } - return ok; -} -#else -bool mg_flash_save(void *sector, uint32_t key, const void *buf, size_t len) { - (void) sector, (void) key, (void) buf, (void) len; - return false; -} -bool mg_flash_load(void *sector, uint32_t key, void *buf, size_t len) { - (void) sector, (void) key, (void) buf, (void) len; - return false; -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/device_imxrt.c" -#endif - - - -#if MG_DEVICE == MG_DEVICE_RT1020 || MG_DEVICE == MG_DEVICE_RT1060 - -struct mg_flexspi_lut_seq { - uint8_t seqNum; - uint8_t seqId; - uint16_t reserved; -}; - -struct mg_flexspi_mem_config { - uint32_t tag; - uint32_t version; - uint32_t reserved0; - uint8_t readSampleClkSrc; - uint8_t csHoldTime; - uint8_t csSetupTime; - uint8_t columnAddressWidth; - uint8_t deviceModeCfgEnable; - uint8_t deviceModeType; - uint16_t waitTimeCfgCommands; - struct mg_flexspi_lut_seq deviceModeSeq; - uint32_t deviceModeArg; - uint8_t configCmdEnable; - uint8_t configModeType[3]; - struct mg_flexspi_lut_seq configCmdSeqs[3]; - uint32_t reserved1; - uint32_t configCmdArgs[3]; - uint32_t reserved2; - uint32_t controllerMiscOption; - uint8_t deviceType; - uint8_t sflashPadType; - uint8_t serialClkFreq; - uint8_t lutCustomSeqEnable; - uint32_t reserved3[2]; - uint32_t sflashA1Size; - uint32_t sflashA2Size; - uint32_t sflashB1Size; - uint32_t sflashB2Size; - uint32_t csPadSettingOverride; - uint32_t sclkPadSettingOverride; - uint32_t dataPadSettingOverride; - uint32_t dqsPadSettingOverride; - uint32_t timeoutInMs; - uint32_t commandInterval; - uint16_t dataValidTime[2]; - uint16_t busyOffset; - uint16_t busyBitPolarity; - uint32_t lookupTable[64]; - struct mg_flexspi_lut_seq lutCustomSeq[12]; - uint32_t reserved4[4]; -}; - -struct mg_flexspi_nor_config { - struct mg_flexspi_mem_config memConfig; - uint32_t pageSize; - uint32_t sectorSize; - uint8_t ipcmdSerialClkFreq; - uint8_t isUniformBlockSize; - uint8_t reserved0[2]; - uint8_t serialNorType; - uint8_t needExitNoCmdMode; - uint8_t halfClkForNonReadCmd; - uint8_t needRestoreNoCmdMode; - uint32_t blockSize; - uint32_t reserve2[11]; -}; - -/* FLEXSPI memory config block related defintions */ -#define MG_FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian -#define MG_FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0 - -#define MG_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \ - (MG_FLEXSPI_LUT_OPERAND0(op0) | MG_FLEXSPI_LUT_NUM_PADS0(pad0) | MG_FLEXSPI_LUT_OPCODE0(cmd0) | \ - MG_FLEXSPI_LUT_OPERAND1(op1) | MG_FLEXSPI_LUT_NUM_PADS1(pad1) | MG_FLEXSPI_LUT_OPCODE1(cmd1)) - -#define MG_CMD_SDR 0x01 -#define MG_CMD_DDR 0x21 -#define MG_DUMMY_SDR 0x0C -#define MG_DUMMY_DDR 0x2C -#define MG_RADDR_SDR 0x02 -#define MG_RADDR_DDR 0x22 -#define MG_READ_SDR 0x09 -#define MG_READ_DDR 0x29 -#define MG_WRITE_SDR 0x08 -#define MG_WRITE_DDR 0x28 -#define MG_STOP 0 - -#define MG_FLEXSPI_1PAD 0 -#define MG_FLEXSPI_2PAD 1 -#define MG_FLEXSPI_4PAD 2 -#define MG_FLEXSPI_8PAD 3 - -#define MG_FLEXSPI_QSPI_LUT \ - { \ - [0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xEB, MG_RADDR_SDR, MG_FLEXSPI_4PAD, \ - 0x18), \ - [1] = MG_FLEXSPI_LUT_SEQ(MG_DUMMY_SDR, MG_FLEXSPI_4PAD, 0x06, MG_READ_SDR, MG_FLEXSPI_4PAD, \ - 0x04), \ - [4 * 1 + 0] = \ - MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x05, MG_READ_SDR, MG_FLEXSPI_1PAD, 0x04), \ - [4 * 3 + 0] = \ - MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x06, MG_STOP, MG_FLEXSPI_1PAD, 0x0), \ - [4 * 5 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x20, MG_RADDR_SDR, \ - MG_FLEXSPI_1PAD, 0x18), \ - [4 * 8 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xD8, MG_RADDR_SDR, \ - MG_FLEXSPI_1PAD, 0x18), \ - [4 * 9 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x02, MG_RADDR_SDR, \ - MG_FLEXSPI_1PAD, 0x18), \ - [4 * 9 + 1] = \ - MG_FLEXSPI_LUT_SEQ(MG_WRITE_SDR, MG_FLEXSPI_1PAD, 0x04, MG_STOP, MG_FLEXSPI_1PAD, 0x0), \ - [4 * 11 + 0] = \ - MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x60, MG_STOP, MG_FLEXSPI_1PAD, 0x0), \ - } - -#define MG_FLEXSPI_LUT_OPERAND0(x) (((uint32_t) (((uint32_t) (x)))) & 0xFFU) -#define MG_FLEXSPI_LUT_NUM_PADS0(x) (((uint32_t) (((uint32_t) (x)) << 8U)) & 0x300U) -#define MG_FLEXSPI_LUT_OPCODE0(x) (((uint32_t) (((uint32_t) (x)) << 10U)) & 0xFC00U) -#define MG_FLEXSPI_LUT_OPERAND1(x) (((uint32_t) (((uint32_t) (x)) << 16U)) & 0xFF0000U) -#define MG_FLEXSPI_LUT_NUM_PADS1(x) (((uint32_t) (((uint32_t) (x)) << 24U)) & 0x3000000U) -#define MG_FLEXSPI_LUT_OPCODE1(x) (((uint32_t) (((uint32_t) (x)) << 26U)) & 0xFC000000U) - -#define FLEXSPI_NOR_INSTANCE 0 - -#if MG_DEVICE == MG_DEVICE_RT1020 -struct mg_flexspi_nor_driver_interface { - uint32_t version; - int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config); - int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config, uint32_t dst_addr, - const uint32_t *src); - uint32_t reserved; - int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config, uint32_t start, - uint32_t lengthInBytes); - uint32_t reserved2; - int (*update_lut)(uint32_t instance, uint32_t seqIndex, const uint32_t *lutBase, - uint32_t seqNumber); - int (*xfer)(uint32_t instance, char *xfer); - void (*clear_cache)(uint32_t instance); -}; -#elif MG_DEVICE == MG_DEVICE_RT1060 -struct mg_flexspi_nor_driver_interface { - uint32_t version; - int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config); - int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config, uint32_t dst_addr, - const uint32_t *src); - int (*erase_all)(uint32_t instance, struct mg_flexspi_nor_config *config); - int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config, uint32_t start, - uint32_t lengthInBytes); - int (*read)(uint32_t instance, struct mg_flexspi_nor_config *config, uint32_t *dst, uint32_t addr, - uint32_t lengthInBytes); - void (*clear_cache)(uint32_t instance); - int (*xfer)(uint32_t instance, char *xfer); - int (*update_lut)(uint32_t instance, uint32_t seqIndex, const uint32_t *lutBase, - uint32_t seqNumber); - int (*get_config)(uint32_t instance, struct mg_flexspi_nor_config *config, uint32_t *option); -}; -#endif - -#define flexspi_nor (*((struct mg_flexspi_nor_driver_interface**) \ - (*(uint32_t*)0x0020001c + 16))) - -static bool s_flash_irq_disabled; - -MG_IRAM void *mg_flash_start(void) { - return (void *) 0x60000000; -} -MG_IRAM size_t mg_flash_size(void) { - return 8 * 1024 * 1024; -} -MG_IRAM size_t mg_flash_sector_size(void) { - return 4 * 1024; // 4k -} -MG_IRAM size_t mg_flash_write_align(void) { - return 256; -} -MG_IRAM int mg_flash_bank(void) { - return 0; -} - -MG_IRAM static bool flash_page_start(volatile uint32_t *dst) { - char *base = (char *) mg_flash_start(), *end = base + mg_flash_size(); - volatile char *p = (char *) dst; - return p >= base && p < end && ((p - base) % mg_flash_sector_size()) == 0; -} - -// Note: the get_config function below works both for RT1020 and 1060 -#if MG_DEVICE == MG_DEVICE_RT1020 -MG_IRAM static int flexspi_nor_get_config(struct mg_flexspi_nor_config *config) { - struct mg_flexspi_nor_config default_config = { - .memConfig = {.tag = MG_FLEXSPI_CFG_BLK_TAG, - .version = MG_FLEXSPI_CFG_BLK_VERSION, - .readSampleClkSrc = 1, // ReadSampleClk_LoopbackFromDqsPad - .csHoldTime = 3, - .csSetupTime = 3, - .controllerMiscOption = MG_BIT(4), - .deviceType = 1, // serial NOR - .sflashPadType = 4, - .serialClkFreq = 7, // 133MHz - .sflashA1Size = 8 * 1024 * 1024, - .lookupTable = MG_FLEXSPI_QSPI_LUT}, - .pageSize = 256, - .sectorSize = 4 * 1024, - .ipcmdSerialClkFreq = 1, - .blockSize = 64 * 1024, - .isUniformBlockSize = false}; - - *config = default_config; - return 0; -} -#else -MG_IRAM static int flexspi_nor_get_config(struct mg_flexspi_nor_config *config) { - uint32_t options[] = {0xc0000000, 0x00}; - - MG_ARM_DISABLE_IRQ(); - uint32_t status = - flexspi_nor->get_config(FLEXSPI_NOR_INSTANCE, config, options); - if (!s_flash_irq_disabled) { - MG_ARM_ENABLE_IRQ(); - } - if (status) { - MG_ERROR(("Failed to extract flash configuration: status %u", status)); - } - return status; -} -#endif - -MG_IRAM bool mg_flash_erase(void *addr) { - struct mg_flexspi_nor_config config; - if (flexspi_nor_get_config(&config) != 0) { - return false; - } - if (flash_page_start(addr) == false) { - MG_ERROR(("%p is not on a sector boundary", addr)); - return false; - } - - void *dst = (void *)((char *) addr - (char *) mg_flash_start()); - - // Note: Interrupts must be disabled before any call to the ROM API on RT1020 - // and 1060 - MG_ARM_DISABLE_IRQ(); - bool ok = (flexspi_nor->erase(FLEXSPI_NOR_INSTANCE, &config, (uint32_t) dst, - mg_flash_sector_size()) == 0); - if (!s_flash_irq_disabled) { - MG_ARM_ENABLE_IRQ(); // Reenable them after the call - } - MG_DEBUG(("Sector starting at %p erasure: %s", addr, ok ? "ok" : "fail")); - return ok; -} - -MG_IRAM bool mg_flash_swap_bank() { - return true; -} - -static inline void spin(volatile uint32_t count) { - while (count--) (void) 0; -} - -static inline void flash_wait(void) { - while ((*((volatile uint32_t *)(0x402A8000 + 0xE0)) & MG_BIT(1)) == 0) - spin(1); -} - -MG_IRAM static void *flash_code_location(void) { - return (void *) ((char *) mg_flash_start() + 0x2000); -} - -MG_IRAM bool mg_flash_write(void *addr, const void *buf, size_t len) { - struct mg_flexspi_nor_config config; - if (flexspi_nor_get_config(&config) != 0) { - return false; - } - if ((len % mg_flash_write_align()) != 0) { - MG_ERROR(("%lu is not aligned to %lu", len, mg_flash_write_align())); - return false; - } - - if ((char *) addr < (char *) mg_flash_start()) { - MG_ERROR(("Invalid flash write address: %p", addr)); - return false; - } - - uint32_t *dst = (uint32_t *) addr; - uint32_t *src = (uint32_t *) buf; - uint32_t *end = (uint32_t *) ((char *) buf + len); - bool ok = true; - - // Note: If we overwrite the flash irq section of the image, we must also - // make sure interrupts are disabled and are not reenabled until we write - // this sector with another irq table. - if ((char *) addr == (char *) flash_code_location()) { - s_flash_irq_disabled = true; - MG_ARM_DISABLE_IRQ(); - } - - while (ok && src < end) { - if (flash_page_start(dst) && mg_flash_erase(dst) == false) { - break; - } - uint32_t status; - uint32_t dst_ofs = (uint32_t) dst - (uint32_t) mg_flash_start(); - if ((char *) buf >= (char *) mg_flash_start()) { - // If we copy from FLASH to FLASH, then we first need to copy the source - // to RAM - size_t tmp_buf_size = mg_flash_write_align() / sizeof(uint32_t); - uint32_t tmp[tmp_buf_size]; - - for (size_t i = 0; i < tmp_buf_size; i++) { - flash_wait(); - tmp[i] = src[i]; - } - MG_ARM_DISABLE_IRQ(); - status = flexspi_nor->program(FLEXSPI_NOR_INSTANCE, &config, - (uint32_t) dst_ofs, tmp); - } else { - MG_ARM_DISABLE_IRQ(); - status = flexspi_nor->program(FLEXSPI_NOR_INSTANCE, &config, - (uint32_t) dst_ofs, src); - } - if (!s_flash_irq_disabled) { - MG_ARM_ENABLE_IRQ(); - } - src = (uint32_t *) ((char *) src + mg_flash_write_align()); - dst = (uint32_t *) ((char *) dst + mg_flash_write_align()); - if (status != 0) { - ok = false; - } - } - MG_DEBUG(("Flash write %lu bytes @ %p: %s.", len, dst, ok ? "ok" : "fail")); - return ok; -} - -MG_IRAM void mg_device_reset(void) { - MG_DEBUG(("Resetting device...")); - *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004; -} - -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/device_stm32h5.c" -#endif - - - -#if MG_DEVICE == MG_DEVICE_STM32H5 - -#define FLASH_BASE 0x40022000 // Base address of the flash controller -#define FLASH_KEYR (FLASH_BASE + 0x4) // See RM0481 7.11 -#define FLASH_OPTKEYR (FLASH_BASE + 0xc) -#define FLASH_OPTCR (FLASH_BASE + 0x1c) -#define FLASH_NSSR (FLASH_BASE + 0x20) -#define FLASH_NSCR (FLASH_BASE + 0x28) -#define FLASH_NSCCR (FLASH_BASE + 0x30) -#define FLASH_OPTSR_CUR (FLASH_BASE + 0x50) -#define FLASH_OPTSR_PRG (FLASH_BASE + 0x54) - -void *mg_flash_start(void) { - return (void *) 0x08000000; -} -size_t mg_flash_size(void) { - return 2 * 1024 * 1024; // 2Mb -} -size_t mg_flash_sector_size(void) { - return 8 * 1024; // 8k -} -size_t mg_flash_write_align(void) { - return 16; // 128 bit -} -int mg_flash_bank(void) { - return MG_REG(FLASH_OPTCR) & MG_BIT(31) ? 2 : 1; -} - -static void flash_unlock(void) { - static bool unlocked = false; - if (unlocked == false) { - MG_REG(FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_KEYR) = 0Xcdef89ab; - MG_REG(FLASH_OPTKEYR) = 0x08192a3b; - MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f; - unlocked = true; - } -} - -static int flash_page_start(volatile uint32_t *dst) { - char *base = (char *) mg_flash_start(), *end = base + mg_flash_size(); - volatile char *p = (char *) dst; - return p >= base && p < end && ((p - base) % mg_flash_sector_size()) == 0; -} - -static bool flash_is_err(void) { - return MG_REG(FLASH_NSSR) & ((MG_BIT(8) - 1) << 17); // RM0481 7.11.9 -} - -static void flash_wait(void) { - while ((MG_REG(FLASH_NSSR) & MG_BIT(0)) && - (MG_REG(FLASH_NSSR) & MG_BIT(16)) == 0) { - (void) 0; - } -} - -static void flash_clear_err(void) { - flash_wait(); // Wait until ready - MG_REG(FLASH_NSCCR) = ((MG_BIT(9) - 1) << 16U); // Clear all errors -} - -static bool flash_bank_is_swapped(void) { - return MG_REG(FLASH_OPTCR) & MG_BIT(31); // RM0481 7.11.8 -} - -bool mg_flash_erase(void *location) { - bool ok = false; - if (flash_page_start(location) == false) { - MG_ERROR(("%p is not on a sector boundary")); - } else { - uintptr_t diff = (char *) location - (char *) mg_flash_start(); - uint32_t sector = diff / mg_flash_sector_size(); - uint32_t saved_cr = MG_REG(FLASH_NSCR); // Save CR value - flash_unlock(); - flash_clear_err(); - MG_REG(FLASH_NSCR) = 0; - if ((sector < 128 && flash_bank_is_swapped()) || - (sector > 127 && !flash_bank_is_swapped())) { - MG_REG(FLASH_NSCR) |= MG_BIT(31); // Set FLASH_CR_BKSEL - } - if (sector > 127) sector -= 128; - MG_REG(FLASH_NSCR) |= MG_BIT(2) | (sector << 6); // Erase | sector_num - MG_REG(FLASH_NSCR) |= MG_BIT(5); // Start erasing - flash_wait(); - ok = !flash_is_err(); - MG_DEBUG(("Erase sector %lu @ %p: %s. CR %#lx SR %#lx", sector, location, - ok ? "ok" : "fail", MG_REG(FLASH_NSCR), MG_REG(FLASH_NSSR))); - // mg_hexdump(location, 32); - MG_REG(FLASH_NSCR) = saved_cr; // Restore saved CR - } - return ok; -} - -bool mg_flash_swap_bank(void) { - uint32_t desired = flash_bank_is_swapped() ? 0 : MG_BIT(31); - flash_unlock(); - flash_clear_err(); - // printf("OPTSR_PRG 1 %#lx\n", FLASH->OPTSR_PRG); - MG_SET_BITS(MG_REG(FLASH_OPTSR_PRG), MG_BIT(31), desired); - // printf("OPTSR_PRG 2 %#lx\n", FLASH->OPTSR_PRG); - MG_REG(FLASH_OPTCR) |= MG_BIT(1); // OPTSTART - while ((MG_REG(FLASH_OPTSR_CUR) & MG_BIT(31)) != desired) (void) 0; - return true; -} - -bool mg_flash_write(void *addr, const void *buf, size_t len) { - if ((len % mg_flash_write_align()) != 0) { - MG_ERROR(("%lu is not aligned to %lu", len, mg_flash_write_align())); - return false; - } - uint32_t *dst = (uint32_t *) addr; - uint32_t *src = (uint32_t *) buf; - uint32_t *end = (uint32_t *) ((char *) buf + len); - bool ok = true; - flash_unlock(); - flash_clear_err(); - MG_ARM_DISABLE_IRQ(); - // MG_DEBUG(("Starting flash write %lu bytes @ %p", len, addr)); - MG_REG(FLASH_NSCR) = MG_BIT(1); // Set programming flag - while (ok && src < end) { - if (flash_page_start(dst) && mg_flash_erase(dst) == false) break; - *(volatile uint32_t *) dst++ = *src++; - flash_wait(); - if (flash_is_err()) ok = false; - } - MG_ARM_ENABLE_IRQ(); - MG_DEBUG(("Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx", len, dst, - flash_is_err() ? "fail" : "ok", MG_REG(FLASH_NSCR), - MG_REG(FLASH_NSSR))); - MG_REG(FLASH_NSCR) = 0; // Clear flags - return ok; -} - -void mg_device_reset(void) { - // SCB->AIRCR = ((0x5fa << SCB_AIRCR_VECTKEY_Pos)|SCB_AIRCR_SYSRESETREQ_Msk); - *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004; -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/device_stm32h7.c" -#endif - - - -#if MG_DEVICE == MG_DEVICE_STM32H7 - -#define FLASH_BASE1 0x52002000 // Base address for bank1 -#define FLASH_BASE2 0x52002100 // Base address for bank2 -#define FLASH_KEYR 0x04 // See RM0433 4.9.2 -#define FLASH_OPTKEYR 0x08 -#define FLASH_OPTCR 0x18 -#define FLASH_SR 0x10 -#define FLASH_CR 0x0c -#define FLASH_CCR 0x14 -#define FLASH_OPTSR_CUR 0x1c -#define FLASH_OPTSR_PRG 0x20 -#define FLASH_SIZE_REG 0x1ff1e880 - -MG_IRAM void *mg_flash_start(void) { - return (void *) 0x08000000; -} -MG_IRAM size_t mg_flash_size(void) { - return MG_REG(FLASH_SIZE_REG) * 1024; -} -MG_IRAM size_t mg_flash_sector_size(void) { - return 128 * 1024; // 128k -} -MG_IRAM size_t mg_flash_write_align(void) { - return 32; // 256 bit -} -MG_IRAM int mg_flash_bank(void) { - if (mg_flash_size() < 2 * 1024 * 1024) return 0; // No dual bank support - return MG_REG(FLASH_BASE1 + FLASH_OPTCR) & MG_BIT(31) ? 2 : 1; -} - -MG_IRAM static void flash_unlock(void) { - static bool unlocked = false; - if (unlocked == false) { - MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; - if (mg_flash_bank() > 0) { - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; - } - MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" - MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once - unlocked = true; - } -} - -MG_IRAM static bool flash_page_start(volatile uint32_t *dst) { - char *base = (char *) mg_flash_start(), *end = base + mg_flash_size(); - volatile char *p = (char *) dst; - return p >= base && p < end && ((p - base) % mg_flash_sector_size()) == 0; -} - -MG_IRAM static bool flash_is_err(uint32_t bank) { - return MG_REG(bank + FLASH_SR) & ((MG_BIT(11) - 1) << 17); // RM0433 4.9.5 -} - -MG_IRAM static void flash_wait(uint32_t bank) { - while (MG_REG(bank + FLASH_SR) & (MG_BIT(0) | MG_BIT(2))) (void) 0; -} - -MG_IRAM static void flash_clear_err(uint32_t bank) { - flash_wait(bank); // Wait until ready - MG_REG(bank + FLASH_CCR) = ((MG_BIT(11) - 1) << 16U); // Clear all errors -} - -MG_IRAM static bool flash_bank_is_swapped(uint32_t bank) { - return MG_REG(bank + FLASH_OPTCR) & MG_BIT(31); // RM0433 4.9.7 -} - -// Figure out flash bank based on the address -MG_IRAM static uint32_t flash_bank(void *addr) { - size_t ofs = (char *) addr - (char *) mg_flash_start(); - if (mg_flash_bank() == 0) return FLASH_BASE1; - return ofs < mg_flash_size() / 2 ? FLASH_BASE1 : FLASH_BASE2; -} - -MG_IRAM bool mg_flash_erase(void *addr) { - bool ok = false; - if (flash_page_start(addr) == false) { - MG_ERROR(("%p is not on a sector boundary", addr)); - } else { - uintptr_t diff = (char *) addr - (char *) mg_flash_start(); - uint32_t sector = diff / mg_flash_sector_size(); - uint32_t bank = flash_bank(addr); - uint32_t saved_cr = MG_REG(bank + FLASH_CR); // Save CR value - - flash_unlock(); - if (sector > 7) sector -= 8; - - flash_clear_err(bank); - MG_REG(bank + FLASH_CR) = MG_BIT(5); // 32-bit write parallelism - MG_REG(bank + FLASH_CR) |= (sector & 7U) << 8U; // Sector to erase - MG_REG(bank + FLASH_CR) |= MG_BIT(2); // Sector erase bit - MG_REG(bank + FLASH_CR) |= MG_BIT(7); // Start erasing - ok = !flash_is_err(bank); - MG_DEBUG(("Erase sector %lu @ %p %s. CR %#lx SR %#lx", sector, addr, - ok ? "ok" : "fail", MG_REG(bank + FLASH_CR), - MG_REG(bank + FLASH_SR))); - MG_REG(bank + FLASH_CR) = saved_cr; // Restore CR - } - return ok; -} - -MG_IRAM bool mg_flash_swap_bank() { - if (mg_flash_bank() == 0) return true; - uint32_t bank = FLASH_BASE1; - uint32_t desired = flash_bank_is_swapped(bank) ? 0 : MG_BIT(31); - flash_unlock(); - flash_clear_err(bank); - // printf("OPTSR_PRG 1 %#lx\n", FLASH->OPTSR_PRG); - MG_SET_BITS(MG_REG(bank + FLASH_OPTSR_PRG), MG_BIT(31), desired); - // printf("OPTSR_PRG 2 %#lx\n", FLASH->OPTSR_PRG); - MG_REG(bank + FLASH_OPTCR) |= MG_BIT(1); // OPTSTART - while ((MG_REG(bank + FLASH_OPTSR_CUR) & MG_BIT(31)) != desired) (void) 0; - return true; -} - -MG_IRAM bool mg_flash_write(void *addr, const void *buf, size_t len) { - if ((len % mg_flash_write_align()) != 0) { - MG_ERROR(("%lu is not aligned to %lu", len, mg_flash_write_align())); - return false; - } - uint32_t bank = flash_bank(addr); - uint32_t *dst = (uint32_t *) addr; - uint32_t *src = (uint32_t *) buf; - uint32_t *end = (uint32_t *) ((char *) buf + len); - bool ok = true; - flash_unlock(); - flash_clear_err(bank); - MG_REG(bank + FLASH_CR) = MG_BIT(1); // Set programming flag - MG_REG(bank + FLASH_CR) |= MG_BIT(5); // 32-bit write parallelism - MG_DEBUG(("Writing flash @ %p, %lu bytes", addr, len)); - MG_ARM_DISABLE_IRQ(); - while (ok && src < end) { - if (flash_page_start(dst) && mg_flash_erase(dst) == false) break; - *(volatile uint32_t *) dst++ = *src++; - flash_wait(bank); - if (flash_is_err(bank)) ok = false; - } - MG_ARM_ENABLE_IRQ(); - MG_DEBUG(("Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx", len, dst, - ok ? "ok" : "fail", MG_REG(bank + FLASH_CR), - MG_REG(bank + FLASH_SR))); - MG_REG(bank + FLASH_CR) &= ~MG_BIT(1); // Clear programming flag - return ok; -} - -MG_IRAM void mg_device_reset(void) { - // SCB->AIRCR = ((0x5fa << SCB_AIRCR_VECTKEY_Pos)|SCB_AIRCR_SYSRESETREQ_Msk); - *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004; -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/dns.c" -#endif - - - - - - - - -struct dns_data { - struct dns_data *next; - struct mg_connection *c; - uint64_t expire; - uint16_t txnid; -}; - -static void mg_sendnsreq(struct mg_connection *, struct mg_str *, int, - struct mg_dns *, bool); - -static void mg_dns_free(struct dns_data **head, struct dns_data *d) { - LIST_DELETE(struct dns_data, head, d); - free(d); -} - -void mg_resolve_cancel(struct mg_connection *c) { - struct dns_data *tmp, *d; - struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests; - for (d = *head; d != NULL; d = tmp) { - tmp = d->next; - if (d->c == c) mg_dns_free(head, d); - } -} - -static size_t mg_dns_parse_name_depth(const uint8_t *s, size_t len, size_t ofs, - char *to, size_t tolen, size_t j, - int depth) { - size_t i = 0; - if (tolen > 0 && depth == 0) to[0] = '\0'; - if (depth > 5) return 0; - // MG_INFO(("ofs %lx %x %x", (unsigned long) ofs, s[ofs], s[ofs + 1])); - while (ofs + i + 1 < len) { - size_t n = s[ofs + i]; - if (n == 0) { - i++; - break; - } - if (n & 0xc0) { - size_t ptr = (((n & 0x3f) << 8) | s[ofs + i + 1]); // 12 is hdr len - // MG_INFO(("PTR %lx", (unsigned long) ptr)); - if (ptr + 1 < len && (s[ptr] & 0xc0) == 0 && - mg_dns_parse_name_depth(s, len, ptr, to, tolen, j, depth + 1) == 0) - return 0; - i += 2; - break; - } - if (ofs + i + n + 1 >= len) return 0; - if (j > 0) { - if (j < tolen) to[j] = '.'; - j++; - } - if (j + n < tolen) memcpy(&to[j], &s[ofs + i + 1], n); - j += n; - i += n + 1; - if (j < tolen) to[j] = '\0'; // Zero-terminate this chunk - // MG_INFO(("--> [%s]", to)); - } - if (tolen > 0) to[tolen - 1] = '\0'; // Make sure make sure it is nul-term - return i; -} - -static size_t mg_dns_parse_name(const uint8_t *s, size_t n, size_t ofs, - char *dst, size_t dstlen) { - return mg_dns_parse_name_depth(s, n, ofs, dst, dstlen, 0, 0); -} - -size_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs, - bool is_question, struct mg_dns_rr *rr) { - const uint8_t *s = buf + ofs, *e = &buf[len]; - - memset(rr, 0, sizeof(*rr)); - if (len < sizeof(struct mg_dns_header)) return 0; // Too small - if (len > 512) return 0; // Too large, we don't expect that - if (s >= e) return 0; // Overflow - - if ((rr->nlen = (uint16_t) mg_dns_parse_name(buf, len, ofs, NULL, 0)) == 0) - return 0; - s += rr->nlen + 4; - if (s > e) return 0; - rr->atype = (uint16_t) (((uint16_t) s[-4] << 8) | s[-3]); - rr->aclass = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]); - if (is_question) return (size_t) (rr->nlen + 4); - - s += 6; - if (s > e) return 0; - rr->alen = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]); - if (s + rr->alen > e) return 0; - return (size_t) (rr->nlen + rr->alen + 10); -} - -bool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *dm) { - const struct mg_dns_header *h = (struct mg_dns_header *) buf; - struct mg_dns_rr rr; - size_t i, n, num_answers, ofs = sizeof(*h); - memset(dm, 0, sizeof(*dm)); - - if (len < sizeof(*h)) return 0; // Too small, headers dont fit - if (mg_ntohs(h->num_questions) > 1) return 0; // Sanity - num_answers = mg_ntohs(h->num_answers); - if (num_answers > 10) { - MG_DEBUG(("Got %u answers, ignoring beyond 10th one", num_answers)); - num_answers = 10; // Sanity cap - } - dm->txnid = mg_ntohs(h->txnid); - - for (i = 0; i < mg_ntohs(h->num_questions); i++) { - if ((n = mg_dns_parse_rr(buf, len, ofs, true, &rr)) == 0) return false; - // MG_INFO(("Q %lu %lu %hu/%hu", ofs, n, rr.atype, rr.aclass)); - ofs += n; - } - for (i = 0; i < num_answers; i++) { - if ((n = mg_dns_parse_rr(buf, len, ofs, false, &rr)) == 0) return false; - // MG_INFO(("A -- %lu %lu %hu/%hu %s", ofs, n, rr.atype, rr.aclass, - // dm->name)); - mg_dns_parse_name(buf, len, ofs, dm->name, sizeof(dm->name)); - ofs += n; - - if (rr.alen == 4 && rr.atype == 1 && rr.aclass == 1) { - dm->addr.is_ip6 = false; - memcpy(&dm->addr.ip, &buf[ofs - 4], 4); - dm->resolved = true; - break; // Return success - } else if (rr.alen == 16 && rr.atype == 28 && rr.aclass == 1) { - dm->addr.is_ip6 = true; - memcpy(&dm->addr.ip, &buf[ofs - 16], 16); - dm->resolved = true; - break; // Return success - } - } - return true; -} - -static void dns_cb(struct mg_connection *c, int ev, void *ev_data) { - struct dns_data *d, *tmp; - struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests; - if (ev == MG_EV_POLL) { - uint64_t now = *(uint64_t *) ev_data; - for (d = *head; d != NULL; d = tmp) { - tmp = d->next; - // MG_DEBUG ("%lu %lu dns poll", d->expire, now)); - if (now > d->expire) mg_error(d->c, "DNS timeout"); - } - } else if (ev == MG_EV_READ) { - struct mg_dns_message dm; - int resolved = 0; - if (mg_dns_parse(c->recv.buf, c->recv.len, &dm) == false) { - MG_ERROR(("Unexpected DNS response:")); - mg_hexdump(c->recv.buf, c->recv.len); - } else { - // MG_VERBOSE(("%s %d", dm.name, dm.resolved)); - for (d = *head; d != NULL; d = tmp) { - tmp = d->next; - // MG_INFO(("d %p %hu %hu", d, d->txnid, dm.txnid)); - if (dm.txnid != d->txnid) continue; - if (d->c->is_resolving) { - if (dm.resolved) { - dm.addr.port = d->c->rem.port; // Save port - d->c->rem = dm.addr; // Copy resolved address - MG_DEBUG( - ("%lu %s is %M", d->c->id, dm.name, mg_print_ip, &d->c->rem)); - mg_connect_resolved(d->c); -#if MG_ENABLE_IPV6 - } else if (dm.addr.is_ip6 == false && dm.name[0] != '\0' && - c->mgr->use_dns6 == false) { - struct mg_str x = mg_str(dm.name); - mg_sendnsreq(d->c, &x, c->mgr->dnstimeout, &c->mgr->dns6, true); -#endif - } else { - mg_error(d->c, "%s DNS lookup failed", dm.name); - } - } else { - MG_ERROR(("%lu already resolved", d->c->id)); - } - mg_dns_free(head, d); - resolved = 1; - } - } - if (!resolved) MG_ERROR(("stray DNS reply")); - c->recv.len = 0; - } else if (ev == MG_EV_CLOSE) { - for (d = *head; d != NULL; d = tmp) { - tmp = d->next; - mg_error(d->c, "DNS error"); - mg_dns_free(head, d); - } - } -} - -static bool mg_dns_send(struct mg_connection *c, const struct mg_str *name, - uint16_t txnid, bool ipv6) { - struct { - struct mg_dns_header header; - uint8_t data[256]; - } pkt; - size_t i, n; - memset(&pkt, 0, sizeof(pkt)); - pkt.header.txnid = mg_htons(txnid); - pkt.header.flags = mg_htons(0x100); - pkt.header.num_questions = mg_htons(1); - for (i = n = 0; i < sizeof(pkt.data) - 5; i++) { - if (name->ptr[i] == '.' || i >= name->len) { - pkt.data[n] = (uint8_t) (i - n); - memcpy(&pkt.data[n + 1], name->ptr + n, i - n); - n = i + 1; - } - if (i >= name->len) break; - } - memcpy(&pkt.data[n], "\x00\x00\x01\x00\x01", 5); // A query - n += 5; - if (ipv6) pkt.data[n - 3] = 0x1c; // AAAA query - // memcpy(&pkt.data[n], "\xc0\x0c\x00\x1c\x00\x01", 6); // AAAA query - // n += 6; - return mg_send(c, &pkt, sizeof(pkt.header) + n); -} - -static void mg_sendnsreq(struct mg_connection *c, struct mg_str *name, int ms, - struct mg_dns *dnsc, bool ipv6) { - struct dns_data *d = NULL; - if (dnsc->url == NULL) { - mg_error(c, "DNS server URL is NULL. Call mg_mgr_init()"); - } else if (dnsc->c == NULL) { - dnsc->c = mg_connect(c->mgr, dnsc->url, NULL, NULL); - if (dnsc->c != NULL) { - dnsc->c->pfn = dns_cb; - // dnsc->c->is_hexdumping = 1; - } - } - if (dnsc->c == NULL) { - mg_error(c, "resolver"); - } else if ((d = (struct dns_data *) calloc(1, sizeof(*d))) == NULL) { - mg_error(c, "resolve OOM"); - } else { - struct dns_data *reqs = (struct dns_data *) c->mgr->active_dns_requests; - d->txnid = reqs ? (uint16_t) (reqs->txnid + 1) : 1; - d->next = (struct dns_data *) c->mgr->active_dns_requests; - c->mgr->active_dns_requests = d; - d->expire = mg_millis() + (uint64_t) ms; - d->c = c; - c->is_resolving = 1; - MG_VERBOSE(("%lu resolving %.*s @ %s, txnid %hu", c->id, (int) name->len, - name->ptr, dnsc->url, d->txnid)); - if (!mg_dns_send(dnsc->c, name, d->txnid, ipv6)) { - mg_error(dnsc->c, "DNS send"); - } - } -} - -void mg_resolve(struct mg_connection *c, const char *url) { - struct mg_str host = mg_url_host(url); - c->rem.port = mg_htons(mg_url_port(url)); - if (mg_aton(host, &c->rem)) { - // host is an IP address, do not fire name resolution - mg_connect_resolved(c); - } else { - // host is not an IP, send DNS resolution request - struct mg_dns *dns = c->mgr->use_dns6 ? &c->mgr->dns6 : &c->mgr->dns4; - mg_sendnsreq(c, &host, c->mgr->dnstimeout, dns, c->mgr->use_dns6); - } -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/event.c" -#endif - - - - - - -void mg_call(struct mg_connection *c, int ev, void *ev_data) { -#if MG_ENABLE_PROFILE - const char *names[] = { - "EV_ERROR", "EV_OPEN", "EV_POLL", "EV_RESOLVE", - "EV_CONNECT", "EV_ACCEPT", "EV_TLS_HS", "EV_READ", - "EV_WRITE", "EV_CLOSE", "EV_HTTP_MSG", "EV_HTTP_CHUNK", - "EV_WS_OPEN", "EV_WS_MSG", "EV_WS_CTL", "EV_MQTT_CMD", - "EV_MQTT_MSG", "EV_MQTT_OPEN", "EV_SNTP_TIME", "EV_USER"}; - if (ev != MG_EV_POLL && ev < (int) (sizeof(names) / sizeof(names[0]))) { - MG_PROF_ADD(c, names[ev]); - } -#endif - // Fire protocol handler first, user handler second. See #2559 - if (c->pfn != NULL) c->pfn(c, ev, ev_data); - if (c->fn != NULL) c->fn(c, ev, ev_data); -} - -void mg_error(struct mg_connection *c, const char *fmt, ...) { - char buf[64]; - va_list ap; - va_start(ap, fmt); - mg_vsnprintf(buf, sizeof(buf), fmt, &ap); - va_end(ap); - MG_ERROR(("%lu %ld %s", c->id, c->fd, buf)); - c->is_closing = 1; // Set is_closing before sending MG_EV_CALL - mg_call(c, MG_EV_ERROR, buf); // Let user handler override it -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/fmt.c" -#endif - - - - -static bool is_digit(int c) { - return c >= '0' && c <= '9'; -} - -static int addexp(char *buf, int e, int sign) { - int n = 0; - buf[n++] = 'e'; - buf[n++] = (char) sign; - if (e > 400) return 0; - if (e < 10) buf[n++] = '0'; - if (e >= 100) buf[n++] = (char) (e / 100 + '0'), e -= 100 * (e / 100); - if (e >= 10) buf[n++] = (char) (e / 10 + '0'), e -= 10 * (e / 10); - buf[n++] = (char) (e + '0'); - return n; -} - -static int xisinf(double x) { - union { - double f; - uint64_t u; - } ieee754 = {x}; - return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 && - ((unsigned) ieee754.u == 0); -} - -static int xisnan(double x) { - union { - double f; - uint64_t u; - } ieee754 = {x}; - return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) + - ((unsigned) ieee754.u != 0) > - 0x7ff00000; -} - -static size_t mg_dtoa(char *dst, size_t dstlen, double d, int width, bool tz) { - char buf[40]; - int i, s = 0, n = 0, e = 0; - double t, mul, saved; - if (d == 0.0) return mg_snprintf(dst, dstlen, "%s", "0"); - if (xisinf(d)) return mg_snprintf(dst, dstlen, "%s", d > 0 ? "inf" : "-inf"); - if (xisnan(d)) return mg_snprintf(dst, dstlen, "%s", "nan"); - if (d < 0.0) d = -d, buf[s++] = '-'; - - // Round - saved = d; - mul = 1.0; - while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0; - while (d <= 1.0 && d / mul <= 1.0) mul /= 10.0; - for (i = 0, t = mul * 5; i < width; i++) t /= 10.0; - d += t; - // Calculate exponent, and 'mul' for scientific representation - mul = 1.0; - while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0, e++; - while (d < 1.0 && d / mul < 1.0) mul /= 10.0, e--; - // printf(" --> %g %d %g %g\n", saved, e, t, mul); - - if (e >= width && width > 1) { - n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz); - // printf(" --> %.*g %d [%.*s]\n", 10, d / t, e, n, buf); - n += addexp(buf + s + n, e, '+'); - return mg_snprintf(dst, dstlen, "%.*s", n, buf); - } else if (e <= -width && width > 1) { - n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz); - // printf(" --> %.*g %d [%.*s]\n", 10, d / mul, e, n, buf); - n += addexp(buf + s + n, -e, '-'); - return mg_snprintf(dst, dstlen, "%.*s", n, buf); - } else { - for (i = 0, t = mul; t >= 1.0 && s + n < (int) sizeof(buf); i++) { - int ch = (int) (d / t); - if (n > 0 || ch > 0) buf[s + n++] = (char) (ch + '0'); - d -= ch * t; - t /= 10.0; - } - // printf(" --> [%g] -> %g %g (%d) [%.*s]\n", saved, d, t, n, s + n, buf); - if (n == 0) buf[s++] = '0'; - while (t >= 1.0 && n + s < (int) sizeof(buf)) buf[n++] = '0', t /= 10.0; - if (s + n < (int) sizeof(buf)) buf[n + s++] = '.'; - // printf(" 1--> [%g] -> [%.*s]\n", saved, s + n, buf); - for (i = 0, t = 0.1; s + n < (int) sizeof(buf) && n < width; i++) { - int ch = (int) (d / t); - buf[s + n++] = (char) (ch + '0'); - d -= ch * t; - t /= 10.0; - } - } - while (tz && n > 0 && buf[s + n - 1] == '0') n--; // Trim trailing zeroes - if (n > 0 && buf[s + n - 1] == '.') n--; // Trim trailing dot - n += s; - if (n >= (int) sizeof(buf)) n = (int) sizeof(buf) - 1; - buf[n] = '\0'; - return mg_snprintf(dst, dstlen, "%s", buf); -} - -static size_t mg_lld(char *buf, int64_t val, bool is_signed, bool is_hex) { - const char *letters = "0123456789abcdef"; - uint64_t v = (uint64_t) val; - size_t s = 0, n, i; - if (is_signed && val < 0) buf[s++] = '-', v = (uint64_t) (-val); - // This loop prints a number in reverse order. I guess this is because we - // write numbers from right to left: least significant digit comes last. - // Maybe because we use Arabic numbers, and Arabs write RTL? - if (is_hex) { - for (n = 0; v; v >>= 4) buf[s + n++] = letters[v & 15]; - } else { - for (n = 0; v; v /= 10) buf[s + n++] = letters[v % 10]; - } - // Reverse a string - for (i = 0; i < n / 2; i++) { - char t = buf[s + i]; - buf[s + i] = buf[s + n - i - 1], buf[s + n - i - 1] = t; - } - if (val == 0) buf[n++] = '0'; // Handle special case - return n + s; -} - -static size_t scpy(void (*out)(char, void *), void *ptr, char *buf, - size_t len) { - size_t i = 0; - while (i < len && buf[i] != '\0') out(buf[i++], ptr); - return i; -} - -size_t mg_xprintf(void (*out)(char, void *), void *ptr, const char *fmt, ...) { - size_t len = 0; - va_list ap; - va_start(ap, fmt); - len = mg_vxprintf(out, ptr, fmt, &ap); - va_end(ap); - return len; -} - -size_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt, - va_list *ap) { - size_t i = 0, n = 0; - while (fmt[i] != '\0') { - if (fmt[i] == '%') { - size_t j, k, x = 0, is_long = 0, w = 0 /* width */, pr = ~0U /* prec */; - char pad = ' ', minus = 0, c = fmt[++i]; - if (c == '#') x++, c = fmt[++i]; - if (c == '-') minus++, c = fmt[++i]; - if (c == '0') pad = '0', c = fmt[++i]; - while (is_digit(c)) w *= 10, w += (size_t) (c - '0'), c = fmt[++i]; - if (c == '.') { - c = fmt[++i]; - if (c == '*') { - pr = (size_t) va_arg(*ap, int); - c = fmt[++i]; - } else { - pr = 0; - while (is_digit(c)) pr *= 10, pr += (size_t) (c - '0'), c = fmt[++i]; - } - } - while (c == 'h') c = fmt[++i]; // Treat h and hh as int - if (c == 'l') { - is_long++, c = fmt[++i]; - if (c == 'l') is_long++, c = fmt[++i]; - } - if (c == 'p') x = 1, is_long = 1; - if (c == 'd' || c == 'u' || c == 'x' || c == 'X' || c == 'p' || - c == 'g' || c == 'f') { - bool s = (c == 'd'), h = (c == 'x' || c == 'X' || c == 'p'); - char tmp[40]; - size_t xl = x ? 2 : 0; - if (c == 'g' || c == 'f') { - double v = va_arg(*ap, double); - if (pr == ~0U) pr = 6; - k = mg_dtoa(tmp, sizeof(tmp), v, (int) pr, c == 'g'); - } else if (is_long == 2) { - int64_t v = va_arg(*ap, int64_t); - k = mg_lld(tmp, v, s, h); - } else if (is_long == 1) { - long v = va_arg(*ap, long); - k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned long) v, s, h); - } else { - int v = va_arg(*ap, int); - k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned) v, s, h); - } - for (j = 0; j < xl && w > 0; j++) w--; - for (j = 0; pad == ' ' && !minus && k < w && j + k < w; j++) - n += scpy(out, param, &pad, 1); - n += scpy(out, param, (char *) "0x", xl); - for (j = 0; pad == '0' && k < w && j + k < w; j++) - n += scpy(out, param, &pad, 1); - n += scpy(out, param, tmp, k); - for (j = 0; pad == ' ' && minus && k < w && j + k < w; j++) - n += scpy(out, param, &pad, 1); - } else if (c == 'm' || c == 'M') { - mg_pm_t f = va_arg(*ap, mg_pm_t); - if (c == 'm') out('"', param); - n += f(out, param, ap); - if (c == 'm') n += 2, out('"', param); - } else if (c == 'c') { - int ch = va_arg(*ap, int); - out((char) ch, param); - n++; - } else if (c == 's') { - char *p = va_arg(*ap, char *); - if (pr == ~0U) pr = p == NULL ? 0 : strlen(p); - for (j = 0; !minus && pr < w && j + pr < w; j++) - n += scpy(out, param, &pad, 1); - n += scpy(out, param, p, pr); - for (j = 0; minus && pr < w && j + pr < w; j++) - n += scpy(out, param, &pad, 1); - } else if (c == '%') { - out('%', param); - n++; - } else { - out('%', param); - out(c, param); - n += 2; - } - i++; - } else { - out(fmt[i], param), n++, i++; - } - } - return n; -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/fs.c" -#endif - - - - -struct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags) { - struct mg_fd *fd = (struct mg_fd *) calloc(1, sizeof(*fd)); - if (fd != NULL) { - fd->fd = fs->op(path, flags); - fd->fs = fs; - if (fd->fd == NULL) { - free(fd); - fd = NULL; - } - } - return fd; -} - -void mg_fs_close(struct mg_fd *fd) { - if (fd != NULL) { - fd->fs->cl(fd->fd); - free(fd); - } -} - -struct mg_str mg_file_read(struct mg_fs *fs, const char *path) { - struct mg_str result = {NULL, 0}; - void *fp; - fs->st(path, &result.len, NULL); - if ((fp = fs->op(path, MG_FS_READ)) != NULL) { - result.ptr = (char *) calloc(1, result.len + 1); - if (result.ptr != NULL && - fs->rd(fp, (void *) result.ptr, result.len) != result.len) { - free((void *) result.ptr); - result.ptr = NULL; - } - fs->cl(fp); - } - if (result.ptr == NULL) result.len = 0; - return result; -} - -bool mg_file_write(struct mg_fs *fs, const char *path, const void *buf, - size_t len) { - bool result = false; - struct mg_fd *fd; - char tmp[MG_PATH_MAX]; - mg_snprintf(tmp, sizeof(tmp), "%s..%d", path, rand()); - if ((fd = mg_fs_open(fs, tmp, MG_FS_WRITE)) != NULL) { - result = fs->wr(fd->fd, buf, len) == len; - mg_fs_close(fd); - if (result) { - fs->rm(path); - fs->mv(tmp, path); - } else { - fs->rm(tmp); - } - } - return result; -} - -bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...) { - va_list ap; - char *data; - bool result = false; - va_start(ap, fmt); - data = mg_vmprintf(fmt, &ap); - va_end(ap); - result = mg_file_write(fs, path, data, strlen(data)); - free(data); - return result; -} - -// This helper function allows to scan a filesystem in a sequential way, -// without using callback function: -// char buf[100] = ""; -// while (mg_fs_ls(&mg_fs_posix, "./", buf, sizeof(buf))) { -// ... -static void mg_fs_ls_fn(const char *filename, void *param) { - struct mg_str *s = (struct mg_str *) param; - if (s->ptr[0] == '\0') { - mg_snprintf((char *) s->ptr, s->len, "%s", filename); - } else if (strcmp(s->ptr, filename) == 0) { - ((char *) s->ptr)[0] = '\0'; // Fetch next file - } -} - -bool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len) { - struct mg_str s = {buf, len}; - fs->ls(path, mg_fs_ls_fn, &s); - return buf[0] != '\0'; -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/fs_fat.c" -#endif - - - -#if MG_ENABLE_FATFS -#include - -static int mg_days_from_epoch(int y, int m, int d) { - y -= m <= 2; - int era = y / 400; - int yoe = y - era * 400; - int doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1; - int doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; - return era * 146097 + doe - 719468; -} - -static time_t mg_timegm(const struct tm *t) { - int year = t->tm_year + 1900; - int month = t->tm_mon; // 0-11 - if (month > 11) { - year += month / 12; - month %= 12; - } else if (month < 0) { - int years_diff = (11 - month) / 12; - year -= years_diff; - month += 12 * years_diff; - } - int x = mg_days_from_epoch(year, month + 1, t->tm_mday); - return 60 * (60 * (24L * x + t->tm_hour) + t->tm_min) + t->tm_sec; -} - -static time_t ff_time_to_epoch(uint16_t fdate, uint16_t ftime) { - struct tm tm; - memset(&tm, 0, sizeof(struct tm)); - tm.tm_sec = (ftime << 1) & 0x3e; - tm.tm_min = ((ftime >> 5) & 0x3f); - tm.tm_hour = ((ftime >> 11) & 0x1f); - tm.tm_mday = (fdate & 0x1f); - tm.tm_mon = ((fdate >> 5) & 0x0f) - 1; - tm.tm_year = ((fdate >> 9) & 0x7f) + 80; - return mg_timegm(&tm); -} - -static int ff_stat(const char *path, size_t *size, time_t *mtime) { - FILINFO fi; - if (path[0] == '\0') { - if (size) *size = 0; - if (mtime) *mtime = 0; - return MG_FS_DIR; - } else if (f_stat(path, &fi) == 0) { - if (size) *size = (size_t) fi.fsize; - if (mtime) *mtime = ff_time_to_epoch(fi.fdate, fi.ftime); - return MG_FS_READ | MG_FS_WRITE | ((fi.fattrib & AM_DIR) ? MG_FS_DIR : 0); - } else { - return 0; - } -} - -static void ff_list(const char *dir, void (*fn)(const char *, void *), - void *userdata) { - DIR d; - FILINFO fi; - if (f_opendir(&d, dir) == FR_OK) { - while (f_readdir(&d, &fi) == FR_OK && fi.fname[0] != '\0') { - if (!strcmp(fi.fname, ".") || !strcmp(fi.fname, "..")) continue; - fn(fi.fname, userdata); - } - f_closedir(&d); - } -} - -static void *ff_open(const char *path, int flags) { - FIL f; - unsigned char mode = FA_READ; - if (flags & MG_FS_WRITE) mode |= FA_WRITE | FA_OPEN_ALWAYS | FA_OPEN_APPEND; - if (f_open(&f, path, mode) == 0) { - FIL *fp; - if ((fp = calloc(1, sizeof(*fp))) != NULL) { - memcpy(fp, &f, sizeof(*fp)); - return fp; - } - } - return NULL; -} - -static void ff_close(void *fp) { - if (fp != NULL) { - f_close((FIL *) fp); - free(fp); - } -} - -static size_t ff_read(void *fp, void *buf, size_t len) { - UINT n = 0, misalign = ((size_t) buf) & 3; - if (misalign) { - char aligned[4]; - f_read((FIL *) fp, aligned, len > misalign ? misalign : len, &n); - memcpy(buf, aligned, n); - } else { - f_read((FIL *) fp, buf, len, &n); - } - return n; -} - -static size_t ff_write(void *fp, const void *buf, size_t len) { - UINT n = 0; - return f_write((FIL *) fp, (char *) buf, len, &n) == FR_OK ? n : 0; -} - -static size_t ff_seek(void *fp, size_t offset) { - f_lseek((FIL *) fp, offset); - return offset; -} - -static bool ff_rename(const char *from, const char *to) { - return f_rename(from, to) == FR_OK; -} - -static bool ff_remove(const char *path) { - return f_unlink(path) == FR_OK; -} - -static bool ff_mkdir(const char *path) { - return f_mkdir(path) == FR_OK; -} - -struct mg_fs mg_fs_fat = {ff_stat, ff_list, ff_open, ff_close, ff_read, - ff_write, ff_seek, ff_rename, ff_remove, ff_mkdir}; -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/fs_packed.c" -#endif - - - - -struct packed_file { - const char *data; - size_t size; - size_t pos; -}; - -#if MG_ENABLE_PACKED_FS -#else -const char *mg_unpack(const char *path, size_t *size, time_t *mtime) { - *size = 0, *mtime = 0; - (void) path; - return NULL; -} -const char *mg_unlist(size_t no) { - (void) no; - return NULL; -} -#endif - -struct mg_str mg_unpacked(const char *path) { - size_t len = 0; - const char *buf = mg_unpack(path, &len, NULL); - return mg_str_n(buf, len); -} - -static int is_dir_prefix(const char *prefix, size_t n, const char *path) { - // MG_INFO(("[%.*s] [%s] %c", (int) n, prefix, path, path[n])); - return n < strlen(path) && strncmp(prefix, path, n) == 0 && - (n == 0 || path[n] == '/' || path[n - 1] == '/'); -} - -static int packed_stat(const char *path, size_t *size, time_t *mtime) { - const char *p; - size_t i, n = strlen(path); - if (mg_unpack(path, size, mtime)) return MG_FS_READ; // Regular file - // Scan all files. If `path` is a dir prefix for any of them, it's a dir - for (i = 0; (p = mg_unlist(i)) != NULL; i++) { - if (is_dir_prefix(path, n, p)) return MG_FS_DIR; - } - return 0; -} - -static void packed_list(const char *dir, void (*fn)(const char *, void *), - void *userdata) { - char buf[MG_PATH_MAX], tmp[sizeof(buf)]; - const char *path, *begin, *end; - size_t i, n = strlen(dir); - tmp[0] = '\0'; // Previously listed entry - for (i = 0; (path = mg_unlist(i)) != NULL; i++) { - if (!is_dir_prefix(dir, n, path)) continue; - begin = &path[n + 1]; - end = strchr(begin, '/'); - if (end == NULL) end = begin + strlen(begin); - mg_snprintf(buf, sizeof(buf), "%.*s", (int) (end - begin), begin); - buf[sizeof(buf) - 1] = '\0'; - // If this entry has been already listed, skip - // NOTE: we're assuming that file list is sorted alphabetically - if (strcmp(buf, tmp) == 0) continue; - fn(buf, userdata); // Not yet listed, call user function - strcpy(tmp, buf); // And save this entry as listed - } -} - -static void *packed_open(const char *path, int flags) { - size_t size = 0; - const char *data = mg_unpack(path, &size, NULL); - struct packed_file *fp = NULL; - if (data == NULL) return NULL; - if (flags & MG_FS_WRITE) return NULL; - if ((fp = (struct packed_file *) calloc(1, sizeof(*fp))) != NULL) { - fp->size = size; - fp->data = data; - } - return (void *) fp; -} - -static void packed_close(void *fp) { - if (fp != NULL) free(fp); -} - -static size_t packed_read(void *fd, void *buf, size_t len) { - struct packed_file *fp = (struct packed_file *) fd; - if (fp->pos + len > fp->size) len = fp->size - fp->pos; - memcpy(buf, &fp->data[fp->pos], len); - fp->pos += len; - return len; -} - -static size_t packed_write(void *fd, const void *buf, size_t len) { - (void) fd, (void) buf, (void) len; - return 0; -} - -static size_t packed_seek(void *fd, size_t offset) { - struct packed_file *fp = (struct packed_file *) fd; - fp->pos = offset; - if (fp->pos > fp->size) fp->pos = fp->size; - return fp->pos; -} - -static bool packed_rename(const char *from, const char *to) { - (void) from, (void) to; - return false; -} - -static bool packed_remove(const char *path) { - (void) path; - return false; -} - -static bool packed_mkdir(const char *path) { - (void) path; - return false; -} - -struct mg_fs mg_fs_packed = { - packed_stat, packed_list, packed_open, packed_close, packed_read, - packed_write, packed_seek, packed_rename, packed_remove, packed_mkdir}; - -#ifdef MG_ENABLE_LINES -#line 1 "src/fs_posix.c" -#endif - - -#if MG_ENABLE_POSIX_FS - -#ifndef MG_STAT_STRUCT -#define MG_STAT_STRUCT stat -#endif - -#ifndef MG_STAT_FUNC -#define MG_STAT_FUNC stat -#endif - -static int p_stat(const char *path, size_t *size, time_t *mtime) { -#if !defined(S_ISDIR) - MG_ERROR(("stat() API is not supported. %p %p %p", path, size, mtime)); - return 0; -#else -#if MG_ARCH == MG_ARCH_WIN32 - struct _stati64 st; - wchar_t tmp[MG_PATH_MAX]; - MultiByteToWideChar(CP_UTF8, 0, path, -1, tmp, sizeof(tmp) / sizeof(tmp[0])); - if (_wstati64(tmp, &st) != 0) return 0; - // If path is a symlink, windows reports 0 in st.st_size. - // Get a real file size by opening it and jumping to the end - if (st.st_size == 0 && (st.st_mode & _S_IFREG)) { - FILE *fp = _wfopen(tmp, L"rb"); - if (fp != NULL) { - fseek(fp, 0, SEEK_END); - if (ftell(fp) > 0) st.st_size = ftell(fp); // Use _ftelli64 on win10+ - fclose(fp); - } - } -#else - struct MG_STAT_STRUCT st; - if (MG_STAT_FUNC(path, &st) != 0) return 0; -#endif - if (size) *size = (size_t) st.st_size; - if (mtime) *mtime = st.st_mtime; - return MG_FS_READ | MG_FS_WRITE | (S_ISDIR(st.st_mode) ? MG_FS_DIR : 0); -#endif -} - -#if MG_ARCH == MG_ARCH_WIN32 -struct dirent { - char d_name[MAX_PATH]; -}; - -typedef struct win32_dir { - HANDLE handle; - WIN32_FIND_DATAW info; - struct dirent result; -} DIR; - -#if 0 -int gettimeofday(struct timeval *tv, void *tz) { - FILETIME ft; - unsigned __int64 tmpres = 0; - - if (tv != NULL) { - GetSystemTimeAsFileTime(&ft); - tmpres |= ft.dwHighDateTime; - tmpres <<= 32; - tmpres |= ft.dwLowDateTime; - tmpres /= 10; // convert into microseconds - tmpres -= (int64_t) 11644473600000000; - tv->tv_sec = (long) (tmpres / 1000000UL); - tv->tv_usec = (long) (tmpres % 1000000UL); - } - (void) tz; - return 0; -} -#endif - -static int to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) { - int ret; - char buf[MAX_PATH * 2], buf2[MAX_PATH * 2], *p; - strncpy(buf, path, sizeof(buf)); - buf[sizeof(buf) - 1] = '\0'; - // Trim trailing slashes. Leave backslash for paths like "X:\" - p = buf + strlen(buf) - 1; - while (p > buf && p[-1] != ':' && (p[0] == '\\' || p[0] == '/')) *p-- = '\0'; - memset(wbuf, 0, wbuf_len * sizeof(wchar_t)); - ret = MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int) wbuf_len); - // Convert back to Unicode. If doubly-converted string does not match the - // original, something is fishy, reject. - WideCharToMultiByte(CP_UTF8, 0, wbuf, (int) wbuf_len, buf2, sizeof(buf2), - NULL, NULL); - if (strcmp(buf, buf2) != 0) { - wbuf[0] = L'\0'; - ret = 0; - } - return ret; -} - -DIR *opendir(const char *name) { - DIR *d = NULL; - wchar_t wpath[MAX_PATH]; - DWORD attrs; - - if (name == NULL) { - SetLastError(ERROR_BAD_ARGUMENTS); - } else if ((d = (DIR *) calloc(1, sizeof(*d))) == NULL) { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - } else { - to_wchar(name, wpath, sizeof(wpath) / sizeof(wpath[0])); - attrs = GetFileAttributesW(wpath); - if (attrs != 0Xffffffff && (attrs & FILE_ATTRIBUTE_DIRECTORY)) { - (void) wcscat(wpath, L"\\*"); - d->handle = FindFirstFileW(wpath, &d->info); - d->result.d_name[0] = '\0'; - } else { - free(d); - d = NULL; - } - } - return d; -} - -int closedir(DIR *d) { - int result = 0; - if (d != NULL) { - if (d->handle != INVALID_HANDLE_VALUE) - result = FindClose(d->handle) ? 0 : -1; - free(d); - } else { - result = -1; - SetLastError(ERROR_BAD_ARGUMENTS); - } - return result; -} - -struct dirent *readdir(DIR *d) { - struct dirent *result = NULL; - if (d != NULL) { - memset(&d->result, 0, sizeof(d->result)); - if (d->handle != INVALID_HANDLE_VALUE) { - result = &d->result; - WideCharToMultiByte(CP_UTF8, 0, d->info.cFileName, -1, result->d_name, - sizeof(result->d_name), NULL, NULL); - if (!FindNextFileW(d->handle, &d->info)) { - FindClose(d->handle); - d->handle = INVALID_HANDLE_VALUE; - } - } else { - SetLastError(ERROR_FILE_NOT_FOUND); - } - } else { - SetLastError(ERROR_BAD_ARGUMENTS); - } - return result; -} -#endif - -static void p_list(const char *dir, void (*fn)(const char *, void *), - void *userdata) { -#if MG_ENABLE_DIRLIST - struct dirent *dp; - DIR *dirp; - if ((dirp = (opendir(dir))) == NULL) return; - while ((dp = readdir(dirp)) != NULL) { - if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) continue; - fn(dp->d_name, userdata); - } - closedir(dirp); -#else - (void) dir, (void) fn, (void) userdata; -#endif -} - -static void *p_open(const char *path, int flags) { -#if MG_ARCH == MG_ARCH_WIN32 - const char *mode = flags == MG_FS_READ ? "rb" : "a+b"; - wchar_t b1[MG_PATH_MAX], b2[10]; - MultiByteToWideChar(CP_UTF8, 0, path, -1, b1, sizeof(b1) / sizeof(b1[0])); - MultiByteToWideChar(CP_UTF8, 0, mode, -1, b2, sizeof(b2) / sizeof(b2[0])); - return (void *) _wfopen(b1, b2); -#else - const char *mode = flags == MG_FS_READ ? "rbe" : "a+be"; // e for CLOEXEC - return (void *) fopen(path, mode); -#endif -} - -static void p_close(void *fp) { - fclose((FILE *) fp); -} - -static size_t p_read(void *fp, void *buf, size_t len) { - return fread(buf, 1, len, (FILE *) fp); -} - -static size_t p_write(void *fp, const void *buf, size_t len) { - return fwrite(buf, 1, len, (FILE *) fp); -} - -static size_t p_seek(void *fp, size_t offset) { -#if (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) || \ - (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \ - (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600) - if (fseeko((FILE *) fp, (off_t) offset, SEEK_SET) != 0) (void) 0; -#else - if (fseek((FILE *) fp, (long) offset, SEEK_SET) != 0) (void) 0; -#endif - return (size_t) ftell((FILE *) fp); -} - -static bool p_rename(const char *from, const char *to) { - return rename(from, to) == 0; -} - -static bool p_remove(const char *path) { - return remove(path) == 0; -} - -static bool p_mkdir(const char *path) { - return mkdir(path, 0775) == 0; -} - -#else - -static int p_stat(const char *path, size_t *size, time_t *mtime) { - (void) path, (void) size, (void) mtime; - return 0; -} -static void p_list(const char *path, void (*fn)(const char *, void *), - void *userdata) { - (void) path, (void) fn, (void) userdata; -} -static void *p_open(const char *path, int flags) { - (void) path, (void) flags; - return NULL; -} -static void p_close(void *fp) { - (void) fp; -} -static size_t p_read(void *fd, void *buf, size_t len) { - (void) fd, (void) buf, (void) len; - return 0; -} -static size_t p_write(void *fd, const void *buf, size_t len) { - (void) fd, (void) buf, (void) len; - return 0; -} -static size_t p_seek(void *fd, size_t offset) { - (void) fd, (void) offset; - return (size_t) ~0; -} -static bool p_rename(const char *from, const char *to) { - (void) from, (void) to; - return false; -} -static bool p_remove(const char *path) { - (void) path; - return false; -} -static bool p_mkdir(const char *path) { - (void) path; - return false; -} -#endif - -struct mg_fs mg_fs_posix = {p_stat, p_list, p_open, p_close, p_read, - p_write, p_seek, p_rename, p_remove, p_mkdir}; - -#ifdef MG_ENABLE_LINES -#line 1 "src/http.c" -#endif - - - - - - - - - - - - - -bool mg_to_size_t(struct mg_str str, size_t *val); -bool mg_to_size_t(struct mg_str str, size_t *val) { - size_t i = 0, max = (size_t) -1, max2 = max / 10, result = 0, ndigits = 0; - while (i < str.len && (str.ptr[i] == ' ' || str.ptr[i] == '\t')) i++; - if (i < str.len && str.ptr[i] == '-') return false; - while (i < str.len && str.ptr[i] >= '0' && str.ptr[i] <= '9') { - size_t digit = (size_t) (str.ptr[i] - '0'); - if (result > max2) return false; // Overflow - result *= 10; - if (result > max - digit) return false; // Overflow - result += digit; - i++, ndigits++; - } - while (i < str.len && (str.ptr[i] == ' ' || str.ptr[i] == '\t')) i++; - if (ndigits == 0) return false; // #2322: Content-Length = 1 * DIGIT - if (i != str.len) return false; // Ditto - *val = (size_t) result; - return true; -} - -// Chunk deletion marker is the MSB in the "processed" counter -#define MG_DMARK ((size_t) 1 << (sizeof(size_t) * 8 - 1)) - -// Multipart POST example: -// --xyz -// Content-Disposition: form-data; name="val" -// -// abcdef -// --xyz -// Content-Disposition: form-data; name="foo"; filename="a.txt" -// Content-Type: text/plain -// -// hello world -// -// --xyz-- -size_t mg_http_next_multipart(struct mg_str body, size_t ofs, - struct mg_http_part *part) { - struct mg_str cd = mg_str_n("Content-Disposition", 19); - const char *s = body.ptr; - size_t b = ofs, h1, h2, b1, b2, max = body.len; - - // Init part params - if (part != NULL) part->name = part->filename = part->body = mg_str_n(0, 0); - - // Skip boundary - while (b + 2 < max && s[b] != '\r' && s[b + 1] != '\n') b++; - if (b <= ofs || b + 2 >= max) return 0; - // MG_INFO(("B: %zu %zu [%.*s]", ofs, b - ofs, (int) (b - ofs), s)); - - // Skip headers - h1 = h2 = b + 2; - for (;;) { - while (h2 + 2 < max && s[h2] != '\r' && s[h2 + 1] != '\n') h2++; - if (h2 == h1) break; - if (h2 + 2 >= max) return 0; - // MG_INFO(("Header: [%.*s]", (int) (h2 - h1), &s[h1])); - if (part != NULL && h1 + cd.len + 2 < h2 && s[h1 + cd.len] == ':' && - mg_ncasecmp(&s[h1], cd.ptr, cd.len) == 0) { - struct mg_str v = mg_str_n(&s[h1 + cd.len + 2], h2 - (h1 + cd.len + 2)); - part->name = mg_http_get_header_var(v, mg_str_n("name", 4)); - part->filename = mg_http_get_header_var(v, mg_str_n("filename", 8)); - } - h1 = h2 = h2 + 2; - } - b1 = b2 = h2 + 2; - while (b2 + 2 + (b - ofs) + 2 < max && !(s[b2] == '\r' && s[b2 + 1] == '\n' && - memcmp(&s[b2 + 2], s, b - ofs) == 0)) - b2++; - - if (b2 + 2 >= max) return 0; - if (part != NULL) part->body = mg_str_n(&s[b1], b2 - b1); - // MG_INFO(("Body: [%.*s]", (int) (b2 - b1), &s[b1])); - return b2 + 2; -} - -void mg_http_bauth(struct mg_connection *c, const char *user, - const char *pass) { - struct mg_str u = mg_str(user), p = mg_str(pass); - size_t need = c->send.len + 36 + (u.len + p.len) * 2; - if (c->send.size < need) mg_iobuf_resize(&c->send, need); - if (c->send.size >= need) { - size_t i, n = 0; - char *buf = (char *) &c->send.buf[c->send.len]; - memcpy(buf, "Authorization: Basic ", 21); // DON'T use mg_send! - for (i = 0; i < u.len; i++) { - n = mg_base64_update(((unsigned char *) u.ptr)[i], buf + 21, n); - } - if (p.len > 0) { - n = mg_base64_update(':', buf + 21, n); - for (i = 0; i < p.len; i++) { - n = mg_base64_update(((unsigned char *) p.ptr)[i], buf + 21, n); - } - } - n = mg_base64_final(buf + 21, n); - c->send.len += 21 + (size_t) n + 2; - memcpy(&c->send.buf[c->send.len - 2], "\r\n", 2); - } else { - MG_ERROR(("%lu oom %d->%d ", c->id, (int) c->send.size, (int) need)); - } -} - -struct mg_str mg_http_var(struct mg_str buf, struct mg_str name) { - struct mg_str entry, k, v, result = mg_str_n(NULL, 0); - while (mg_span(buf, &entry, &buf, '&')) { - if (mg_span(entry, &k, &v, '=') && name.len == k.len && - mg_ncasecmp(name.ptr, k.ptr, k.len) == 0) { - result = v; - break; - } - } - return result; -} - -int mg_http_get_var(const struct mg_str *buf, const char *name, char *dst, - size_t dst_len) { - int len; - if (dst != NULL && dst_len > 0) { - dst[0] = '\0'; // If destination buffer is valid, always nul-terminate it - } - if (dst == NULL || dst_len == 0) { - len = -2; // Bad destination - } else if (buf->ptr == NULL || name == NULL || buf->len == 0) { - len = -1; // Bad source - } else { - struct mg_str v = mg_http_var(*buf, mg_str(name)); - if (v.ptr == NULL) { - len = -4; // Name does not exist - } else { - len = mg_url_decode(v.ptr, v.len, dst, dst_len, 1); - if (len < 0) len = -3; // Failed to decode - } - } - return len; -} - -static bool isx(int c) { - return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || - (c >= 'A' && c <= 'F'); -} - -int mg_url_decode(const char *src, size_t src_len, char *dst, size_t dst_len, - int is_form_url_encoded) { - size_t i, j; - for (i = j = 0; i < src_len && j + 1 < dst_len; i++, j++) { - if (src[i] == '%') { - // Use `i + 2 < src_len`, not `i < src_len - 2`, note small src_len - if (i + 2 < src_len && isx(src[i + 1]) && isx(src[i + 2])) { - mg_unhex(src + i + 1, 2, (uint8_t *) &dst[j]); - i += 2; - } else { - return -1; - } - } else if (is_form_url_encoded && src[i] == '+') { - dst[j] = ' '; - } else { - dst[j] = src[i]; - } - } - if (j < dst_len) dst[j] = '\0'; // Null-terminate the destination - return i >= src_len && j < dst_len ? (int) j : -1; -} - -static bool isok(uint8_t c) { - return c == '\n' || c == '\r' || c >= ' '; -} - -int mg_http_get_request_len(const unsigned char *buf, size_t buf_len) { - size_t i; - for (i = 0; i < buf_len; i++) { - if (!isok(buf[i])) return -1; - if ((i > 0 && buf[i] == '\n' && buf[i - 1] == '\n') || - (i > 3 && buf[i] == '\n' && buf[i - 1] == '\r' && buf[i - 2] == '\n')) - return (int) i + 1; - } - return 0; -} -struct mg_str *mg_http_get_header(struct mg_http_message *h, const char *name) { - size_t i, n = strlen(name), max = sizeof(h->headers) / sizeof(h->headers[0]); - for (i = 0; i < max && h->headers[i].name.len > 0; i++) { - struct mg_str *k = &h->headers[i].name, *v = &h->headers[i].value; - if (n == k->len && mg_ncasecmp(k->ptr, name, n) == 0) return v; - } - return NULL; -} - -// Is it a valid utf-8 continuation byte -static bool vcb(uint8_t c) { - return (c & 0xc0) == 0x80; -} - -// Get character length (valid utf-8). Used to parse method, URI, headers -static size_t clen(const char *s, const char *end) { - const unsigned char *u = (unsigned char *) s, c = *u; - long n = (long) (end - s); - if (c > ' ' && c < '~') return 1; // Usual ascii printed char - if ((c & 0xe0) == 0xc0 && n > 1 && vcb(u[1])) return 2; // 2-byte UTF8 - if ((c & 0xf0) == 0xe0 && n > 2 && vcb(u[1]) && vcb(u[2])) return 3; - if ((c & 0xf8) == 0xf0 && n > 3 && vcb(u[1]) && vcb(u[2]) && vcb(u[3])) - return 4; - return 0; -} - -// Skip until the newline. Return advanced `s`, or NULL on error -static const char *skiptorn(const char *s, const char *end, struct mg_str *v) { - v->ptr = s; - while (s < end && s[0] != '\n' && s[0] != '\r') s++, v->len++; // To newline - if (s >= end || (s[0] == '\r' && s[1] != '\n')) return NULL; // Stray \r - if (s < end && s[0] == '\r') s++; // Skip \r - if (s >= end || *s++ != '\n') return NULL; // Skip \n - return s; -} - -static bool mg_http_parse_headers(const char *s, const char *end, - struct mg_http_header *h, size_t max_hdrs) { - size_t i, n; - for (i = 0; i < max_hdrs; i++) { - struct mg_str k = {NULL, 0}, v = {NULL, 0}; - if (s >= end) return false; - if (s[0] == '\n' || (s[0] == '\r' && s[1] == '\n')) break; - k.ptr = s; - while (s < end && s[0] != ':' && (n = clen(s, end)) > 0) s += n, k.len += n; - if (k.len == 0) return false; // Empty name - if (s >= end || clen(s, end) == 0) return false; // Invalid UTF-8 - if (*s++ != ':') return false; // Invalid, not followed by : - // if (clen(s, end) == 0) return false; // Invalid UTF-8 - while (s < end && s[0] == ' ') s++; // Skip spaces - if ((s = skiptorn(s, end, &v)) == NULL) return false; - while (v.len > 0 && v.ptr[v.len - 1] == ' ') v.len--; // Trim spaces - // MG_INFO(("--HH [%.*s] [%.*s]", (int) k.len, k.ptr, (int) v.len, v.ptr)); - h[i].name = k, h[i].value = v; // Success. Assign values - } - return true; -} - -int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) { - int is_response, req_len = mg_http_get_request_len((unsigned char *) s, len); - const char *end = s == NULL ? NULL : s + req_len, *qs; // Cannot add to NULL - struct mg_str *cl; - size_t n; - - memset(hm, 0, sizeof(*hm)); - if (req_len <= 0) return req_len; - - hm->message.ptr = hm->head.ptr = s; - hm->body.ptr = end; - hm->head.len = (size_t) req_len; - hm->message.len = hm->body.len = (size_t) -1; // Set body length to infinite - - // Parse request line - hm->method.ptr = s; - while (s < end && (n = clen(s, end)) > 0) s += n, hm->method.len += n; - while (s < end && s[0] == ' ') s++; // Skip spaces - hm->uri.ptr = s; - while (s < end && (n = clen(s, end)) > 0) s += n, hm->uri.len += n; - while (s < end && s[0] == ' ') s++; // Skip spaces - if ((s = skiptorn(s, end, &hm->proto)) == NULL) return false; - - // If URI contains '?' character, setup query string - if ((qs = (const char *) memchr(hm->uri.ptr, '?', hm->uri.len)) != NULL) { - hm->query.ptr = qs + 1; - hm->query.len = (size_t) (&hm->uri.ptr[hm->uri.len] - (qs + 1)); - hm->uri.len = (size_t) (qs - hm->uri.ptr); - } - - // Sanity check. Allow protocol/reason to be empty - // Do this check after hm->method.len and hm->uri.len are finalised - if (hm->method.len == 0 || hm->uri.len == 0) return -1; - - if (!mg_http_parse_headers(s, end, hm->headers, - sizeof(hm->headers) / sizeof(hm->headers[0]))) - return -1; // error when parsing - if ((cl = mg_http_get_header(hm, "Content-Length")) != NULL) { - if (mg_to_size_t(*cl, &hm->body.len) == false) return -1; - hm->message.len = (size_t) req_len + hm->body.len; - } - - // mg_http_parse() is used to parse both HTTP requests and HTTP - // responses. If HTTP response does not have Content-Length set, then - // body is read until socket is closed, i.e. body.len is infinite (~0). - // - // For HTTP requests though, according to - // http://tools.ietf.org/html/rfc7231#section-8.1.3, - // only POST and PUT methods have defined body semantics. - // Therefore, if Content-Length is not specified and methods are - // not one of PUT or POST, set body length to 0. - // - // So, if it is HTTP request, and Content-Length is not set, - // and method is not (PUT or POST) then reset body length to zero. - is_response = mg_ncasecmp(hm->method.ptr, "HTTP/", 5) == 0; - if (hm->body.len == (size_t) ~0 && !is_response && - mg_vcasecmp(&hm->method, "PUT") != 0 && - mg_vcasecmp(&hm->method, "POST") != 0) { - hm->body.len = 0; - hm->message.len = (size_t) req_len; - } - - // The 204 (No content) responses also have 0 body length - if (hm->body.len == (size_t) ~0 && is_response && - mg_vcasecmp(&hm->uri, "204") == 0) { - hm->body.len = 0; - hm->message.len = (size_t) req_len; - } - if (hm->message.len < (size_t) req_len) return -1; // Overflow protection - - return req_len; -} - -static void mg_http_vprintf_chunk(struct mg_connection *c, const char *fmt, - va_list *ap) { - size_t len = c->send.len; - mg_send(c, " \r\n", 10); - mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap); - if (c->send.len >= len + 10) { - mg_snprintf((char *) c->send.buf + len, 9, "%08lx", c->send.len - len - 10); - c->send.buf[len + 8] = '\r'; - if (c->send.len == len + 10) c->is_resp = 0; // Last chunk, reset marker - } - mg_send(c, "\r\n", 2); -} - -void mg_http_printf_chunk(struct mg_connection *c, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - mg_http_vprintf_chunk(c, fmt, &ap); - va_end(ap); -} - -void mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len) { - mg_printf(c, "%lx\r\n", (unsigned long) len); - mg_send(c, buf, len); - mg_send(c, "\r\n", 2); - if (len == 0) c->is_resp = 0; -} - -// clang-format off -static const char *mg_http_status_code_str(int status_code) { - switch (status_code) { - case 100: return "Continue"; - case 101: return "Switching Protocols"; - case 102: return "Processing"; - case 200: return "OK"; - case 201: return "Created"; - case 202: return "Accepted"; - case 203: return "Non-authoritative Information"; - case 204: return "No Content"; - case 205: return "Reset Content"; - case 206: return "Partial Content"; - case 207: return "Multi-Status"; - case 208: return "Already Reported"; - case 226: return "IM Used"; - case 300: return "Multiple Choices"; - case 301: return "Moved Permanently"; - case 302: return "Found"; - case 303: return "See Other"; - case 304: return "Not Modified"; - case 305: return "Use Proxy"; - case 307: return "Temporary Redirect"; - case 308: return "Permanent Redirect"; - case 400: return "Bad Request"; - case 401: return "Unauthorized"; - case 402: return "Payment Required"; - case 403: return "Forbidden"; - case 404: return "Not Found"; - case 405: return "Method Not Allowed"; - case 406: return "Not Acceptable"; - case 407: return "Proxy Authentication Required"; - case 408: return "Request Timeout"; - case 409: return "Conflict"; - case 410: return "Gone"; - case 411: return "Length Required"; - case 412: return "Precondition Failed"; - case 413: return "Payload Too Large"; - case 414: return "Request-URI Too Long"; - case 415: return "Unsupported Media Type"; - case 416: return "Requested Range Not Satisfiable"; - case 417: return "Expectation Failed"; - case 418: return "I'm a teapot"; - case 421: return "Misdirected Request"; - case 422: return "Unprocessable Entity"; - case 423: return "Locked"; - case 424: return "Failed Dependency"; - case 426: return "Upgrade Required"; - case 428: return "Precondition Required"; - case 429: return "Too Many Requests"; - case 431: return "Request Header Fields Too Large"; - case 444: return "Connection Closed Without Response"; - case 451: return "Unavailable For Legal Reasons"; - case 499: return "Client Closed Request"; - case 500: return "Internal Server Error"; - case 501: return "Not Implemented"; - case 502: return "Bad Gateway"; - case 503: return "Service Unavailable"; - case 504: return "Gateway Timeout"; - case 505: return "HTTP Version Not Supported"; - case 506: return "Variant Also Negotiates"; - case 507: return "Insufficient Storage"; - case 508: return "Loop Detected"; - case 510: return "Not Extended"; - case 511: return "Network Authentication Required"; - case 599: return "Network Connect Timeout Error"; - default: return ""; - } -} -// clang-format on - -void mg_http_reply(struct mg_connection *c, int code, const char *headers, - const char *fmt, ...) { - va_list ap; - size_t len; - mg_printf(c, "HTTP/1.1 %d %s\r\n%sContent-Length: \r\n\r\n", code, - mg_http_status_code_str(code), headers == NULL ? "" : headers); - len = c->send.len; - va_start(ap, fmt); - mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, &ap); - va_end(ap); - if (c->send.len > 16) { - size_t n = mg_snprintf((char *) &c->send.buf[len - 15], 11, "%-10lu", - (unsigned long) (c->send.len - len)); - c->send.buf[len - 15 + n] = ' '; // Change ending 0 to space - } - c->is_resp = 0; -} - -static void http_cb(struct mg_connection *, int, void *); -static void restore_http_cb(struct mg_connection *c) { - mg_fs_close((struct mg_fd *) c->pfn_data); - c->pfn_data = NULL; - c->pfn = http_cb; - c->is_resp = 0; -} - -char *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime); -char *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime) { - mg_snprintf(buf, len, "\"%lld.%lld\"", (int64_t) mtime, (int64_t) size); - return buf; -} - -static void static_cb(struct mg_connection *c, int ev, void *ev_data) { - if (ev == MG_EV_WRITE || ev == MG_EV_POLL) { - struct mg_fd *fd = (struct mg_fd *) c->pfn_data; - // Read to send IO buffer directly, avoid extra on-stack buffer - size_t n, max = MG_IO_SIZE, space; - size_t *cl = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) / - sizeof(size_t) * sizeof(size_t)]; - if (c->send.size < max) mg_iobuf_resize(&c->send, max); - if (c->send.len >= c->send.size) return; // Rate limit - if ((space = c->send.size - c->send.len) > *cl) space = *cl; - n = fd->fs->rd(fd->fd, c->send.buf + c->send.len, space); - c->send.len += n; - *cl -= n; - if (n == 0) restore_http_cb(c); - } else if (ev == MG_EV_CLOSE) { - restore_http_cb(c); - } - (void) ev_data; -} - -// Known mime types. Keep it outside guess_content_type() function, since -// some environments don't like it defined there. -// clang-format off -static struct mg_str s_known_types[] = { - MG_C_STR("html"), MG_C_STR("text/html; charset=utf-8"), - MG_C_STR("htm"), MG_C_STR("text/html; charset=utf-8"), - MG_C_STR("css"), MG_C_STR("text/css; charset=utf-8"), - MG_C_STR("js"), MG_C_STR("text/javascript; charset=utf-8"), - MG_C_STR("gif"), MG_C_STR("image/gif"), - MG_C_STR("png"), MG_C_STR("image/png"), - MG_C_STR("jpg"), MG_C_STR("image/jpeg"), - MG_C_STR("jpeg"), MG_C_STR("image/jpeg"), - MG_C_STR("woff"), MG_C_STR("font/woff"), - MG_C_STR("ttf"), MG_C_STR("font/ttf"), - MG_C_STR("svg"), MG_C_STR("image/svg+xml"), - MG_C_STR("txt"), MG_C_STR("text/plain; charset=utf-8"), - MG_C_STR("avi"), MG_C_STR("video/x-msvideo"), - MG_C_STR("csv"), MG_C_STR("text/csv"), - MG_C_STR("doc"), MG_C_STR("application/msword"), - MG_C_STR("exe"), MG_C_STR("application/octet-stream"), - MG_C_STR("gz"), MG_C_STR("application/gzip"), - MG_C_STR("ico"), MG_C_STR("image/x-icon"), - MG_C_STR("json"), MG_C_STR("application/json"), - MG_C_STR("mov"), MG_C_STR("video/quicktime"), - MG_C_STR("mp3"), MG_C_STR("audio/mpeg"), - MG_C_STR("mp4"), MG_C_STR("video/mp4"), - MG_C_STR("mpeg"), MG_C_STR("video/mpeg"), - MG_C_STR("pdf"), MG_C_STR("application/pdf"), - MG_C_STR("shtml"), MG_C_STR("text/html; charset=utf-8"), - MG_C_STR("tgz"), MG_C_STR("application/tar-gz"), - MG_C_STR("wav"), MG_C_STR("audio/wav"), - MG_C_STR("webp"), MG_C_STR("image/webp"), - MG_C_STR("zip"), MG_C_STR("application/zip"), - MG_C_STR("3gp"), MG_C_STR("video/3gpp"), - {0, 0}, -}; -// clang-format on - -static struct mg_str guess_content_type(struct mg_str path, const char *extra) { - struct mg_str entry, k, v, s = mg_str(extra); - size_t i = 0; - - // Shrink path to its extension only - while (i < path.len && path.ptr[path.len - i - 1] != '.') i++; - path.ptr += path.len - i; - path.len = i; - - // Process user-provided mime type overrides, if any - while (mg_span(s, &entry, &s, ',')) { - if (mg_span(entry, &k, &v, '=') && mg_strcmp(path, k) == 0) return v; - } - - // Process built-in mime types - for (i = 0; s_known_types[i].ptr != NULL; i += 2) { - if (mg_strcmp(path, s_known_types[i]) == 0) return s_known_types[i + 1]; - } - - return mg_str("text/plain; charset=utf-8"); -} - -static int getrange(struct mg_str *s, size_t *a, size_t *b) { - size_t i, numparsed = 0; - for (i = 0; i + 6 < s->len; i++) { - struct mg_str k, v = mg_str_n(s->ptr + i + 6, s->len - i - 6); - if (memcmp(&s->ptr[i], "bytes=", 6) != 0) continue; - if (mg_span(v, &k, &v, '-')) { - if (mg_to_size_t(k, a)) numparsed++; - if (v.len > 0 && mg_to_size_t(v, b)) numparsed++; - } else { - if (mg_to_size_t(v, a)) numparsed++; - } - break; - } - return (int) numparsed; -} - -void mg_http_serve_file(struct mg_connection *c, struct mg_http_message *hm, - const char *path, - const struct mg_http_serve_opts *opts) { - char etag[64], tmp[MG_PATH_MAX]; - struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs; - struct mg_fd *fd = NULL; - size_t size = 0; - time_t mtime = 0; - struct mg_str *inm = NULL; - struct mg_str mime = guess_content_type(mg_str(path), opts->mime_types); - bool gzip = false; - - if (path != NULL) { - // If a browser sends us "Accept-Encoding: gzip", try to open .gz first - struct mg_str *ae = mg_http_get_header(hm, "Accept-Encoding"); - if (ae != NULL && mg_strstr(*ae, mg_str("gzip")) != NULL) { - mg_snprintf(tmp, sizeof(tmp), "%s.gz", path); - fd = mg_fs_open(fs, tmp, MG_FS_READ); - if (fd != NULL) gzip = true, path = tmp; - } - // No luck opening .gz? Open what we've told to open - if (fd == NULL) fd = mg_fs_open(fs, path, MG_FS_READ); - } - - // Failed to open, and page404 is configured? Open it, then - if (fd == NULL && opts->page404 != NULL) { - fd = mg_fs_open(fs, opts->page404, MG_FS_READ); - mime = guess_content_type(mg_str(path), opts->mime_types); - path = opts->page404; - } - - if (fd == NULL || fs->st(path, &size, &mtime) == 0) { - mg_http_reply(c, 404, opts->extra_headers, "Not found\n"); - mg_fs_close(fd); - // NOTE: mg_http_etag() call should go first! - } else if (mg_http_etag(etag, sizeof(etag), size, mtime) != NULL && - (inm = mg_http_get_header(hm, "If-None-Match")) != NULL && - mg_vcasecmp(inm, etag) == 0) { - mg_fs_close(fd); - mg_http_reply(c, 304, opts->extra_headers, ""); - } else { - int n, status = 200; - char range[100]; - size_t r1 = 0, r2 = 0, cl = size; - - // Handle Range header - struct mg_str *rh = mg_http_get_header(hm, "Range"); - range[0] = '\0'; - if (rh != NULL && (n = getrange(rh, &r1, &r2)) > 0) { - // If range is specified like "400-", set second limit to content len - if (n == 1) r2 = cl - 1; - if (r1 > r2 || r2 >= cl) { - status = 416; - cl = 0; - mg_snprintf(range, sizeof(range), "Content-Range: bytes */%lld\r\n", - (int64_t) size); - } else { - status = 206; - cl = r2 - r1 + 1; - mg_snprintf(range, sizeof(range), - "Content-Range: bytes %llu-%llu/%llu\r\n", (uint64_t) r1, - (uint64_t) (r1 + cl - 1), (uint64_t) size); - fs->sk(fd->fd, r1); - } - } - mg_printf(c, - "HTTP/1.1 %d %s\r\n" - "Content-Type: %.*s\r\n" - "Etag: %s\r\n" - "Content-Length: %llu\r\n" - "%s%s%s\r\n", - status, mg_http_status_code_str(status), (int) mime.len, mime.ptr, - etag, (uint64_t) cl, gzip ? "Content-Encoding: gzip\r\n" : "", - range, opts->extra_headers ? opts->extra_headers : ""); - if (mg_vcasecmp(&hm->method, "HEAD") == 0) { - c->is_draining = 1; - c->is_resp = 0; - mg_fs_close(fd); - } else { - // Track to-be-sent content length at the end of c->data, aligned - size_t *clp = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) / - sizeof(size_t) * sizeof(size_t)]; - c->pfn = static_cb; - c->pfn_data = fd; - *clp = cl; - } - } -} - -struct printdirentrydata { - struct mg_connection *c; - struct mg_http_message *hm; - const struct mg_http_serve_opts *opts; - const char *dir; -}; - -#if MG_ENABLE_DIRLIST -static void printdirentry(const char *name, void *userdata) { - struct printdirentrydata *d = (struct printdirentrydata *) userdata; - struct mg_fs *fs = d->opts->fs == NULL ? &mg_fs_posix : d->opts->fs; - size_t size = 0; - time_t t = 0; - char path[MG_PATH_MAX], sz[40], mod[40]; - int flags, n = 0; - - // MG_DEBUG(("[%s] [%s]", d->dir, name)); - if (mg_snprintf(path, sizeof(path), "%s%c%s", d->dir, '/', name) > - sizeof(path)) { - MG_ERROR(("%s truncated", name)); - } else if ((flags = fs->st(path, &size, &t)) == 0) { - MG_ERROR(("%lu stat(%s): %d", d->c->id, path, errno)); - } else { - const char *slash = flags & MG_FS_DIR ? "/" : ""; - if (flags & MG_FS_DIR) { - mg_snprintf(sz, sizeof(sz), "%s", "[DIR]"); - } else { - mg_snprintf(sz, sizeof(sz), "%lld", (uint64_t) size); - } -#if defined(MG_HTTP_DIRLIST_TIME_FMT) - { - char time_str[40]; - struct tm *time_info = localtime(&t); - strftime(time_str, sizeof time_str, "%Y/%m/%d %H:%M:%S", time_info); - mg_snprintf(mod, sizeof(mod), "%s", time_str); - } -#else - mg_snprintf(mod, sizeof(mod), "%lu", (unsigned long) t); -#endif - n = (int) mg_url_encode(name, strlen(name), path, sizeof(path)); - mg_printf(d->c, - " %s%s" - "%s%s\n", - n, path, slash, name, slash, (unsigned long) t, mod, - flags & MG_FS_DIR ? (int64_t) -1 : (int64_t) size, sz); - } -} - -static void listdir(struct mg_connection *c, struct mg_http_message *hm, - const struct mg_http_serve_opts *opts, char *dir) { - const char *sort_js_code = - ""; - struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs; - struct printdirentrydata d = {c, hm, opts, dir}; - char tmp[10], buf[MG_PATH_MAX]; - size_t off, n; - int len = mg_url_decode(hm->uri.ptr, hm->uri.len, buf, sizeof(buf), 0); - struct mg_str uri = len > 0 ? mg_str_n(buf, (size_t) len) : hm->uri; - - mg_printf(c, - "HTTP/1.1 200 OK\r\n" - "Content-Type: text/html; charset=utf-8\r\n" - "%s" - "Content-Length: \r\n\r\n", - opts->extra_headers == NULL ? "" : opts->extra_headers); - off = c->send.len; // Start of body - mg_printf(c, - "Index of %.*s%s%s" - "" - "

Index of %.*s

" - "" - "" - "" - "" - "\n", - (int) uri.len, uri.ptr, sort_js_code, sort_js_code2, (int) uri.len, - uri.ptr); - mg_printf(c, "%s", - " " - "\n"); - - fs->ls(dir, printdirentry, &d); - mg_printf(c, - "" - "
Name" - "ModifiedSize

..[DIR]

Mongoose v.%s
\n", - MG_VERSION); - n = mg_snprintf(tmp, sizeof(tmp), "%lu", (unsigned long) (c->send.len - off)); - if (n > sizeof(tmp)) n = 0; - memcpy(c->send.buf + off - 12, tmp, n); // Set content length - c->is_resp = 0; // Mark response end -} -#endif - -// Resolve requested file into `path` and return its fs->st() result -static int uri_to_path2(struct mg_connection *c, struct mg_http_message *hm, - struct mg_fs *fs, struct mg_str url, struct mg_str dir, - char *path, size_t path_size) { - int flags, tmp; - // Append URI to the root_dir, and sanitize it - size_t n = mg_snprintf(path, path_size, "%.*s", (int) dir.len, dir.ptr); - if (n + 2 >= path_size) { - mg_http_reply(c, 400, "", "Exceeded path size"); - return -1; - } - path[path_size - 1] = '\0'; - // Terminate root dir with slash - if (n > 0 && path[n - 1] != '/') path[n++] = '/', path[n] = '\0'; - if (url.len < hm->uri.len) { - mg_url_decode(hm->uri.ptr + url.len, hm->uri.len - url.len, path + n, - path_size - n, 0); - } - path[path_size - 1] = '\0'; // Double-check - if (!mg_path_is_sane(path)) { - mg_http_reply(c, 400, "", "Invalid path"); - return -1; - } - n = strlen(path); - while (n > 1 && path[n - 1] == '/') path[--n] = 0; // Trim trailing slashes - flags = mg_vcmp(&hm->uri, "/") == 0 ? MG_FS_DIR : fs->st(path, NULL, NULL); - MG_VERBOSE(("%lu %.*s -> %s %d", c->id, (int) hm->uri.len, hm->uri.ptr, path, - flags)); - if (flags == 0) { - // Do nothing - let's caller decide - } else if ((flags & MG_FS_DIR) && hm->uri.len > 0 && - hm->uri.ptr[hm->uri.len - 1] != '/') { - mg_printf(c, - "HTTP/1.1 301 Moved\r\n" - "Location: %.*s/\r\n" - "Content-Length: 0\r\n" - "\r\n", - (int) hm->uri.len, hm->uri.ptr); - c->is_resp = 0; - flags = -1; - } else if (flags & MG_FS_DIR) { - if (((mg_snprintf(path + n, path_size - n, "/" MG_HTTP_INDEX) > 0 && - (tmp = fs->st(path, NULL, NULL)) != 0) || - (mg_snprintf(path + n, path_size - n, "/index.shtml") > 0 && - (tmp = fs->st(path, NULL, NULL)) != 0))) { - flags = tmp; - } else if ((mg_snprintf(path + n, path_size - n, "/" MG_HTTP_INDEX ".gz") > - 0 && - (tmp = fs->st(path, NULL, NULL)) != - 0)) { // check for gzipped index - flags = tmp; - path[n + 1 + strlen(MG_HTTP_INDEX)] = - '\0'; // Remove appended .gz in index file name - } else { - path[n] = '\0'; // Remove appended index file name - } - } - return flags; -} - -static int uri_to_path(struct mg_connection *c, struct mg_http_message *hm, - const struct mg_http_serve_opts *opts, char *path, - size_t path_size) { - struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs; - struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u; - while (mg_span(s, &part, &s, ',')) { - if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0); - if (v.len == 0) v = k, k = mg_str("/"), u = k, p = v; - if (hm->uri.len < k.len) continue; - if (mg_strcmp(k, mg_str_n(hm->uri.ptr, k.len)) != 0) continue; - u = k, p = v; - } - return uri_to_path2(c, hm, fs, u, p, path, path_size); -} - -void mg_http_serve_dir(struct mg_connection *c, struct mg_http_message *hm, - const struct mg_http_serve_opts *opts) { - char path[MG_PATH_MAX]; - const char *sp = opts->ssi_pattern; - int flags = uri_to_path(c, hm, opts, path, sizeof(path)); - if (flags < 0) { - // Do nothing: the response has already been sent by uri_to_path() - } else if (flags & MG_FS_DIR) { -#if MG_ENABLE_DIRLIST - listdir(c, hm, opts, path); -#else - mg_http_reply(c, 403, "", "Forbidden\n"); -#endif - } else if (flags && sp != NULL && - mg_globmatch(sp, strlen(sp), path, strlen(path))) { - mg_http_serve_ssi(c, opts->root_dir, path); - } else { - mg_http_serve_file(c, hm, path, opts); - } -} - -static bool mg_is_url_safe(int c) { - return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || c == '.' || c == '_' || c == '-' || c == '~'; -} - -size_t mg_url_encode(const char *s, size_t sl, char *buf, size_t len) { - size_t i, n = 0; - for (i = 0; i < sl; i++) { - int c = *(unsigned char *) &s[i]; - if (n + 4 >= len) return 0; - if (mg_is_url_safe(c)) { - buf[n++] = s[i]; - } else { - buf[n++] = '%'; - mg_hex(&s[i], 1, &buf[n]); - n += 2; - } - } - if (len > 0 && n < len - 1) buf[n] = '\0'; // Null-terminate the destination - if (len > 0) buf[len - 1] = '\0'; // Always. - return n; -} - -void mg_http_creds(struct mg_http_message *hm, char *user, size_t userlen, - char *pass, size_t passlen) { - struct mg_str *v = mg_http_get_header(hm, "Authorization"); - user[0] = pass[0] = '\0'; - if (v != NULL && v->len > 6 && memcmp(v->ptr, "Basic ", 6) == 0) { - char buf[256]; - size_t n = mg_base64_decode(v->ptr + 6, v->len - 6, buf, sizeof(buf)); - const char *p = (const char *) memchr(buf, ':', n > 0 ? n : 0); - if (p != NULL) { - mg_snprintf(user, userlen, "%.*s", p - buf, buf); - mg_snprintf(pass, passlen, "%.*s", n - (size_t) (p - buf) - 1, p + 1); - } - } else if (v != NULL && v->len > 7 && memcmp(v->ptr, "Bearer ", 7) == 0) { - mg_snprintf(pass, passlen, "%.*s", (int) v->len - 7, v->ptr + 7); - } else if ((v = mg_http_get_header(hm, "Cookie")) != NULL) { - struct mg_str t = mg_http_get_header_var(*v, mg_str_n("access_token", 12)); - if (t.len > 0) mg_snprintf(pass, passlen, "%.*s", (int) t.len, t.ptr); - } else { - mg_http_get_var(&hm->query, "access_token", pass, passlen); - } -} - -static struct mg_str stripquotes(struct mg_str s) { - return s.len > 1 && s.ptr[0] == '"' && s.ptr[s.len - 1] == '"' - ? mg_str_n(s.ptr + 1, s.len - 2) - : s; -} - -struct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v) { - size_t i; - for (i = 0; v.len > 0 && i + v.len + 2 < s.len; i++) { - if (s.ptr[i + v.len] == '=' && memcmp(&s.ptr[i], v.ptr, v.len) == 0) { - const char *p = &s.ptr[i + v.len + 1], *b = p, *x = &s.ptr[s.len]; - int q = p < x && *p == '"' ? 1 : 0; - while (p < x && - (q ? p == b || *p != '"' : *p != ';' && *p != ' ' && *p != ',')) - p++; - // MG_INFO(("[%.*s] [%.*s] [%.*s]", (int) s.len, s.ptr, (int) v.len, - // v.ptr, (int) (p - b), b)); - return stripquotes(mg_str_n(b, (size_t) (p - b + q))); - } - } - return mg_str_n(NULL, 0); -} - -bool mg_http_match_uri(const struct mg_http_message *hm, const char *glob) { - return mg_match(hm->uri, mg_str(glob), NULL); -} - -long mg_http_upload(struct mg_connection *c, struct mg_http_message *hm, - struct mg_fs *fs, const char *dir, size_t max_size) { - char buf[20] = "0", file[40], path[MG_PATH_MAX]; - long res = 0, offset; - mg_http_get_var(&hm->query, "offset", buf, sizeof(buf)); - mg_http_get_var(&hm->query, "file", file, sizeof(file)); - offset = strtol(buf, NULL, 0); - mg_snprintf(path, sizeof(path), "%s%c%s", dir, MG_DIRSEP, file); - if (hm->body.len == 0) { - mg_http_reply(c, 200, "", "%ld", res); // Nothing to write - } else if (file[0] == '\0') { - mg_http_reply(c, 400, "", "file required"); - res = -1; - } else if (mg_path_is_sane(file) == false) { - mg_http_reply(c, 400, "", "%s: invalid file", file); - res = -2; - } else if (offset < 0) { - mg_http_reply(c, 400, "", "offset required"); - res = -3; - } else if ((size_t) offset + hm->body.len > max_size) { - mg_http_reply(c, 400, "", "%s: over max size of %lu", path, - (unsigned long) max_size); - res = -4; - } else { - struct mg_fd *fd; - size_t current_size = 0; - MG_DEBUG(("%s -> %lu bytes @ %ld", path, hm->body.len, offset)); - if (offset == 0) fs->rm(path); // If offset if 0, truncate file - fs->st(path, ¤t_size, NULL); - if (offset > 0 && current_size != (size_t) offset) { - mg_http_reply(c, 400, "", "%s: offset mismatch", path); - res = -5; - } else if ((fd = mg_fs_open(fs, path, MG_FS_WRITE)) == NULL) { - mg_http_reply(c, 400, "", "open(%s): %d", path, errno); - res = -6; - } else { - res = offset + (long) fs->wr(fd->fd, hm->body.ptr, hm->body.len); - mg_fs_close(fd); - mg_http_reply(c, 200, "", "%ld", res); - } - } - return res; -} - -int mg_http_status(const struct mg_http_message *hm) { - return atoi(hm->uri.ptr); -} - -static bool is_hex_digit(int c) { - return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || - (c >= 'A' && c <= 'F'); -} - -static int skip_chunk(const char *buf, int len, int *pl, int *dl) { - int i = 0, n = 0; - if (len < 3) return 0; - while (i < len && is_hex_digit(buf[i])) i++; - if (i == 0) return -1; // Error, no length specified - if (i > (int) sizeof(int) * 2) return -1; // Chunk length is too big - if (len < i + 1 || buf[i] != '\r' || buf[i + 1] != '\n') return -1; // Error - n = (int) mg_unhexn(buf, (size_t) i); // Decode chunk length - if (n < 0) return -1; // Error - if (n > len - i - 4) return 0; // Chunk not yet fully buffered - if (buf[i + n + 2] != '\r' || buf[i + n + 3] != '\n') return -1; // Error - *pl = i + 2, *dl = n; - return i + 2 + n + 2; -} - -static void http_cb(struct mg_connection *c, int ev, void *ev_data) { - if (ev == MG_EV_READ || ev == MG_EV_CLOSE) { - struct mg_http_message hm; - size_t ofs = 0; // Parsing offset - - while (c->is_resp == 0 && ofs < c->recv.len) { - const char *buf = (char *) c->recv.buf + ofs; - int n = mg_http_parse(buf, c->recv.len - ofs, &hm); - struct mg_str *te; // Transfer - encoding header - bool is_chunked = false; - if (n < 0) { - // We don't use mg_error() here, to avoid closing pipelined requests - // prematurely, see #2592 - MG_ERROR(("HTTP parse, %lu bytes", c->recv.len)); - c->is_draining = 1; - mg_hexdump(buf, c->recv.len - ofs > 16 ? 16 : c->recv.len - ofs); - c->recv.len = 0; - return; - } - if (n == 0) break; // Request is not buffered yet - if (ev == MG_EV_CLOSE) { // If client did not set Content-Length - hm.message.len = c->recv.len - ofs; // and closes now, deliver MSG - hm.body.len = hm.message.len - (size_t) (hm.body.ptr - hm.message.ptr); - } - if ((te = mg_http_get_header(&hm, "Transfer-Encoding")) != NULL) { - if (mg_vcasecmp(te, "chunked") == 0) { - is_chunked = true; - } else { - mg_error(c, "Invalid Transfer-Encoding"); // See #2460 - return; - } - } - - if (is_chunked) { - // For chunked data, strip off prefixes and suffixes from chunks - // and relocate them right after the headers, then report a message - char *s = (char *) c->recv.buf + ofs + n; - int o = 0, pl, dl, cl, len = (int) (c->recv.len - ofs - (size_t) n); - - // Find zero-length chunk (the end of the body) - while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0 && dl) o += cl; - if (cl == 0) break; // No zero-len chunk, buffer more data - if (cl < 0) { - mg_error(c, "Invalid chunk"); - break; - } - - // Zero chunk found. Second pass: strip + relocate - o = 0, hm.body.len = 0, hm.message.len = (size_t) n; - while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0) { - memmove(s + hm.body.len, s + o + pl, (size_t) dl); - o += cl, hm.body.len += (size_t) dl, hm.message.len += (size_t) dl; - if (dl == 0) break; - } - ofs += (size_t) (n + o); - } else { // Normal, non-chunked data - size_t len = c->recv.len - ofs - (size_t) n; - if (hm.body.len > len) break; // Buffer more data - ofs += (size_t) n + hm.body.len; - } - - if (c->is_accepted) c->is_resp = 1; // Start generating response - mg_call(c, MG_EV_HTTP_MSG, &hm); // User handler can clear is_resp - } - if (ofs > 0) mg_iobuf_del(&c->recv, 0, ofs); // Delete processed data - } - (void) ev_data; -} - -static void mg_hfn(struct mg_connection *c, int ev, void *ev_data) { - if (ev == MG_EV_HTTP_MSG) { - struct mg_http_message *hm = (struct mg_http_message *) ev_data; - if (mg_http_match_uri(hm, "/quit")) { - mg_http_reply(c, 200, "", "ok\n"); - c->is_draining = 1; - c->data[0] = 'X'; - } else if (mg_http_match_uri(hm, "/debug")) { - int level = (int) mg_json_get_long(hm->body, "$.level", MG_LL_DEBUG); - mg_log_set(level); - mg_http_reply(c, 200, "", "Debug level set to %d\n", level); - } else { - mg_http_reply(c, 200, "", "hi\n"); - } - } else if (ev == MG_EV_CLOSE) { - if (c->data[0] == 'X') *(bool *) c->fn_data = true; - } -} - -void mg_hello(const char *url) { - struct mg_mgr mgr; - bool done = false; - mg_mgr_init(&mgr); - if (mg_http_listen(&mgr, url, mg_hfn, &done) == NULL) done = true; - while (done == false) mg_mgr_poll(&mgr, 100); - mg_mgr_free(&mgr); -} - -struct mg_connection *mg_http_connect(struct mg_mgr *mgr, const char *url, - mg_event_handler_t fn, void *fn_data) { - struct mg_connection *c = mg_connect(mgr, url, fn, fn_data); - if (c != NULL) c->pfn = http_cb; - return c; -} - -struct mg_connection *mg_http_listen(struct mg_mgr *mgr, const char *url, - mg_event_handler_t fn, void *fn_data) { - struct mg_connection *c = mg_listen(mgr, url, fn, fn_data); - if (c != NULL) c->pfn = http_cb; - return c; -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/iobuf.c" -#endif - - - - - -static size_t roundup(size_t size, size_t align) { - return align == 0 ? size : (size + align - 1) / align * align; -} - -int mg_iobuf_resize(struct mg_iobuf *io, size_t new_size) { - int ok = 1; - new_size = roundup(new_size, io->align); - if (new_size == 0) { - mg_bzero(io->buf, io->size); - free(io->buf); - io->buf = NULL; - io->len = io->size = 0; - } else if (new_size != io->size) { - // NOTE(lsm): do not use realloc here. Use calloc/free only, to ease the - // porting to some obscure platforms like FreeRTOS - void *p = calloc(1, new_size); - if (p != NULL) { - size_t len = new_size < io->len ? new_size : io->len; - if (len > 0 && io->buf != NULL) memmove(p, io->buf, len); - mg_bzero(io->buf, io->size); - free(io->buf); - io->buf = (unsigned char *) p; - io->size = new_size; - } else { - ok = 0; - MG_ERROR(("%lld->%lld", (uint64_t) io->size, (uint64_t) new_size)); - } - } - return ok; -} - -int mg_iobuf_init(struct mg_iobuf *io, size_t size, size_t align) { - io->buf = NULL; - io->align = align; - io->size = io->len = 0; - return mg_iobuf_resize(io, size); -} - -size_t mg_iobuf_add(struct mg_iobuf *io, size_t ofs, const void *buf, - size_t len) { - size_t new_size = roundup(io->len + len, io->align); - mg_iobuf_resize(io, new_size); // Attempt to resize - if (new_size != io->size) len = 0; // Resize failure, append nothing - if (ofs < io->len) memmove(io->buf + ofs + len, io->buf + ofs, io->len - ofs); - if (buf != NULL) memmove(io->buf + ofs, buf, len); - if (ofs > io->len) io->len += ofs - io->len; - io->len += len; - return len; -} - -size_t mg_iobuf_del(struct mg_iobuf *io, size_t ofs, size_t len) { - if (ofs > io->len) ofs = io->len; - if (ofs + len > io->len) len = io->len - ofs; - if (io->buf) memmove(io->buf + ofs, io->buf + ofs + len, io->len - ofs - len); - if (io->buf) mg_bzero(io->buf + io->len - len, len); - io->len -= len; - return len; -} - -void mg_iobuf_free(struct mg_iobuf *io) { - mg_iobuf_resize(io, 0); -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/json.c" -#endif - - - - -static const char *escapeseq(int esc) { - return esc ? "\b\f\n\r\t\\\"" : "bfnrt\\\""; -} - -static char json_esc(int c, int esc) { - const char *p, *esc1 = escapeseq(esc), *esc2 = escapeseq(!esc); - for (p = esc1; *p != '\0'; p++) { - if (*p == c) return esc2[p - esc1]; - } - return 0; -} - -static int mg_pass_string(const char *s, int len) { - int i; - for (i = 0; i < len; i++) { - if (s[i] == '\\' && i + 1 < len && json_esc(s[i + 1], 1)) { - i++; - } else if (s[i] == '\0') { - return MG_JSON_INVALID; - } else if (s[i] == '"') { - return i; - } - } - return MG_JSON_INVALID; -} - -static double mg_atod(const char *p, int len, int *numlen) { - double d = 0.0; - int i = 0, sign = 1; - - // Sign - if (i < len && *p == '-') { - sign = -1, i++; - } else if (i < len && *p == '+') { - i++; - } - - // Decimal - for (; i < len && p[i] >= '0' && p[i] <= '9'; i++) { - d *= 10.0; - d += p[i] - '0'; - } - d *= sign; - - // Fractional - if (i < len && p[i] == '.') { - double frac = 0.0, base = 0.1; - i++; - for (; i < len && p[i] >= '0' && p[i] <= '9'; i++) { - frac += base * (p[i] - '0'); - base /= 10.0; - } - d += frac * sign; - } - - // Exponential - if (i < len && (p[i] == 'e' || p[i] == 'E')) { - int j, exp = 0, minus = 0; - i++; - if (i < len && p[i] == '-') minus = 1, i++; - if (i < len && p[i] == '+') i++; - while (i < len && p[i] >= '0' && p[i] <= '9' && exp < 308) - exp = exp * 10 + (p[i++] - '0'); - if (minus) exp = -exp; - for (j = 0; j < exp; j++) d *= 10.0; - for (j = 0; j < -exp; j++) d /= 10.0; - } - - if (numlen != NULL) *numlen = i; - return d; -} - -// Iterate over object or array elements -size_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key, - struct mg_str *val) { - if (ofs >= obj.len) { - ofs = 0; // Out of boundaries, stop scanning - } else if (obj.len < 2 || (*obj.ptr != '{' && *obj.ptr != '[')) { - ofs = 0; // Not an array or object, stop - } else { - struct mg_str sub = mg_str_n(obj.ptr + ofs, obj.len - ofs); - if (ofs == 0) ofs++, sub.ptr++, sub.len--; - if (*obj.ptr == '[') { // Iterate over an array - int n = 0, o = mg_json_get(sub, "$", &n); - if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) { - ofs = 0; // Error parsing key, stop scanning - } else { - if (key) *key = mg_str_n(NULL, 0); - if (val) *val = mg_str_n(sub.ptr + o, (size_t) n); - ofs = (size_t) (&sub.ptr[o + n] - obj.ptr); - } - } else { // Iterate over an object - int n = 0, o = mg_json_get(sub, "$", &n); - if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) { - ofs = 0; // Error parsing key, stop scanning - } else { - if (key) *key = mg_str_n(sub.ptr + o, (size_t) n); - sub.ptr += o + n, sub.len -= (size_t) (o + n); - while (sub.len > 0 && *sub.ptr != ':') sub.len--, sub.ptr++; - if (sub.len > 0 && *sub.ptr == ':') sub.len--, sub.ptr++; - n = 0, o = mg_json_get(sub, "$", &n); - if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) { - ofs = 0; // Error parsing value, stop scanning - } else { - if (val) *val = mg_str_n(sub.ptr + o, (size_t) n); - ofs = (size_t) (&sub.ptr[o + n] - obj.ptr); - } - } - } - // MG_INFO(("SUB ofs %u %.*s", ofs, sub.len, sub.ptr)); - while (ofs && ofs < obj.len && - (obj.ptr[ofs] == ' ' || obj.ptr[ofs] == '\t' || - obj.ptr[ofs] == '\n' || obj.ptr[ofs] == '\r')) { - ofs++; - } - if (ofs && ofs < obj.len && obj.ptr[ofs] == ',') ofs++; - if (ofs > obj.len) ofs = 0; - } - return ofs; -} - -int mg_json_get(struct mg_str json, const char *path, int *toklen) { - const char *s = json.ptr; - int len = (int) json.len; - enum { S_VALUE, S_KEY, S_COLON, S_COMMA_OR_EOO } expecting = S_VALUE; - unsigned char nesting[MG_JSON_MAX_DEPTH]; - int i = 0; // Current offset in `s` - int j = 0; // Offset in `s` we're looking for (return value) - int depth = 0; // Current depth (nesting level) - int ed = 0; // Expected depth - int pos = 1; // Current position in `path` - int ci = -1, ei = -1; // Current and expected index in array - - if (toklen) *toklen = 0; - if (path[0] != '$') return MG_JSON_INVALID; - -#define MG_CHECKRET(x) \ - do { \ - if (depth == ed && path[pos] == '\0' && ci == ei) { \ - if (toklen) *toklen = i - j + 1; \ - return j; \ - } \ - } while (0) - -// In the ascii table, the distance between `[` and `]` is 2. -// Ditto for `{` and `}`. Hence +2 in the code below. -#define MG_EOO(x) \ - do { \ - if (depth == ed && ci != ei) return MG_JSON_NOT_FOUND; \ - if (c != nesting[depth - 1] + 2) return MG_JSON_INVALID; \ - depth--; \ - MG_CHECKRET(x); \ - } while (0) - - for (i = 0; i < len; i++) { - unsigned char c = ((unsigned char *) s)[i]; - if (c == ' ' || c == '\t' || c == '\n' || c == '\r') continue; - switch (expecting) { - case S_VALUE: - // p("V %s [%.*s] %d %d %d %d\n", path, pos, path, depth, ed, ci, ei); - if (depth == ed) j = i; - if (c == '{') { - if (depth >= (int) sizeof(nesting)) return MG_JSON_TOO_DEEP; - if (depth == ed && path[pos] == '.' && ci == ei) { - // If we start the object, reset array indices - ed++, pos++, ci = ei = -1; - } - nesting[depth++] = c; - expecting = S_KEY; - break; - } else if (c == '[') { - if (depth >= (int) sizeof(nesting)) return MG_JSON_TOO_DEEP; - if (depth == ed && path[pos] == '[' && ei == ci) { - ed++, pos++, ci = 0; - for (ei = 0; path[pos] != ']' && path[pos] != '\0'; pos++) { - ei *= 10; - ei += path[pos] - '0'; - } - if (path[pos] != 0) pos++; - } - nesting[depth++] = c; - break; - } else if (c == ']' && depth > 0) { // Empty array - MG_EOO(']'); - } else if (c == 't' && i + 3 < len && memcmp(&s[i], "true", 4) == 0) { - i += 3; - } else if (c == 'n' && i + 3 < len && memcmp(&s[i], "null", 4) == 0) { - i += 3; - } else if (c == 'f' && i + 4 < len && memcmp(&s[i], "false", 5) == 0) { - i += 4; - } else if (c == '-' || ((c >= '0' && c <= '9'))) { - int numlen = 0; - mg_atod(&s[i], len - i, &numlen); - i += numlen - 1; - } else if (c == '"') { - int n = mg_pass_string(&s[i + 1], len - i - 1); - if (n < 0) return n; - i += n + 1; - } else { - return MG_JSON_INVALID; - } - MG_CHECKRET('V'); - if (depth == ed && ei >= 0) ci++; - expecting = S_COMMA_OR_EOO; - break; - - case S_KEY: - if (c == '"') { - int n = mg_pass_string(&s[i + 1], len - i - 1); - if (n < 0) return n; - if (i + 1 + n >= len) return MG_JSON_NOT_FOUND; - if (depth < ed) return MG_JSON_NOT_FOUND; - if (depth == ed && path[pos - 1] != '.') return MG_JSON_NOT_FOUND; - // printf("K %s [%.*s] [%.*s] %d %d %d %d %d\n", path, pos, path, n, - // &s[i + 1], n, depth, ed, ci, ei); - // NOTE(cpq): in the check sequence below is important. - // strncmp() must go first: it fails fast if the remaining length - // of the path is smaller than `n`. - if (depth == ed && path[pos - 1] == '.' && - strncmp(&s[i + 1], &path[pos], (size_t) n) == 0 && - (path[pos + n] == '\0' || path[pos + n] == '.' || - path[pos + n] == '[')) { - pos += n; - } - i += n + 1; - expecting = S_COLON; - } else if (c == '}') { // Empty object - MG_EOO('}'); - expecting = S_COMMA_OR_EOO; - if (depth == ed && ei >= 0) ci++; - } else { - return MG_JSON_INVALID; - } - break; - - case S_COLON: - if (c == ':') { - expecting = S_VALUE; - } else { - return MG_JSON_INVALID; - } - break; - - case S_COMMA_OR_EOO: - if (depth <= 0) { - return MG_JSON_INVALID; - } else if (c == ',') { - expecting = (nesting[depth - 1] == '{') ? S_KEY : S_VALUE; - } else if (c == ']' || c == '}') { - if (depth == ed && c == '}' && path[pos - 1] == '.') - return MG_JSON_NOT_FOUND; - if (depth == ed && c == ']' && path[pos - 1] == ',') - return MG_JSON_NOT_FOUND; - MG_EOO('O'); - if (depth == ed && ei >= 0) ci++; - } else { - return MG_JSON_INVALID; - } - break; - } - } - return MG_JSON_NOT_FOUND; -} - -struct mg_str mg_json_get_tok(struct mg_str json, const char *path) { - int len = 0, ofs = mg_json_get(json, path, &len); - return mg_str_n(ofs < 0 ? NULL : json.ptr + ofs, - (size_t) (len < 0 ? 0 : len)); -} - -bool mg_json_get_num(struct mg_str json, const char *path, double *v) { - int n, toklen, found = 0; - if ((n = mg_json_get(json, path, &toklen)) >= 0 && - (json.ptr[n] == '-' || (json.ptr[n] >= '0' && json.ptr[n] <= '9'))) { - if (v != NULL) *v = mg_atod(json.ptr + n, toklen, NULL); - found = 1; - } - return found; -} - -bool mg_json_get_bool(struct mg_str json, const char *path, bool *v) { - int found = 0, off = mg_json_get(json, path, NULL); - if (off >= 0 && (json.ptr[off] == 't' || json.ptr[off] == 'f')) { - if (v != NULL) *v = json.ptr[off] == 't'; - found = 1; - } - return found; -} - -bool mg_json_unescape(struct mg_str s, char *to, size_t n) { - size_t i, j; - for (i = 0, j = 0; i < s.len && j < n; i++, j++) { - if (s.ptr[i] == '\\' && i + 5 < s.len && s.ptr[i + 1] == 'u') { - // \uXXXX escape. We could process a simple one-byte chars - // \u00xx from the ASCII range. More complex chars would require - // dragging in a UTF8 library, which is too much for us - if (s.ptr[i + 2] != '0' || s.ptr[i + 3] != '0') return false; // Give up - ((unsigned char *) to)[j] = (unsigned char) mg_unhexn(s.ptr + i + 4, 2); - - i += 5; - } else if (s.ptr[i] == '\\' && i + 1 < s.len) { - char c = json_esc(s.ptr[i + 1], 0); - if (c == 0) return false; - to[j] = c; - i++; - } else { - to[j] = s.ptr[i]; - } - } - if (j >= n) return false; - if (n > 0) to[j] = '\0'; - return true; -} - -char *mg_json_get_str(struct mg_str json, const char *path) { - char *result = NULL; - int len = 0, off = mg_json_get(json, path, &len); - if (off >= 0 && len > 1 && json.ptr[off] == '"') { - if ((result = (char *) calloc(1, (size_t) len)) != NULL && - !mg_json_unescape(mg_str_n(json.ptr + off + 1, (size_t) (len - 2)), - result, (size_t) len)) { - free(result); - result = NULL; - } - } - return result; -} - -char *mg_json_get_b64(struct mg_str json, const char *path, int *slen) { - char *result = NULL; - int len = 0, off = mg_json_get(json, path, &len); - if (off >= 0 && json.ptr[off] == '"' && len > 1 && - (result = (char *) calloc(1, (size_t) len)) != NULL) { - size_t k = mg_base64_decode(json.ptr + off + 1, (size_t) (len - 2), result, - (size_t) len); - if (slen != NULL) *slen = (int) k; - } - return result; -} - -char *mg_json_get_hex(struct mg_str json, const char *path, int *slen) { - char *result = NULL; - int len = 0, off = mg_json_get(json, path, &len); - if (off >= 0 && json.ptr[off] == '"' && len > 1 && - (result = (char *) calloc(1, (size_t) len / 2)) != NULL) { - mg_unhex(json.ptr + off + 1, (size_t) (len - 2), (uint8_t *) result); - result[len / 2 - 1] = '\0'; - if (slen != NULL) *slen = len / 2 - 1; - } - return result; -} - -long mg_json_get_long(struct mg_str json, const char *path, long dflt) { - double dv; - long result = dflt; - if (mg_json_get_num(json, path, &dv)) result = (long) dv; - return result; -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/log.c" -#endif - - - - - -int mg_log_level = MG_LL_INFO; -static mg_pfn_t s_log_func = mg_pfn_stdout; -static void *s_log_func_param = NULL; - -void mg_log_set_fn(mg_pfn_t fn, void *param) { - s_log_func = fn; - s_log_func_param = param; -} - -static void logc(unsigned char c) { - s_log_func((char) c, s_log_func_param); -} - -static void logs(const char *buf, size_t len) { - size_t i; - for (i = 0; i < len; i++) logc(((unsigned char *) buf)[i]); -} - -#if MG_ENABLE_CUSTOM_LOG -// Let user define their own mg_log_prefix() and mg_log() -#else -void mg_log_prefix(int level, const char *file, int line, const char *fname) { - const char *p = strrchr(file, '/'); - char buf[41]; - size_t n; - if (p == NULL) p = strrchr(file, '\\'); - n = mg_snprintf(buf, sizeof(buf), "%-6llx %d %s:%d:%s", mg_millis(), level, - p == NULL ? file : p + 1, line, fname); - if (n > sizeof(buf) - 2) n = sizeof(buf) - 2; - while (n < sizeof(buf)) buf[n++] = ' '; - logs(buf, n - 1); -} - -void mg_log(const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - mg_vxprintf(s_log_func, s_log_func_param, fmt, &ap); - va_end(ap); - logs("\r\n", 2); -} -#endif - -static unsigned char nibble(unsigned c) { - return (unsigned char) (c < 10 ? c + '0' : c + 'W'); -} - -#define ISPRINT(x) ((x) >= ' ' && (x) <= '~') -void mg_hexdump(const void *buf, size_t len) { - const unsigned char *p = (const unsigned char *) buf; - unsigned char ascii[16], alen = 0; - size_t i; - for (i = 0; i < len; i++) { - if ((i % 16) == 0) { - // Print buffered ascii chars - if (i > 0) logs(" ", 2), logs((char *) ascii, 16), logc('\n'), alen = 0; - // Print hex address, then \t - logc(nibble((i >> 12) & 15)), logc(nibble((i >> 8) & 15)), - logc(nibble((i >> 4) & 15)), logc('0'), logs(" ", 3); - } - logc(nibble(p[i] >> 4)), logc(nibble(p[i] & 15)); // Two nibbles, e.g. c5 - logc(' '); // Space after hex number - ascii[alen++] = ISPRINT(p[i]) ? p[i] : '.'; // Add to the ascii buf - } - while (alen < 16) logs(" ", 3), ascii[alen++] = ' '; - logs(" ", 2), logs((char *) ascii, 16), logc('\n'); -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/md5.c" -#endif - - - -// This code implements the MD5 message-digest algorithm. -// The algorithm is due to Ron Rivest. This code was -// written by Colin Plumb in 1993, no copyright is claimed. -// This code is in the public domain; do with it what you wish. -// -// Equivalent code is available from RSA Data Security, Inc. -// This code has been tested against that, and is equivalent, -// except that you don't need to include two pages of legalese -// with every copy. -// -// To compute the message digest of a chunk of bytes, declare an -// MD5Context structure, pass it to MD5Init, call MD5Update as -// needed on buffers full of bytes, and then call MD5Final, which -// will fill a supplied 16-byte array with the digest. - -#if defined(MG_ENABLE_MD5) && MG_ENABLE_MD5 - -static void mg_byte_reverse(unsigned char *buf, unsigned longs) { - if (MG_BIG_ENDIAN) { - do { - uint32_t t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 | - ((unsigned) buf[1] << 8 | buf[0]); - *(uint32_t *) buf = t; - buf += 4; - } while (--longs); - } else { - (void) buf, (void) longs; // Little endian. Do nothing - } -} - -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -#define MD5STEP(f, w, x, y, z, data, s) \ - (w += f(x, y, z) + data, w = w << s | w >> (32 - s), w += x) - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void mg_md5_init(mg_md5_ctx *ctx) { - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; -} - -static void mg_md5_transform(uint32_t buf[4], uint32_t const in[16]) { - uint32_t a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - -void mg_md5_update(mg_md5_ctx *ctx, const unsigned char *buf, size_t len) { - uint32_t t; - - t = ctx->bits[0]; - if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) ctx->bits[1]++; - ctx->bits[1] += (uint32_t) len >> 29; - - t = (t >> 3) & 0x3f; - - if (t) { - unsigned char *p = (unsigned char *) ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - mg_byte_reverse(ctx->in, 16); - mg_md5_transform(ctx->buf, (uint32_t *) ctx->in); - buf += t; - len -= t; - } - - while (len >= 64) { - memcpy(ctx->in, buf, 64); - mg_byte_reverse(ctx->in, 16); - mg_md5_transform(ctx->buf, (uint32_t *) ctx->in); - buf += 64; - len -= 64; - } - - memcpy(ctx->in, buf, len); -} - -void mg_md5_final(mg_md5_ctx *ctx, unsigned char digest[16]) { - unsigned count; - unsigned char *p; - uint32_t *a; - - count = (ctx->bits[0] >> 3) & 0x3F; - - p = ctx->in + count; - *p++ = 0x80; - count = 64 - 1 - count; - if (count < 8) { - memset(p, 0, count); - mg_byte_reverse(ctx->in, 16); - mg_md5_transform(ctx->buf, (uint32_t *) ctx->in); - memset(ctx->in, 0, 56); - } else { - memset(p, 0, count - 8); - } - mg_byte_reverse(ctx->in, 14); - - a = (uint32_t *) ctx->in; - a[14] = ctx->bits[0]; - a[15] = ctx->bits[1]; - - mg_md5_transform(ctx->buf, (uint32_t *) ctx->in); - mg_byte_reverse((unsigned char *) ctx->buf, 4); - memcpy(digest, ctx->buf, 16); - memset((char *) ctx, 0, sizeof(*ctx)); -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/mqtt.c" -#endif - - - - - - - - -#define MQTT_CLEAN_SESSION 0x02 -#define MQTT_HAS_WILL 0x04 -#define MQTT_WILL_RETAIN 0x20 -#define MQTT_HAS_PASSWORD 0x40 -#define MQTT_HAS_USER_NAME 0x80 - -struct mg_mqtt_pmap { - uint8_t id; - uint8_t type; -}; - -static const struct mg_mqtt_pmap s_prop_map[] = { - {MQTT_PROP_PAYLOAD_FORMAT_INDICATOR, MQTT_PROP_TYPE_BYTE}, - {MQTT_PROP_MESSAGE_EXPIRY_INTERVAL, MQTT_PROP_TYPE_INT}, - {MQTT_PROP_CONTENT_TYPE, MQTT_PROP_TYPE_STRING}, - {MQTT_PROP_RESPONSE_TOPIC, MQTT_PROP_TYPE_STRING}, - {MQTT_PROP_CORRELATION_DATA, MQTT_PROP_TYPE_BINARY_DATA}, - {MQTT_PROP_SUBSCRIPTION_IDENTIFIER, MQTT_PROP_TYPE_VARIABLE_INT}, - {MQTT_PROP_SESSION_EXPIRY_INTERVAL, MQTT_PROP_TYPE_INT}, - {MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER, MQTT_PROP_TYPE_STRING}, - {MQTT_PROP_SERVER_KEEP_ALIVE, MQTT_PROP_TYPE_SHORT}, - {MQTT_PROP_AUTHENTICATION_METHOD, MQTT_PROP_TYPE_STRING}, - {MQTT_PROP_AUTHENTICATION_DATA, MQTT_PROP_TYPE_BINARY_DATA}, - {MQTT_PROP_REQUEST_PROBLEM_INFORMATION, MQTT_PROP_TYPE_BYTE}, - {MQTT_PROP_WILL_DELAY_INTERVAL, MQTT_PROP_TYPE_INT}, - {MQTT_PROP_REQUEST_RESPONSE_INFORMATION, MQTT_PROP_TYPE_BYTE}, - {MQTT_PROP_RESPONSE_INFORMATION, MQTT_PROP_TYPE_STRING}, - {MQTT_PROP_SERVER_REFERENCE, MQTT_PROP_TYPE_STRING}, - {MQTT_PROP_REASON_STRING, MQTT_PROP_TYPE_STRING}, - {MQTT_PROP_RECEIVE_MAXIMUM, MQTT_PROP_TYPE_SHORT}, - {MQTT_PROP_TOPIC_ALIAS_MAXIMUM, MQTT_PROP_TYPE_SHORT}, - {MQTT_PROP_TOPIC_ALIAS, MQTT_PROP_TYPE_SHORT}, - {MQTT_PROP_MAXIMUM_QOS, MQTT_PROP_TYPE_BYTE}, - {MQTT_PROP_RETAIN_AVAILABLE, MQTT_PROP_TYPE_BYTE}, - {MQTT_PROP_USER_PROPERTY, MQTT_PROP_TYPE_STRING_PAIR}, - {MQTT_PROP_MAXIMUM_PACKET_SIZE, MQTT_PROP_TYPE_INT}, - {MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE, MQTT_PROP_TYPE_BYTE}, - {MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE, MQTT_PROP_TYPE_BYTE}, - {MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE, MQTT_PROP_TYPE_BYTE}}; - -void mg_mqtt_send_header(struct mg_connection *c, uint8_t cmd, uint8_t flags, - uint32_t len) { - uint8_t buf[1 + sizeof(len)], *vlen = &buf[1]; - buf[0] = (uint8_t) ((cmd << 4) | flags); - do { - *vlen = len % 0x80; - len /= 0x80; - if (len > 0) *vlen |= 0x80; - vlen++; - } while (len > 0 && vlen < &buf[sizeof(buf)]); - mg_send(c, buf, (size_t) (vlen - buf)); -} - -static void mg_send_u16(struct mg_connection *c, uint16_t value) { - mg_send(c, &value, sizeof(value)); -} - -static void mg_send_u32(struct mg_connection *c, uint32_t value) { - mg_send(c, &value, sizeof(value)); -} - -static uint8_t varint_size(size_t length) { - uint8_t bytes_needed = 0; - do { - bytes_needed++; - length /= 0x80; - } while (length > 0); - return bytes_needed; -} - -static size_t encode_varint(uint8_t *buf, size_t value) { - size_t len = 0; - - do { - uint8_t byte = (uint8_t) (value % 128); - value /= 128; - if (value > 0) byte |= 0x80; - buf[len++] = byte; - } while (value > 0); - - return len; -} - -static size_t decode_varint(const uint8_t *buf, size_t len, size_t *value) { - size_t multiplier = 1, offset; - *value = 0; - - for (offset = 0; offset < 4 && offset < len; offset++) { - uint8_t encoded_byte = buf[offset]; - *value += (encoded_byte & 0x7f) * multiplier; - multiplier *= 128; - - if ((encoded_byte & 0x80) == 0) return offset + 1; - } - - return 0; -} - -static int mqtt_prop_type_by_id(uint8_t prop_id) { - size_t i, num_properties = sizeof(s_prop_map) / sizeof(s_prop_map[0]); - for (i = 0; i < num_properties; ++i) { - if (s_prop_map[i].id == prop_id) return s_prop_map[i].type; - } - return -1; // Property ID not found -} - -// Returns the size of the properties section, without the -// size of the content's length -static size_t get_properties_length(struct mg_mqtt_prop *props, size_t count) { - size_t i, size = 0; - for (i = 0; i < count; i++) { - size++; // identifier - switch (mqtt_prop_type_by_id(props[i].id)) { - case MQTT_PROP_TYPE_STRING_PAIR: - size += (uint32_t) (props[i].val.len + props[i].key.len + - 2 * sizeof(uint16_t)); - break; - case MQTT_PROP_TYPE_STRING: - size += (uint32_t) (props[i].val.len + sizeof(uint16_t)); - break; - case MQTT_PROP_TYPE_BINARY_DATA: - size += (uint32_t) (props[i].val.len + sizeof(uint16_t)); - break; - case MQTT_PROP_TYPE_VARIABLE_INT: - size += varint_size((uint32_t) props[i].iv); - break; - case MQTT_PROP_TYPE_INT: - size += (uint32_t) sizeof(uint32_t); - break; - case MQTT_PROP_TYPE_SHORT: - size += (uint32_t) sizeof(uint16_t); - break; - case MQTT_PROP_TYPE_BYTE: - size += (uint32_t) sizeof(uint8_t); - break; - default: - return size; // cannot parse further down - } - } - - return size; -} - -// returns the entire size of the properties section, including the -// size of the variable length of the content -static size_t get_props_size(struct mg_mqtt_prop *props, size_t count) { - size_t size = get_properties_length(props, count); - size += varint_size(size); - return size; -} - -static void mg_send_mqtt_properties(struct mg_connection *c, - struct mg_mqtt_prop *props, size_t nprops) { - size_t total_size = get_properties_length(props, nprops); - uint8_t buf_v[4] = {0, 0, 0, 0}; - uint8_t buf[4] = {0, 0, 0, 0}; - size_t i, len = encode_varint(buf, total_size); - - mg_send(c, buf, (size_t) len); - for (i = 0; i < nprops; i++) { - mg_send(c, &props[i].id, sizeof(props[i].id)); - switch (mqtt_prop_type_by_id(props[i].id)) { - case MQTT_PROP_TYPE_STRING_PAIR: - mg_send_u16(c, mg_htons((uint16_t) props[i].key.len)); - mg_send(c, props[i].key.ptr, props[i].key.len); - mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)); - mg_send(c, props[i].val.ptr, props[i].val.len); - break; - case MQTT_PROP_TYPE_BYTE: - mg_send(c, &props[i].iv, sizeof(uint8_t)); - break; - case MQTT_PROP_TYPE_SHORT: - mg_send_u16(c, mg_htons((uint16_t) props[i].iv)); - break; - case MQTT_PROP_TYPE_INT: - mg_send_u32(c, mg_htonl((uint32_t) props[i].iv)); - break; - case MQTT_PROP_TYPE_STRING: - mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)); - mg_send(c, props[i].val.ptr, props[i].val.len); - break; - case MQTT_PROP_TYPE_BINARY_DATA: - mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)); - mg_send(c, props[i].val.ptr, props[i].val.len); - break; - case MQTT_PROP_TYPE_VARIABLE_INT: - len = encode_varint(buf_v, props[i].iv); - mg_send(c, buf_v, (size_t) len); - break; - } - } -} - -size_t mg_mqtt_next_prop(struct mg_mqtt_message *msg, struct mg_mqtt_prop *prop, - size_t ofs) { - uint8_t *i = (uint8_t *) msg->dgram.ptr + msg->props_start + ofs; - uint8_t *end = (uint8_t *) msg->dgram.ptr + msg->dgram.len; - size_t new_pos = ofs, len; - prop->id = i[0]; - - if (ofs >= msg->dgram.len || ofs >= msg->props_start + msg->props_size) - return 0; - i++, new_pos++; - - switch (mqtt_prop_type_by_id(prop->id)) { - case MQTT_PROP_TYPE_STRING_PAIR: - prop->key.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]); - prop->key.ptr = (char *) i + 2; - i += 2 + prop->key.len; - prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]); - prop->val.ptr = (char *) i + 2; - new_pos += 2 * sizeof(uint16_t) + prop->val.len + prop->key.len; - break; - case MQTT_PROP_TYPE_BYTE: - prop->iv = (uint8_t) i[0]; - new_pos++; - break; - case MQTT_PROP_TYPE_SHORT: - prop->iv = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]); - new_pos += sizeof(uint16_t); - break; - case MQTT_PROP_TYPE_INT: - prop->iv = ((uint32_t) i[0] << 24) | ((uint32_t) i[1] << 16) | - ((uint32_t) i[2] << 8) | i[3]; - new_pos += sizeof(uint32_t); - break; - case MQTT_PROP_TYPE_STRING: - prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]); - prop->val.ptr = (char *) i + 2; - new_pos += 2 + prop->val.len; - break; - case MQTT_PROP_TYPE_BINARY_DATA: - prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]); - prop->val.ptr = (char *) i + 2; - new_pos += 2 + prop->val.len; - break; - case MQTT_PROP_TYPE_VARIABLE_INT: - len = decode_varint(i, (size_t) (end - i), (size_t *) &prop->iv); - new_pos = (!len) ? 0 : new_pos + len; - break; - default: - new_pos = 0; - } - - return new_pos; -} - -void mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts) { - char rnd[10], client_id[21]; - struct mg_str cid = opts->client_id; - size_t total_len = 7 + 1 + 2 + 2; - uint8_t hdr[8] = {0, 4, 'M', 'Q', 'T', 'T', opts->version, 0}; - - if (cid.len == 0) { - mg_random(rnd, sizeof(rnd)); - mg_hex(rnd, sizeof(rnd), client_id); - client_id[sizeof(client_id) - 1] = '\0'; - cid = mg_str(client_id); - } - - if (hdr[6] == 0) hdr[6] = 4; // If version is not set, use 4 (3.1.1) - c->is_mqtt5 = hdr[6] == 5; // Set version 5 flag - hdr[7] = (uint8_t) ((opts->qos & 3) << 3); // Connection flags - if (opts->user.len > 0) { - total_len += 2 + (uint32_t) opts->user.len; - hdr[7] |= MQTT_HAS_USER_NAME; - } - if (opts->pass.len > 0) { - total_len += 2 + (uint32_t) opts->pass.len; - hdr[7] |= MQTT_HAS_PASSWORD; - } - if (opts->topic.len > 0 && opts->message.len > 0) { - total_len += 4 + (uint32_t) opts->topic.len + (uint32_t) opts->message.len; - hdr[7] |= MQTT_HAS_WILL; - } - if (opts->clean || cid.len == 0) hdr[7] |= MQTT_CLEAN_SESSION; - if (opts->retain) hdr[7] |= MQTT_WILL_RETAIN; - total_len += (uint32_t) cid.len; - if (c->is_mqtt5) { - total_len += get_props_size(opts->props, opts->num_props); - if (hdr[7] & MQTT_HAS_WILL) - total_len += get_props_size(opts->will_props, opts->num_will_props); - } - - mg_mqtt_send_header(c, MQTT_CMD_CONNECT, 0, (uint32_t) total_len); - mg_send(c, hdr, sizeof(hdr)); - // keepalive == 0 means "do not disconnect us!" - mg_send_u16(c, mg_htons((uint16_t) opts->keepalive)); - - if (c->is_mqtt5) mg_send_mqtt_properties(c, opts->props, opts->num_props); - - mg_send_u16(c, mg_htons((uint16_t) cid.len)); - mg_send(c, cid.ptr, cid.len); - - if (hdr[7] & MQTT_HAS_WILL) { - if (c->is_mqtt5) - mg_send_mqtt_properties(c, opts->will_props, opts->num_will_props); - - mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)); - mg_send(c, opts->topic.ptr, opts->topic.len); - mg_send_u16(c, mg_htons((uint16_t) opts->message.len)); - mg_send(c, opts->message.ptr, opts->message.len); - } - if (opts->user.len > 0) { - mg_send_u16(c, mg_htons((uint16_t) opts->user.len)); - mg_send(c, opts->user.ptr, opts->user.len); - } - if (opts->pass.len > 0) { - mg_send_u16(c, mg_htons((uint16_t) opts->pass.len)); - mg_send(c, opts->pass.ptr, opts->pass.len); - } -} - -void mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts) { - uint8_t flags = (uint8_t) (((opts->qos & 3) << 1) | (opts->retain ? 1 : 0)); - size_t len = 2 + opts->topic.len + opts->message.len; - MG_DEBUG(("%lu [%.*s] -> [%.*s]", c->id, (int) opts->topic.len, - (char *) opts->topic.ptr, (int) opts->message.len, - (char *) opts->message.ptr)); - if (opts->qos > 0) len += 2; - if (c->is_mqtt5) len += get_props_size(opts->props, opts->num_props); - - mg_mqtt_send_header(c, MQTT_CMD_PUBLISH, flags, (uint32_t) len); - mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)); - mg_send(c, opts->topic.ptr, opts->topic.len); - if (opts->qos > 0) { - if (++c->mgr->mqtt_id == 0) ++c->mgr->mqtt_id; - mg_send_u16(c, mg_htons(c->mgr->mqtt_id)); - } - - if (c->is_mqtt5) mg_send_mqtt_properties(c, opts->props, opts->num_props); - - if (opts->message.len > 0) mg_send(c, opts->message.ptr, opts->message.len); -} - -void mg_mqtt_sub(struct mg_connection *c, const struct mg_mqtt_opts *opts) { - uint8_t qos_ = opts->qos & 3; - size_t plen = c->is_mqtt5 ? get_props_size(opts->props, opts->num_props) : 0; - size_t len = 2 + opts->topic.len + 2 + 1 + plen; - - mg_mqtt_send_header(c, MQTT_CMD_SUBSCRIBE, 2, (uint32_t) len); - if (++c->mgr->mqtt_id == 0) ++c->mgr->mqtt_id; - mg_send_u16(c, mg_htons(c->mgr->mqtt_id)); - if (c->is_mqtt5) mg_send_mqtt_properties(c, opts->props, opts->num_props); - - mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)); - mg_send(c, opts->topic.ptr, opts->topic.len); - mg_send(c, &qos_, sizeof(qos_)); -} - -int mg_mqtt_parse(const uint8_t *buf, size_t len, uint8_t version, - struct mg_mqtt_message *m) { - uint8_t lc = 0, *p, *end; - uint32_t n = 0, len_len = 0; - - memset(m, 0, sizeof(*m)); - m->dgram.ptr = (char *) buf; - if (len < 2) return MQTT_INCOMPLETE; - m->cmd = (uint8_t) (buf[0] >> 4); - m->qos = (buf[0] >> 1) & 3; - - n = len_len = 0; - p = (uint8_t *) buf + 1; - while ((size_t) (p - buf) < len) { - lc = *((uint8_t *) p++); - n += (uint32_t) ((lc & 0x7f) << 7 * len_len); - len_len++; - if (!(lc & 0x80)) break; - if (len_len >= 4) return MQTT_MALFORMED; - } - end = p + n; - if ((lc & 0x80) || (end > buf + len)) return MQTT_INCOMPLETE; - m->dgram.len = (size_t) (end - buf); - - switch (m->cmd) { - case MQTT_CMD_CONNACK: - if (end - p < 2) return MQTT_MALFORMED; - m->ack = p[1]; - break; - case MQTT_CMD_PUBACK: - case MQTT_CMD_PUBREC: - case MQTT_CMD_PUBREL: - case MQTT_CMD_PUBCOMP: - case MQTT_CMD_SUBSCRIBE: - case MQTT_CMD_SUBACK: - case MQTT_CMD_UNSUBSCRIBE: - case MQTT_CMD_UNSUBACK: - if (p + 2 > end) return MQTT_MALFORMED; - m->id = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]); - p += 2; - break; - case MQTT_CMD_PUBLISH: { - if (p + 2 > end) return MQTT_MALFORMED; - m->topic.len = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]); - m->topic.ptr = (char *) p + 2; - p += 2 + m->topic.len; - if (p > end) return MQTT_MALFORMED; - if (m->qos > 0) { - if (p + 2 > end) return MQTT_MALFORMED; - m->id = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]); - p += 2; - } - if (p > end) return MQTT_MALFORMED; - if (version == 5 && p + 2 < end) { - len_len = - (uint32_t) decode_varint(p, (size_t) (end - p), &m->props_size); - if (!len_len) return MQTT_MALFORMED; - m->props_start = (size_t) (p + len_len - buf); - p += len_len + m->props_size; - } - if (p > end) return MQTT_MALFORMED; - m->data.ptr = (char *) p; - m->data.len = (size_t) (end - p); - break; - } - default: - break; - } - return MQTT_OK; -} - -static void mqtt_cb(struct mg_connection *c, int ev, void *ev_data) { - if (ev == MG_EV_READ) { - for (;;) { - uint8_t version = c->is_mqtt5 ? 5 : 4; - struct mg_mqtt_message mm; - int rc = mg_mqtt_parse(c->recv.buf, c->recv.len, version, &mm); - if (rc == MQTT_MALFORMED) { - MG_ERROR(("%lu MQTT malformed message", c->id)); - c->is_closing = 1; - break; - } else if (rc == MQTT_OK) { - MG_VERBOSE(("%lu MQTT CMD %d len %d [%.*s]", c->id, mm.cmd, - (int) mm.dgram.len, (int) mm.data.len, mm.data.ptr)); - switch (mm.cmd) { - case MQTT_CMD_CONNACK: - mg_call(c, MG_EV_MQTT_OPEN, &mm.ack); - if (mm.ack == 0) { - MG_DEBUG(("%lu Connected", c->id)); - } else { - MG_ERROR(("%lu MQTT auth failed, code %d", c->id, mm.ack)); - c->is_closing = 1; - } - break; - case MQTT_CMD_PUBLISH: { - /*MG_DEBUG(("%lu [%.*s] -> [%.*s]", c->id, (int) mm.topic.len, - mm.topic.ptr, (int) mm.data.len, mm.data.ptr));*/ - if (mm.qos > 0) { - uint16_t id = mg_ntohs(mm.id); - uint32_t remaining_len = sizeof(id); - if (c->is_mqtt5) remaining_len += 2; // 3.4.2 - - mg_mqtt_send_header( - c, - (uint8_t) (mm.qos == 2 ? MQTT_CMD_PUBREC : MQTT_CMD_PUBACK), - 0, remaining_len); - mg_send(c, &id, sizeof(id)); - - if (c->is_mqtt5) { - uint16_t zero = 0; - mg_send(c, &zero, sizeof(zero)); - } - } - mg_call(c, MG_EV_MQTT_MSG, &mm); // let the app handle qos stuff - break; - } - case MQTT_CMD_PUBREC: { // MQTT5: 3.5.2-1 TODO(): variable header rc - uint16_t id = mg_ntohs(mm.id); - uint32_t remaining_len = sizeof(id); // MQTT5 3.6.2-1 - mg_mqtt_send_header(c, MQTT_CMD_PUBREL, 2, remaining_len); - mg_send(c, &id, sizeof(id)); // MQTT5 3.6.1-1, flags = 2 - break; - } - case MQTT_CMD_PUBREL: { // MQTT5: 3.6.2-1 TODO(): variable header rc - uint16_t id = mg_ntohs(mm.id); - uint32_t remaining_len = sizeof(id); // MQTT5 3.7.2-1 - mg_mqtt_send_header(c, MQTT_CMD_PUBCOMP, 0, remaining_len); - mg_send(c, &id, sizeof(id)); - break; - } - } - mg_call(c, MG_EV_MQTT_CMD, &mm); - mg_iobuf_del(&c->recv, 0, mm.dgram.len); - } else { - break; - } - } - } - (void) ev_data; -} - -void mg_mqtt_ping(struct mg_connection *nc) { - mg_mqtt_send_header(nc, MQTT_CMD_PINGREQ, 0, 0); -} - -void mg_mqtt_pong(struct mg_connection *nc) { - mg_mqtt_send_header(nc, MQTT_CMD_PINGRESP, 0, 0); -} - -void mg_mqtt_disconnect(struct mg_connection *c, - const struct mg_mqtt_opts *opts) { - size_t len = 0; - if (c->is_mqtt5) len = 1 + get_props_size(opts->props, opts->num_props); - mg_mqtt_send_header(c, MQTT_CMD_DISCONNECT, 0, (uint32_t) len); - - if (c->is_mqtt5) { - uint8_t zero = 0; - mg_send(c, &zero, sizeof(zero)); // reason code - mg_send_mqtt_properties(c, opts->props, opts->num_props); - } -} - -struct mg_connection *mg_mqtt_connect(struct mg_mgr *mgr, const char *url, - const struct mg_mqtt_opts *opts, - mg_event_handler_t fn, void *fn_data) { - struct mg_connection *c = mg_connect(mgr, url, fn, fn_data); - if (c != NULL) { - struct mg_mqtt_opts empty; - memset(&empty, 0, sizeof(empty)); - mg_mqtt_login(c, opts == NULL ? &empty : opts); - c->pfn = mqtt_cb; - } - return c; -} - -struct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url, - mg_event_handler_t fn, void *fn_data) { - struct mg_connection *c = mg_listen(mgr, url, fn, fn_data); - if (c != NULL) c->pfn = mqtt_cb, c->pfn_data = mgr; - return c; -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/net.c" -#endif - - - - - - - - - -size_t mg_vprintf(struct mg_connection *c, const char *fmt, va_list *ap) { - size_t old = c->send.len; - mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap); - return c->send.len - old; -} - -size_t mg_printf(struct mg_connection *c, const char *fmt, ...) { - size_t len = 0; - va_list ap; - va_start(ap, fmt); - len = mg_vprintf(c, fmt, &ap); - va_end(ap); - return len; -} - -static bool mg_atonl(struct mg_str str, struct mg_addr *addr) { - uint32_t localhost = mg_htonl(0x7f000001); - if (mg_vcasecmp(&str, "localhost") != 0) return false; - memcpy(addr->ip, &localhost, sizeof(uint32_t)); - addr->is_ip6 = false; - return true; -} - -static bool mg_atone(struct mg_str str, struct mg_addr *addr) { - if (str.len > 0) return false; - memset(addr->ip, 0, sizeof(addr->ip)); - addr->is_ip6 = false; - return true; -} - -static bool mg_aton4(struct mg_str str, struct mg_addr *addr) { - uint8_t data[4] = {0, 0, 0, 0}; - size_t i, num_dots = 0; - for (i = 0; i < str.len; i++) { - if (str.ptr[i] >= '0' && str.ptr[i] <= '9') { - int octet = data[num_dots] * 10 + (str.ptr[i] - '0'); - if (octet > 255) return false; - data[num_dots] = (uint8_t) octet; - } else if (str.ptr[i] == '.') { - if (num_dots >= 3 || i == 0 || str.ptr[i - 1] == '.') return false; - num_dots++; - } else { - return false; - } - } - if (num_dots != 3 || str.ptr[i - 1] == '.') return false; - memcpy(&addr->ip, data, sizeof(data)); - addr->is_ip6 = false; - return true; -} - -static bool mg_v4mapped(struct mg_str str, struct mg_addr *addr) { - int i; - uint32_t ipv4; - if (str.len < 14) return false; - if (str.ptr[0] != ':' || str.ptr[1] != ':' || str.ptr[6] != ':') return false; - for (i = 2; i < 6; i++) { - if (str.ptr[i] != 'f' && str.ptr[i] != 'F') return false; - } - // struct mg_str s = mg_str_n(&str.ptr[7], str.len - 7); - if (!mg_aton4(mg_str_n(&str.ptr[7], str.len - 7), addr)) return false; - memcpy(&ipv4, addr->ip, sizeof(ipv4)); - memset(addr->ip, 0, sizeof(addr->ip)); - addr->ip[10] = addr->ip[11] = 255; - memcpy(&addr->ip[12], &ipv4, 4); - addr->is_ip6 = true; - return true; -} - -static bool mg_aton6(struct mg_str str, struct mg_addr *addr) { - size_t i, j = 0, n = 0, dc = 42; - addr->scope_id = 0; - if (str.len > 2 && str.ptr[0] == '[') str.ptr++, str.len -= 2; - if (mg_v4mapped(str, addr)) return true; - for (i = 0; i < str.len; i++) { - if ((str.ptr[i] >= '0' && str.ptr[i] <= '9') || - (str.ptr[i] >= 'a' && str.ptr[i] <= 'f') || - (str.ptr[i] >= 'A' && str.ptr[i] <= 'F')) { - unsigned long val; - if (i > j + 3) return false; - // MG_DEBUG(("%lu %lu [%.*s]", i, j, (int) (i - j + 1), &str.ptr[j])); - val = mg_unhexn(&str.ptr[j], i - j + 1); - addr->ip[n] = (uint8_t) ((val >> 8) & 255); - addr->ip[n + 1] = (uint8_t) (val & 255); - } else if (str.ptr[i] == ':') { - j = i + 1; - if (i > 0 && str.ptr[i - 1] == ':') { - dc = n; // Double colon - if (i > 1 && str.ptr[i - 2] == ':') return false; - } else if (i > 0) { - n += 2; - } - if (n > 14) return false; - addr->ip[n] = addr->ip[n + 1] = 0; // For trailing :: - } else if (str.ptr[i] == '%') { // Scope ID - for (i = i + 1; i < str.len; i++) { - if (str.ptr[i] < '0' || str.ptr[i] > '9') return false; - addr->scope_id = (uint8_t) (addr->scope_id * 10); - addr->scope_id = (uint8_t) (addr->scope_id + (str.ptr[i] - '0')); - } - } else { - return false; - } - } - if (n < 14 && dc == 42) return false; - if (n < 14) { - memmove(&addr->ip[dc + (14 - n)], &addr->ip[dc], n - dc + 2); - memset(&addr->ip[dc], 0, 14 - n); - } - - addr->is_ip6 = true; - return true; -} - -bool mg_aton(struct mg_str str, struct mg_addr *addr) { - // MG_INFO(("[%.*s]", (int) str.len, str.ptr)); - return mg_atone(str, addr) || mg_atonl(str, addr) || mg_aton4(str, addr) || - mg_aton6(str, addr); -} - -struct mg_connection *mg_alloc_conn(struct mg_mgr *mgr) { - struct mg_connection *c = - (struct mg_connection *) calloc(1, sizeof(*c) + mgr->extraconnsize); - if (c != NULL) { - c->mgr = mgr; - c->send.align = c->recv.align = c->rtls.align = MG_IO_SIZE; - c->id = ++mgr->nextid; - MG_PROF_INIT(c); - } - return c; -} - -void mg_close_conn(struct mg_connection *c) { - mg_resolve_cancel(c); // Close any pending DNS query - LIST_DELETE(struct mg_connection, &c->mgr->conns, c); - if (c == c->mgr->dns4.c) c->mgr->dns4.c = NULL; - if (c == c->mgr->dns6.c) c->mgr->dns6.c = NULL; - // Order of operations is important. `MG_EV_CLOSE` event must be fired - // before we deallocate received data, see #1331 - mg_call(c, MG_EV_CLOSE, NULL); - MG_DEBUG(("%lu %ld closed", c->id, c->fd)); - MG_PROF_DUMP(c); - MG_PROF_FREE(c); - - mg_tls_free(c); - mg_iobuf_free(&c->recv); - mg_iobuf_free(&c->send); - mg_iobuf_free(&c->rtls); - mg_bzero((unsigned char *) c, sizeof(*c)); - free(c); -} - -struct mg_connection *mg_connect(struct mg_mgr *mgr, const char *url, - mg_event_handler_t fn, void *fn_data) { - struct mg_connection *c = NULL; - if (url == NULL || url[0] == '\0') { - MG_ERROR(("null url")); - } else if ((c = mg_alloc_conn(mgr)) == NULL) { - MG_ERROR(("OOM")); - } else { - LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c); - c->is_udp = (strncmp(url, "udp:", 4) == 0); - c->fd = (void *) (size_t) MG_INVALID_SOCKET; - c->fn = fn; - c->is_client = true; - c->fn_data = fn_data; - MG_DEBUG(("%lu %ld %s", c->id, c->fd, url)); - mg_call(c, MG_EV_OPEN, (void *) url); - mg_resolve(c, url); - } - return c; -} - -struct mg_connection *mg_listen(struct mg_mgr *mgr, const char *url, - mg_event_handler_t fn, void *fn_data) { - struct mg_connection *c = NULL; - if ((c = mg_alloc_conn(mgr)) == NULL) { - MG_ERROR(("OOM %s", url)); - } else if (!mg_open_listener(c, url)) { - MG_ERROR(("Failed: %s, errno %d", url, errno)); - MG_PROF_FREE(c); - free(c); - c = NULL; - } else { - c->is_listening = 1; - c->is_udp = strncmp(url, "udp:", 4) == 0; - LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c); - c->fn = fn; - c->fn_data = fn_data; - mg_call(c, MG_EV_OPEN, NULL); - if (mg_url_is_ssl(url)) c->is_tls = 1; // Accepted connection must - MG_DEBUG(("%lu %ld %s", c->id, c->fd, url)); - } - return c; -} - -struct mg_connection *mg_wrapfd(struct mg_mgr *mgr, int fd, - mg_event_handler_t fn, void *fn_data) { - struct mg_connection *c = mg_alloc_conn(mgr); - if (c != NULL) { - c->fd = (void *) (size_t) fd; - c->fn = fn; - c->fn_data = fn_data; - MG_EPOLL_ADD(c); - mg_call(c, MG_EV_OPEN, NULL); - LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c); - } - return c; -} - -struct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds, - unsigned flags, void (*fn)(void *), void *arg) { - struct mg_timer *t = (struct mg_timer *) calloc(1, sizeof(*t)); - if (t != NULL) { - mg_timer_init(&mgr->timers, t, milliseconds, flags, fn, arg); - t->id = mgr->timerid++; - } - return t; -} - -long mg_io_recv(struct mg_connection *c, void *buf, size_t len) { - if (c->rtls.len == 0) return MG_IO_WAIT; - if (len > c->rtls.len) len = c->rtls.len; - memcpy(buf, c->rtls.buf, len); - mg_iobuf_del(&c->rtls, 0, len); - return (long) len; -} - -void mg_mgr_free(struct mg_mgr *mgr) { - struct mg_connection *c; - struct mg_timer *tmp, *t = mgr->timers; - while (t != NULL) tmp = t->next, free(t), t = tmp; - mgr->timers = NULL; // Important. Next call to poll won't touch timers - for (c = mgr->conns; c != NULL; c = c->next) c->is_closing = 1; - mg_mgr_poll(mgr, 0); -#if MG_ENABLE_FREERTOS_TCP - FreeRTOS_DeleteSocketSet(mgr->ss); -#endif - MG_DEBUG(("All connections closed")); -#if MG_ENABLE_EPOLL - if (mgr->epoll_fd >= 0) close(mgr->epoll_fd), mgr->epoll_fd = -1; -#endif - mg_tls_ctx_free(mgr); -} - -void mg_mgr_init(struct mg_mgr *mgr) { - memset(mgr, 0, sizeof(*mgr)); -#if MG_ENABLE_EPOLL - if ((mgr->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0) - MG_ERROR(("epoll_create1 errno %d", errno)); -#else - mgr->epoll_fd = -1; -#endif -#if MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK - // clang-format off - { WSADATA data; WSAStartup(MAKEWORD(2, 2), &data); } - // clang-format on -#elif MG_ENABLE_FREERTOS_TCP - mgr->ss = FreeRTOS_CreateSocketSet(); -#elif defined(__unix) || defined(__unix__) || defined(__APPLE__) - // Ignore SIGPIPE signal, so if client cancels the request, it - // won't kill the whole process. - signal(SIGPIPE, SIG_IGN); -#endif - mgr->pipe = MG_INVALID_SOCKET; - mgr->dnstimeout = 3000; - mgr->dns4.url = "udp://8.8.8.8:53"; - mgr->dns6.url = "udp://[2001:4860:4860::8888]:53"; - mg_tls_ctx_init(mgr); -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/net_builtin.c" -#endif - - -#if defined(MG_ENABLE_TCPIP) && MG_ENABLE_TCPIP -#define MG_EPHEMERAL_PORT_BASE 32768 -#define PDIFF(a, b) ((size_t) (((char *) (b)) - ((char *) (a)))) - -#ifndef MIP_TCP_KEEPALIVE_MS -#define MIP_TCP_KEEPALIVE_MS 45000 // TCP keep-alive period, ms -#endif - -#define MIP_TCP_ACK_MS 150 // Timeout for ACKing -#define MIP_TCP_ARP_MS 100 // Timeout for ARP response -#define MIP_TCP_SYN_MS 15000 // Timeout for connection establishment -#define MIP_TCP_FIN_MS 1000 // Timeout for closing connection - -struct connstate { - uint32_t seq, ack; // TCP seq/ack counters - uint64_t timer; // TCP keep-alive / ACK timer - uint8_t mac[6]; // Peer MAC address - uint8_t ttype; // Timer type. 0: ack, 1: keep-alive -#define MIP_TTYPE_KEEPALIVE 0 // Connection is idle for long, send keepalive -#define MIP_TTYPE_ACK 1 // Peer sent us data, we have to ack it soon -#define MIP_TTYPE_ARP 2 // ARP resolve sent, waiting for response -#define MIP_TTYPE_SYN 3 // SYN sent, waiting for response -#define MIP_TTYPE_FIN 4 // FIN sent, waiting until terminating the connection - uint8_t tmiss; // Number of keep-alive misses - struct mg_iobuf raw; // For TLS only. Incoming raw data -}; - -#pragma pack(push, 1) - -struct lcp { - uint8_t addr, ctrl, proto[2], code, id, len[2]; -}; - -struct eth { - uint8_t dst[6]; // Destination MAC address - uint8_t src[6]; // Source MAC address - uint16_t type; // Ethernet type -}; - -struct ip { - uint8_t ver; // Version - uint8_t tos; // Unused - uint16_t len; // Length - uint16_t id; // Unused - uint16_t frag; // Fragmentation -#define IP_FRAG_OFFSET_MSK 0xFF1F -#define IP_MORE_FRAGS_MSK 0x20 - uint8_t ttl; // Time to live - uint8_t proto; // Upper level protocol - uint16_t csum; // Checksum - uint32_t src; // Source IP - uint32_t dst; // Destination IP -}; - -struct ip6 { - uint8_t ver; // Version - uint8_t opts[3]; // Options - uint16_t len; // Length - uint8_t proto; // Upper level protocol - uint8_t ttl; // Time to live - uint8_t src[16]; // Source IP - uint8_t dst[16]; // Destination IP -}; - -struct icmp { - uint8_t type; - uint8_t code; - uint16_t csum; -}; - -struct arp { - uint16_t fmt; // Format of hardware address - uint16_t pro; // Format of protocol address - uint8_t hlen; // Length of hardware address - uint8_t plen; // Length of protocol address - uint16_t op; // Operation - uint8_t sha[6]; // Sender hardware address - uint32_t spa; // Sender protocol address - uint8_t tha[6]; // Target hardware address - uint32_t tpa; // Target protocol address -}; - -struct tcp { - uint16_t sport; // Source port - uint16_t dport; // Destination port - uint32_t seq; // Sequence number - uint32_t ack; // Acknowledgement number - uint8_t off; // Data offset - uint8_t flags; // TCP flags -#define TH_FIN 0x01 -#define TH_SYN 0x02 -#define TH_RST 0x04 -#define TH_PUSH 0x08 -#define TH_ACK 0x10 -#define TH_URG 0x20 -#define TH_ECE 0x40 -#define TH_CWR 0x80 - uint16_t win; // Window - uint16_t csum; // Checksum - uint16_t urp; // Urgent pointer -}; - -struct udp { - uint16_t sport; // Source port - uint16_t dport; // Destination port - uint16_t len; // UDP length - uint16_t csum; // UDP checksum -}; - -struct dhcp { - uint8_t op, htype, hlen, hops; - uint32_t xid; - uint16_t secs, flags; - uint32_t ciaddr, yiaddr, siaddr, giaddr; - uint8_t hwaddr[208]; - uint32_t magic; - uint8_t options[32]; -}; - -#pragma pack(pop) - -struct pkt { - struct mg_str raw; // Raw packet data - struct mg_str pay; // Payload data - struct eth *eth; - struct llc *llc; - struct arp *arp; - struct ip *ip; - struct ip6 *ip6; - struct icmp *icmp; - struct tcp *tcp; - struct udp *udp; - struct dhcp *dhcp; -}; - -static void send_syn(struct mg_connection *c); - -static void mkpay(struct pkt *pkt, void *p) { - pkt->pay = - mg_str_n((char *) p, (size_t) (&pkt->raw.ptr[pkt->raw.len] - (char *) p)); -} - -static uint32_t csumup(uint32_t sum, const void *buf, size_t len) { - const uint8_t *p = (const uint8_t *) buf; - for (size_t i = 0; i < len; i++) sum += i & 1 ? p[i] : (uint32_t) (p[i] << 8); - return sum; -} - -static uint16_t csumfin(uint32_t sum) { - while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16); - return mg_htons(~sum & 0xffff); -} - -static uint16_t ipcsum(const void *buf, size_t len) { - uint32_t sum = csumup(0, buf, len); - return csumfin(sum); -} - -static void settmout(struct mg_connection *c, uint8_t type) { - struct mg_tcpip_if *ifp = (struct mg_tcpip_if *) c->mgr->priv; - struct connstate *s = (struct connstate *) (c + 1); - unsigned n = type == MIP_TTYPE_ACK ? MIP_TCP_ACK_MS - : type == MIP_TTYPE_ARP ? MIP_TCP_ARP_MS - : type == MIP_TTYPE_SYN ? MIP_TCP_SYN_MS - : type == MIP_TTYPE_FIN ? MIP_TCP_FIN_MS - : MIP_TCP_KEEPALIVE_MS; - s->timer = ifp->now + n; - s->ttype = type; - MG_VERBOSE(("%lu %d -> %llx", c->id, type, s->timer)); -} - -static size_t ether_output(struct mg_tcpip_if *ifp, size_t len) { - size_t n = ifp->driver->tx(ifp->tx.ptr, len, ifp); - if (n == len) ifp->nsent++; - return n; -} - -static void arp_ask(struct mg_tcpip_if *ifp, uint32_t ip) { - struct eth *eth = (struct eth *) ifp->tx.ptr; - struct arp *arp = (struct arp *) (eth + 1); - memset(eth->dst, 255, sizeof(eth->dst)); - memcpy(eth->src, ifp->mac, sizeof(eth->src)); - eth->type = mg_htons(0x806); - memset(arp, 0, sizeof(*arp)); - arp->fmt = mg_htons(1), arp->pro = mg_htons(0x800), arp->hlen = 6, - arp->plen = 4; - arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip; - memcpy(arp->sha, ifp->mac, sizeof(arp->sha)); - ether_output(ifp, PDIFF(eth, arp + 1)); -} - -static void onstatechange(struct mg_tcpip_if *ifp) { - if (ifp->state == MG_TCPIP_STATE_READY) { - MG_INFO(("READY, IP: %M", mg_print_ip4, &ifp->ip)); - MG_INFO((" GW: %M", mg_print_ip4, &ifp->gw)); - MG_INFO((" MAC: %M", mg_print_mac, &ifp->mac)); - arp_ask(ifp, ifp->gw); - } else if (ifp->state == MG_TCPIP_STATE_UP) { - MG_ERROR(("Link up")); - srand((unsigned int) mg_millis()); - } else if (ifp->state == MG_TCPIP_STATE_DOWN) { - MG_ERROR(("Link down")); - } -} - -static struct ip *tx_ip(struct mg_tcpip_if *ifp, uint8_t *mac_dst, - uint8_t proto, uint32_t ip_src, uint32_t ip_dst, - size_t plen) { - struct eth *eth = (struct eth *) ifp->tx.ptr; - struct ip *ip = (struct ip *) (eth + 1); - memcpy(eth->dst, mac_dst, sizeof(eth->dst)); - memcpy(eth->src, ifp->mac, sizeof(eth->src)); // Use our MAC - eth->type = mg_htons(0x800); - memset(ip, 0, sizeof(*ip)); - ip->ver = 0x45; // Version 4, header length 5 words - ip->frag = 0x40; // Don't fragment - ip->len = mg_htons((uint16_t) (sizeof(*ip) + plen)); - ip->ttl = 64; - ip->proto = proto; - ip->src = ip_src; - ip->dst = ip_dst; - ip->csum = ipcsum(ip, sizeof(*ip)); - return ip; -} - -static void tx_udp(struct mg_tcpip_if *ifp, uint8_t *mac_dst, uint32_t ip_src, - uint16_t sport, uint32_t ip_dst, uint16_t dport, - const void *buf, size_t len) { - struct ip *ip = - tx_ip(ifp, mac_dst, 17, ip_src, ip_dst, len + sizeof(struct udp)); - struct udp *udp = (struct udp *) (ip + 1); - // MG_DEBUG(("UDP XX LEN %d %d", (int) len, (int) ifp->tx.len)); - udp->sport = sport; - udp->dport = dport; - udp->len = mg_htons((uint16_t) (sizeof(*udp) + len)); - udp->csum = 0; - uint32_t cs = csumup(0, udp, sizeof(*udp)); - cs = csumup(cs, buf, len); - cs = csumup(cs, &ip->src, sizeof(ip->src)); - cs = csumup(cs, &ip->dst, sizeof(ip->dst)); - cs += (uint32_t) (ip->proto + sizeof(*udp) + len); - udp->csum = csumfin(cs); - memmove(udp + 1, buf, len); - // MG_DEBUG(("UDP LEN %d %d", (int) len, (int) ifp->frame_len)); - ether_output(ifp, sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len); -} - -static void tx_dhcp(struct mg_tcpip_if *ifp, uint8_t *mac_dst, uint32_t ip_src, - uint32_t ip_dst, uint8_t *opts, size_t optslen, - bool ciaddr) { - // https://datatracker.ietf.org/doc/html/rfc2132#section-9.6 - struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}}; - dhcp.magic = mg_htonl(0x63825363); - memcpy(&dhcp.hwaddr, ifp->mac, sizeof(ifp->mac)); - memcpy(&dhcp.xid, ifp->mac + 2, sizeof(dhcp.xid)); - memcpy(&dhcp.options, opts, optslen); - if (ciaddr) dhcp.ciaddr = ip_src; - tx_udp(ifp, mac_dst, ip_src, mg_htons(68), ip_dst, mg_htons(67), &dhcp, - sizeof(dhcp)); -} - -static const uint8_t broadcast[] = {255, 255, 255, 255, 255, 255}; - -// RFC-2131 #4.3.6, #4.4.1 -static void tx_dhcp_request_sel(struct mg_tcpip_if *ifp, uint32_t ip_req, - uint32_t ip_srv) { - uint8_t opts[] = { - 53, 1, 3, // Type: DHCP request - 55, 2, 1, 3, // GW and mask - 12, 3, 'm', 'i', 'p', // Host name: "mip" - 54, 4, 0, 0, 0, 0, // DHCP server ID - 50, 4, 0, 0, 0, 0, // Requested IP - 255 // End of options - }; - memcpy(opts + 14, &ip_srv, sizeof(ip_srv)); - memcpy(opts + 20, &ip_req, sizeof(ip_req)); - tx_dhcp(ifp, (uint8_t *) broadcast, 0, 0xffffffff, opts, sizeof(opts), false); - MG_DEBUG(("DHCP req sent")); -} - -// RFC-2131 #4.3.6, #4.4.5 (renewing: unicast, rebinding: bcast) -static void tx_dhcp_request_re(struct mg_tcpip_if *ifp, uint8_t *mac_dst, - uint32_t ip_src, uint32_t ip_dst) { - uint8_t opts[] = { - 53, 1, 3, // Type: DHCP request - 255 // End of options - }; - tx_dhcp(ifp, mac_dst, ip_src, ip_dst, opts, sizeof(opts), true); - MG_DEBUG(("DHCP req sent")); -} - -static void tx_dhcp_discover(struct mg_tcpip_if *ifp) { - uint8_t opts[] = { - 53, 1, 1, // Type: DHCP discover - 55, 2, 1, 3, // Parameters: ip, mask - 255 // End of options - }; - tx_dhcp(ifp, (uint8_t *) broadcast, 0, 0xffffffff, opts, sizeof(opts), false); - MG_DEBUG(("DHCP discover sent. Our MAC: %M", mg_print_mac, ifp->mac)); -} - -static struct mg_connection *getpeer(struct mg_mgr *mgr, struct pkt *pkt, - bool lsn) { - struct mg_connection *c = NULL; - for (c = mgr->conns; c != NULL; c = c->next) { - if (c->is_arplooking && pkt->arp && - memcmp(&pkt->arp->spa, c->rem.ip, sizeof(pkt->arp->spa)) == 0) - break; - if (c->is_udp && pkt->udp && c->loc.port == pkt->udp->dport) break; - if (!c->is_udp && pkt->tcp && c->loc.port == pkt->tcp->dport && - lsn == c->is_listening && (lsn || c->rem.port == pkt->tcp->sport)) - break; - } - return c; -} - -static void rx_arp(struct mg_tcpip_if *ifp, struct pkt *pkt) { - if (pkt->arp->op == mg_htons(1) && pkt->arp->tpa == ifp->ip) { - // ARP request. Make a response, then send - // MG_DEBUG(("ARP op %d %M: %M", mg_ntohs(pkt->arp->op), mg_print_ip4, - // &pkt->arp->spa, mg_print_ip4, &pkt->arp->tpa)); - struct eth *eth = (struct eth *) ifp->tx.ptr; - struct arp *arp = (struct arp *) (eth + 1); - memcpy(eth->dst, pkt->eth->src, sizeof(eth->dst)); - memcpy(eth->src, ifp->mac, sizeof(eth->src)); - eth->type = mg_htons(0x806); - *arp = *pkt->arp; - arp->op = mg_htons(2); - memcpy(arp->tha, pkt->arp->sha, sizeof(pkt->arp->tha)); - memcpy(arp->sha, ifp->mac, sizeof(pkt->arp->sha)); - arp->tpa = pkt->arp->spa; - arp->spa = ifp->ip; - MG_DEBUG(("ARP: tell %M we're %M", mg_print_ip4, &arp->tpa, mg_print_mac, - &ifp->mac)); - ether_output(ifp, PDIFF(eth, arp + 1)); - } else if (pkt->arp->op == mg_htons(2)) { - if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return; - if (pkt->arp->spa == ifp->gw) { - // Got response for the GW ARP request. Set ifp->gwmac - memcpy(ifp->gwmac, pkt->arp->sha, sizeof(ifp->gwmac)); - } else { - struct mg_connection *c = getpeer(ifp->mgr, pkt, false); - if (c != NULL && c->is_arplooking) { - struct connstate *s = (struct connstate *) (c + 1); - memcpy(s->mac, pkt->arp->sha, sizeof(s->mac)); - MG_DEBUG(("%lu ARP resolved %M -> %M", c->id, mg_print_ip4, c->rem.ip, - mg_print_mac, s->mac)); - c->is_arplooking = 0; - send_syn(c); - settmout(c, MIP_TTYPE_SYN); - } - } - } -} - -static void rx_icmp(struct mg_tcpip_if *ifp, struct pkt *pkt) { - // MG_DEBUG(("ICMP %d", (int) len)); - if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) { - size_t hlen = sizeof(struct eth) + sizeof(struct ip) + sizeof(struct icmp); - size_t space = ifp->tx.len - hlen, plen = pkt->pay.len; - if (plen > space) plen = space; - struct ip *ip = tx_ip(ifp, pkt->eth->src, 1, ifp->ip, pkt->ip->src, - sizeof(struct icmp) + plen); - struct icmp *icmp = (struct icmp *) (ip + 1); - memset(icmp, 0, sizeof(*icmp)); // Set csum to 0 - memcpy(icmp + 1, pkt->pay.ptr, plen); // Copy RX payload to TX - icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen); - ether_output(ifp, hlen + plen); - } -} - -static void rx_dhcp_client(struct mg_tcpip_if *ifp, struct pkt *pkt) { - uint32_t ip = 0, gw = 0, mask = 0, lease = 0; - uint8_t msgtype = 0, state = ifp->state; - // perform size check first, then access fields - uint8_t *p = pkt->dhcp->options, - *end = (uint8_t *) &pkt->raw.ptr[pkt->raw.len]; - if (end < (uint8_t *) (pkt->dhcp + 1)) return; - if (memcmp(&pkt->dhcp->xid, ifp->mac + 2, sizeof(pkt->dhcp->xid))) return; - while (p + 1 < end && p[0] != 255) { // Parse options RFC-1533 #9 - if (p[0] == 1 && p[1] == sizeof(ifp->mask) && p + 6 < end) { // Mask - memcpy(&mask, p + 2, sizeof(mask)); - } else if (p[0] == 3 && p[1] == sizeof(ifp->gw) && p + 6 < end) { // GW - memcpy(&gw, p + 2, sizeof(gw)); - ip = pkt->dhcp->yiaddr; - } else if (p[0] == 51 && p[1] == 4 && p + 6 < end) { // Lease - memcpy(&lease, p + 2, sizeof(lease)); - lease = mg_ntohl(lease); - } else if (p[0] == 53 && p[1] == 1 && p + 6 < end) { // Msg Type - msgtype = p[2]; - } - p += p[1] + 2; - } - // Process message type, RFC-1533 (9.4); RFC-2131 (3.1, 4) - if (msgtype == 6 && ifp->ip == ip) { // DHCPNACK, release IP - ifp->state = MG_TCPIP_STATE_UP, ifp->ip = 0; - } else if (msgtype == 2 && ifp->state == MG_TCPIP_STATE_UP && ip && gw && - lease) { // DHCPOFFER - // select IP, (4.4.1) (fallback to IP source addr on foul play) - tx_dhcp_request_sel(ifp, ip, pkt->dhcp->siaddr ? pkt->dhcp->siaddr : pkt->ip->src); - ifp->state = MG_TCPIP_STATE_REQ; // REQUESTING state - } else if (msgtype == 5) { // DHCPACK - if (ifp->state == MG_TCPIP_STATE_REQ && ip && gw && lease) { // got an IP - ifp->lease_expire = ifp->now + lease * 1000; - MG_INFO(("Lease: %u sec (%lld)", lease, ifp->lease_expire / 1000)); - // assume DHCP server = router until ARP resolves - memcpy(ifp->gwmac, pkt->eth->src, sizeof(ifp->gwmac)); - ifp->ip = ip, ifp->gw = gw, ifp->mask = mask; - ifp->state = MG_TCPIP_STATE_READY; // BOUND state - uint64_t rand; - mg_random(&rand, sizeof(rand)); - srand((unsigned int) (rand + mg_millis())); - } else if (ifp->state == MG_TCPIP_STATE_READY && ifp->ip == ip) { // renew - ifp->lease_expire = ifp->now + lease * 1000; - MG_INFO(("Lease: %u sec (%lld)", lease, ifp->lease_expire / 1000)); - } // TODO(): accept provided T1/T2 and store server IP for renewal (4.4) - } - if (ifp->state != state) onstatechange(ifp); -} - -// Simple DHCP server that assigns a next IP address: ifp->ip + 1 -static void rx_dhcp_server(struct mg_tcpip_if *ifp, struct pkt *pkt) { - uint8_t op = 0, *p = pkt->dhcp->options, - *end = (uint8_t *) &pkt->raw.ptr[pkt->raw.len]; - if (end < (uint8_t *) (pkt->dhcp + 1)) return; - // struct dhcp *req = pkt->dhcp; - struct dhcp res = {2, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}}; - res.yiaddr = ifp->ip; - ((uint8_t *) (&res.yiaddr))[3]++; // Offer our IP + 1 - while (p + 1 < end && p[0] != 255) { // Parse options - if (p[0] == 53 && p[1] == 1 && p + 2 < end) { // Message type - op = p[2]; - } - p += p[1] + 2; - } - if (op == 1 || op == 3) { // DHCP Discover or DHCP Request - uint8_t msg = op == 1 ? 2 : 5; // Message type: DHCP OFFER or DHCP ACK - uint8_t opts[] = { - 53, 1, msg, // Message type - 1, 4, 0, 0, 0, 0, // Subnet mask - 54, 4, 0, 0, 0, 0, // Server ID - 12, 3, 'm', 'i', 'p', // Host name: "mip" - 51, 4, 255, 255, 255, 255, // Lease time - 255 // End of options - }; - memcpy(&res.hwaddr, pkt->dhcp->hwaddr, 6); - memcpy(opts + 5, &ifp->mask, sizeof(ifp->mask)); - memcpy(opts + 11, &ifp->ip, sizeof(ifp->ip)); - memcpy(&res.options, opts, sizeof(opts)); - res.magic = pkt->dhcp->magic; - res.xid = pkt->dhcp->xid; - if (ifp->enable_get_gateway) { - ifp->gw = res.yiaddr; - memcpy(ifp->gwmac, pkt->eth->src, sizeof(ifp->gwmac)); - } - tx_udp(ifp, pkt->eth->src, ifp->ip, mg_htons(67), - op == 1 ? ~0U : res.yiaddr, mg_htons(68), &res, sizeof(res)); - } -} - -static void rx_udp(struct mg_tcpip_if *ifp, struct pkt *pkt) { - struct mg_connection *c = getpeer(ifp->mgr, pkt, true); - if (c == NULL) { - // No UDP listener on this port. Should send ICMP, but keep silent. - } else { - c->rem.port = pkt->udp->sport; - memcpy(c->rem.ip, &pkt->ip->src, sizeof(uint32_t)); - struct connstate *s = (struct connstate *) (c + 1); - memcpy(s->mac, pkt->eth->src, sizeof(s->mac)); - if (c->recv.len >= MG_MAX_RECV_SIZE) { - mg_error(c, "max_recv_buf_size reached"); - } else if (c->recv.size - c->recv.len < pkt->pay.len && - !mg_iobuf_resize(&c->recv, c->recv.len + pkt->pay.len)) { - mg_error(c, "oom"); - } else { - memcpy(&c->recv.buf[c->recv.len], pkt->pay.ptr, pkt->pay.len); - c->recv.len += pkt->pay.len; - mg_call(c, MG_EV_READ, &pkt->pay.len); - } - } -} - -static size_t tx_tcp(struct mg_tcpip_if *ifp, uint8_t *dst_mac, uint32_t dst_ip, - uint8_t flags, uint16_t sport, uint16_t dport, - uint32_t seq, uint32_t ack, const void *buf, size_t len) { - struct ip *ip = - tx_ip(ifp, dst_mac, 6, ifp->ip, dst_ip, sizeof(struct tcp) + len); - struct tcp *tcp = (struct tcp *) (ip + 1); - memset(tcp, 0, sizeof(*tcp)); - if (buf != NULL && len) memmove(tcp + 1, buf, len); - tcp->sport = sport; - tcp->dport = dport; - tcp->seq = seq; - tcp->ack = ack; - tcp->flags = flags; - tcp->win = mg_htons(8192); - tcp->off = (uint8_t) (sizeof(*tcp) / 4 << 4); - uint32_t cs = 0; - uint16_t n = (uint16_t) (sizeof(*tcp) + len); - uint8_t pseudo[] = {0, ip->proto, (uint8_t) (n >> 8), (uint8_t) (n & 255)}; - cs = csumup(cs, tcp, n); - cs = csumup(cs, &ip->src, sizeof(ip->src)); - cs = csumup(cs, &ip->dst, sizeof(ip->dst)); - cs = csumup(cs, pseudo, sizeof(pseudo)); - tcp->csum = csumfin(cs); - MG_VERBOSE(("TCP %M:%hu -> %M:%hu fl %x len %u", mg_print_ip4, &ip->src, - mg_ntohs(tcp->sport), mg_print_ip4, &ip->dst, - mg_ntohs(tcp->dport), tcp->flags, (int) len)); - // mg_hexdump(ifp->tx.ptr, PDIFF(ifp->tx.ptr, tcp + 1) + len); - return ether_output(ifp, PDIFF(ifp->tx.ptr, tcp + 1) + len); -} - -static size_t tx_tcp_pkt(struct mg_tcpip_if *ifp, struct pkt *pkt, - uint8_t flags, uint32_t seq, const void *buf, - size_t len) { - uint32_t delta = (pkt->tcp->flags & (TH_SYN | TH_FIN)) ? 1 : 0; - return tx_tcp(ifp, pkt->eth->src, pkt->ip->src, flags, pkt->tcp->dport, - pkt->tcp->sport, seq, mg_htonl(mg_ntohl(pkt->tcp->seq) + delta), - buf, len); -} - -static struct mg_connection *accept_conn(struct mg_connection *lsn, - struct pkt *pkt) { - struct mg_connection *c = mg_alloc_conn(lsn->mgr); - if (c == NULL) { - MG_ERROR(("OOM")); - return NULL; - } - struct connstate *s = (struct connstate *) (c + 1); - s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq); - memcpy(s->mac, pkt->eth->src, sizeof(s->mac)); - settmout(c, MIP_TTYPE_KEEPALIVE); - memcpy(c->rem.ip, &pkt->ip->src, sizeof(uint32_t)); - c->rem.port = pkt->tcp->sport; - MG_DEBUG(("%lu accepted %M", c->id, mg_print_ip_port, &c->rem)); - LIST_ADD_HEAD(struct mg_connection, &lsn->mgr->conns, c); - c->is_accepted = 1; - c->is_hexdumping = lsn->is_hexdumping; - c->pfn = lsn->pfn; - c->loc = lsn->loc; - c->pfn_data = lsn->pfn_data; - c->fn = lsn->fn; - c->fn_data = lsn->fn_data; - mg_call(c, MG_EV_OPEN, NULL); - mg_call(c, MG_EV_ACCEPT, NULL); - return c; -} - -static size_t trim_len(struct mg_connection *c, size_t len) { - struct mg_tcpip_if *ifp = (struct mg_tcpip_if *) c->mgr->priv; - size_t eth_h_len = 14, ip_max_h_len = 24, tcp_max_h_len = 60, udp_h_len = 8; - size_t max_headers_len = - eth_h_len + ip_max_h_len + (c->is_udp ? udp_h_len : tcp_max_h_len); - size_t min_mtu = c->is_udp ? 68 /* RFC-791 */ : max_headers_len - eth_h_len; - - // If the frame exceeds the available buffer, trim the length - if (len + max_headers_len > ifp->tx.len) { - len = ifp->tx.len - max_headers_len; - } - // Ensure the MTU isn't lower than the minimum allowed value - if (ifp->mtu < min_mtu) { - MG_ERROR(("MTU is lower than minimum, capping to %lu", min_mtu)); - ifp->mtu = (uint16_t) min_mtu; - } - // If the total packet size exceeds the MTU, trim the length - if (len + max_headers_len - eth_h_len > ifp->mtu) { - len = ifp->mtu - max_headers_len + eth_h_len; - if (c->is_udp) { - MG_ERROR(("UDP datagram exceeds MTU. Truncating it.")); - } - } - - return len; -} - -long mg_io_send(struct mg_connection *c, const void *buf, size_t len) { - struct mg_tcpip_if *ifp = (struct mg_tcpip_if *) c->mgr->priv; - struct connstate *s = (struct connstate *) (c + 1); - uint32_t dst_ip = *(uint32_t *) c->rem.ip; - len = trim_len(c, len); - if (c->is_udp) { - tx_udp(ifp, s->mac, ifp->ip, c->loc.port, dst_ip, c->rem.port, buf, len); - } else { - size_t sent = - tx_tcp(ifp, s->mac, dst_ip, TH_PUSH | TH_ACK, c->loc.port, c->rem.port, - mg_htonl(s->seq), mg_htonl(s->ack), buf, len); - if (sent == 0) { - return MG_IO_WAIT; - } else if (sent == (size_t) -1) { - return MG_IO_ERR; - } else { - s->seq += (uint32_t) len; - if (s->ttype == MIP_TTYPE_ACK) settmout(c, MIP_TTYPE_KEEPALIVE); - } - } - return (long) len; -} - -static void read_conn(struct mg_connection *c, struct pkt *pkt) { - struct connstate *s = (struct connstate *) (c + 1); - struct mg_iobuf *io = c->is_tls ? &c->rtls : &c->recv; - uint32_t seq = mg_ntohl(pkt->tcp->seq); - uint32_t rem_ip; - memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t)); - if (pkt->tcp->flags & TH_FIN) { - // If we initiated the closure, we reply with ACK upon receiving FIN - // If we didn't initiate it, we reply with FIN as part of the normal TCP - // closure process - uint8_t flags = TH_ACK; - s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len + 1); - if (c->is_draining && s->ttype == MIP_TTYPE_FIN) { - if (s->seq == mg_htonl(pkt->tcp->ack)) { // Simultaneous closure ? - s->seq++; // Yes. Increment our SEQ - } else { // Otherwise, - s->seq = mg_htonl(pkt->tcp->ack); // Set to peer's ACK - } - } else { - flags |= TH_FIN; - c->is_draining = 1; - settmout(c, MIP_TTYPE_FIN); - } - tx_tcp((struct mg_tcpip_if *) c->mgr->priv, s->mac, rem_ip, flags, - c->loc.port, c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0); - } else if (pkt->pay.len == 0) { - // TODO(cpq): handle this peer's ACK - } else if (seq != s->ack) { - uint32_t ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len); - if (s->ack == ack) { - MG_VERBOSE(("ignoring duplicate pkt")); - } else { - MG_VERBOSE(("SEQ != ACK: %x %x %x", seq, s->ack, ack)); - tx_tcp((struct mg_tcpip_if *) c->mgr->priv, s->mac, rem_ip, TH_ACK, - c->loc.port, c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", - 0); - } - } else if (io->size - io->len < pkt->pay.len && - !mg_iobuf_resize(io, io->len + pkt->pay.len)) { - mg_error(c, "oom"); - } else { - // Copy TCP payload into the IO buffer. If the connection is plain text, - // we copy to c->recv. If the connection is TLS, this data is encrypted, - // therefore we copy that encrypted data to the c->rtls iobuffer instead, - // and then call mg_tls_recv() to decrypt it. NOTE: mg_tls_recv() will - // call back mg_io_recv() which grabs raw data from c->rtls - memcpy(&io->buf[io->len], pkt->pay.ptr, pkt->pay.len); - io->len += pkt->pay.len; - - MG_VERBOSE(("%lu SEQ %x -> %x", c->id, mg_htonl(pkt->tcp->seq), s->ack)); - // Advance ACK counter - s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len); -#if 0 - // Send ACK immediately - uint32_t rem_ip; - memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t)); - MG_DEBUG((" imm ACK", c->id, mg_htonl(pkt->tcp->seq), s->ack)); - tx_tcp((struct mg_tcpip_if *) c->mgr->priv, s->mac, rem_ip, TH_ACK, c->loc.port, - c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0); -#else - // if not already running, setup a timer to send an ACK later - if (s->ttype != MIP_TTYPE_ACK) settmout(c, MIP_TTYPE_ACK); -#endif - - if (c->is_tls && c->is_tls_hs) { - mg_tls_handshake(c); - } else if (c->is_tls) { - // TLS connection. Make room for decrypted data in c->recv - io = &c->recv; - if (io->size - io->len < pkt->pay.len && - !mg_iobuf_resize(io, io->len + pkt->pay.len)) { - mg_error(c, "oom"); - } else { - // Decrypt data directly into c->recv - long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len); - if (n == MG_IO_ERR) { - mg_error(c, "TLS recv error"); - } else if (n > 0) { - // Decrypted successfully - trigger MG_EV_READ - io->len += (size_t) n; - mg_call(c, MG_EV_READ, &n); - } - } - } else { - // Plain text connection, data is already in c->recv, trigger - // MG_EV_READ - mg_call(c, MG_EV_READ, &pkt->pay.len); - } - } -} - -static void rx_tcp(struct mg_tcpip_if *ifp, struct pkt *pkt) { - struct mg_connection *c = getpeer(ifp->mgr, pkt, false); - struct connstate *s = c == NULL ? NULL : (struct connstate *) (c + 1); -#if 0 - MG_INFO(("%lu %hhu %d", c ? c->id : 0, pkt->tcp->flags, (int) pkt->pay.len)); -#endif - if (c != NULL && c->is_connecting && pkt->tcp->flags == (TH_SYN | TH_ACK)) { - s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq) + 1; - tx_tcp_pkt(ifp, pkt, TH_ACK, pkt->tcp->ack, NULL, 0); - c->is_connecting = 0; // Client connected - settmout(c, MIP_TTYPE_KEEPALIVE); - mg_call(c, MG_EV_CONNECT, NULL); // Let user know - } else if (c != NULL && c->is_connecting && pkt->tcp->flags != TH_ACK) { - // mg_hexdump(pkt->raw.ptr, pkt->raw.len); - tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0); - } else if (c != NULL && pkt->tcp->flags & TH_RST) { - mg_error(c, "peer RST"); // RFC-1122 4.2.2.13 - } else if (c != NULL) { -#if 0 - MG_DEBUG(("%lu %d %M:%hu -> %M:%hu", c->id, (int) pkt->raw.len, - mg_print_ip4, &pkt->ip->src, mg_ntohs(pkt->tcp->sport), - mg_print_ip4, &pkt->ip->dst, mg_ntohs(pkt->tcp->dport))); - mg_hexdump(pkt->pay.ptr, pkt->pay.len); -#endif - s->tmiss = 0; // Reset missed keep-alive counter - if (s->ttype == MIP_TTYPE_KEEPALIVE) // Advance keep-alive timer - settmout(c, - MIP_TTYPE_KEEPALIVE); // unless a former ACK timeout is pending - read_conn(c, pkt); // Override timer with ACK timeout if needed - } else if ((c = getpeer(ifp->mgr, pkt, true)) == NULL) { - tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0); - } else if (pkt->tcp->flags & TH_RST) { - if (c->is_accepted) mg_error(c, "peer RST"); // RFC-1122 4.2.2.13 - // ignore RST if not connected - } else if (pkt->tcp->flags & TH_SYN) { - // Use peer's source port as ISN, in order to recognise the handshake - uint32_t isn = mg_htonl((uint32_t) mg_ntohs(pkt->tcp->sport)); - tx_tcp_pkt(ifp, pkt, TH_SYN | TH_ACK, isn, NULL, 0); - } else if (pkt->tcp->flags & TH_FIN) { - tx_tcp_pkt(ifp, pkt, TH_FIN | TH_ACK, pkt->tcp->ack, NULL, 0); - } else if (mg_htonl(pkt->tcp->ack) == mg_htons(pkt->tcp->sport) + 1U) { - accept_conn(c, pkt); - } else if (!c->is_accepted) { // no peer - tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0); - } else { - // MG_VERBOSE(("dropped silently..")); - } -} - -static void rx_ip(struct mg_tcpip_if *ifp, struct pkt *pkt) { - if (pkt->ip->frag & IP_MORE_FRAGS_MSK || pkt->ip->frag & IP_FRAG_OFFSET_MSK) { - if (pkt->ip->proto == 17) pkt->udp = (struct udp *) (pkt->ip + 1); - if (pkt->ip->proto == 6) pkt->tcp = (struct tcp *) (pkt->ip + 1); - struct mg_connection *c = getpeer(ifp->mgr, pkt, false); - if (c) mg_error(c, "Received fragmented packet"); - } else if (pkt->ip->proto == 1) { - pkt->icmp = (struct icmp *) (pkt->ip + 1); - if (pkt->pay.len < sizeof(*pkt->icmp)) return; - mkpay(pkt, pkt->icmp + 1); - rx_icmp(ifp, pkt); - } else if (pkt->ip->proto == 17) { - pkt->udp = (struct udp *) (pkt->ip + 1); - if (pkt->pay.len < sizeof(*pkt->udp)) return; - mkpay(pkt, pkt->udp + 1); - MG_VERBOSE(("UDP %M:%hu -> %M:%hu len %u", mg_print_ip4, &pkt->ip->src, - mg_ntohs(pkt->udp->sport), mg_print_ip4, &pkt->ip->dst, - mg_ntohs(pkt->udp->dport), (int) pkt->pay.len)); - if (ifp->enable_dhcp_client && pkt->udp->dport == mg_htons(68)) { - pkt->dhcp = (struct dhcp *) (pkt->udp + 1); - mkpay(pkt, pkt->dhcp + 1); - rx_dhcp_client(ifp, pkt); - } else if (ifp->enable_dhcp_server && pkt->udp->dport == mg_htons(67)) { - pkt->dhcp = (struct dhcp *) (pkt->udp + 1); - mkpay(pkt, pkt->dhcp + 1); - rx_dhcp_server(ifp, pkt); - } else { - rx_udp(ifp, pkt); - } - } else if (pkt->ip->proto == 6) { - pkt->tcp = (struct tcp *) (pkt->ip + 1); - if (pkt->pay.len < sizeof(*pkt->tcp)) return; - mkpay(pkt, pkt->tcp + 1); - uint16_t iplen = mg_ntohs(pkt->ip->len); - uint16_t off = (uint16_t) (sizeof(*pkt->ip) + ((pkt->tcp->off >> 4) * 4U)); - if (iplen >= off) pkt->pay.len = (size_t) (iplen - off); - MG_VERBOSE(("TCP %M:%hu -> %M:%hu len %u", mg_print_ip4, &pkt->ip->src, - mg_ntohs(pkt->tcp->sport), mg_print_ip4, &pkt->ip->dst, - mg_ntohs(pkt->tcp->dport), (int) pkt->pay.len)); - rx_tcp(ifp, pkt); - } -} - -static void rx_ip6(struct mg_tcpip_if *ifp, struct pkt *pkt) { - // MG_DEBUG(("IP %d", (int) len)); - if (pkt->ip6->proto == 1 || pkt->ip6->proto == 58) { - pkt->icmp = (struct icmp *) (pkt->ip6 + 1); - if (pkt->pay.len < sizeof(*pkt->icmp)) return; - mkpay(pkt, pkt->icmp + 1); - rx_icmp(ifp, pkt); - } else if (pkt->ip6->proto == 17) { - pkt->udp = (struct udp *) (pkt->ip6 + 1); - if (pkt->pay.len < sizeof(*pkt->udp)) return; - // MG_DEBUG((" UDP %u %u -> %u", len, mg_htons(udp->sport), - // mg_htons(udp->dport))); - mkpay(pkt, pkt->udp + 1); - } -} - -static void mg_tcpip_rx(struct mg_tcpip_if *ifp, void *buf, size_t len) { - struct pkt pkt; - memset(&pkt, 0, sizeof(pkt)); - pkt.raw.ptr = (char *) buf; - pkt.raw.len = len; - pkt.eth = (struct eth *) buf; - // mg_hexdump(buf, len > 16 ? 16: len); - if (pkt.raw.len < sizeof(*pkt.eth)) return; // Truncated - runt? - if (ifp->enable_mac_check && - memcmp(pkt.eth->dst, ifp->mac, sizeof(pkt.eth->dst)) != 0 && - memcmp(pkt.eth->dst, broadcast, sizeof(pkt.eth->dst)) != 0) - return; - if (ifp->enable_crc32_check && len > 4) { - len -= 4; // TODO(scaprile): check on bigendian - uint32_t crc = mg_crc32(0, (const char *) buf, len); - if (memcmp((void *) ((size_t) buf + len), &crc, sizeof(crc))) return; - } - if (pkt.eth->type == mg_htons(0x806)) { - pkt.arp = (struct arp *) (pkt.eth + 1); - if (sizeof(*pkt.eth) + sizeof(*pkt.arp) > pkt.raw.len) return; // Truncated - rx_arp(ifp, &pkt); - } else if (pkt.eth->type == mg_htons(0x86dd)) { - pkt.ip6 = (struct ip6 *) (pkt.eth + 1); - if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip6)) return; // Truncated - if ((pkt.ip6->ver >> 4) != 0x6) return; // Not IP - mkpay(&pkt, pkt.ip6 + 1); - rx_ip6(ifp, &pkt); - } else if (pkt.eth->type == mg_htons(0x800)) { - pkt.ip = (struct ip *) (pkt.eth + 1); - if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return; // Truncated - // Truncate frame to what IP header tells us - if ((size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth) < pkt.raw.len) { - pkt.raw.len = (size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth); - } - if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return; // Truncated - if ((pkt.ip->ver >> 4) != 4) return; // Not IP - mkpay(&pkt, pkt.ip + 1); - rx_ip(ifp, &pkt); - } else { - MG_DEBUG(("Unknown eth type %x", mg_htons(pkt.eth->type))); - if (mg_log_level >= MG_LL_VERBOSE) mg_hexdump(buf, len >= 32 ? 32 : len); - } -} - -static void mg_tcpip_poll(struct mg_tcpip_if *ifp, uint64_t uptime_ms) { - if (ifp == NULL || ifp->driver == NULL) return; - bool expired_1000ms = mg_timer_expired(&ifp->timer_1000ms, 1000, uptime_ms); - ifp->now = uptime_ms; - - // Handle physical interface up/down status - if (expired_1000ms && ifp->driver->up) { - bool up = ifp->driver->up(ifp); - bool current = ifp->state != MG_TCPIP_STATE_DOWN; - if (up != current) { - ifp->state = up == false ? MG_TCPIP_STATE_DOWN - : ifp->enable_dhcp_client ? MG_TCPIP_STATE_UP - : MG_TCPIP_STATE_READY; - if (!up && ifp->enable_dhcp_client) ifp->ip = 0; - onstatechange(ifp); - } - } - if (ifp->state == MG_TCPIP_STATE_DOWN) return; - - // DHCP RFC-2131 (4.4) - if (ifp->state == MG_TCPIP_STATE_UP && expired_1000ms) { - tx_dhcp_discover(ifp); // INIT (4.4.1) - } else if (expired_1000ms && ifp->state == MG_TCPIP_STATE_READY && - ifp->lease_expire > 0) { // BOUND / RENEWING / REBINDING - if (ifp->now >= ifp->lease_expire) { - ifp->state = MG_TCPIP_STATE_UP, ifp->ip = 0; // expired, release IP - onstatechange(ifp); - } else if (ifp->now + 30UL * 60UL * 1000UL > ifp->lease_expire && - ((ifp->now / 1000) % 60) == 0) { - // hack: 30 min before deadline, try to rebind (4.3.6) every min - tx_dhcp_request_re(ifp, (uint8_t *) broadcast, ifp->ip, 0xffffffff); - } // TODO(): Handle T1 (RENEWING) and T2 (REBINDING) (4.4.5) - } - - // Read data from the network - if (ifp->driver->rx != NULL) { // Polling driver. We must call it - size_t len = - ifp->driver->rx(ifp->recv_queue.buf, ifp->recv_queue.size, ifp); - if (len > 0) { - ifp->nrecv++; - mg_tcpip_rx(ifp, ifp->recv_queue.buf, len); - } - } else { // Interrupt-based driver. Fills recv queue itself - char *buf; - size_t len = mg_queue_next(&ifp->recv_queue, &buf); - if (len > 0) { - mg_tcpip_rx(ifp, buf, len); - mg_queue_del(&ifp->recv_queue, len); - } - } - - // Process timeouts - for (struct mg_connection *c = ifp->mgr->conns; c != NULL; c = c->next) { - if (c->is_udp || c->is_listening || c->is_resolving) continue; - struct connstate *s = (struct connstate *) (c + 1); - uint32_t rem_ip; - memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t)); - if (uptime_ms > s->timer) { - if (s->ttype == MIP_TTYPE_ACK) { - MG_VERBOSE(("%lu ack %x %x", c->id, s->seq, s->ack)); - tx_tcp(ifp, s->mac, rem_ip, TH_ACK, c->loc.port, c->rem.port, - mg_htonl(s->seq), mg_htonl(s->ack), "", 0); - } else if (s->ttype == MIP_TTYPE_ARP) { - mg_error(c, "ARP timeout"); - } else if (s->ttype == MIP_TTYPE_SYN) { - mg_error(c, "Connection timeout"); - } else if (s->ttype == MIP_TTYPE_FIN) { - c->is_closing = 1; - continue; - } else { - if (s->tmiss++ > 2) { - mg_error(c, "keepalive"); - } else { - MG_VERBOSE(("%lu keepalive", c->id)); - tx_tcp(ifp, s->mac, rem_ip, TH_ACK, c->loc.port, c->rem.port, - mg_htonl(s->seq - 1), mg_htonl(s->ack), "", 0); - } - } - - settmout(c, MIP_TTYPE_KEEPALIVE); - } - } -} - -// This function executes in interrupt context, thus it should copy data -// somewhere fast. Note that newlib's malloc is not thread safe, thus use -// our lock-free queue with preallocated buffer to copy data and return asap -void mg_tcpip_qwrite(void *buf, size_t len, struct mg_tcpip_if *ifp) { - char *p; - if (mg_queue_book(&ifp->recv_queue, &p, len) >= len) { - memcpy(p, buf, len); - mg_queue_add(&ifp->recv_queue, len); - ifp->nrecv++; - } else { - ifp->ndrop++; - } -} - -void mg_tcpip_init(struct mg_mgr *mgr, struct mg_tcpip_if *ifp) { - // If MAC address is not set, make a random one - if (ifp->mac[0] == 0 && ifp->mac[1] == 0 && ifp->mac[2] == 0 && - ifp->mac[3] == 0 && ifp->mac[4] == 0 && ifp->mac[5] == 0) { - ifp->mac[0] = 0x02; // Locally administered, unicast - mg_random(&ifp->mac[1], sizeof(ifp->mac) - 1); - MG_INFO(("MAC not set. Generated random: %M", mg_print_mac, ifp->mac)); - } - - if (ifp->driver->init && !ifp->driver->init(ifp)) { - MG_ERROR(("driver init failed")); - } else { - size_t framesize = 1540; - ifp->tx.ptr = (char *) calloc(1, framesize), ifp->tx.len = framesize; - if (ifp->recv_queue.size == 0) - ifp->recv_queue.size = ifp->driver->rx ? framesize : 8192; - ifp->recv_queue.buf = (char *) calloc(1, ifp->recv_queue.size); - ifp->timer_1000ms = mg_millis(); - mgr->priv = ifp; - ifp->mgr = mgr; - ifp->mtu = MG_TCPIP_MTU_DEFAULT; - mgr->extraconnsize = sizeof(struct connstate); - if (ifp->ip == 0) ifp->enable_dhcp_client = true; - memset(ifp->gwmac, 255, sizeof(ifp->gwmac)); // Set to broadcast - mg_random(&ifp->eport, sizeof(ifp->eport)); // Random from 0 to 65535 - ifp->eport |= MG_EPHEMERAL_PORT_BASE; // Random from - // MG_EPHEMERAL_PORT_BASE to 65535 - if (ifp->tx.ptr == NULL || ifp->recv_queue.buf == NULL) MG_ERROR(("OOM")); - } -} - -void mg_tcpip_free(struct mg_tcpip_if *ifp) { - free(ifp->recv_queue.buf); - free((char *) ifp->tx.ptr); -} - -static void send_syn(struct mg_connection *c) { - struct connstate *s = (struct connstate *) (c + 1); - uint32_t isn = mg_htonl((uint32_t) mg_ntohs(c->loc.port)); - struct mg_tcpip_if *ifp = (struct mg_tcpip_if *) c->mgr->priv; - uint32_t rem_ip; - memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t)); - tx_tcp(ifp, s->mac, rem_ip, TH_SYN, c->loc.port, c->rem.port, isn, 0, NULL, - 0); -} - -void mg_connect_resolved(struct mg_connection *c) { - struct mg_tcpip_if *ifp = (struct mg_tcpip_if *) c->mgr->priv; - uint32_t rem_ip; - memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t)); - c->is_resolving = 0; - if (ifp->eport < MG_EPHEMERAL_PORT_BASE) ifp->eport = MG_EPHEMERAL_PORT_BASE; - memcpy(c->loc.ip, &ifp->ip, sizeof(uint32_t)); - c->loc.port = mg_htons(ifp->eport++); - MG_DEBUG(("%lu %M -> %M", c->id, mg_print_ip_port, &c->loc, mg_print_ip_port, - &c->rem)); - mg_call(c, MG_EV_RESOLVE, NULL); - if (c->is_udp && (rem_ip == 0xffffffff || rem_ip == (ifp->ip | ~ifp->mask))) { - struct connstate *s = (struct connstate *) (c + 1); - memset(s->mac, 0xFF, sizeof(s->mac)); // global or local broadcast - } else if (((rem_ip & ifp->mask) == (ifp->ip & ifp->mask))) { - // If we're in the same LAN, fire an ARP lookup. - MG_DEBUG(("%lu ARP lookup...", c->id)); - arp_ask(ifp, rem_ip); - settmout(c, MIP_TTYPE_ARP); - c->is_arplooking = 1; - c->is_connecting = 1; - } else if ((*((uint8_t *) &rem_ip) & 0xE0) == 0xE0) { - struct connstate *s = (struct connstate *) (c + 1); // 224 to 239, E0 to EF - uint8_t mcastp[3] = {0x01, 0x00, 0x5E}; // multicast group - memcpy(s->mac, mcastp, 3); - memcpy(s->mac + 3, ((uint8_t *) &rem_ip) + 1, 3); // 23 LSb - s->mac[3] &= 0x7F; - } else { - struct connstate *s = (struct connstate *) (c + 1); - memcpy(s->mac, ifp->gwmac, sizeof(ifp->gwmac)); - if (c->is_udp) { - mg_call(c, MG_EV_CONNECT, NULL); - } else { - send_syn(c); - settmout(c, MIP_TTYPE_SYN); - c->is_connecting = 1; - } - } -} - -bool mg_open_listener(struct mg_connection *c, const char *url) { - c->loc.port = mg_htons(mg_url_port(url)); - return true; -} - -static void write_conn(struct mg_connection *c) { - long len = c->is_tls ? mg_tls_send(c, c->send.buf, c->send.len) - : mg_io_send(c, c->send.buf, c->send.len); - if (len == MG_IO_ERR) { - mg_error(c, "tx err"); - } else if (len > 0) { - mg_iobuf_del(&c->send, 0, (size_t) len); - mg_call(c, MG_EV_WRITE, &len); - } -} - -static void init_closure(struct mg_connection *c) { - struct connstate *s = (struct connstate *) (c + 1); - if (c->is_udp == false && c->is_listening == false && - c->is_connecting == false) { // For TCP conns, - struct mg_tcpip_if *ifp = - (struct mg_tcpip_if *) c->mgr->priv; // send TCP FIN - uint32_t rem_ip; - memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t)); - tx_tcp(ifp, s->mac, rem_ip, TH_FIN | TH_ACK, c->loc.port, c->rem.port, - mg_htonl(s->seq), mg_htonl(s->ack), NULL, 0); - settmout(c, MIP_TTYPE_FIN); - } -} - -static void close_conn(struct mg_connection *c) { - struct connstate *s = (struct connstate *) (c + 1); - mg_iobuf_free(&s->raw); // For TLS connections, release raw data - mg_close_conn(c); -} - -static bool can_write(struct mg_connection *c) { - return c->is_connecting == 0 && c->is_resolving == 0 && c->send.len > 0 && - c->is_tls_hs == 0 && c->is_arplooking == 0; -} - -void mg_mgr_poll(struct mg_mgr *mgr, int ms) { - struct mg_connection *c, *tmp; - uint64_t now = mg_millis(); - mg_tcpip_poll((struct mg_tcpip_if *) mgr->priv, now); - mg_timer_poll(&mgr->timers, now); - for (c = mgr->conns; c != NULL; c = tmp) { - tmp = c->next; - struct connstate *s = (struct connstate *) (c + 1); - mg_call(c, MG_EV_POLL, &now); - MG_VERBOSE(("%lu .. %c%c%c%c%c", c->id, c->is_tls ? 'T' : 't', - c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h', - c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c')); - if (can_write(c)) write_conn(c); - if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN) - init_closure(c); - if (c->is_closing) close_conn(c); - } - (void) ms; -} - -bool mg_send(struct mg_connection *c, const void *buf, size_t len) { - struct mg_tcpip_if *ifp = (struct mg_tcpip_if *) c->mgr->priv; - bool res = false; - uint32_t rem_ip; - memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t)); - if (ifp->ip == 0 || ifp->state != MG_TCPIP_STATE_READY) { - mg_error(c, "net down"); - } else if (c->is_udp) { - struct connstate *s = (struct connstate *) (c + 1); - len = trim_len(c, len); // Trimming length if necessary - tx_udp(ifp, s->mac, ifp->ip, c->loc.port, rem_ip, c->rem.port, buf, len); - res = true; - } else { - res = mg_iobuf_add(&c->send, c->send.len, buf, len); - } - return res; -} -#endif // MG_ENABLE_TCPIP - -#ifdef MG_ENABLE_LINES -#line 1 "src/ota_dummy.c" -#endif - - - -#if MG_OTA == MG_OTA_NONE -bool mg_ota_begin(size_t new_firmware_size) { - (void) new_firmware_size; - return true; -} -bool mg_ota_write(const void *buf, size_t len) { - (void) buf, (void) len; - return true; -} -bool mg_ota_end(void) { - return true; -} -bool mg_ota_commit(void) { - return true; -} -bool mg_ota_rollback(void) { - return true; -} -int mg_ota_status(int fw) { - (void) fw; - return 0; -} -uint32_t mg_ota_crc32(int fw) { - (void) fw; - return 0; -} -uint32_t mg_ota_timestamp(int fw) { - (void) fw; - return 0; -} -size_t mg_ota_size(int fw) { - (void) fw; - return 0; -} -MG_IRAM void mg_ota_boot(void) { -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/ota_flash.c" -#endif - - - - - -// This OTA implementation uses the internal flash API outlined in device.h -// It splits flash into 2 equal partitions, and stores OTA status in the -// last sector of the partition. - -#if MG_OTA == MG_OTA_FLASH - -#define MG_OTADATA_KEY 0xb07afed0 - -static char *s_addr; // Current address to write to -static size_t s_size; // Firmware size to flash. In-progress indicator -static uint32_t s_crc32; // Firmware checksum - -struct mg_otadata { - uint32_t crc32, size, timestamp, status; -}; - -bool mg_ota_begin(size_t new_firmware_size) { - bool ok = false; - if (s_size) { - MG_ERROR(("OTA already in progress. Call mg_ota_end()")); - } else { - size_t half = mg_flash_size() / 2, max = half - mg_flash_sector_size(); - s_crc32 = 0; - s_addr = (char *) mg_flash_start() + half; - MG_DEBUG(("Firmware %lu bytes, max %lu", new_firmware_size, max)); - if (new_firmware_size < max) { - ok = true; - s_size = new_firmware_size; - MG_INFO(("Starting OTA, firmware size %lu", s_size)); - } else { - MG_ERROR(("Firmware %lu is too big to fit %lu", new_firmware_size, max)); - } - } - return ok; -} - -bool mg_ota_write(const void *buf, size_t len) { - bool ok = false; - if (s_size == 0) { - MG_ERROR(("OTA is not started, call mg_ota_begin()")); - } else { - size_t align = mg_flash_write_align(); - size_t len_aligned_down = MG_ROUND_DOWN(len, align); - if (len_aligned_down) ok = mg_flash_write(s_addr, buf, len_aligned_down); - if (len_aligned_down < len) { - size_t left = len - len_aligned_down; - char tmp[align]; - memset(tmp, 0xff, sizeof(tmp)); - memcpy(tmp, (char *) buf + len_aligned_down, left); - ok = mg_flash_write(s_addr + len_aligned_down, tmp, sizeof(tmp)); - } - s_crc32 = mg_crc32(s_crc32, (char *) buf, len); // Update CRC - MG_DEBUG(("%#x %p %lu -> %d", s_addr - len, buf, len, ok)); - s_addr += len; - } - return ok; -} - -MG_IRAM static uint32_t mg_fwkey(int fw) { - uint32_t key = MG_OTADATA_KEY + fw; - int bank = mg_flash_bank(); - if (bank == 2 && fw == MG_FIRMWARE_PREVIOUS) key--; - if (bank == 2 && fw == MG_FIRMWARE_CURRENT) key++; - return key; -} - -bool mg_ota_end(void) { - char *base = (char *) mg_flash_start() + mg_flash_size() / 2; - bool ok = false; - if (s_size) { - size_t size = s_addr - base; - uint32_t crc32 = mg_crc32(0, base, s_size); - if (size == s_size && crc32 == s_crc32) { - uint32_t now = (uint32_t) (mg_now() / 1000); - struct mg_otadata od = {crc32, size, now, MG_OTA_FIRST_BOOT}; - uint32_t key = mg_fwkey(MG_FIRMWARE_PREVIOUS); - ok = mg_flash_save(NULL, key, &od, sizeof(od)); - } - MG_DEBUG(("CRC: %x/%x, size: %lu/%lu, status: %s", s_crc32, crc32, s_size, - size, ok ? "ok" : "fail")); - s_size = 0; - if (ok) ok = mg_flash_swap_bank(); - } - MG_INFO(("Finishing OTA: %s", ok ? "ok" : "fail")); - return ok; -} - -MG_IRAM static struct mg_otadata mg_otadata(int fw) { - uint32_t key = mg_fwkey(fw); - struct mg_otadata od = {}; - MG_INFO(("Loading %s OTA data", fw == MG_FIRMWARE_CURRENT ? "curr" : "prev")); - mg_flash_load(NULL, key, &od, sizeof(od)); - // MG_DEBUG(("Loaded OTA data. fw %d, bank %d, key %p", fw, bank, key)); - // mg_hexdump(&od, sizeof(od)); - return od; -} - -int mg_ota_status(int fw) { - struct mg_otadata od = mg_otadata(fw); - return od.status; -} -uint32_t mg_ota_crc32(int fw) { - struct mg_otadata od = mg_otadata(fw); - return od.crc32; -} -uint32_t mg_ota_timestamp(int fw) { - struct mg_otadata od = mg_otadata(fw); - return od.timestamp; -} -size_t mg_ota_size(int fw) { - struct mg_otadata od = mg_otadata(fw); - return od.size; -} - -MG_IRAM bool mg_ota_commit(void) { - bool ok = true; - struct mg_otadata od = mg_otadata(MG_FIRMWARE_CURRENT); - if (od.status != MG_OTA_COMMITTED) { - od.status = MG_OTA_COMMITTED; - MG_INFO(("Committing current firmware, OD size %lu", sizeof(od))); - ok = mg_flash_save(NULL, mg_fwkey(MG_FIRMWARE_CURRENT), &od, sizeof(od)); - } - return ok; -} - -bool mg_ota_rollback(void) { - MG_DEBUG(("Rolling firmware back")); - if (mg_flash_bank() == 0) { - // No dual bank support. Mark previous firmware as FIRST_BOOT - struct mg_otadata prev = mg_otadata(MG_FIRMWARE_PREVIOUS); - prev.status = MG_OTA_FIRST_BOOT; - return mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_PREVIOUS, &prev, - sizeof(prev)); - } else { - return mg_flash_swap_bank(); - } -} - -MG_IRAM void mg_ota_boot(void) { - MG_INFO(("Booting. Flash bank: %d", mg_flash_bank())); - struct mg_otadata curr = mg_otadata(MG_FIRMWARE_CURRENT); - struct mg_otadata prev = mg_otadata(MG_FIRMWARE_PREVIOUS); - - if (curr.status == MG_OTA_FIRST_BOOT) { - if (prev.status == MG_OTA_UNAVAILABLE) { - MG_INFO(("Setting previous firmware state to committed")); - prev.status = MG_OTA_COMMITTED; - mg_flash_save(NULL, mg_fwkey(MG_FIRMWARE_PREVIOUS), &prev, sizeof(prev)); - } - curr.status = MG_OTA_UNCOMMITTED; - MG_INFO(("First boot, setting status to UNCOMMITTED")); - mg_flash_save(NULL, mg_fwkey(MG_FIRMWARE_CURRENT), &curr, sizeof(curr)); - } else if (prev.status == MG_OTA_FIRST_BOOT && mg_flash_bank() == 0) { - // Swap paritions. Pray power does not disappear - size_t fs = mg_flash_size(), ss = mg_flash_sector_size(); - char *partition1 = mg_flash_start(); - char *partition2 = mg_flash_start() + fs / 2; - size_t ofs, max = fs / 2 - ss; // Set swap size to the whole partition - - if (curr.status != MG_OTA_UNAVAILABLE && - prev.status != MG_OTA_UNAVAILABLE) { - // We know exact sizes of both firmwares. - // Shrink swap size to the MAX(firmware1, firmware2) - size_t sz = curr.size > prev.size ? curr.size : prev.size; - if (sz > 0 && sz < max) max = sz; - } - - // MG_OTA_FIRST_BOOT -> MG_OTA_UNCOMMITTED - prev.status = MG_OTA_UNCOMMITTED; - mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_CURRENT, &prev, - sizeof(prev)); - mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_PREVIOUS, &curr, - sizeof(curr)); - - MG_INFO(("Swapping partitions, size %u (%u sectors)", max, max / ss)); - MG_INFO(("Do NOT power off...")); - mg_log_level = MG_LL_NONE; - - // We use the last sector of partition2 for OTA data/config storage - // Therefore we can use last sector of partition1 for swapping - char *tmpsector = partition1 + fs / 2 - ss; // Last sector of partition1 - (void) tmpsector; - for (ofs = 0; ofs < max; ofs += ss) { - // mg_flash_erase(tmpsector); - mg_flash_write(tmpsector, partition1 + ofs, ss); - // mg_flash_erase(partition1 + ofs); - mg_flash_write(partition1 + ofs, partition2 + ofs, ss); - // mg_flash_erase(partition2 + ofs); - mg_flash_write(partition2 + ofs, tmpsector, ss); - } - mg_device_reset(); - } -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/printf.c" -#endif - - - - -size_t mg_queue_vprintf(struct mg_queue *q, const char *fmt, va_list *ap) { - size_t len = mg_snprintf(NULL, 0, fmt, ap); - char *buf; - if (len == 0 || mg_queue_book(q, &buf, len + 1) < len + 1) { - len = 0; // Nah. Not enough space - } else { - len = mg_vsnprintf((char *) buf, len + 1, fmt, ap); - mg_queue_add(q, len); - } - return len; -} - -size_t mg_queue_printf(struct mg_queue *q, const char *fmt, ...) { - va_list ap; - size_t len; - va_start(ap, fmt); - len = mg_queue_vprintf(q, fmt, &ap); - va_end(ap); - return len; -} - -static void mg_pfn_iobuf_private(char ch, void *param, bool expand) { - struct mg_iobuf *io = (struct mg_iobuf *) param; - if (expand && io->len + 2 > io->size) mg_iobuf_resize(io, io->len + 2); - if (io->len + 2 <= io->size) { - io->buf[io->len++] = (uint8_t) ch; - io->buf[io->len] = 0; - } else if (io->len < io->size) { - io->buf[io->len++] = 0; // Guarantee to 0-terminate - } -} - -static void mg_putchar_iobuf_static(char ch, void *param) { - mg_pfn_iobuf_private(ch, param, false); -} - -void mg_pfn_iobuf(char ch, void *param) { - mg_pfn_iobuf_private(ch, param, true); -} - -size_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap) { - struct mg_iobuf io = {(uint8_t *) buf, len, 0, 0}; - size_t n = mg_vxprintf(mg_putchar_iobuf_static, &io, fmt, ap); - if (n < len) buf[n] = '\0'; - return n; -} - -size_t mg_snprintf(char *buf, size_t len, const char *fmt, ...) { - va_list ap; - size_t n; - va_start(ap, fmt); - n = mg_vsnprintf(buf, len, fmt, &ap); - va_end(ap); - return n; -} - -char *mg_vmprintf(const char *fmt, va_list *ap) { - struct mg_iobuf io = {0, 0, 0, 256}; - mg_vxprintf(mg_pfn_iobuf, &io, fmt, ap); - return (char *) io.buf; -} - -char *mg_mprintf(const char *fmt, ...) { - char *s; - va_list ap; - va_start(ap, fmt); - s = mg_vmprintf(fmt, &ap); - va_end(ap); - return s; -} - -void mg_pfn_stdout(char c, void *param) { - putchar(c); - (void) param; -} - -static size_t print_ip4(void (*out)(char, void *), void *arg, uint8_t *p) { - return mg_xprintf(out, arg, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); -} - -static size_t print_ip6(void (*out)(char, void *), void *arg, uint16_t *p) { - return mg_xprintf(out, arg, "[%x:%x:%x:%x:%x:%x:%x:%x]", mg_ntohs(p[0]), - mg_ntohs(p[1]), mg_ntohs(p[2]), mg_ntohs(p[3]), - mg_ntohs(p[4]), mg_ntohs(p[5]), mg_ntohs(p[6]), - mg_ntohs(p[7])); -} - -size_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap) { - uint8_t *p = va_arg(*ap, uint8_t *); - return print_ip4(out, arg, p); -} - -size_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap) { - uint16_t *p = va_arg(*ap, uint16_t *); - return print_ip6(out, arg, p); -} - -size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap) { - struct mg_addr *addr = va_arg(*ap, struct mg_addr *); - if (addr->is_ip6) return print_ip6(out, arg, (uint16_t *) addr->ip); - return print_ip4(out, arg, (uint8_t *) &addr->ip); -} - -size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap) { - struct mg_addr *a = va_arg(*ap, struct mg_addr *); - return mg_xprintf(out, arg, "%M:%hu", mg_print_ip, a, mg_ntohs(a->port)); -} - -size_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap) { - uint8_t *p = va_arg(*ap, uint8_t *); - return mg_xprintf(out, arg, "%02x:%02x:%02x:%02x:%02x:%02x", p[0], p[1], p[2], - p[3], p[4], p[5]); -} - -static char mg_esc(int c, bool esc) { - const char *p, *esc1 = "\b\f\n\r\t\\\"", *esc2 = "bfnrt\\\""; - for (p = esc ? esc1 : esc2; *p != '\0'; p++) { - if (*p == c) return esc ? esc2[p - esc1] : esc1[p - esc2]; - } - return 0; -} - -static char mg_escape(int c) { - return mg_esc(c, true); -} - -static size_t qcpy(void (*out)(char, void *), void *ptr, char *buf, - size_t len) { - size_t i = 0, extra = 0; - for (i = 0; i < len && buf[i] != '\0'; i++) { - char c = mg_escape(buf[i]); - if (c) { - out('\\', ptr), out(c, ptr), extra++; - } else { - out(buf[i], ptr); - } - } - return i + extra; -} - -static size_t bcpy(void (*out)(char, void *), void *arg, uint8_t *buf, - size_t len) { - size_t i, j, n = 0; - const char *t = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - for (i = 0; i < len; i += 3) { - uint8_t c1 = buf[i], c2 = i + 1 < len ? buf[i + 1] : 0, - c3 = i + 2 < len ? buf[i + 2] : 0; - char tmp[4] = {t[c1 >> 2], t[(c1 & 3) << 4 | (c2 >> 4)], '=', '='}; - if (i + 1 < len) tmp[2] = t[(c2 & 15) << 2 | (c3 >> 6)]; - if (i + 2 < len) tmp[3] = t[c3 & 63]; - for (j = 0; j < sizeof(tmp) && tmp[j] != '\0'; j++) out(tmp[j], arg); - n += j; - } - return n; -} - -size_t mg_print_hex(void (*out)(char, void *), void *arg, va_list *ap) { - size_t bl = (size_t) va_arg(*ap, int); - uint8_t *p = va_arg(*ap, uint8_t *); - const char *hex = "0123456789abcdef"; - size_t j; - for (j = 0; j < bl; j++) { - out(hex[(p[j] >> 4) & 0x0F], arg); - out(hex[p[j] & 0x0F], arg); - } - return 2 * bl; -} -size_t mg_print_base64(void (*out)(char, void *), void *arg, va_list *ap) { - size_t len = (size_t) va_arg(*ap, int); - uint8_t *buf = va_arg(*ap, uint8_t *); - return bcpy(out, arg, buf, len); -} - -size_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap) { - size_t len = (size_t) va_arg(*ap, int); - char *p = va_arg(*ap, char *); - if (len == 0) len = p == NULL ? 0 : strlen(p); - return qcpy(out, arg, p, len); -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/queue.c" -#endif - - - -#if (defined(__GNUC__) && (__GNUC__ > 4) || \ - (defined(__GNUC_MINOR__) && __GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \ - defined(__clang__) -#define MG_MEMORY_BARRIER() __sync_synchronize() -#elif defined(_MSC_VER) && _MSC_VER >= 1700 -#define MG_MEMORY_BARRIER() MemoryBarrier() -#elif !defined(MG_MEMORY_BARRIER) -#define MG_MEMORY_BARRIER() -#endif - -// Every message in a queue is prepended by a 32-bit message length (ML). -// If ML is 0, then it is the end, and reader must wrap to the beginning. -// -// Queue when q->tail <= q->head: -// |----- free -----| ML | message1 | ML | message2 | ----- free ------| -// ^ ^ ^ ^ -// buf tail head len -// -// Queue when q->tail > q->head: -// | ML | message2 |----- free ------| ML | message1 | 0 |---- free ----| -// ^ ^ ^ ^ -// buf head tail len - -void mg_queue_init(struct mg_queue *q, char *buf, size_t size) { - q->size = size; - q->buf = buf; - q->head = q->tail = 0; -} - -static size_t mg_queue_read_len(struct mg_queue *q) { - uint32_t n = 0; - MG_MEMORY_BARRIER(); - memcpy(&n, q->buf + q->tail, sizeof(n)); - assert(q->tail + n + sizeof(n) <= q->size); - return n; -} - -static void mg_queue_write_len(struct mg_queue *q, size_t len) { - uint32_t n = (uint32_t) len; - memcpy(q->buf + q->head, &n, sizeof(n)); - MG_MEMORY_BARRIER(); -} - -size_t mg_queue_book(struct mg_queue *q, char **buf, size_t len) { - size_t space = 0, hs = sizeof(uint32_t) * 2; // *2 is for the 0 marker - if (q->head >= q->tail && q->head + len + hs <= q->size) { - space = q->size - q->head - hs; // There is enough space - } else if (q->head >= q->tail && q->tail > hs) { - mg_queue_write_len(q, 0); // Not enough space ahead - q->head = 0; // Wrap head to the beginning - } - if (q->head + hs + len < q->tail) space = q->tail - q->head - hs; - if (buf != NULL) *buf = q->buf + q->head + sizeof(uint32_t); - return space; -} - -size_t mg_queue_next(struct mg_queue *q, char **buf) { - size_t len = 0; - if (q->tail != q->head) { - len = mg_queue_read_len(q); - if (len == 0) { // Zero (head wrapped) ? - q->tail = 0; // Reset tail to the start - if (q->head > q->tail) len = mg_queue_read_len(q); // Read again - } - } - if (buf != NULL) *buf = q->buf + q->tail + sizeof(uint32_t); - assert(q->tail + len <= q->size); - return len; -} - -void mg_queue_add(struct mg_queue *q, size_t len) { - assert(len > 0); - mg_queue_write_len(q, len); - assert(q->head + sizeof(uint32_t) * 2 + len <= q->size); - q->head += len + sizeof(uint32_t); -} - -void mg_queue_del(struct mg_queue *q, size_t len) { - q->tail += len + sizeof(uint32_t); - assert(q->tail + sizeof(uint32_t) <= q->size); -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/rpc.c" -#endif - - - -void mg_rpc_add(struct mg_rpc **head, struct mg_str method, - void (*fn)(struct mg_rpc_req *), void *fn_data) { - struct mg_rpc *rpc = (struct mg_rpc *) calloc(1, sizeof(*rpc)); - if (rpc != NULL) { - rpc->method = mg_strdup(method), rpc->fn = fn, rpc->fn_data = fn_data; - rpc->next = *head, *head = rpc; - } -} - -void mg_rpc_del(struct mg_rpc **head, void (*fn)(struct mg_rpc_req *)) { - struct mg_rpc *r; - while ((r = *head) != NULL) { - if (r->fn == fn || fn == NULL) { - *head = r->next; - free((void *) r->method.ptr); - free(r); - } else { - head = &(*head)->next; - } - } -} - -static void mg_rpc_call(struct mg_rpc_req *r, struct mg_str method) { - struct mg_rpc *h = r->head == NULL ? NULL : *r->head; - while (h != NULL && !mg_match(method, h->method, NULL)) h = h->next; - if (h != NULL) { - r->rpc = h; - h->fn(r); - } else { - mg_rpc_err(r, -32601, "\"%.*s not found\"", (int) method.len, method.ptr); - } -} - -void mg_rpc_process(struct mg_rpc_req *r) { - int len, off = mg_json_get(r->frame, "$.method", &len); - if (off > 0 && r->frame.ptr[off] == '"') { - struct mg_str method = mg_str_n(&r->frame.ptr[off + 1], (size_t) len - 2); - mg_rpc_call(r, method); - } else if ((off = mg_json_get(r->frame, "$.result", &len)) > 0 || - (off = mg_json_get(r->frame, "$.error", &len)) > 0) { - mg_rpc_call(r, mg_str("")); // JSON response! call "" method handler - } else { - mg_rpc_err(r, -32700, "%m", mg_print_esc, (int) r->frame.len, - r->frame.ptr); // Invalid - } -} - -void mg_rpc_vok(struct mg_rpc_req *r, const char *fmt, va_list *ap) { - int len, off = mg_json_get(r->frame, "$.id", &len); - if (off > 0) { - mg_xprintf(r->pfn, r->pfn_data, "{%m:%.*s,%m:", mg_print_esc, 0, "id", len, - &r->frame.ptr[off], mg_print_esc, 0, "result"); - mg_vxprintf(r->pfn, r->pfn_data, fmt == NULL ? "null" : fmt, ap); - mg_xprintf(r->pfn, r->pfn_data, "}"); - } -} - -void mg_rpc_ok(struct mg_rpc_req *r, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - mg_rpc_vok(r, fmt, &ap); - va_end(ap); -} - -void mg_rpc_verr(struct mg_rpc_req *r, int code, const char *fmt, va_list *ap) { - int len, off = mg_json_get(r->frame, "$.id", &len); - mg_xprintf(r->pfn, r->pfn_data, "{"); - if (off > 0) { - mg_xprintf(r->pfn, r->pfn_data, "%m:%.*s,", mg_print_esc, 0, "id", len, - &r->frame.ptr[off]); - } - mg_xprintf(r->pfn, r->pfn_data, "%m:{%m:%d,%m:", mg_print_esc, 0, "error", - mg_print_esc, 0, "code", code, mg_print_esc, 0, "message"); - mg_vxprintf(r->pfn, r->pfn_data, fmt == NULL ? "null" : fmt, ap); - mg_xprintf(r->pfn, r->pfn_data, "}}"); -} - -void mg_rpc_err(struct mg_rpc_req *r, int code, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - mg_rpc_verr(r, code, fmt, &ap); - va_end(ap); -} - -static size_t print_methods(mg_pfn_t pfn, void *pfn_data, va_list *ap) { - struct mg_rpc *h, **head = (struct mg_rpc **) va_arg(*ap, void **); - size_t len = 0; - for (h = *head; h != NULL; h = h->next) { - if (h->method.len == 0) continue; // Ignore response handler - len += mg_xprintf(pfn, pfn_data, "%s%m", h == *head ? "" : ",", - mg_print_esc, (int) h->method.len, h->method.ptr); - } - return len; -} - -void mg_rpc_list(struct mg_rpc_req *r) { - mg_rpc_ok(r, "[%M]", print_methods, r->head); -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/sha1.c" -#endif -/* Copyright(c) By Steve Reid */ -/* 100% Public Domain */ - - - -union char64long16 { - unsigned char c[64]; - uint32_t l[16]; -}; - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -static uint32_t blk0(union char64long16 *block, int i) { - if (MG_BIG_ENDIAN) { - } else { - block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | - (rol(block->l[i], 8) & 0x00FF00FF); - } - return block->l[i]; -} - -/* Avoid redefine warning (ARM /usr/include/sys/ucontext.h define R0~R4) */ -#undef blk -#undef R0 -#undef R1 -#undef R2 -#undef R3 -#undef R4 - -#define blk(i) \ - (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ \ - block->l[(i + 2) & 15] ^ block->l[i & 15], \ - 1)) -#define R0(v, w, x, y, z, i) \ - z += ((w & (x ^ y)) ^ y) + blk0(block, i) + 0x5A827999 + rol(v, 5); \ - w = rol(w, 30); -#define R1(v, w, x, y, z, i) \ - z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \ - w = rol(w, 30); -#define R2(v, w, x, y, z, i) \ - z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \ - w = rol(w, 30); -#define R3(v, w, x, y, z, i) \ - z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \ - w = rol(w, 30); -#define R4(v, w, x, y, z, i) \ - z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \ - w = rol(w, 30); - -static void mg_sha1_transform(uint32_t state[5], - const unsigned char *buffer) { - uint32_t a, b, c, d, e; - union char64long16 block[1]; - - memcpy(block, buffer, 64); - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - R0(a, b, c, d, e, 0); - R0(e, a, b, c, d, 1); - R0(d, e, a, b, c, 2); - R0(c, d, e, a, b, 3); - R0(b, c, d, e, a, 4); - R0(a, b, c, d, e, 5); - R0(e, a, b, c, d, 6); - R0(d, e, a, b, c, 7); - R0(c, d, e, a, b, 8); - R0(b, c, d, e, a, 9); - R0(a, b, c, d, e, 10); - R0(e, a, b, c, d, 11); - R0(d, e, a, b, c, 12); - R0(c, d, e, a, b, 13); - R0(b, c, d, e, a, 14); - R0(a, b, c, d, e, 15); - R1(e, a, b, c, d, 16); - R1(d, e, a, b, c, 17); - R1(c, d, e, a, b, 18); - R1(b, c, d, e, a, 19); - R2(a, b, c, d, e, 20); - R2(e, a, b, c, d, 21); - R2(d, e, a, b, c, 22); - R2(c, d, e, a, b, 23); - R2(b, c, d, e, a, 24); - R2(a, b, c, d, e, 25); - R2(e, a, b, c, d, 26); - R2(d, e, a, b, c, 27); - R2(c, d, e, a, b, 28); - R2(b, c, d, e, a, 29); - R2(a, b, c, d, e, 30); - R2(e, a, b, c, d, 31); - R2(d, e, a, b, c, 32); - R2(c, d, e, a, b, 33); - R2(b, c, d, e, a, 34); - R2(a, b, c, d, e, 35); - R2(e, a, b, c, d, 36); - R2(d, e, a, b, c, 37); - R2(c, d, e, a, b, 38); - R2(b, c, d, e, a, 39); - R3(a, b, c, d, e, 40); - R3(e, a, b, c, d, 41); - R3(d, e, a, b, c, 42); - R3(c, d, e, a, b, 43); - R3(b, c, d, e, a, 44); - R3(a, b, c, d, e, 45); - R3(e, a, b, c, d, 46); - R3(d, e, a, b, c, 47); - R3(c, d, e, a, b, 48); - R3(b, c, d, e, a, 49); - R3(a, b, c, d, e, 50); - R3(e, a, b, c, d, 51); - R3(d, e, a, b, c, 52); - R3(c, d, e, a, b, 53); - R3(b, c, d, e, a, 54); - R3(a, b, c, d, e, 55); - R3(e, a, b, c, d, 56); - R3(d, e, a, b, c, 57); - R3(c, d, e, a, b, 58); - R3(b, c, d, e, a, 59); - R4(a, b, c, d, e, 60); - R4(e, a, b, c, d, 61); - R4(d, e, a, b, c, 62); - R4(c, d, e, a, b, 63); - R4(b, c, d, e, a, 64); - R4(a, b, c, d, e, 65); - R4(e, a, b, c, d, 66); - R4(d, e, a, b, c, 67); - R4(c, d, e, a, b, 68); - R4(b, c, d, e, a, 69); - R4(a, b, c, d, e, 70); - R4(e, a, b, c, d, 71); - R4(d, e, a, b, c, 72); - R4(c, d, e, a, b, 73); - R4(b, c, d, e, a, 74); - R4(a, b, c, d, e, 75); - R4(e, a, b, c, d, 76); - R4(d, e, a, b, c, 77); - R4(c, d, e, a, b, 78); - R4(b, c, d, e, a, 79); - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - /* Erase working structures. The order of operations is important, - * used to ensure that compiler doesn't optimize those out. */ - memset(block, 0, sizeof(block)); - a = b = c = d = e = 0; - (void) a; - (void) b; - (void) c; - (void) d; - (void) e; -} - -void mg_sha1_init(mg_sha1_ctx *context) { - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - -void mg_sha1_update(mg_sha1_ctx *context, const unsigned char *data, - size_t len) { - size_t i, j; - - j = context->count[0]; - if ((context->count[0] += (uint32_t) len << 3) < j) context->count[1]++; - context->count[1] += (uint32_t) (len >> 29); - j = (j >> 3) & 63; - if ((j + len) > 63) { - memcpy(&context->buffer[j], data, (i = 64 - j)); - mg_sha1_transform(context->state, context->buffer); - for (; i + 63 < len; i += 64) { - mg_sha1_transform(context->state, &data[i]); - } - j = 0; - } else - i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -} - -void mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *context) { - unsigned i; - unsigned char finalcount[8], c; - - for (i = 0; i < 8; i++) { - finalcount[i] = (unsigned char) ((context->count[(i >= 4 ? 0 : 1)] >> - ((3 - (i & 3)) * 8)) & - 255); - } - c = 0200; - mg_sha1_update(context, &c, 1); - while ((context->count[0] & 504) != 448) { - c = 0000; - mg_sha1_update(context, &c, 1); - } - mg_sha1_update(context, finalcount, 8); - for (i = 0; i < 20; i++) { - digest[i] = - (unsigned char) ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); - } - memset(context, '\0', sizeof(*context)); - memset(&finalcount, '\0', sizeof(finalcount)); -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/sha256.c" -#endif - - -#define ror(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) -#define ch(x, y, z) (((x) & (y)) ^ (~(x) & (z))) -#define maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) -#define ep0(x) (ror(x, 2) ^ ror(x, 13) ^ ror(x, 22)) -#define ep1(x) (ror(x, 6) ^ ror(x, 11) ^ ror(x, 25)) -#define sig0(x) (ror(x, 7) ^ ror(x, 18) ^ ((x) >> 3)) -#define sig1(x) (ror(x, 17) ^ ror(x, 19) ^ ((x) >> 10)) - -static const uint32_t mg_sha256_k[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, - 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, - 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, - 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, - 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, - 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; - -void mg_sha256_init(mg_sha256_ctx *ctx) { - ctx->len = 0; - ctx->bits = 0; - ctx->state[0] = 0x6a09e667; - ctx->state[1] = 0xbb67ae85; - ctx->state[2] = 0x3c6ef372; - ctx->state[3] = 0xa54ff53a; - ctx->state[4] = 0x510e527f; - ctx->state[5] = 0x9b05688c; - ctx->state[6] = 0x1f83d9ab; - ctx->state[7] = 0x5be0cd19; -} - -static void mg_sha256_chunk(mg_sha256_ctx *ctx) { - int i, j; - uint32_t a, b, c, d, e, f, g, h; - uint32_t m[64]; - for (i = 0, j = 0; i < 16; ++i, j += 4) - m[i] = (uint32_t) ((ctx->buffer[j] << 24) | (ctx->buffer[j + 1] << 16) | - (ctx->buffer[j + 2] << 8) | (ctx->buffer[j + 3])); - for (; i < 64; ++i) - m[i] = sig1(m[i - 2]) + m[i - 7] + sig0(m[i - 15]) + m[i - 16]; - - a = ctx->state[0]; - b = ctx->state[1]; - c = ctx->state[2]; - d = ctx->state[3]; - e = ctx->state[4]; - f = ctx->state[5]; - g = ctx->state[6]; - h = ctx->state[7]; - - for (i = 0; i < 64; ++i) { - uint32_t t1 = h + ep1(e) + ch(e, f, g) + mg_sha256_k[i] + m[i]; - uint32_t t2 = ep0(a) + maj(a, b, c); - h = g; - g = f; - f = e; - e = d + t1; - d = c; - c = b; - b = a; - a = t1 + t2; - } - - ctx->state[0] += a; - ctx->state[1] += b; - ctx->state[2] += c; - ctx->state[3] += d; - ctx->state[4] += e; - ctx->state[5] += f; - ctx->state[6] += g; - ctx->state[7] += h; -} - -void mg_sha256_update(mg_sha256_ctx *ctx, const unsigned char *data, - size_t len) { - size_t i; - for (i = 0; i < len; i++) { - ctx->buffer[ctx->len] = data[i]; - if ((++ctx->len) == 64) { - mg_sha256_chunk(ctx); - ctx->bits += 512; - ctx->len = 0; - } - } -} - -// TODO: make final reusable (remove side effects) -void mg_sha256_final(unsigned char digest[32], mg_sha256_ctx *ctx) { - uint32_t i = ctx->len; - if (i < 56) { - ctx->buffer[i++] = 0x80; - while (i < 56) { - ctx->buffer[i++] = 0x00; - } - } else { - ctx->buffer[i++] = 0x80; - while (i < 64) { - ctx->buffer[i++] = 0x00; - } - mg_sha256_chunk(ctx); - memset(ctx->buffer, 0, 56); - } - - ctx->bits += ctx->len * 8; - ctx->buffer[63] = (uint8_t) ((ctx->bits) & 0xff); - ctx->buffer[62] = (uint8_t) ((ctx->bits >> 8) & 0xff); - ctx->buffer[61] = (uint8_t) ((ctx->bits >> 16) & 0xff); - ctx->buffer[60] = (uint8_t) ((ctx->bits >> 24) & 0xff); - ctx->buffer[59] = (uint8_t) ((ctx->bits >> 32) & 0xff); - ctx->buffer[58] = (uint8_t) ((ctx->bits >> 40) & 0xff); - ctx->buffer[57] = (uint8_t) ((ctx->bits >> 48) & 0xff); - ctx->buffer[56] = (uint8_t) ((ctx->bits >> 56) & 0xff); - mg_sha256_chunk(ctx); - - for (i = 0; i < 4; ++i) { - digest[i] = (ctx->state[0] >> (24 - i * 8)) & 0xff; - digest[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0xff; - digest[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0xff; - digest[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0xff; - digest[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0xff; - digest[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0xff; - digest[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0xff; - digest[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0xff; - } -} - -void mg_hmac_sha256(uint8_t dst[32], uint8_t *key, size_t keysz, uint8_t *data, - size_t datasz) { - mg_sha256_ctx ctx; - uint8_t k[64] = {0}; - uint8_t o_pad[64], i_pad[64]; - unsigned int i; - memset(i_pad, 0x36, sizeof(i_pad)); - memset(o_pad, 0x5c, sizeof(o_pad)); - if (keysz < 64) { - memmove(k, key, keysz); - } else { - mg_sha256_init(&ctx); - mg_sha256_update(&ctx, key, keysz); - mg_sha256_final(k, &ctx); - } - for (i = 0; i < sizeof(k); i++) { - i_pad[i] ^= k[i]; - o_pad[i] ^= k[i]; - } - mg_sha256_init(&ctx); - mg_sha256_update(&ctx, i_pad, sizeof(i_pad)); - mg_sha256_update(&ctx, data, datasz); - mg_sha256_final(dst, &ctx); - mg_sha256_init(&ctx); - mg_sha256_update(&ctx, o_pad, sizeof(o_pad)); - mg_sha256_update(&ctx, dst, 32); - mg_sha256_final(dst, &ctx); -} - - -#ifdef MG_ENABLE_LINES -#line 1 "src/sntp.c" -#endif - - - - - - -#define SNTP_TIME_OFFSET 2208988800U // (1970 - 1900) in seconds -#define SNTP_MAX_FRAC 4294967295.0 // 2 ** 32 - 1 - -static int64_t gettimestamp(const uint32_t *data) { - uint32_t sec = mg_ntohl(data[0]), frac = mg_ntohl(data[1]); - if (sec) sec -= SNTP_TIME_OFFSET; - return ((int64_t) sec) * 1000 + (int64_t) (frac / SNTP_MAX_FRAC * 1000.0); -} - -int64_t mg_sntp_parse(const unsigned char *buf, size_t len) { - int64_t res = -1; - int mode = len > 0 ? buf[0] & 7 : 0; - int version = len > 0 ? (buf[0] >> 3) & 7 : 0; - if (len < 48) { - MG_ERROR(("%s", "corrupt packet")); - } else if (mode != 4 && mode != 5) { - MG_ERROR(("%s", "not a server reply")); - } else if (buf[1] == 0) { - MG_ERROR(("%s", "server sent a kiss of death")); - } else if (version == 4 || version == 3) { - // int64_t ref = gettimestamp((uint32_t *) &buf[16]); - int64_t t0 = gettimestamp((uint32_t *) &buf[24]); - int64_t t1 = gettimestamp((uint32_t *) &buf[32]); - int64_t t2 = gettimestamp((uint32_t *) &buf[40]); - int64_t t3 = (int64_t) mg_millis(); - int64_t delta = (t3 - t0) - (t2 - t1); - MG_VERBOSE(("%lld %lld %lld %lld delta:%lld", t0, t1, t2, t3, delta)); - res = t2 + delta / 2; - } else { - MG_ERROR(("unexpected version: %d", version)); - } - return res; -} - -static void sntp_cb(struct mg_connection *c, int ev, void *ev_data) { - if (ev == MG_EV_READ) { - int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len); - if (milliseconds > 0) { - MG_DEBUG(("%lu got time: %lld ms from epoch", c->id, milliseconds)); - mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds); - MG_VERBOSE(("%u.%u", (unsigned) (milliseconds / 1000), - (unsigned) (milliseconds % 1000))); - } - mg_iobuf_del(&c->recv, 0, c->recv.len); // Free receive buffer - } else if (ev == MG_EV_CONNECT) { - mg_sntp_request(c); - } else if (ev == MG_EV_CLOSE) { - } - (void) ev_data; -} - -void mg_sntp_request(struct mg_connection *c) { - if (c->is_resolving) { - MG_ERROR(("%lu wait until resolved", c->id)); - } else { - int64_t now = (int64_t) mg_millis(); // Use int64_t, for vc98 - uint8_t buf[48] = {0}; - uint32_t *t = (uint32_t *) &buf[40]; - double frac = ((double) (now % 1000)) / 1000.0 * SNTP_MAX_FRAC; - buf[0] = (0 << 6) | (4 << 3) | 3; - t[0] = mg_htonl((uint32_t) (now / 1000) + SNTP_TIME_OFFSET); - t[1] = mg_htonl((uint32_t) frac); - mg_send(c, buf, sizeof(buf)); - } -} - -struct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url, - mg_event_handler_t fn, void *fnd) { - struct mg_connection *c = NULL; - if (url == NULL) url = "udp://time.google.com:123"; - if ((c = mg_connect(mgr, url, fn, fnd)) != NULL) c->pfn = sntp_cb; - return c; -} - -#ifdef MG_ENABLE_LINES -#line 1 "src/sock.c" -#endif - - - - - - - - - - - -#if MG_ENABLE_SOCKET - -#ifndef closesocket -#define closesocket(x) close(x) -#endif - -#define FD(c_) ((MG_SOCKET_TYPE) (size_t) (c_)->fd) -#define S2PTR(s_) ((void *) (size_t) (s_)) - -#ifndef MSG_NONBLOCKING -#define MSG_NONBLOCKING 0 -#endif - -#ifndef AF_INET6 -#define AF_INET6 10 -#endif - -#ifndef MG_SOCK_ERR -#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? errno : 0) -#endif - -#ifndef MG_SOCK_INTR -#define MG_SOCK_INTR(fd) (fd == MG_INVALID_SOCKET && MG_SOCK_ERR(-1) == EINTR) -#endif - -#ifndef MG_SOCK_PENDING -#define MG_SOCK_PENDING(errcode) \ - (((errcode) < 0) && (errno == EINPROGRESS || errno == EWOULDBLOCK)) -#endif - -#ifndef MG_SOCK_RESET -#define MG_SOCK_RESET(errcode) \ - (((errcode) < 0) && (errno == EPIPE || errno == ECONNRESET)) -#endif - -union usa { - struct sockaddr sa; - struct sockaddr_in sin; -#if MG_ENABLE_IPV6 - struct sockaddr_in6 sin6; -#endif -}; - -static socklen_t tousa(struct mg_addr *a, union usa *usa) { - socklen_t len = sizeof(usa->sin); - memset(usa, 0, sizeof(*usa)); - usa->sin.sin_family = AF_INET; - usa->sin.sin_port = a->port; - memcpy(&usa->sin.sin_addr, a->ip, sizeof(uint32_t)); -#if MG_ENABLE_IPV6 - if (a->is_ip6) { - usa->sin.sin_family = AF_INET6; - usa->sin6.sin6_port = a->port; - usa->sin6.sin6_scope_id = a->scope_id; - memcpy(&usa->sin6.sin6_addr, a->ip, sizeof(a->ip)); - len = sizeof(usa->sin6); - } -#endif - return len; -} - -static void tomgaddr(union usa *usa, struct mg_addr *a, bool is_ip6) { - a->is_ip6 = is_ip6; - a->port = usa->sin.sin_port; - memcpy(&a->ip, &usa->sin.sin_addr, sizeof(uint32_t)); -#if MG_ENABLE_IPV6 - if (is_ip6) { - memcpy(a->ip, &usa->sin6.sin6_addr, sizeof(a->ip)); - a->port = usa->sin6.sin6_port; - a->scope_id = (uint8_t) usa->sin6.sin6_scope_id; - } -#endif -} - -static void setlocaddr(MG_SOCKET_TYPE fd, struct mg_addr *addr) { - union usa usa; - socklen_t n = sizeof(usa); - if (getsockname(fd, &usa.sa, &n) == 0) { - tomgaddr(&usa, addr, n != sizeof(usa.sin)); - } -} - -static void iolog(struct mg_connection *c, char *buf, long n, bool r) { - if (n == MG_IO_WAIT) { - // Do nothing - } else if (n <= 0) { - c->is_closing = 1; // Termination. Don't call mg_error(): #1529 - } else if (n > 0) { - if (c->is_hexdumping) { - MG_INFO(("\n-- %lu %M %s %M %ld", c->id, mg_print_ip_port, &c->loc, - r ? "<-" : "->", mg_print_ip_port, &c->rem, n)); - mg_hexdump(buf, (size_t) n); - } - if (r) { - c->recv.len += (size_t) n; - mg_call(c, MG_EV_READ, &n); - } else { - mg_iobuf_del(&c->send, 0, (size_t) n); - // if (c->send.len == 0) mg_iobuf_resize(&c->send, 0); - if (c->send.len == 0) { - MG_EPOLL_MOD(c, 0); - } - mg_call(c, MG_EV_WRITE, &n); - } - } -} - -long mg_io_send(struct mg_connection *c, const void *buf, size_t len) { - long n; - if (c->is_udp) { - union usa usa; - socklen_t slen = tousa(&c->rem, &usa); - n = sendto(FD(c), (char *) buf, len, 0, &usa.sa, slen); - if (n > 0) setlocaddr(FD(c), &c->loc); - } else { - n = send(FD(c), (char *) buf, len, MSG_NONBLOCKING); - } - MG_VERBOSE(("%lu %ld %d", c->id, n, MG_SOCK_ERR(n))); - if (MG_SOCK_PENDING(n)) return MG_IO_WAIT; - if (MG_SOCK_RESET(n)) return MG_IO_RESET; - if (n <= 0) return MG_IO_ERR; - return n; -} - -bool mg_send(struct mg_connection *c, const void *buf, size_t len) { - if (c->is_udp) { - long n = mg_io_send(c, buf, len); - MG_DEBUG(("%lu %ld %d:%d %ld err %d", c->id, c->fd, (int) c->send.len, - (int) c->recv.len, n, MG_SOCK_ERR(n))); - iolog(c, (char *) buf, n, false); - return n > 0; - } else { - return mg_iobuf_add(&c->send, c->send.len, buf, len); - } -} - -static void mg_set_non_blocking_mode(MG_SOCKET_TYPE fd) { -#if defined(MG_CUSTOM_NONBLOCK) - MG_CUSTOM_NONBLOCK(fd); -#elif MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK - unsigned long on = 1; - ioctlsocket(fd, FIONBIO, &on); -#elif MG_ENABLE_RL - unsigned long on = 1; - ioctlsocket(fd, FIONBIO, &on); -#elif MG_ENABLE_FREERTOS_TCP - const BaseType_t off = 0; - if (setsockopt(fd, 0, FREERTOS_SO_RCVTIMEO, &off, sizeof(off)) != 0) (void) 0; - if (setsockopt(fd, 0, FREERTOS_SO_SNDTIMEO, &off, sizeof(off)) != 0) (void) 0; -#elif MG_ENABLE_LWIP - lwip_fcntl(fd, F_SETFL, O_NONBLOCK); -#elif MG_ARCH == MG_ARCH_AZURERTOS - fcntl(fd, F_SETFL, O_NONBLOCK); -#elif MG_ARCH == MG_ARCH_TIRTOS - int val = 0; - setsockopt(fd, SOL_SOCKET, SO_BLOCKING, &val, sizeof(val)); - // SPRU524J section 3.3.3 page 63, SO_SNDLOWAT - int sz = sizeof(val); - getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &sz); - val /= 2; // set send low-water mark at half send buffer size - setsockopt(fd, SOL_SOCKET, SO_SNDLOWAT, &val, sizeof(val)); -#else - fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); // Non-blocking mode - fcntl(fd, F_SETFD, FD_CLOEXEC); // Set close-on-exec -#endif -} - -bool mg_open_listener(struct mg_connection *c, const char *url) { - MG_SOCKET_TYPE fd = MG_INVALID_SOCKET; - bool success = false; - c->loc.port = mg_htons(mg_url_port(url)); - if (!mg_aton(mg_url_host(url), &c->loc)) { - MG_ERROR(("invalid listening URL: %s", url)); - } else { - union usa usa; - socklen_t slen = tousa(&c->loc, &usa); - int rc, on = 1, af = c->loc.is_ip6 ? AF_INET6 : AF_INET; - int type = strncmp(url, "udp:", 4) == 0 ? SOCK_DGRAM : SOCK_STREAM; - int proto = type == SOCK_DGRAM ? IPPROTO_UDP : IPPROTO_TCP; - (void) on; - - if ((fd = socket(af, type, proto)) == MG_INVALID_SOCKET) { - MG_ERROR(("socket: %d", MG_SOCK_ERR(-1))); -#if defined(SO_EXCLUSIVEADDRUSE) - } else if ((rc = setsockopt(fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, - (char *) &on, sizeof(on))) != 0) { - // "Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE" - MG_ERROR(("setsockopt(SO_EXCLUSIVEADDRUSE): %d %d", on, MG_SOCK_ERR(rc))); -#elif defined(SO_REUSEADDR) && (!defined(LWIP_SOCKET) || SO_REUSE) - } else if ((rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, - sizeof(on))) != 0) { - // 1. SO_REUSEADDR semantics on UNIX and Windows is different. On - // Windows, SO_REUSEADDR allows to bind a socket to a port without error - // even if the port is already open by another program. This is not the - // behavior SO_REUSEADDR was designed for, and leads to hard-to-track - // failure scenarios. - // - // 2. For LWIP, SO_REUSEADDR should be explicitly enabled by defining - // SO_REUSE = 1 in lwipopts.h, otherwise the code below will compile but - // won't work! (setsockopt will return EINVAL) - MG_ERROR(("setsockopt(SO_REUSEADDR): %d", MG_SOCK_ERR(rc))); -#endif -#if MG_IPV6_V6ONLY - // Bind only to the V6 address, not V4 address on this port - } else if (c->loc.is_ip6 && - (rc = setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &on, - sizeof(on))) != 0) { - // See #2089. Allow to bind v4 and v6 sockets on the same port - MG_ERROR(("setsockopt(IPV6_V6ONLY): %d", MG_SOCK_ERR(rc))); -#endif - } else if ((rc = bind(fd, &usa.sa, slen)) != 0) { - MG_ERROR(("bind: %d", MG_SOCK_ERR(rc))); - } else if ((type == SOCK_STREAM && - (rc = listen(fd, MG_SOCK_LISTEN_BACKLOG_SIZE)) != 0)) { - // NOTE(lsm): FreeRTOS uses backlog value as a connection limit - // In case port was set to 0, get the real port number - MG_ERROR(("listen: %d", MG_SOCK_ERR(rc))); - } else { - setlocaddr(fd, &c->loc); - mg_set_non_blocking_mode(fd); - c->fd = S2PTR(fd); - MG_EPOLL_ADD(c); - success = true; - } - } - if (success == false && fd != MG_INVALID_SOCKET) closesocket(fd); - return success; -} - -static long recv_raw(struct mg_connection *c, void *buf, size_t len) { - long n = 0; - if (c->is_udp) { - union usa usa; - socklen_t slen = tousa(&c->rem, &usa); - n = recvfrom(FD(c), (char *) buf, len, 0, &usa.sa, &slen); - if (n > 0) tomgaddr(&usa, &c->rem, slen != sizeof(usa.sin)); - } else { - n = recv(FD(c), (char *) buf, len, MSG_NONBLOCKING); - } - MG_VERBOSE(("%lu %ld %d", c->id, n, MG_SOCK_ERR(n))); - if (MG_SOCK_PENDING(n)) return MG_IO_WAIT; - if (MG_SOCK_RESET(n)) return MG_IO_RESET; - if (n <= 0) return MG_IO_ERR; - return n; -} - -static bool ioalloc(struct mg_connection *c, struct mg_iobuf *io) { - bool res = false; - if (io->len >= MG_MAX_RECV_SIZE) { - mg_error(c, "MG_MAX_RECV_SIZE"); - } else if (io->size <= io->len && - !mg_iobuf_resize(io, io->size + MG_IO_SIZE)) { - mg_error(c, "OOM"); - } else { - res = true; - } - return res; -} - -// NOTE(lsm): do only one iteration of reads, cause some systems -// (e.g. FreeRTOS stack) return 0 instead of -1/EWOULDBLOCK when no data -static void read_conn(struct mg_connection *c) { - if (ioalloc(c, &c->recv)) { - char *buf = (char *) &c->recv.buf[c->recv.len]; - size_t len = c->recv.size - c->recv.len; - long n = -1; - if (c->is_tls) { - if (!ioalloc(c, &c->rtls)) return; - n = recv_raw(c, (char *) &c->rtls.buf[c->rtls.len], - c->rtls.size - c->rtls.len); - if (n == MG_IO_ERR && c->rtls.len == 0) { - // Close only if we have fully drained both raw (rtls) and TLS buffers - c->is_closing = 1; - } else { - if (n > 0) c->rtls.len += (size_t) n; - if (c->is_tls_hs) mg_tls_handshake(c); - if (c->is_tls_hs) return; - n = mg_tls_recv(c, buf, len); - } - } else { - n = recv_raw(c, buf, len); - } - MG_DEBUG(("%lu %p snd %ld/%ld rcv %ld/%ld n=%ld err=%d", c->id, c->fd, - (long) c->send.len, (long) c->send.size, (long) c->recv.len, - (long) c->recv.size, n, MG_SOCK_ERR(n))); - iolog(c, buf, n, true); - } -} - -static void write_conn(struct mg_connection *c) { - char *buf = (char *) c->send.buf; - size_t len = c->send.len; - long n = c->is_tls ? mg_tls_send(c, buf, len) : mg_io_send(c, buf, len); - MG_DEBUG(("%lu %ld snd %ld/%ld rcv %ld/%ld n=%ld err=%d", c->id, c->fd, - (long) c->send.len, (long) c->send.size, (long) c->recv.len, - (long) c->recv.size, n, MG_SOCK_ERR(n))); - iolog(c, buf, n, false); -} - -static void close_conn(struct mg_connection *c) { - if (FD(c) != MG_INVALID_SOCKET) { -#if MG_ENABLE_EPOLL - epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_DEL, FD(c), NULL); -#endif - closesocket(FD(c)); -#if MG_ENABLE_FREERTOS_TCP - FreeRTOS_FD_CLR(c->fd, c->mgr->ss, eSELECT_ALL); -#endif - } - mg_close_conn(c); -} - -static void connect_conn(struct mg_connection *c) { - union usa usa; - socklen_t n = sizeof(usa); - // Use getpeername() to test whether we have connected - if (getpeername(FD(c), &usa.sa, &n) == 0) { - c->is_connecting = 0; - setlocaddr(FD(c), &c->loc); - mg_call(c, MG_EV_CONNECT, NULL); - MG_EPOLL_MOD(c, 0); - if (c->is_tls_hs) mg_tls_handshake(c); - } else { - mg_error(c, "socket error"); - } -} - -static void setsockopts(struct mg_connection *c) { -#if MG_ENABLE_FREERTOS_TCP || MG_ARCH == MG_ARCH_AZURERTOS || \ - MG_ARCH == MG_ARCH_TIRTOS - (void) c; -#else - int on = 1; -#if !defined(SOL_TCP) -#define SOL_TCP IPPROTO_TCP -#endif - if (setsockopt(FD(c), SOL_TCP, TCP_NODELAY, (char *) &on, sizeof(on)) != 0) - (void) 0; - if (setsockopt(FD(c), SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof(on)) != - 0) - (void) 0; -#endif -} - -void mg_connect_resolved(struct mg_connection *c) { - int type = c->is_udp ? SOCK_DGRAM : SOCK_STREAM; - int rc, af = c->rem.is_ip6 ? AF_INET6 : AF_INET; // c->rem has resolved IP - c->fd = S2PTR(socket(af, type, 0)); // Create outbound socket - c->is_resolving = 0; // Clear resolving flag - if (FD(c) == MG_INVALID_SOCKET) { - mg_error(c, "socket(): %d", MG_SOCK_ERR(-1)); - } else if (c->is_udp) { - MG_EPOLL_ADD(c); -#if MG_ARCH == MG_ARCH_TIRTOS - union usa usa; // TI-RTOS NDK requires binding to receive on UDP sockets - socklen_t slen = tousa(&c->loc, &usa); - if ((rc = bind(c->fd, &usa.sa, slen)) != 0) - MG_ERROR(("bind: %d", MG_SOCK_ERR(rc))); -#endif - setlocaddr(FD(c), &c->loc); - mg_call(c, MG_EV_RESOLVE, NULL); - mg_call(c, MG_EV_CONNECT, NULL); - } else { - union usa usa; - socklen_t slen = tousa(&c->rem, &usa); - mg_set_non_blocking_mode(FD(c)); - setsockopts(c); - MG_EPOLL_ADD(c); - mg_call(c, MG_EV_RESOLVE, NULL); - rc = connect(FD(c), &usa.sa, slen); // Attempt to connect - if (rc == 0) { // Success - setlocaddr(FD(c), &c->loc); - mg_call(c, MG_EV_CONNECT, NULL); // Send MG_EV_CONNECT to the user - } else if (MG_SOCK_PENDING(rc)) { // Need to wait for TCP handshake - MG_DEBUG(("%lu %ld -> %M pend", c->id, c->fd, mg_print_ip_port, &c->rem)); - c->is_connecting = 1; - } else { - mg_error(c, "connect: %d", MG_SOCK_ERR(rc)); - } - } -} - -static MG_SOCKET_TYPE raccept(MG_SOCKET_TYPE sock, union usa *usa, - socklen_t *len) { - MG_SOCKET_TYPE fd = MG_INVALID_SOCKET; - do { - memset(usa, 0, sizeof(*usa)); - fd = accept(sock, &usa->sa, len); - } while (MG_SOCK_INTR(fd)); - return fd; -} - -static void accept_conn(struct mg_mgr *mgr, struct mg_connection *lsn) { - struct mg_connection *c = NULL; - union usa usa; - socklen_t sa_len = sizeof(usa); - MG_SOCKET_TYPE fd = raccept(FD(lsn), &usa, &sa_len); - if (fd == MG_INVALID_SOCKET) { -#if MG_ARCH == MG_ARCH_AZURERTOS || defined(__ECOS) - // AzureRTOS, in non-block socket mode can mark listening socket readable - // even it is not. See comment for 'select' func implementation in - // nx_bsd.c That's not an error, just should try later - if (errno != EAGAIN) -#endif - MG_ERROR(("%lu accept failed, errno %d", lsn->id, MG_SOCK_ERR(-1))); -#if (MG_ARCH != MG_ARCH_WIN32) && !MG_ENABLE_FREERTOS_TCP && \ - (MG_ARCH != MG_ARCH_TIRTOS) && !MG_ENABLE_POLL && !MG_ENABLE_EPOLL - } else if ((long) fd >= FD_SETSIZE) { - MG_ERROR(("%ld > %ld", (long) fd, (long) FD_SETSIZE)); - closesocket(fd); -#endif - } else if ((c = mg_alloc_conn(mgr)) == NULL) { - MG_ERROR(("%lu OOM", lsn->id)); - closesocket(fd); - } else { - tomgaddr(&usa, &c->rem, sa_len != sizeof(usa.sin)); - LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c); - c->fd = S2PTR(fd); - MG_EPOLL_ADD(c); - mg_set_non_blocking_mode(FD(c)); - setsockopts(c); - c->is_accepted = 1; - c->is_hexdumping = lsn->is_hexdumping; - c->loc = lsn->loc; - c->pfn = lsn->pfn; - c->pfn_data = lsn->pfn_data; - c->fn = lsn->fn; - c->fn_data = lsn->fn_data; - MG_DEBUG(("%lu %ld accepted %M -> %M", c->id, c->fd, mg_print_ip_port, - &c->rem, mg_print_ip_port, &c->loc)); - mg_call(c, MG_EV_OPEN, NULL); - mg_call(c, MG_EV_ACCEPT, NULL); - } -} - -static bool can_read(const struct mg_connection *c) { - return c->is_full == false; -} - -static bool can_write(const struct mg_connection *c) { - return c->is_connecting || (c->send.len > 0 && c->is_tls_hs == 0); -} - -static bool skip_iotest(const struct mg_connection *c) { - return (c->is_closing || c->is_resolving || FD(c) == MG_INVALID_SOCKET) || - (can_read(c) == false && can_write(c) == false); -} - -static void mg_iotest(struct mg_mgr *mgr, int ms) { -#if MG_ENABLE_FREERTOS_TCP - struct mg_connection *c; - for (c = mgr->conns; c != NULL; c = c->next) { - c->is_readable = c->is_writable = 0; - if (skip_iotest(c)) continue; - if (can_read(c)) - FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_READ | eSELECT_EXCEPT); - if (can_write(c)) FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_WRITE); - if (c->is_closing) ms = 1; - } - FreeRTOS_select(mgr->ss, pdMS_TO_TICKS(ms)); - for (c = mgr->conns; c != NULL; c = c->next) { - EventBits_t bits = FreeRTOS_FD_ISSET(c->fd, mgr->ss); - c->is_readable = bits & (eSELECT_READ | eSELECT_EXCEPT) ? 1U : 0; - c->is_writable = bits & eSELECT_WRITE ? 1U : 0; - if (c->fd != MG_INVALID_SOCKET) - FreeRTOS_FD_CLR(c->fd, mgr->ss, - eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE); - } -#elif MG_ENABLE_EPOLL - size_t max = 1; - for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) { - c->is_readable = c->is_writable = 0; - if (c->rtls.len > 0) ms = 1, c->is_readable = 1; - if (can_write(c)) MG_EPOLL_MOD(c, 1); - if (c->is_closing) ms = 1; - max++; - } - struct epoll_event *evs = (struct epoll_event *) alloca(max * sizeof(evs[0])); - int n = epoll_wait(mgr->epoll_fd, evs, (int) max, ms); - for (int i = 0; i < n; i++) { - struct mg_connection *c = (struct mg_connection *) evs[i].data.ptr; - if (evs[i].events & EPOLLERR) { - mg_error(c, "socket error"); - } else if (c->is_readable == 0) { - bool rd = evs[i].events & (EPOLLIN | EPOLLHUP); - bool wr = evs[i].events & EPOLLOUT; - c->is_readable = can_read(c) && rd ? 1U : 0; - c->is_writable = can_write(c) && wr ? 1U : 0; - if (c->rtls.len > 0) c->is_readable = 1; - } - } - (void) skip_iotest; -#elif MG_ENABLE_POLL - nfds_t n = 0; - for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) n++; - struct pollfd *fds = (struct pollfd *) alloca(n * sizeof(fds[0])); - memset(fds, 0, n * sizeof(fds[0])); - n = 0; - for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) { - c->is_readable = c->is_writable = 0; - if (skip_iotest(c)) { - // Socket not valid, ignore - } else if (c->rtls.len > 0) { - ms = 1; // Don't wait if TLS is ready - } else { - fds[n].fd = FD(c); - if (can_read(c)) fds[n].events |= POLLIN; - if (can_write(c)) fds[n].events |= POLLOUT; - if (c->is_closing) ms = 1; - n++; - } - } - - // MG_INFO(("poll n=%d ms=%d", (int) n, ms)); - if (poll(fds, n, ms) < 0) { -#if MG_ARCH == MG_ARCH_WIN32 - if (n == 0) Sleep(ms); // On Windows, poll fails if no sockets -#endif - memset(fds, 0, n * sizeof(fds[0])); - } - n = 0; - for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) { - if (skip_iotest(c)) { - // Socket not valid, ignore - } else if (c->rtls.len > 0) { - c->is_readable = 1; - } else { - if (fds[n].revents & POLLERR) { - mg_error(c, "socket error"); - } else { - c->is_readable = - (unsigned) (fds[n].revents & (POLLIN | POLLHUP) ? 1 : 0); - c->is_writable = (unsigned) (fds[n].revents & POLLOUT ? 1 : 0); - if (c->rtls.len > 0) c->is_readable = 1; - } - n++; - } - } -#else - struct timeval tv = {ms / 1000, (ms % 1000) * 1000}, tv_zero = {0, 0}, *tvp; - struct mg_connection *c; - fd_set rset, wset, eset; - MG_SOCKET_TYPE maxfd = 0; - int rc; - - FD_ZERO(&rset); - FD_ZERO(&wset); - FD_ZERO(&eset); - tvp = ms < 0 ? NULL : &tv; - for (c = mgr->conns; c != NULL; c = c->next) { - c->is_readable = c->is_writable = 0; - if (skip_iotest(c)) continue; - FD_SET(FD(c), &eset); - if (can_read(c)) FD_SET(FD(c), &rset); - if (can_write(c)) FD_SET(FD(c), &wset); - if (c->rtls.len > 0) tvp = &tv_zero; - if (FD(c) > maxfd) maxfd = FD(c); - if (c->is_closing) ms = 1; - } - - if ((rc = select((int) maxfd + 1, &rset, &wset, &eset, tvp)) < 0) { -#if MG_ARCH == MG_ARCH_WIN32 - if (maxfd == 0) Sleep(ms); // On Windows, select fails if no sockets -#else - MG_ERROR(("select: %d %d", rc, MG_SOCK_ERR(rc))); -#endif - FD_ZERO(&rset); - FD_ZERO(&wset); - FD_ZERO(&eset); - } - - for (c = mgr->conns; c != NULL; c = c->next) { - if (FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &eset)) { - mg_error(c, "socket error"); - } else { - c->is_readable = FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &rset); - c->is_writable = FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &wset); - if (c->rtls.len > 0) c->is_readable = 1; - } - } -#endif -} - -static bool mg_socketpair(MG_SOCKET_TYPE sp[2], union usa usa[2]) { - socklen_t n = sizeof(usa[0].sin); - bool success = false; - - sp[0] = sp[1] = MG_INVALID_SOCKET; - (void) memset(&usa[0], 0, sizeof(usa[0])); - usa[0].sin.sin_family = AF_INET; - *(uint32_t *) &usa->sin.sin_addr = mg_htonl(0x7f000001U); // 127.0.0.1 - usa[1] = usa[0]; - - if ((sp[0] = socket(AF_INET, SOCK_DGRAM, 0)) != MG_INVALID_SOCKET && - (sp[1] = socket(AF_INET, SOCK_DGRAM, 0)) != MG_INVALID_SOCKET && - bind(sp[0], &usa[0].sa, n) == 0 && // - bind(sp[1], &usa[1].sa, n) == 0 && // - getsockname(sp[0], &usa[0].sa, &n) == 0 && // - getsockname(sp[1], &usa[1].sa, &n) == 0 && // - connect(sp[0], &usa[1].sa, n) == 0 && // - connect(sp[1], &usa[0].sa, n) == 0) { // - success = true; - } - if (!success) { - if (sp[0] != MG_INVALID_SOCKET) closesocket(sp[0]); - if (sp[1] != MG_INVALID_SOCKET) closesocket(sp[1]); - sp[0] = sp[1] = MG_INVALID_SOCKET; - } - return success; -} - -// mg_wakeup() event handler -static void wufn(struct mg_connection *c, int ev, void *ev_data) { - if (ev == MG_EV_READ) { - unsigned long *id = (unsigned long *) c->recv.buf; - // MG_INFO(("Got data")); - // mg_hexdump(c->recv.buf, c->recv.len); - if (c->recv.len >= sizeof(*id)) { - struct mg_connection *t; - for (t = c->mgr->conns; t != NULL; t = t->next) { - if (t->id == *id) { - struct mg_str data = mg_str_n((char *) c->recv.buf + sizeof(*id), - c->recv.len - sizeof(*id)); - mg_call(t, MG_EV_WAKEUP, &data); - } - } - } - c->recv.len = 0; // Consume received data - } else if (ev == MG_EV_CLOSE) { - closesocket(c->mgr->pipe); // When we're closing, close the other - c->mgr->pipe = MG_INVALID_SOCKET; // side of the socketpair, too - } - (void) ev_data; -} - -bool mg_wakeup_init(struct mg_mgr *mgr) { - bool ok = false; - if (mgr->pipe == MG_INVALID_SOCKET) { - union usa usa[2]; - MG_SOCKET_TYPE sp[2] = {MG_INVALID_SOCKET, MG_INVALID_SOCKET}; - struct mg_connection *c = NULL; - if (!mg_socketpair(sp, usa)) { - MG_ERROR(("Cannot create socket pair")); - } else if ((c = mg_wrapfd(mgr, (int) sp[1], wufn, NULL)) == NULL) { - closesocket(sp[0]); - closesocket(sp[1]); - sp[0] = sp[1] = MG_INVALID_SOCKET; - } else { - tomgaddr(&usa[0], &c->rem, false); - MG_DEBUG(("%lu %p pipe %lu", c->id, c->fd, (unsigned long) sp[0])); - mgr->pipe = sp[0]; - ok = true; - } - } - return ok; -} - -bool mg_wakeup(struct mg_mgr *mgr, unsigned long conn_id, const void *buf, - size_t len) { - if (mgr->pipe != MG_INVALID_SOCKET && conn_id > 0) { - char *extended_buf = (char *) alloca(len + sizeof(conn_id)); - memcpy(extended_buf, &conn_id, sizeof(conn_id)); - memcpy(extended_buf + sizeof(conn_id), buf, len); - send(mgr->pipe, extended_buf, len + sizeof(conn_id), MSG_NONBLOCKING); - return true; - } - return false; -} - -void mg_mgr_poll(struct mg_mgr *mgr, int ms) { - struct mg_connection *c, *tmp; - uint64_t now; - - mg_iotest(mgr, ms); - now = mg_millis(); - mg_timer_poll(&mgr->timers, now); - - for (c = mgr->conns; c != NULL; c = tmp) { - bool is_resp = c->is_resp; - tmp = c->next; - mg_call(c, MG_EV_POLL, &now); - if (is_resp && !c->is_resp) { - long n = 0; - mg_call(c, MG_EV_READ, &n); - } - MG_VERBOSE(("%lu %c%c %c%c%c%c%c %lu %lu", c->id, - c->is_readable ? 'r' : '-', c->is_writable ? 'w' : '-', - c->is_tls ? 'T' : 't', c->is_connecting ? 'C' : 'c', - c->is_tls_hs ? 'H' : 'h', c->is_resolving ? 'R' : 'r', - c->is_closing ? 'C' : 'c', mg_tls_pending(c), c->rtls.len)); - if (c->is_resolving || c->is_closing) { - // Do nothing - } else if (c->is_listening && c->is_udp == 0) { - if (c->is_readable) accept_conn(mgr, c); - } else if (c->is_connecting) { - if (c->is_readable || c->is_writable) connect_conn(c); - //} else if (c->is_tls_hs) { - // if ((c->is_readable || c->is_writable)) mg_tls_handshake(c); - } else { - if (c->is_readable) read_conn(c); - if (c->is_writable) write_conn(c); - } - - if (c->is_draining && c->send.len == 0) c->is_closing = 1; - if (c->is_closing) close_conn(c); - } -} -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/ssi.c" -#endif - - - - -#ifndef MG_MAX_SSI_DEPTH -#define MG_MAX_SSI_DEPTH 5 -#endif - -#ifndef MG_SSI_BUFSIZ -#define MG_SSI_BUFSIZ 1024 -#endif - -#if MG_ENABLE_SSI -static char *mg_ssi(const char *path, const char *root, int depth) { - struct mg_iobuf b = {NULL, 0, 0, MG_IO_SIZE}; - FILE *fp = fopen(path, "rb"); - if (fp != NULL) { - char buf[MG_SSI_BUFSIZ], arg[sizeof(buf)]; - int ch, intag = 0; - size_t len = 0; - buf[0] = arg[0] = '\0'; - while ((ch = fgetc(fp)) != EOF) { - if (intag && ch == '>' && buf[len - 1] == '-' && buf[len - 2] == '-') { - buf[len++] = (char) (ch & 0xff); - buf[len] = '\0'; - if (sscanf(buf, " %#x %#x", s_txdesc[s_txno][1], tsr)); - if (!(s_txdesc[s_txno][1] & MG_BIT(31))) s_txdesc[s_txno][1] |= MG_BIT(31); - } - - GMAC_REGS->GMAC_RSR = rsr; - GMAC_REGS->GMAC_TSR = tsr; -} - -struct mg_tcpip_driver mg_tcpip_driver_same54 = { - mg_tcpip_driver_same54_init, mg_tcpip_driver_same54_tx, NULL, - mg_tcpip_driver_same54_up}; -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/drivers/stm32f.c" -#endif - - -#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \ - MG_ENABLE_DRIVER_STM32F -struct stm32f_eth { - volatile uint32_t MACCR, MACFFR, MACHTHR, MACHTLR, MACMIIAR, MACMIIDR, MACFCR, - MACVLANTR, RESERVED0[2], MACRWUFFR, MACPMTCSR, RESERVED1, MACDBGR, MACSR, - MACIMR, MACA0HR, MACA0LR, MACA1HR, MACA1LR, MACA2HR, MACA2LR, MACA3HR, - MACA3LR, RESERVED2[40], MMCCR, MMCRIR, MMCTIR, MMCRIMR, MMCTIMR, - RESERVED3[14], MMCTGFSCCR, MMCTGFMSCCR, RESERVED4[5], MMCTGFCR, - RESERVED5[10], MMCRFCECR, MMCRFAECR, RESERVED6[10], MMCRGUFCR, - RESERVED7[334], PTPTSCR, PTPSSIR, PTPTSHR, PTPTSLR, PTPTSHUR, PTPTSLUR, - PTPTSAR, PTPTTHR, PTPTTLR, RESERVED8, PTPTSSR, PTPPPSCR, RESERVED9[564], - DMABMR, DMATPDR, DMARPDR, DMARDLAR, DMATDLAR, DMASR, DMAOMR, DMAIER, - DMAMFBOCR, DMARSWTR, RESERVED10[8], DMACHTDR, DMACHRDR, DMACHTBAR, - DMACHRBAR; -}; -#undef ETH -#define ETH ((struct stm32f_eth *) (uintptr_t) 0x40028000) - -#define ETH_PKT_SIZE 1540 // Max frame size -#define ETH_DESC_CNT 4 // Descriptors count -#define ETH_DS 4 // Descriptor size (words) - -static uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS]; // RX descriptors -static uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS]; // TX descriptors -static uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE]; // RX ethernet buffers -static uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE]; // TX ethernet buffers -static uint8_t s_txno; // Current TX descriptor -static uint8_t s_rxno; // Current RX descriptor - -static struct mg_tcpip_if *s_ifp; // MIP interface -enum { - MG_PHYREG_BCR = 0, - MG_PHYREG_BSR = 1, - MG_PHYREG_ID1 = 2, - MG_PHYREG_ID2 = 3, - MG_PHYREG_CSCR = 31 -}; - -static uint32_t eth_read_phy(uint8_t addr, uint8_t reg) { - ETH->MACMIIAR &= (7 << 2); - ETH->MACMIIAR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6); - ETH->MACMIIAR |= MG_BIT(0); - while (ETH->MACMIIAR & MG_BIT(0)) (void) 0; - return ETH->MACMIIDR; -} - -static void eth_write_phy(uint8_t addr, uint8_t reg, uint32_t val) { - ETH->MACMIIDR = val; - ETH->MACMIIAR &= (7 << 2); - ETH->MACMIIAR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6) | MG_BIT(1); - ETH->MACMIIAR |= MG_BIT(0); - while (ETH->MACMIIAR & MG_BIT(0)) (void) 0; -} - -static uint32_t get_hclk(void) { - struct rcc { - volatile uint32_t CR, PLLCFGR, CFGR; - } *rcc = (struct rcc *) 0x40023800; - uint32_t clk = 0, hsi = 16000000 /* 16 MHz */, hse = 8000000 /* 8MHz */; - - if (rcc->CFGR & (1 << 2)) { - clk = hse; - } else if (rcc->CFGR & (1 << 3)) { - uint32_t vco, m, n, p; - m = (rcc->PLLCFGR & (0x3f << 0)) >> 0; - n = (rcc->PLLCFGR & (0x1ff << 6)) >> 6; - p = (((rcc->PLLCFGR & (3 << 16)) >> 16) + 1) * 2; - clk = (rcc->PLLCFGR & (1 << 22)) ? hse : hsi; - vco = (uint32_t) ((uint64_t) clk * n / m); - clk = vco / p; - } else { - clk = hsi; - } - uint32_t hpre = (rcc->CFGR & (15 << 4)) >> 4; - if (hpre < 8) return clk; - - uint8_t ahbptab[8] = {1, 2, 3, 4, 6, 7, 8, 9}; // log2(div) - return ((uint32_t) clk) >> ahbptab[hpre - 8]; -} - -// Guess CR from HCLK. MDC clock is generated from HCLK (AHB); as per 802.3, -// it must not exceed 2.5MHz As the AHB clock can be (and usually is) derived -// from the HSI (internal RC), and it can go above specs, the datasheets -// specify a range of frequencies and activate one of a series of dividers to -// keep the MDC clock safely below 2.5MHz. We guess a divider setting based on -// HCLK with a +5% drift. If the user uses a different clock from our -// defaults, needs to set the macros on top Valid for STM32F74xxx/75xxx -// (38.8.1) and STM32F42xxx/43xxx (33.8.1) (both 4.5% worst case drift) -static int guess_mdc_cr(void) { - uint8_t crs[] = {2, 3, 0, 1, 4, 5}; // ETH->MACMIIAR::CR values - uint8_t div[] = {16, 26, 42, 62, 102, 124}; // Respective HCLK dividers - uint32_t hclk = get_hclk(); // Guess system HCLK - int result = -1; // Invalid CR value - if (hclk < 25000000) { - MG_ERROR(("HCLK too low")); - } else { - for (int i = 0; i < 6; i++) { - if (hclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) { - result = crs[i]; - break; - } - } - if (result < 0) MG_ERROR(("HCLK too high")); - } - MG_DEBUG(("HCLK: %u, CR: %d", hclk, result)); - return result; -} - -static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { - struct mg_tcpip_driver_stm32f_data *d = - (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data; - uint8_t phy_addr = d == NULL ? 0 : d->phy_addr; - s_ifp = ifp; - - // Init RX descriptors - for (int i = 0; i < ETH_DESC_CNT; i++) { - s_rxdesc[i][0] = MG_BIT(31); // Own - s_rxdesc[i][1] = sizeof(s_rxbuf[i]) | MG_BIT(14); // 2nd address chained - s_rxdesc[i][2] = (uint32_t) (uintptr_t) s_rxbuf[i]; // Point to data buffer - s_rxdesc[i][3] = - (uint32_t) (uintptr_t) s_rxdesc[(i + 1) % ETH_DESC_CNT]; // Chain - } - - // Init TX descriptors - for (int i = 0; i < ETH_DESC_CNT; i++) { - s_txdesc[i][2] = (uint32_t) (uintptr_t) s_txbuf[i]; // Buf pointer - s_txdesc[i][3] = - (uint32_t) (uintptr_t) s_txdesc[(i + 1) % ETH_DESC_CNT]; // Chain - } - - ETH->DMABMR |= MG_BIT(0); // Software reset - while ((ETH->DMABMR & MG_BIT(0)) != 0) (void) 0; // Wait until done - - // Set MDC clock divider. If user told us the value, use it. Otherwise, guess - int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr; - ETH->MACMIIAR = ((uint32_t) cr & 7) << 2; - - // NOTE(cpq): we do not use extended descriptor bit 7, and do not use - // hardware checksum. Therefore, descriptor size is 4, not 8 - // ETH->DMABMR = MG_BIT(13) | MG_BIT(16) | MG_BIT(22) | MG_BIT(23) | - // MG_BIT(25); - ETH->MACIMR = MG_BIT(3) | MG_BIT(9); // Mask timestamp & PMT IT - ETH->MACFCR = MG_BIT(7); // Disable zero quarta pause - // ETH->MACFFR = MG_BIT(31); // Receive all - eth_write_phy(phy_addr, MG_PHYREG_BCR, MG_BIT(15)); // Reset PHY - eth_write_phy(phy_addr, MG_PHYREG_BCR, MG_BIT(12)); // Set autonegotiation - ETH->DMARDLAR = (uint32_t) (uintptr_t) s_rxdesc; // RX descriptors - ETH->DMATDLAR = (uint32_t) (uintptr_t) s_txdesc; // RX descriptors - ETH->DMAIER = MG_BIT(6) | MG_BIT(16); // RIE, NISE - ETH->MACCR = - MG_BIT(2) | MG_BIT(3) | MG_BIT(11) | MG_BIT(14); // RE, TE, Duplex, Fast - ETH->DMAOMR = - MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25); // SR, ST, TSF, RSF - - MG_DEBUG(("PHY ID: %#04hx %#04hx", eth_read_phy(phy_addr, MG_PHYREG_ID1), - eth_read_phy(phy_addr, MG_PHYREG_ID2))); - - // MAC address filtering - ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4]; - ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) | - ((uint32_t) ifp->mac[2] << 16) | - ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0]; - return true; -} - -static size_t mg_tcpip_driver_stm32f_tx(const void *buf, size_t len, - struct mg_tcpip_if *ifp) { - if (len > sizeof(s_txbuf[s_txno])) { - MG_ERROR(("Frame too big, %ld", (long) len)); - len = 0; // Frame is too big - } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) { - ifp->nerr++; - MG_ERROR(("No free descriptors")); - // printf("D0 %lx SR %lx\n", (long) s_txdesc[0][0], (long) ETH->DMASR); - len = 0; // All descriptors are busy, fail - } else { - memcpy(s_txbuf[s_txno], buf, len); // Copy data - s_txdesc[s_txno][1] = (uint32_t) len; // Set data len - s_txdesc[s_txno][0] = MG_BIT(20) | MG_BIT(28) | MG_BIT(29); // Chain,FS,LS - s_txdesc[s_txno][0] |= MG_BIT(31); // Set OWN bit - let DMA take over - if (++s_txno >= ETH_DESC_CNT) s_txno = 0; - } - MG_DSB(); // ensure descriptors have been written - ETH->DMASR = MG_BIT(2) | MG_BIT(5); // Clear any prior TBUS/TUS - ETH->DMATPDR = 0; // and resume - return len; -} - -static bool mg_tcpip_driver_stm32f_up(struct mg_tcpip_if *ifp) { - struct mg_tcpip_driver_stm32f_data *d = - (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data; - uint8_t phy_addr = d == NULL ? 0 : d->phy_addr; - uint32_t bsr = eth_read_phy(phy_addr, MG_PHYREG_BSR); - bool up = bsr & MG_BIT(2) ? 1 : 0; - if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) { // link state just went up - uint32_t scsr = eth_read_phy(phy_addr, MG_PHYREG_CSCR); - // tmp = reg with flags set to the most likely situation: 100M full-duplex - // if(link is slow or half) set flags otherwise - // reg = tmp - uint32_t maccr = ETH->MACCR | MG_BIT(14) | MG_BIT(11); // 100M, Full-duplex - if ((scsr & MG_BIT(3)) == 0) maccr &= ~MG_BIT(14); // 10M - if ((scsr & MG_BIT(4)) == 0) maccr &= ~MG_BIT(11); // Half-duplex - ETH->MACCR = maccr; // IRQ handler does not fiddle with this register - MG_DEBUG(("Link is %uM %s-duplex", maccr & MG_BIT(14) ? 100 : 10, - maccr & MG_BIT(11) ? "full" : "half")); - } - return up; -} - -#ifdef __riscv -__attribute__((interrupt())) // For RISCV CH32V307, which share the same MAC -#endif -void ETH_IRQHandler(void); -void ETH_IRQHandler(void) { - if (ETH->DMASR & MG_BIT(6)) { // Frame received, loop - ETH->DMASR = MG_BIT(16) | MG_BIT(6); // Clear flag - for (uint32_t i = 0; i < 10; i++) { // read as they arrive but not forever - if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break; // exit when done - if (((s_rxdesc[s_rxno][0] & (MG_BIT(8) | MG_BIT(9))) == - (MG_BIT(8) | MG_BIT(9))) && - !(s_rxdesc[s_rxno][0] & MG_BIT(15))) { // skip partial/errored frames - uint32_t len = ((s_rxdesc[s_rxno][0] >> 16) & (MG_BIT(14) - 1)); - // printf("%lx %lu %lx %.8lx\n", s_rxno, len, s_rxdesc[s_rxno][0], - // ETH->DMASR); - mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp); - } - s_rxdesc[s_rxno][0] = MG_BIT(31); - if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0; - } - } - // Cleanup flags - ETH->DMASR = MG_BIT(16) // NIS, normal interrupt summary - | MG_BIT(7); // Clear possible RBUS while processing - ETH->DMARPDR = 0; // and resume RX -} - -struct mg_tcpip_driver mg_tcpip_driver_stm32f = { - mg_tcpip_driver_stm32f_init, mg_tcpip_driver_stm32f_tx, NULL, - mg_tcpip_driver_stm32f_up}; -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/drivers/stm32h.c" -#endif - - -#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32H) && \ - MG_ENABLE_DRIVER_STM32H -struct stm32h_eth { - volatile uint32_t MACCR, MACECR, MACPFR, MACWTR, MACHT0R, MACHT1R, - RESERVED1[14], MACVTR, RESERVED2, MACVHTR, RESERVED3, MACVIR, MACIVIR, - RESERVED4[2], MACTFCR, RESERVED5[7], MACRFCR, RESERVED6[7], MACISR, - MACIER, MACRXTXSR, RESERVED7, MACPCSR, MACRWKPFR, RESERVED8[2], MACLCSR, - MACLTCR, MACLETR, MAC1USTCR, RESERVED9[12], MACVR, MACDR, RESERVED10, - MACHWF0R, MACHWF1R, MACHWF2R, RESERVED11[54], MACMDIOAR, MACMDIODR, - RESERVED12[2], MACARPAR, RESERVED13[59], MACA0HR, MACA0LR, MACA1HR, - MACA1LR, MACA2HR, MACA2LR, MACA3HR, MACA3LR, RESERVED14[248], MMCCR, - MMCRIR, MMCTIR, MMCRIMR, MMCTIMR, RESERVED15[14], MMCTSCGPR, MMCTMCGPR, - RESERVED16[5], MMCTPCGR, RESERVED17[10], MMCRCRCEPR, MMCRAEPR, - RESERVED18[10], MMCRUPGR, RESERVED19[9], MMCTLPIMSTR, MMCTLPITCR, - MMCRLPIMSTR, MMCRLPITCR, RESERVED20[65], MACL3L4C0R, MACL4A0R, - RESERVED21[2], MACL3A0R0R, MACL3A1R0R, MACL3A2R0R, MACL3A3R0R, - RESERVED22[4], MACL3L4C1R, MACL4A1R, RESERVED23[2], MACL3A0R1R, - MACL3A1R1R, MACL3A2R1R, MACL3A3R1R, RESERVED24[108], MACTSCR, MACSSIR, - MACSTSR, MACSTNR, MACSTSUR, MACSTNUR, MACTSAR, RESERVED25, MACTSSR, - RESERVED26[3], MACTTSSNR, MACTTSSSR, RESERVED27[2], MACACR, RESERVED28, - MACATSNR, MACATSSR, MACTSIACR, MACTSEACR, MACTSICNR, MACTSECNR, - RESERVED29[4], MACPPSCR, RESERVED30[3], MACPPSTTSR, MACPPSTTNR, MACPPSIR, - MACPPSWR, RESERVED31[12], MACPOCR, MACSPI0R, MACSPI1R, MACSPI2R, MACLMIR, - RESERVED32[11], MTLOMR, RESERVED33[7], MTLISR, RESERVED34[55], MTLTQOMR, - MTLTQUR, MTLTQDR, RESERVED35[8], MTLQICSR, MTLRQOMR, MTLRQMPOCR, MTLRQDR, - RESERVED36[177], DMAMR, DMASBMR, DMAISR, DMADSR, RESERVED37[60], DMACCR, - DMACTCR, DMACRCR, RESERVED38[2], DMACTDLAR, RESERVED39, DMACRDLAR, - DMACTDTPR, RESERVED40, DMACRDTPR, DMACTDRLR, DMACRDRLR, DMACIER, - DMACRIWTR, DMACSFCSR, RESERVED41, DMACCATDR, RESERVED42, DMACCARDR, - RESERVED43, DMACCATBR, RESERVED44, DMACCARBR, DMACSR, RESERVED45[2], - DMACMFCR; -}; -#undef ETH -#define ETH \ - ((struct stm32h_eth *) (uintptr_t) (0x40000000UL + 0x00020000UL + 0x8000UL)) - -#define ETH_PKT_SIZE 1540 // Max frame size -#define ETH_DESC_CNT 4 // Descriptors count -#define ETH_DS 4 // Descriptor size (words) - -static volatile uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS]; // RX descriptors -static volatile uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS]; // TX descriptors -static uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE]; // RX ethernet buffers -static uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE]; // TX ethernet buffers -static struct mg_tcpip_if *s_ifp; // MIP interface -enum { - MG_PHY_ADDR = 0, - MG_PHYREG_BCR = 0, - MG_PHYREG_BSR = 1, - MG_PHYREG_CSCR = 31 -}; // PHY constants - -static uint32_t eth_read_phy(uint8_t addr, uint8_t reg) { - ETH->MACMDIOAR &= (0xF << 8); - ETH->MACMDIOAR |= ((uint32_t) addr << 21) | ((uint32_t) reg << 16) | 3 << 2; - ETH->MACMDIOAR |= MG_BIT(0); - while (ETH->MACMDIOAR & MG_BIT(0)) (void) 0; - return ETH->MACMDIODR; -} - -static void eth_write_phy(uint8_t addr, uint8_t reg, uint32_t val) { - ETH->MACMDIODR = val; - ETH->MACMDIOAR &= (0xF << 8); - ETH->MACMDIOAR |= ((uint32_t) addr << 21) | ((uint32_t) reg << 16) | 1 << 2; - ETH->MACMDIOAR |= MG_BIT(0); - while (ETH->MACMDIOAR & MG_BIT(0)) (void) 0; -} - -static uint32_t get_hclk(void) { - struct rcc { - volatile uint32_t CR, HSICFGR, CRRCR, CSICFGR, CFGR, RESERVED1, D1CFGR, - D2CFGR, D3CFGR, RESERVED2, PLLCKSELR, PLLCFGR, PLL1DIVR, PLL1FRACR, - PLL2DIVR, PLL2FRACR, PLL3DIVR, PLL3FRACR, RESERVED3, D1CCIPR, D2CCIP1R, - D2CCIP2R, D3CCIPR, RESERVED4, CIER, CIFR, CICR, RESERVED5, BDCR, CSR, - RESERVED6, AHB3RSTR, AHB1RSTR, AHB2RSTR, AHB4RSTR, APB3RSTR, APB1LRSTR, - APB1HRSTR, APB2RSTR, APB4RSTR, GCR, RESERVED8, D3AMR, RESERVED11[9], - RSR, AHB3ENR, AHB1ENR, AHB2ENR, AHB4ENR, APB3ENR, APB1LENR, APB1HENR, - APB2ENR, APB4ENR, RESERVED12, AHB3LPENR, AHB1LPENR, AHB2LPENR, - AHB4LPENR, APB3LPENR, APB1LLPENR, APB1HLPENR, APB2LPENR, APB4LPENR, - RESERVED13[4]; - } *rcc = ((struct rcc *) (0x40000000 + 0x18020000 + 0x4400)); - uint32_t clk = 0, hsi = 64000000 /* 64 MHz */, hse = 8000000 /* 8MHz */, - csi = 4000000 /* 4MHz */; - unsigned int sel = (rcc->CFGR & (7 << 3)) >> 3; - - if (sel == 1) { - clk = csi; - } else if (sel == 2) { - clk = hse; - } else if (sel == 3) { - uint32_t vco, m, n, p; - unsigned int src = (rcc->PLLCKSELR & (3 << 0)) >> 0; - m = ((rcc->PLLCKSELR & (0x3F << 4)) >> 4); - n = ((rcc->PLL1DIVR & (0x1FF << 0)) >> 0) + 1 + - ((rcc->PLLCFGR & MG_BIT(0)) ? 1 : 0); // round-up in fractional mode - p = ((rcc->PLL1DIVR & (0x7F << 9)) >> 9) + 1; - if (src == 1) { - clk = csi; - } else if (src == 2) { - clk = hse; - } else { - clk = hsi; - clk >>= ((rcc->CR & 3) >> 3); - } - vco = (uint32_t) ((uint64_t) clk * n / m); - clk = vco / p; - } else { - clk = hsi; - clk >>= ((rcc->CR & 3) >> 3); - } - const uint8_t cptab[12] = {1, 2, 3, 4, 6, 7, 8, 9}; // log2(div) - uint32_t d1cpre = (rcc->D1CFGR & (0x0F << 8)) >> 8; - if (d1cpre >= 8) clk >>= cptab[d1cpre - 8]; - MG_DEBUG(("D1 CLK: %u", clk)); - uint32_t hpre = (rcc->D1CFGR & (0x0F << 0)) >> 0; - if (hpre < 8) return clk; - return ((uint32_t) clk) >> cptab[hpre - 8]; -} - -// Guess CR from AHB1 clock. MDC clock is generated from the ETH peripheral -// clock (AHB1); as per 802.3, it must not exceed 2. As the AHB clock can -// be derived from HSI or CSI (internal RC) clocks, and those can go above -// specs, the datasheets specify a range of frequencies and activate one of a -// series of dividers to keep the MDC clock safely below 2.5MHz. We guess a -// divider setting based on HCLK with some drift. If the user uses a different -// clock from our defaults, needs to set the macros on top. Valid for -// STM32H74xxx/75xxx (58.11.4)(4.5% worst case drift)(CSI clock has a 7.5 % -// worst case drift @ max temp) -static int guess_mdc_cr(void) { - const uint8_t crs[] = {2, 3, 0, 1, 4, 5}; // ETH->MACMDIOAR::CR values - const uint8_t div[] = {16, 26, 42, 62, 102, 124}; // Respective HCLK dividers - uint32_t hclk = get_hclk(); // Guess system HCLK - int result = -1; // Invalid CR value - for (int i = 0; i < 6; i++) { - if (hclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) { - result = crs[i]; - break; - } - } - if (result < 0) MG_ERROR(("HCLK too high")); - MG_DEBUG(("HCLK: %u, CR: %d", hclk, result)); - return result; -} - -static bool mg_tcpip_driver_stm32h_init(struct mg_tcpip_if *ifp) { - struct mg_tcpip_driver_stm32h_data *d = - (struct mg_tcpip_driver_stm32h_data *) ifp->driver_data; - s_ifp = ifp; - - // Init RX descriptors - for (int i = 0; i < ETH_DESC_CNT; i++) { - s_rxdesc[i][0] = (uint32_t) (uintptr_t) s_rxbuf[i]; // Point to data buffer - s_rxdesc[i][3] = MG_BIT(31) | MG_BIT(30) | MG_BIT(24); // OWN, IOC, BUF1V - } - - // Init TX descriptors - for (int i = 0; i < ETH_DESC_CNT; i++) { - s_txdesc[i][0] = (uint32_t) (uintptr_t) s_txbuf[i]; // Buf pointer - } - - ETH->DMAMR |= MG_BIT(0); // Software reset - while ((ETH->DMAMR & MG_BIT(0)) != 0) (void) 0; // Wait until done - - // Set MDC clock divider. If user told us the value, use it. Otherwise, guess - int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr; - ETH->MACMDIOAR = ((uint32_t) cr & 0xF) << 8; - - // NOTE(scaprile): We do not use timing facilities so the DMA engine does not - // re-write buffer address - ETH->DMAMR = 0 << 16; // use interrupt mode 0 (58.8.1) (reset value) - ETH->DMASBMR |= MG_BIT(12); // AAL NOTE(scaprile): is this actually needed - ETH->MACIER = 0; // Do not enable additional irq sources (reset value) - ETH->MACTFCR = MG_BIT(7); // Disable zero-quanta pause - // ETH->MACPFR = MG_BIT(31); // Receive all - eth_write_phy(MG_PHY_ADDR, MG_PHYREG_BCR, MG_BIT(15)); // Reset PHY - eth_write_phy(MG_PHY_ADDR, MG_PHYREG_BCR, - MG_BIT(12)); // Set autonegotiation - ETH->DMACRDLAR = - (uint32_t) (uintptr_t) s_rxdesc; // RX descriptors start address - ETH->DMACRDRLR = ETH_DESC_CNT - 1; // ring length - ETH->DMACRDTPR = - (uint32_t) (uintptr_t) &s_rxdesc[ETH_DESC_CNT - - 1]; // last valid descriptor address - ETH->DMACTDLAR = - (uint32_t) (uintptr_t) s_txdesc; // TX descriptors start address - ETH->DMACTDRLR = ETH_DESC_CNT - 1; // ring length - ETH->DMACTDTPR = - (uint32_t) (uintptr_t) s_txdesc; // first available descriptor address - ETH->DMACCR = 0; // DSL = 0 (contiguous descriptor table) (reset value) - ETH->DMACIER = MG_BIT(6) | MG_BIT(15); // RIE, NIE - ETH->MACCR = MG_BIT(0) | MG_BIT(1) | MG_BIT(13) | MG_BIT(14) | - MG_BIT(15); // RE, TE, Duplex, Fast, Reserved - ETH->MTLTQOMR |= MG_BIT(1); // TSF - ETH->MTLRQOMR |= MG_BIT(5); // RSF - ETH->DMACTCR |= MG_BIT(0); // ST - ETH->DMACRCR |= MG_BIT(0); // SR - - // MAC address filtering - ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4]; - ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) | - ((uint32_t) ifp->mac[2] << 16) | - ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0]; - return true; -} - -static uint32_t s_txno; -static size_t mg_tcpip_driver_stm32h_tx(const void *buf, size_t len, - struct mg_tcpip_if *ifp) { - if (len > sizeof(s_txbuf[s_txno])) { - MG_ERROR(("Frame too big, %ld", (long) len)); - len = 0; // Frame is too big - } else if ((s_txdesc[s_txno][3] & MG_BIT(31))) { - ifp->nerr++; - MG_ERROR(("No free descriptors: %u %08X %08X %08X", s_txno, - s_txdesc[s_txno][3], ETH->DMACSR, ETH->DMACTCR)); - for (int i = 0; i < ETH_DESC_CNT; i++) MG_ERROR(("%08X", s_txdesc[i][3])); - len = 0; // All descriptors are busy, fail - } else { - memcpy(s_txbuf[s_txno], buf, len); // Copy data - s_txdesc[s_txno][2] = (uint32_t) len; // Set data len - s_txdesc[s_txno][3] = MG_BIT(28) | MG_BIT(29); // FD, LD - s_txdesc[s_txno][3] |= MG_BIT(31); // Set OWN bit - let DMA take over - if (++s_txno >= ETH_DESC_CNT) s_txno = 0; - } - ETH->DMACSR |= MG_BIT(2) | MG_BIT(1); // Clear any prior TBU, TPS - ETH->DMACTDTPR = (uint32_t) (uintptr_t) &s_txdesc[s_txno]; // and resume - return len; - (void) ifp; -} - -static bool mg_tcpip_driver_stm32h_up(struct mg_tcpip_if *ifp) { - uint32_t bsr = eth_read_phy(MG_PHY_ADDR, MG_PHYREG_BSR); - bool up = bsr & MG_BIT(2) ? 1 : 0; - if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) { // link state just went up - uint32_t scsr = eth_read_phy(MG_PHY_ADDR, MG_PHYREG_CSCR); - // tmp = reg with flags set to the most likely situation: 100M full-duplex - // if(link is slow or half) set flags otherwise - // reg = tmp - uint32_t maccr = ETH->MACCR | MG_BIT(14) | MG_BIT(13); // 100M, Full-duplex - if ((scsr & MG_BIT(3)) == 0) maccr &= ~MG_BIT(14); // 10M - if ((scsr & MG_BIT(4)) == 0) maccr &= ~MG_BIT(13); // Half-duplex - ETH->MACCR = maccr; // IRQ handler does not fiddle with this register - MG_DEBUG(("Link is %uM %s-duplex", maccr & MG_BIT(14) ? 100 : 10, - maccr & MG_BIT(13) ? "full" : "half")); - } - return up; -} - -void ETH_IRQHandler(void); -static uint32_t s_rxno; -void ETH_IRQHandler(void) { - if (ETH->DMACSR & MG_BIT(6)) { // Frame received, loop - ETH->DMACSR = MG_BIT(15) | MG_BIT(6); // Clear flag - for (uint32_t i = 0; i < 10; i++) { // read as they arrive but not forever - if (s_rxdesc[s_rxno][3] & MG_BIT(31)) break; // exit when done - if (((s_rxdesc[s_rxno][3] & (MG_BIT(28) | MG_BIT(29))) == - (MG_BIT(28) | MG_BIT(29))) && - !(s_rxdesc[s_rxno][3] & MG_BIT(15))) { // skip partial/errored frames - uint32_t len = s_rxdesc[s_rxno][3] & (MG_BIT(15) - 1); - // MG_DEBUG(("%lx %lu %lx %08lx", s_rxno, len, s_rxdesc[s_rxno][3], - // ETH->DMACSR)); - mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp); - } - s_rxdesc[s_rxno][3] = - MG_BIT(31) | MG_BIT(30) | MG_BIT(24); // OWN, IOC, BUF1V - if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0; - } - } - ETH->DMACSR = - MG_BIT(7) | MG_BIT(8); // Clear possible RBU RPS while processing - ETH->DMACRDTPR = - (uint32_t) (uintptr_t) &s_rxdesc[ETH_DESC_CNT - 1]; // and resume RX -} - -struct mg_tcpip_driver mg_tcpip_driver_stm32h = { - mg_tcpip_driver_stm32h_init, mg_tcpip_driver_stm32h_tx, NULL, - mg_tcpip_driver_stm32h_up}; -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/drivers/tm4c.c" -#endif - - -#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C -struct tm4c_emac { - volatile uint32_t EMACCFG, EMACFRAMEFLTR, EMACHASHTBLH, EMACHASHTBLL, - EMACMIIADDR, EMACMIIDATA, EMACFLOWCTL, EMACVLANTG, RESERVED0, EMACSTATUS, - EMACRWUFF, EMACPMTCTLSTAT, RESERVED1[2], EMACRIS, EMACIM, EMACADDR0H, - EMACADDR0L, EMACADDR1H, EMACADDR1L, EMACADDR2H, EMACADDR2L, EMACADDR3H, - EMACADDR3L, RESERVED2[31], EMACWDOGTO, RESERVED3[8], EMACMMCCTRL, - EMACMMCRXRIS, EMACMMCTXRIS, EMACMMCRXIM, EMACMMCTXIM, RESERVED4, - EMACTXCNTGB, RESERVED5[12], EMACTXCNTSCOL, EMACTXCNTMCOL, RESERVED6[4], - EMACTXOCTCNTG, RESERVED7[6], EMACRXCNTGB, RESERVED8[4], EMACRXCNTCRCERR, - EMACRXCNTALGNERR, RESERVED9[10], EMACRXCNTGUNI, RESERVED10[239], - EMACVLNINCREP, EMACVLANHASH, RESERVED11[93], EMACTIMSTCTRL, EMACSUBSECINC, - EMACTIMSEC, EMACTIMNANO, EMACTIMSECU, EMACTIMNANOU, EMACTIMADD, - EMACTARGSEC, EMACTARGNANO, EMACHWORDSEC, EMACTIMSTAT, EMACPPSCTRL, - RESERVED12[12], EMACPPS0INTVL, EMACPPS0WIDTH, RESERVED13[294], - EMACDMABUSMOD, EMACTXPOLLD, EMACRXPOLLD, EMACRXDLADDR, EMACTXDLADDR, - EMACDMARIS, EMACDMAOPMODE, EMACDMAIM, EMACMFBOC, EMACRXINTWDT, - RESERVED14[8], EMACHOSTXDESC, EMACHOSRXDESC, EMACHOSTXBA, EMACHOSRXBA, - RESERVED15[218], EMACPP, EMACPC, EMACCC, RESERVED16, EMACEPHYRIS, - EMACEPHYIM, EMACEPHYIMSC; -}; -#undef EMAC -#define EMAC ((struct tm4c_emac *) (uintptr_t) 0x400EC000) - -#define ETH_PKT_SIZE 1540 // Max frame size -#define ETH_DESC_CNT 4 // Descriptors count -#define ETH_DS 4 // Descriptor size (words) - -static uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS]; // RX descriptors -static uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS]; // TX descriptors -static uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE]; // RX ethernet buffers -static uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE]; // TX ethernet buffers -static struct mg_tcpip_if *s_ifp; // MIP interface -enum { - EPHY_ADDR = 0, - EPHYBMCR = 0, - EPHYBMSR = 1, - EPHYSTS = 16 -}; // PHY constants - -static inline void tm4cspin(volatile uint32_t count) { - while (count--) (void) 0; -} - -static uint32_t emac_read_phy(uint8_t addr, uint8_t reg) { - EMAC->EMACMIIADDR &= (0xf << 2); - EMAC->EMACMIIADDR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6); - EMAC->EMACMIIADDR |= MG_BIT(0); - while (EMAC->EMACMIIADDR & MG_BIT(0)) tm4cspin(1); - return EMAC->EMACMIIDATA; -} - -static void emac_write_phy(uint8_t addr, uint8_t reg, uint32_t val) { - EMAC->EMACMIIDATA = val; - EMAC->EMACMIIADDR &= (0xf << 2); - EMAC->EMACMIIADDR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6) | MG_BIT(1); - EMAC->EMACMIIADDR |= MG_BIT(0); - while (EMAC->EMACMIIADDR & MG_BIT(0)) tm4cspin(1); -} - -static uint32_t get_sysclk(void) { - struct sysctl { - volatile uint32_t DONTCARE0[44], RSCLKCFG, DONTCARE1[43], PLLFREQ0, - PLLFREQ1; - } *sysctl = (struct sysctl *) 0x400FE000; - uint32_t clk = 0, piosc = 16000000 /* 16 MHz */, mosc = 25000000 /* 25MHz */; - if (sysctl->RSCLKCFG & (1 << 28)) { // USEPLL - uint32_t fin, vco, mdiv, n, q, psysdiv; - uint32_t pllsrc = (sysctl->RSCLKCFG & (0xf << 24)) >> 24; - if (pllsrc == 0) { - clk = piosc; - } else if (pllsrc == 3) { - clk = mosc; - } else { - MG_ERROR(("Unsupported clock source")); - } - q = (sysctl->PLLFREQ1 & (0x1f << 8)) >> 8; - n = (sysctl->PLLFREQ1 & (0x1f << 0)) >> 0; - fin = clk / ((q + 1) * (n + 1)); - mdiv = (sysctl->PLLFREQ0 & (0x3ff << 0)) >> - 0; // mint + (mfrac / 1024); MFRAC not supported - psysdiv = (sysctl->RSCLKCFG & (0x3f << 0)) >> 0; - vco = (uint32_t) ((uint64_t) fin * mdiv); - return vco / (psysdiv + 1); - } - uint32_t oscsrc = (sysctl->RSCLKCFG & (0xf << 20)) >> 20; - if (oscsrc == 0) { - clk = piosc; - } else if (oscsrc == 3) { - clk = mosc; - } else { - MG_ERROR(("Unsupported clock source")); - } - uint32_t osysdiv = (sysctl->RSCLKCFG & (0xf << 16)) >> 16; - return clk / (osysdiv + 1); -} - -// Guess CR from SYSCLK. MDC clock is generated from SYSCLK (AHB); as per -// 802.3, it must not exceed 2.5MHz (also 20.4.2.6) As the AHB clock can be -// derived from the PIOSC (internal RC), and it can go above specs, the -// datasheets specify a range of frequencies and activate one of a series of -// dividers to keep the MDC clock safely below 2.5MHz. We guess a divider -// setting based on SYSCLK with a +5% drift. If the user uses a different clock -// from our defaults, needs to set the macros on top Valid for TM4C129x (20.7) -// (4.5% worst case drift) -// The PHY receives the main oscillator (MOSC) (20.3.1) -static int guess_mdc_cr(void) { - uint8_t crs[] = {2, 3, 0, 1}; // EMAC->MACMIIAR::CR values - uint8_t div[] = {16, 26, 42, 62}; // Respective HCLK dividers - uint32_t sysclk = get_sysclk(); // Guess system SYSCLK - int result = -1; // Invalid CR value - if (sysclk < 25000000) { - MG_ERROR(("SYSCLK too low")); - } else { - for (int i = 0; i < 4; i++) { - if (sysclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) { - result = crs[i]; - break; - } - } - if (result < 0) MG_ERROR(("SYSCLK too high")); - } - MG_DEBUG(("SYSCLK: %u, CR: %d", sysclk, result)); - return result; -} - -static bool mg_tcpip_driver_tm4c_init(struct mg_tcpip_if *ifp) { - struct mg_tcpip_driver_tm4c_data *d = - (struct mg_tcpip_driver_tm4c_data *) ifp->driver_data; - s_ifp = ifp; - - // Init RX descriptors - for (int i = 0; i < ETH_DESC_CNT; i++) { - s_rxdesc[i][0] = MG_BIT(31); // Own - s_rxdesc[i][1] = sizeof(s_rxbuf[i]) | MG_BIT(14); // 2nd address chained - s_rxdesc[i][2] = (uint32_t) (uintptr_t) s_rxbuf[i]; // Point to data buffer - s_rxdesc[i][3] = - (uint32_t) (uintptr_t) s_rxdesc[(i + 1) % ETH_DESC_CNT]; // Chain - // MG_DEBUG(("%d %p", i, s_rxdesc[i])); - } - - // Init TX descriptors - for (int i = 0; i < ETH_DESC_CNT; i++) { - s_txdesc[i][2] = (uint32_t) (uintptr_t) s_txbuf[i]; // Buf pointer - s_txdesc[i][3] = - (uint32_t) (uintptr_t) s_txdesc[(i + 1) % ETH_DESC_CNT]; // Chain - } - - EMAC->EMACDMABUSMOD |= MG_BIT(0); // Software reset - while ((EMAC->EMACDMABUSMOD & MG_BIT(0)) != 0) tm4cspin(1); // Wait until done - - // Set MDC clock divider. If user told us the value, use it. Otherwise, guess - int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr; - EMAC->EMACMIIADDR = ((uint32_t) cr & 0xf) << 2; - - // NOTE(cpq): we do not use extended descriptor bit 7, and do not use - // hardware checksum. Therefore, descriptor size is 4, not 8 - // EMAC->EMACDMABUSMOD = MG_BIT(13) | MG_BIT(16) | MG_BIT(22) | MG_BIT(23) | MG_BIT(25); - EMAC->EMACIM = MG_BIT(3) | MG_BIT(9); // Mask timestamp & PMT IT - EMAC->EMACFLOWCTL = MG_BIT(7); // Disable zero-quanta pause - // EMAC->EMACFRAMEFLTR = MG_BIT(31); // Receive all - // EMAC->EMACPC defaults to internal PHY (EPHY) in MMI mode - emac_write_phy(EPHY_ADDR, EPHYBMCR, MG_BIT(15)); // Reset internal PHY (EPHY) - emac_write_phy(EPHY_ADDR, EPHYBMCR, MG_BIT(12)); // Set autonegotiation - EMAC->EMACRXDLADDR = (uint32_t) (uintptr_t) s_rxdesc; // RX descriptors - EMAC->EMACTXDLADDR = (uint32_t) (uintptr_t) s_txdesc; // TX descriptors - EMAC->EMACDMAIM = MG_BIT(6) | MG_BIT(16); // RIE, NIE - EMAC->EMACCFG = MG_BIT(2) | MG_BIT(3) | MG_BIT(11) | MG_BIT(14); // RE, TE, Duplex, Fast - EMAC->EMACDMAOPMODE = - MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25); // SR, ST, TSF, RSF - EMAC->EMACADDR0H = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4]; - EMAC->EMACADDR0L = (uint32_t) (ifp->mac[3] << 24) | - ((uint32_t) ifp->mac[2] << 16) | - ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0]; - // NOTE(scaprile) There are 3 additional slots for filtering, disabled by - // default. This also applies to the STM32 driver (at least for F7) - return true; -} - -static uint32_t s_txno; -static size_t mg_tcpip_driver_tm4c_tx(const void *buf, size_t len, - struct mg_tcpip_if *ifp) { - if (len > sizeof(s_txbuf[s_txno])) { - MG_ERROR(("Frame too big, %ld", (long) len)); - len = 0; // fail - } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) { - ifp->nerr++; - MG_ERROR(("No descriptors available")); - // printf("D0 %lx SR %lx\n", (long) s_txdesc[0][0], (long) - // EMAC->EMACDMARIS); - len = 0; // fail - } else { - memcpy(s_txbuf[s_txno], buf, len); // Copy data - s_txdesc[s_txno][1] = (uint32_t) len; // Set data len - s_txdesc[s_txno][0] = - MG_BIT(20) | MG_BIT(28) | MG_BIT(29) | MG_BIT(30); // Chain,FS,LS,IC - s_txdesc[s_txno][0] |= MG_BIT(31); // Set OWN bit - let DMA take over - if (++s_txno >= ETH_DESC_CNT) s_txno = 0; - } - EMAC->EMACDMARIS = MG_BIT(2) | MG_BIT(5); // Clear any prior TU/UNF - EMAC->EMACTXPOLLD = 0; // and resume - return len; - (void) ifp; -} - -static bool mg_tcpip_driver_tm4c_up(struct mg_tcpip_if *ifp) { - uint32_t bmsr = emac_read_phy(EPHY_ADDR, EPHYBMSR); - bool up = (bmsr & MG_BIT(2)) ? 1 : 0; - if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) { // link state just went up - uint32_t sts = emac_read_phy(EPHY_ADDR, EPHYSTS); - // tmp = reg with flags set to the most likely situation: 100M full-duplex - // if(link is slow or half) set flags otherwise - // reg = tmp - uint32_t emaccfg = EMAC->EMACCFG | MG_BIT(14) | MG_BIT(11); // 100M, Full-duplex - if (sts & MG_BIT(1)) emaccfg &= ~MG_BIT(14); // 10M - if ((sts & MG_BIT(2)) == 0) emaccfg &= ~MG_BIT(11); // Half-duplex - EMAC->EMACCFG = emaccfg; // IRQ handler does not fiddle with this register - MG_DEBUG(("Link is %uM %s-duplex", emaccfg & MG_BIT(14) ? 100 : 10, - emaccfg & MG_BIT(11) ? "full" : "half")); - } - return up; -} - -void EMAC0_IRQHandler(void); -static uint32_t s_rxno; -void EMAC0_IRQHandler(void) { - if (EMAC->EMACDMARIS & MG_BIT(6)) { // Frame received, loop - EMAC->EMACDMARIS = MG_BIT(16) | MG_BIT(6); // Clear flag - for (uint32_t i = 0; i < 10; i++) { // read as they arrive but not forever - if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break; // exit when done - if (((s_rxdesc[s_rxno][0] & (MG_BIT(8) | MG_BIT(9))) == (MG_BIT(8) | MG_BIT(9))) && - !(s_rxdesc[s_rxno][0] & MG_BIT(15))) { // skip partial/errored frames - uint32_t len = ((s_rxdesc[s_rxno][0] >> 16) & (MG_BIT(14) - 1)); - // printf("%lx %lu %lx %.8lx\n", s_rxno, len, s_rxdesc[s_rxno][0], - // EMAC->EMACDMARIS); - mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp); - } - s_rxdesc[s_rxno][0] = MG_BIT(31); - if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0; - } - } - EMAC->EMACDMARIS = MG_BIT(7); // Clear possible RU while processing - EMAC->EMACRXPOLLD = 0; // and resume RX -} - -struct mg_tcpip_driver mg_tcpip_driver_tm4c = {mg_tcpip_driver_tm4c_init, - mg_tcpip_driver_tm4c_tx, NULL, - mg_tcpip_driver_tm4c_up}; -#endif - -#ifdef MG_ENABLE_LINES -#line 1 "src/drivers/w5500.c" -#endif - - -#if MG_ENABLE_TCPIP - -enum { W5500_CR = 0, W5500_S0 = 1, W5500_TX0 = 2, W5500_RX0 = 3 }; - -static void w5500_txn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, bool wr, - void *buf, size_t len) { - uint8_t *p = (uint8_t *) buf; - uint8_t cmd[] = {(uint8_t) (addr >> 8), (uint8_t) (addr & 255), - (uint8_t) ((block << 3) | (wr ? 4 : 0))}; - s->begin(s->spi); - for (size_t i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]); - for (size_t i = 0; i < len; i++) { - uint8_t r = s->txn(s->spi, p[i]); - if (!wr) p[i] = r; - } - s->end(s->spi); -} - -// clang-format off -static void w5500_wn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, void *buf, size_t len) { w5500_txn(s, block, addr, true, buf, len); } -static void w5500_w1(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, uint8_t val) { w5500_wn(s, block, addr, &val, 1); } -static void w5500_w2(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, uint16_t val) { uint8_t buf[2] = {(uint8_t) (val >> 8), (uint8_t) (val & 255)}; w5500_wn(s, block, addr, buf, sizeof(buf)); } -static void w5500_rn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, void *buf, size_t len) { w5500_txn(s, block, addr, false, buf, len); } -static uint8_t w5500_r1(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr) { uint8_t r = 0; w5500_rn(s, block, addr, &r, 1); return r; } -static uint16_t w5500_r2(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr) { uint8_t buf[2] = {0, 0}; w5500_rn(s, block, addr, buf, sizeof(buf)); return (uint16_t) ((buf[0] << 8) | buf[1]); } -// clang-format on - -static size_t w5500_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) { - struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data; - uint16_t r = 0, n = 0, len = (uint16_t) buflen, n2; // Read recv len - while ((n2 = w5500_r2(s, W5500_S0, 0x26)) > n) n = n2; // Until it is stable - // printf("RSR: %d\n", (int) n); - if (n > 0) { - uint16_t ptr = w5500_r2(s, W5500_S0, 0x28); // Get read pointer - n = w5500_r2(s, W5500_RX0, ptr); // Read frame length - if (n <= len + 2 && n > 1) { - r = (uint16_t) (n - 2); - w5500_rn(s, W5500_RX0, (uint16_t) (ptr + 2), buf, r); - } - w5500_w2(s, W5500_S0, 0x28, (uint16_t) (ptr + n)); // Advance read pointer - w5500_w1(s, W5500_S0, 1, 0x40); // Sock0 CR -> RECV - // printf(" RX_RD: tot=%u n=%u r=%u\n", n2, n, r); - } - return r; -} - -static size_t w5500_tx(const void *buf, size_t buflen, struct mg_tcpip_if *ifp) { - struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data; - uint16_t n = 0, len = (uint16_t) buflen; - while (n < len) n = w5500_r2(s, W5500_S0, 0x20); // Wait for space - uint16_t ptr = w5500_r2(s, W5500_S0, 0x24); // Get write pointer - w5500_wn(s, W5500_TX0, ptr, (void *) buf, len); // Write data - w5500_w2(s, W5500_S0, 0x24, (uint16_t) (ptr + len)); // Advance write pointer - w5500_w1(s, W5500_S0, 1, 0x20); // Sock0 CR -> SEND - for (int i = 0; i < 40; i++) { - uint8_t ir = w5500_r1(s, W5500_S0, 2); // Read S0 IR - if (ir == 0) continue; - // printf("IR %d, len=%d, free=%d, ptr %d\n", ir, (int) len, (int) n, ptr); - w5500_w1(s, W5500_S0, 2, ir); // Write S0 IR: clear it! - if (ir & 8) len = 0; // Timeout. Report error - if (ir & (16 | 8)) break; // Stop on SEND_OK or timeout - } - return len; -} - -static bool w5500_init(struct mg_tcpip_if *ifp) { - struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data; - s->end(s->spi); - w5500_w1(s, W5500_CR, 0, 0x80); // Reset chip: CR -> 0x80 - w5500_w1(s, W5500_CR, 0x2e, 0); // CR PHYCFGR -> reset - w5500_w1(s, W5500_CR, 0x2e, 0xf8); // CR PHYCFGR -> set - // w5500_wn(s, W5500_CR, 9, s->mac, 6); // Set source MAC - w5500_w1(s, W5500_S0, 0x1e, 16); // Sock0 RX buf size - w5500_w1(s, W5500_S0, 0x1f, 16); // Sock0 TX buf size - w5500_w1(s, W5500_S0, 0, 4); // Sock0 MR -> MACRAW - w5500_w1(s, W5500_S0, 1, 1); // Sock0 CR -> OPEN - return w5500_r1(s, W5500_S0, 3) == 0x42; // Sock0 SR == MACRAW -} - -static bool w5500_up(struct mg_tcpip_if *ifp) { - struct mg_tcpip_spi *spi = (struct mg_tcpip_spi *) ifp->driver_data; - uint8_t phycfgr = w5500_r1(spi, W5500_CR, 0x2e); - return phycfgr & 1; // Bit 0 of PHYCFGR is LNK (0 - down, 1 - up) -} - -struct mg_tcpip_driver mg_tcpip_driver_w5500 = {w5500_init, w5500_tx, w5500_rx, w5500_up}; -#endif diff --git a/SmartEVSE-3/SmartEVSE-3/src/utils.cpp b/SmartEVSE-3/SmartEVSE-3/src/utils.cpp deleted file mode 100644 index 7e306d9..0000000 --- a/SmartEVSE-3/SmartEVSE-3/src/utils.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* -; Project: Smart EVSE -; -; -; -; Permission is hereby granted, free of charge, to any person obtaining a copy -; of this software and associated documentation files (the "Software"), to deal -; in the Software without restriction, including without limitation the rights -; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -; copies of the Software, and to permit persons to whom the Software is -; furnished to do so, subject to the following conditions: -; -; The above copyright notice and this permission notice shall be included in -; all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -; THE SOFTWARE. - */ - -#include -#include -#include - -#include "evse.h" -#include "utils.h" - -unsigned long pow_10[10] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}; - - -// read Mac, and reverse to ID -uint32_t MacId() { - - uint32_t id = 0; - - for (int i=0; i<17; i=i+8) { - id |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; - } - return id >> 2; // low two bits are unused. -} - - -unsigned char crc8(unsigned char *buf, unsigned char len) { - unsigned char crc = 0, i, mix, inbyte; - - while (len--) { - inbyte = *buf++; - for (i = 8; i; i--) { - mix = (crc ^ inbyte) & 0x01; - crc >>= 1; - if (mix) crc ^= 0x8C; - inbyte >>= 1; - } - } - return crc; -} - -/** - * Calculates 16-bit CRC of given data - * used for Frame Check Sequence on data frame - * - * @param unsigned char pointer to buffer - * @param unsigned char length of buffer - * @return unsigned int CRC - */ -/* -unsigned int crc16(unsigned char *buf, unsigned char len) { - unsigned int pos, crc = 0xffff; - unsigned char i; - - // Poly used is x^16+x^15+x^2+x - for (pos = 0; pos < len; pos++) { - crc ^= (unsigned int)buf[pos]; // XOR byte into least sig. byte of crc - - for (i = 8; i != 0; i--) { // Loop over each bit - if ((crc & 0x0001) != 0) { // If the LSB is set - crc >>= 1; // Shift right and XOR 0xA001 - crc ^= 0xA001; - } else // Else LSB is not set - crc >>= 1; // Just shift right - } - } - - return crc; -} -*/ - - -/** - * Insert rounded value into string in printf style - * - * @param pointer to string - * @param string Format - * @param signed long Value to round and insert - * @param unsinged char Divisor where to set decimal point - * @param unsigned char Decimal place count - */ -void sprintfl(char *str, const char *Format, signed long Value, unsigned char Divisor, unsigned char Decimal) { - signed long val; - - val = Value / (signed long) pow_10[Divisor - Decimal - 1]; - // Round value - if(val < 0) val -= 5; - else val += 5; - val /= 10; - // Split value - if(Decimal > 0) sprintf(str, Format, (signed int) (val / (signed long) pow_10[Decimal]), (unsigned int) (abs(val) % pow_10[Decimal])); - else sprintf(str, Format, (signed int) val); -} - -/* triwave8: triangle (sawtooth) wave generator. Useful for - turning a one-byte ever-increasing value into a - one-byte value that oscillates up and down. - - input output - 0..127 0..254 (positive slope) - 128..255 254..0 (negative slope) - */ -unsigned char triwave8(unsigned char in) { - if (in & 0x80) { - in = 255u - in; - } - unsigned char out = in << 1; - return out; -} - -unsigned char scale8(unsigned char i, unsigned char scale) { - return (((unsigned int) i) * (1 + (unsigned int) (scale))) >> 8; -} - -/* easing functions; see http://easings.net - - ease8InOutQuad: 8-bit quadratic ease-in / ease-out function - */ -unsigned char ease8InOutQuad(unsigned char i) { - unsigned char j = i; - if (j & 0x80) { - j = 255u - j; - } - unsigned char jj = scale8(j, j); - unsigned char jj2 = jj << 1; - if (i & 0x80) { - jj2 = 255u - jj2; - } - return jj2; -} diff --git a/SmartEVSE-3/SmartEVSE-3/test/README b/SmartEVSE-3/SmartEVSE-3/test/README deleted file mode 100644 index b94d089..0000000 --- a/SmartEVSE-3/SmartEVSE-3/test/README +++ /dev/null @@ -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 diff --git a/SmartEVSE-3/SmartEVSE-3/test/feed_bat.sh b/SmartEVSE-3/SmartEVSE-3/test/feed_bat.sh deleted file mode 100755 index bd462e7..0000000 --- a/SmartEVSE-3/SmartEVSE-3/test/feed_bat.sh +++ /dev/null @@ -1,19 +0,0 @@ -FEED="HomeBatteryCurrent" - -if [ $# -eq 0 ]; then - echo "Usage: $0 4-digit-topic-nr-of-your-smartevse." - exit 1 -fi - -echo "Enter your current in deci-Ampères:" -OLD_CURRENT=20 -while true; do - read -t 8 CURRENT - if [ $CURRENT"x" == "x" ]; then - CURRENT=$OLD_CURRENT - else - OLD_CURRENT=$CURRENT - fi - echo $FEED-CURRENT=$CURRENT. - mosquitto_pub -h 127.0.0.1 -t "SmartEVSE-$1/Set/$FEED" -m $CURRENT -done diff --git a/SmartEVSE-3/SmartEVSE-3/test/feed_ev.sh b/SmartEVSE-3/SmartEVSE-3/test/feed_ev.sh deleted file mode 100755 index 292c61a..0000000 --- a/SmartEVSE-3/SmartEVSE-3/test/feed_ev.sh +++ /dev/null @@ -1,22 +0,0 @@ -FEED="EVMeter" - -if [ $# -eq 0 ]; then - echo "Usage: $0 4-digit-topic-nr-of-your-smartevse." - exit 1 -fi - -echo "Enter your current in deci-Ampères:" -OLD_CURRENT=20 -#energy in Wh: -ENERGY=0 -while true; do - read -t 5 CURRENT - if [ $CURRENT"x" == "x" ]; then - CURRENT=$OLD_CURRENT - else - OLD_CURRENT=$CURRENT - fi - echo $FEED-CURRENT=$CURRENT. - mosquitto_pub -h 127.0.0.1 -t "SmartEVSE-$1/Set/$FEED" -m $CURRENT:$CURRENT:$CURRENT:11000:$ENERGY - ENERGY=$((ENERGY + 100)) -done diff --git a/SmartEVSE-3/SmartEVSE-3/test/feed_mains.sh b/SmartEVSE-3/SmartEVSE-3/test/feed_mains.sh deleted file mode 100755 index 2465f84..0000000 --- a/SmartEVSE-3/SmartEVSE-3/test/feed_mains.sh +++ /dev/null @@ -1,20 +0,0 @@ -FEED="MainsMeter" - -if [ $# -eq 0 ]; then - echo "Usage: $0 4-digit-topic-nr-of-your-smartevse." - exit 1 -fi - -echo "Enter your current in deci-Ampères:" -OLD_CURRENT=20 -while true; do - read -t 1 CURRENT - if [ $CURRENT"x" == "x" ]; then - CURRENT=$OLD_CURRENT - else - OLD_CURRENT=$CURRENT - fi - echo $FEED-CURRENT=$CURRENT. - mosquitto_pub -h 127.0.0.1 -t "SmartEVSE-$1/Set/$FEED" -m $CURRENT:$CURRENT:$CURRENT - sleep 1 -done diff --git a/SmartEVSE-3/SmartEVSE-3/test/tests.sh b/SmartEVSE-3/SmartEVSE-3/test/tests.sh deleted file mode 100755 index 94567a3..0000000 --- a/SmartEVSE-3/SmartEVSE-3/test/tests.sh +++ /dev/null @@ -1,743 +0,0 @@ -#!/bin/bash - -# This script is meant to automate testing of SmartEVSEv3 firmware -# Needs jq binary - -#serialnrs (4 digits): - -if [ "$#" -ne 3 ]; then - echo "Usage: $0 ; serialnr is 4 digits." - echo - echo "Make sure you compiled your test version with -DAUTOMATED_TESTING=1 !!" - echo - echo "Known BUGS: Only run one test at a time; running multiple tests leads to false " - echo - echo "WARNING: ONLY USE THIS SCRIPT ON SMARTEVSEs ON A TEST BENCH" - echo "NEVER USE THIS SCRIPT ON A LIVE SMARTEVSE; IT _WILL_ BLOW YOUR FUSES AND YOUR BREAKERS!!!" - exit 1 -fi - -COUNT=`pgrep tests | wc -l` -if [ $COUNT -ne 2 ]; then - echo "Tests are already running in the background, exiting" - killall tests.sh - exit 1 -fi - -if [ $3 -eq 0 ]; then #all tests selected - SEL=$((0xFFFF)) -else - SEL=$3 -fi - -DBG=1 #1 means debug mode on, 0 means debug mode off - -# please give values in deci-Ampère: -MASTER_SOCKET_HARDWIRED=320 -SLAVE_SOCKET_HARDWIRED=130 -MASTER_MAC_ID=$1 -SLAVE_MAC_ID=$2 - -MASTER="smartevse-"$1".local" -SLAVE="smartevse-"$2".local" - -control_c() -# run if user hits control-c -{ - echo -en "\n*** Ouch! Exiting ***\n" - #kill all running subprocesses - pkill -P $$ - exit $? -} - -# trap keyboard interrupt (control-c) -trap control_c SIGINT - - -#curl suppress data -CURLPOST="curl -s -o /dev/null -X POST -d''" - -# Colors for echo -# Reset -NC='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -ABORT=0 - -init_devices () { -for device in $SLAVE $MASTER; do - #go to Normal Mode for init - $CURLPOST $device/reboot - sleep 1 - $CURLPOST "$device/automated_testing?loadbl=0&mainsmeter=1" - $CURLPOST $device/settings?mode=1 -done -read -p "Make sure all EVSE's are set to NOT CHARGING, then press " dummy -sleep 5 -} - -init_currents () { -#first load all settings before the test -for device in $SLAVE $MASTER; do - $CURLPOST "$device/automated_testing?config=1¤t_max=60¤t_max_circuit=70¤t_main=80" - $CURLPOST "$device/settings?current_max_sum_mains=600&enable_C2=0" - #$CURLPOST $device/settings?enable_C2=0 #TODO cycle through all tests with different settings !!! -done -} - -#takes 3 arguments, actual value, test value and margin -print_results() { - if [ $DBG -eq 1 ]; then - printf "CHARGECUR=$1, TARGET=$2." - fi - if [ $1 -ge $(( $2 - $3 )) ] && [ $1 -le $(( $2 + $3 )) ]; then - printf "$Green Passed $NC LBL=$loadbl_master, Mode=$MODE: $device chargecurrent is limited to $TESTSTRING.\n" - else - printf "$Red Failed $NC LBL=$loadbl_master, Mode=$MODE: $device chargecurrent is $1 dA and should be limited to $2 dA (with a margin of $3 dA) because of $TESTSTRING.\n" - fi -} - -#takes 4 arguments, actual value, test value, margin, string_to_test -print_results2() { - if [ $DBG -eq 1 ]; then - printf "$4=$1, TARGET=$2." - fi - if [ $1 -ge $(( $2 - $3 )) ] && [ $1 -le $(( $2 + $3 )) ]; then - printf "$Green Passed $NC LBL=$loadbl_master, Mode=$MODE: $device $4 is as expected when testing $TESTSTRING.\n" - else - printf "$Red Failed $NC LBL=$loadbl_master, Mode=$MODE: $device $4=$1 should be $4=$2 when testing $TESTSTRING.\n" - fi -} - -check_all_charge_currents () { - for device in $MASTER $SLAVE; do - check_charging - print_results "$CHARGECUR" "$TESTVALUE10" "0" - done -} - -set_loadbalancing () { - #make sure we switch lbl in the right order so we dont get modbus errors - if [ $loadbl_master -eq 0 ]; then - loadbl_slave=0 - $CURLPOST $SLAVE/automated_testing?loadbl=$loadbl_slave - $CURLPOST $MASTER/automated_testing?loadbl=$loadbl_master - fi - if [ $loadbl_master -eq 1 ]; then - $CURLPOST $MASTER/automated_testing?loadbl=$loadbl_master - sleep 1 - loadbl_slave=2 - $CURLPOST $SLAVE/automated_testing?loadbl=$loadbl_slave - fi -} - -MODESTR=("Off" "Normal" "Solar" "Smart") - -set_mode () { - $CURLPOST $MASTER/settings?mode=$mode_master - if [ $loadbl_slave -eq 0 ]; then - $CURLPOST $SLAVE/settings?mode=$mode_master - fi - MODE=${MODESTR[$mode_master]} - printf "Testing LBL=$loadbl_master, mode=$MODE on $TESTSTRING.\r" - TESTVALUE10=$((TESTVALUE * 10)) -} - -overload_mains () { -# echo $TESTVALUE10 >feed_mains_$device - #now overload the mains by 1A - echo $(( TESTVALUE10 + 10 )) >feed_mains_$device - #settle switching modes AND stabilizing charging speeds - printf "Watch the charge current of device $device going down in 1-2A steps!\r" - sleep 10 - #now stabilize the mains to MaxMains - echo $(( TESTVALUE10 )) >feed_mains_$device -} - -set_mainsmeter_to_api () { - if [ ! -e "feed_mains_$device" ]; then - mkfifo feed_mains_$device - fi - if [ $device == $MASTER ]; then - MAC_ID=$MASTER_MAC_ID - else - MAC_ID=$SLAVE_MAC_ID - fi - ./feed_mains.sh $MAC_ID /dev/null & - echo $TESTVALUE10 >feed_mains_$device - $CURLPOST $device/automated_testing?mainsmeter=9 -} - -run_test_loadbl0 () { - init_devices - init_currents - for device in $MASTER $SLAVE; do - set_mainsmeter_to_api - done - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - - loadbl_master=0 - set_loadbalancing - for mode_master in 3 2; do - set_mode - for device in $MASTER $SLAVE; do - $CURLPOST $device$CONFIG_COMMAND - overload_mains - check_charging - #we start charging at maxcurrent and then step down for approx. 1A per 670ms - print_results "$CHARGECUR" "${TARGET[$mode_master]}" "$MARGIN" - done - done - #set MainsMeter to Sensorbox - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?mainsmeter=1 - done - #kill all running subprocesses - pkill -P $$ -} - -run_test_loadbl1 () { - init_devices - init_currents - device=$MASTER - set_mainsmeter_to_api - loadbl_master=1 - set_loadbalancing - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - #if we are in loadbl 0 we don't test the slave device - for mode_master in 3 2; do - set_mode - $CURLPOST $device$CONFIG_COMMAND - overload_mains - TOTCUR=0 - for device in $SLAVE $MASTER; do - check_charging - TOTCUR=$((TOTCUR + CHARGECUR)) - done - #we started charging at maxcurrent and then stepped down for approx. 1A per 670ms - print_results "$TOTCUR" "${TARGET[$mode_master]}" "$MARGIN" - done - #set MainsMeter to Sensorbox - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?mainsmeter=1 - done - #kill all running subprocesses - pkill -P $$ -} - -check_charging () { - #make sure we are actually charging - CURL=$(curl -s -X GET $device/settings) - STATE_ID=$(echo $CURL | jq ".evse.state_id") - print_results2 "$STATE_ID" "2" "0" "STATE_ID" - CHARGECUR=$(echo $CURL | jq ".settings.charge_current") -} - -#TEST1: MODESWITCH TEST: test if mode changes on master reflects on slave and vice versa -NR=$((2**0)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="Modeswitch" - printf "Starting $TESTSTRING test #$NR:\n" - init_devices - $CURLPOST $MASTER/automated_testing?loadbl=1 - $CURLPOST $SLAVE/automated_testing?loadbl=2 - for mode_master in 1 2 3; do - $CURLPOST $MASTER/settings?mode=$mode_master - sleep 5 - mode_slave=$(curl -s -X GET $SLAVE/settings | jq ".mode_id") - if [ "x"$mode_slave == "x"$mode_master ]; then - printf "$Green Passed $NC Master switching to mode $mode_master, slave follows.\n" - else - printf "$Red Failed $NC Master switching to mode $mode_master, slave is at $mode_slave.\n" - ABORT=1 - fi - done - - if [ $ABORT -ne 0 ]; then - exit $ABORT - fi - - for mode_slave in 1 2 3; do - $CURLPOST $SLAVE/settings?mode=$mode_slave - sleep 5 - mode_master=$(curl -s -X GET $MASTER/settings | jq ".mode_id") - if [ "x"$mode_slave == "x"$mode_master ]; then - printf "$Green Passed $NC Slave switching to $mode_slave, master follows.\n" - else - printf "$Red Failed $NC Slave switching to $mode_slave, master is at $mode_master.\n" - ABORT=1 - fi - done - - #if we cannot rely on correct switching of modes between master and slave, we will have to abort testing - if [ $ABORT -ne 0 ]; then - printf "Since one of the previous tests failed we abort testing." - exit $ABORT - fi -fi - -#TEST2: SOCKET HARDWIRING TEST: test if Socket resistors in test bench limit our current // Configuration (0:Socket / 1:Fixed Cable) -# needs setting [MASTER|SLAVE]_SOCKET_HARDWIRED to the correct values of your test bench -NR=$((2**1)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="Socket Hardwiring" - printf "Starting $TESTSTRING test #$NR:\n" - printf "Make sure your Sensorbox is on MAX power delivery to the grid, or Solar tests will fail!\n" - init_devices - init_currents - #first load all settings before the test - for device in $SLAVE $MASTER; do - $CURLPOST $device/automated_testing?config=0 - done - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - - for loadbl_master in 0 1; do - set_loadbalancing - #if we are in loadbl 0 we test the slave device in loadbl 0 also - for mode_master in 1 2 3; do - set_mode - #settle switching modes AND stabilizing charging speeds - sleep 10 - for device in $SLAVE $MASTER; do - check_charging - if [ $device == $MASTER ]; then - print_results "$CHARGECUR" "$MASTER_SOCKET_HARDWIRED" "0" - else - print_results "$CHARGECUR" "$SLAVE_SOCKET_HARDWIRED" "0" - fi - done - done - done - - #for all other tests we don't want socket resistors to limit our currents, so switch to Fixed Cable - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?config=1 - done -fi - -#TEST4: MAXCURRENT TEST: test if MaxCurrent is obeyed -NR=$((2**2)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="MaxCurrent" - printf "Starting $TESTSTRING test #$NR:\n" - printf "Make sure your Sensorbox is on MAX power delivery to the grid, or Solar tests will fail!\n" - init_devices - init_currents - - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - - for loadbl_master in 0 1; do - set_loadbalancing - #if we are in loadbl 0 we test the slave device in loadbl 0 also - TESTVALUE=12 - for mode_master in 1 3 2; do - set_mode - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?current_max=$TESTVALUE - done - #settle switching modes AND stabilizing charging speeds - sleep 10 - check_all_charge_currents - #increase testvalue to test if the device responds to that - TESTVALUE=$(( TESTVALUE + 1 )) - done - done -fi - -#TEST8: MAXCIRCUIT TEST: test if MaxCircuit is obeyed -NR=$((2**3)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="MaxCirCuit" - printf "Starting $TESTSTRING test #$NR:\n" - printf "Make sure your Sensorbox is on MAX power delivery to the grid, or Solar tests will fail!\n" - init_devices - init_currents - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - - for loadbl_master in 0 1; do - set_loadbalancing - #if we are in loadbl 0 we test the slave device in loadbl 0 also - TESTVALUE=20 - for mode_master in 1 3 2; do - set_mode - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?current_max_circuit=$TESTVALUE - done - #settle switching modes AND stabilizing charging speeds - sleep 13 - - if [ $loadbl_master -eq 0 ]; then - check_all_charge_currents - else - TOTCUR=0 - for device in $SLAVE $MASTER; do - check_charging - TOTCUR=$((TOTCUR + CHARGECUR)) - done - print_results "$TOTCUR" "$TESTVALUE10" "0" - fi - #increase testvalue to test if the device responds to that - TESTVALUE=$(( TESTVALUE + 1 )) - done - done -fi - -#TEST16: MAXMAINS TEST: test if MaxMains is obeyed when using EM_API for loadbl=0 -NR=$((2**4)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="MaxMains via EM_API for loadbl=0" - printf "Starting $TESTSTRING test #$NR:\n" - #the margin for which we will accept the lowering/upping of the charge current, in dA - MARGIN=20 - TESTVALUE=25 - #Target values for Off, Normal, Solar, Smart mode RESPECTIVELY: - TARGET=(0 0 300 450) - CONFIG_COMMAND="/automated_testing?current_main=$TESTVALUE" - run_test_loadbl0 -fi - -#TEST32: MAXMAINS TEST: test if MaxMains is obeyed when using EM_API -NR=$((2**5)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="MaxMains via EM_API for loadbl=1" - printf "Starting $TESTSTRING test #$NR:\n" - #the margin for which we will accept the lowering/upping of the charge current, in dA - MARGIN=20 - TESTVALUE=25 - #Target values for Off, Normal, Solar, Smart mode RESPECTIVELY: - TARGET=(0 0 420 560) - CONFIG_COMMAND="/automated_testing?current_main=$TESTVALUE" - run_test_loadbl1 -fi - -#TEST64: MAXSUMMAINS TEST: test if MaxSumMains is obeyed when using EM_API for loadbl=0 -NR=$((2**6)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="MaxSumMains via EM_API for loadbl=0" - printf "Starting $TESTSTRING test #$NR:\n" - #the margin for which we will accept the lowering/upping of the charge current, in dA - MARGIN=20 - TESTVALUE=50 - #Target values for Off, Normal, Solar, Smart mode RESPECTIVELY: - TARGET=(0 0 310 455) - CONFIG_COMMAND="/settings?current_max_sum_mains=$((TESTVALUE * 3))" - run_test_loadbl0 -fi - -#TEST128: MAXSUMMAINS TEST: test if MaxSumMains is obeyed when using EM_API for loadbl=1 -NR=$((2**7)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="MaxSumMains via EM_API for loadbl=1" - printf "Starting $TESTSTRING test #$NR:\n" - #the margin for which we will accept the lowering/upping of the charge current, in dA - MARGIN=20 - TESTVALUE=50 - TARGET=(0 0 425 560) - CONFIG_COMMAND="/settings?current_max_sum_mains=$((TESTVALUE * 3))" - run_test_loadbl1 -fi - -#TEST256: STARTCURRENT TEST: test if StartCurrent is obeyed in Solar Mode for loadbl=0 -NR=$((2**8)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="StartCurrent, StopTimer and ImportCurrent via EM_API for loadbl=0" - printf "Starting $TESTSTRING test #$NR:\n" - #the margin for which we will accept the lowering/upping of the charge current, in dA - MARGIN=20 - #make mains_overload feed mains_current with 3A to the grid - TESTVALUE=-3 - #note that startcurrent shown as -4A on the display is stored as 4A ! - #CONFIG_COMMAND="/settings?solar_start_current=4" - init_devices - init_currents - for device in $MASTER $SLAVE; do - set_mainsmeter_to_api - $CURLPOST "$device/settings?solar_start_current=4&solar_max_import=15&solar_stop_time=1" - done - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - - loadbl_master=0 - set_loadbalancing - #SOLAR mode - mode_master=2 - set_mode - for device in $MASTER $SLAVE; do - echo 60 >feed_mains_$device - done - printf "Feeding total of 18A....chargecurrent should drop to 6A, then triggers stoptimer and when it expires, stops charging because over import limit of 15A\r" - TESTSTRING="SolarStopTimer should have been activated on overload on ImportCurrent" - sleep 50 - for device in $MASTER $SLAVE; do - TIMER=$(curl -s -X GET $device/settings | jq ".evse.solar_stop_timer") - print_results2 "$TIMER" "28" "15" "SOLAR_STOP_TIMER" - done - TESTSTRING="Charging should stop after expiring SolarStopTimer" - printf "$TESTSTRING\r" - sleep 40 - for device in $MASTER $SLAVE; do - STATE_ID=$(curl -s -X GET $device/settings | jq ".evse.state_id") - print_results2 "$STATE_ID" "10" "0" "STATE_ID" - echo -20 >feed_mains_$device - done - TESTSTRING="Feeding total of -6A....should trigger ready-timer 60s" - printf "$TESTSTRING\r" - sleep 65 - read -p "To start charging, set EVSE's to NO CHARGING and then to CHARGING again, then press " dummy - TESTSTRING="Feeding total of 18A should drop the charging current" - printf "$TESTSTRING\r" - for device in $MASTER $SLAVE; do - check_charging - #dropping the charge current by a few amps - echo 60 >feed_mains_$device - done - sleep 3 - TESTSTRING="Feeding total of 15A should stabilize the charging current" - printf "$TESTSTRING\r" - for device in $MASTER $SLAVE; do - check_charging - print_results "$CHARGECUR" "475" "30" - echo 50 >feed_mains_$device - done - sleep 10 - for device in $MASTER $SLAVE; do - check_charging - print_results "$CHARGECUR" "450" "35" - done - #set MainsMeter to Sensorbox - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?mainsmeter=1 - done - #kill all running subprocesses - pkill -P $$ -fi - -#TEST512: STARTCURRENT TEST: test if StartCurrent is obeyed in Solar Mode for loadbl=1 -NR=$((2**9)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="StartCurrent, StopTimer and ImportCurrent via EM_API for loadbl=1" - printf "Starting $TESTSTRING test #$NR:\n" - #the margin for which we will accept the lowering/upping of the charge current, in dA - MARGIN=20 - #make mains_overload feed mains_current with 3A to the grid - TESTVALUE=-3 - #note that startcurrent shown as -4A on the display is stored as 4A ! - #CONFIG_COMMAND="/settings?solar_start_current=4" - init_devices - init_currents - for device in $MASTER; do - set_mainsmeter_to_api - $CURLPOST "$device/settings?solar_start_current=4&solar_max_import=15&solar_stop_time=1" - done - - loadbl_master=1 - set_loadbalancing - #SOLAR mode - sleep 2 - mode_master=2 - set_mode - sleep 2 - printf "\n" - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - TESTSTRING="Feeding total of 3A so we should wait for the sun" - printf "$TESTSTRING\r" - echo 10 >feed_mains_$MASTER - sleep 5 - for device in $MASTER $SLAVE; do - STATE_ID=$(curl -s -X GET $device/settings | jq ".evse.state_id") - print_results2 "$STATE_ID" "9" "0" "STATE_ID" - done - TESTSTRING="Feeding total of -6A....should trigger ready-timer 60s" - printf "$TESTSTRING\r" - echo -20 >feed_mains_$MASTER - sleep 70 - read -p "To start charging, set EVSE's to NO CHARGING and then to CHARGING again, then press " dummy - sleep 2 - for device in $MASTER $SLAVE; do - check_charging - done - TESTSTRING="Feeding total of 18A should drop the charging current" - printf "$TESTSTRING\r" - echo 60 >feed_mains_$MASTER - sleep 10 - for device in $MASTER $SLAVE; do - check_charging - print_results "$CHARGECUR" "225" "20" - done - TESTSTRING="Feeding total of 15A should stabilize the charging current" - printf "$TESTSTRING\r" - echo 50 >feed_mains_$MASTER - sleep 10 - for device in $MASTER $SLAVE; do - check_charging - print_results "$CHARGECUR" "210" "20" - done - printf "Feeding total of 18A....chargecurrent should drop to 6A, then triggers stoptimer and when it expires, stops charging because over import limit of 15A\r" - TESTSTRING="SolarStopTimer should have been activated on overload on ImportCurrent" - echo 60 >feed_mains_$MASTER - sleep 60 - for device in $MASTER $SLAVE; do - TIMER=$(curl -s -X GET $device/settings | jq ".evse.solar_stop_timer") - print_results2 "$TIMER" "15" "5" "SOLAR_STOP_TIMER" - done - TESTSTRING="Charging should stop after expiring SolarStopTimer" - printf "$TESTSTRING\r" - sleep 40 - for device in $MASTER $SLAVE; do - STATE_ID=$(curl -s -X GET $device/settings | jq ".evse.state_id") - print_results2 "$STATE_ID" "9" "0" "STATE_ID" - done - TESTSTRING="Feeding total of -6A....should trigger ready-timer 60s" - printf "$TESTSTRING\r" - echo -20 >feed_mains_$MASTER - sleep 63 - read -p "To start charging, set EVSE's to NO CHARGING and then to CHARGING again, then press " dummy - sleep 2 - for device in $MASTER $SLAVE; do - check_charging - done - #set MainsMeter to Sensorbox - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?mainsmeter=1 - done - #kill all running subprocesses - pkill -P $$ -fi - -#TEST1024: shortened version of test512 -NR=$((2**10)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="StartCurrent, StopTimer and ImportCurrent via EM_API for loadbl=1" - printf "Starting $TESTSTRING test #$NR:\n" - #the margin for which we will accept the lowering/upping of the charge current, in dA - MARGIN=20 - TESTVALUE=-3 - TESTVALUE10=$((TESTVALUE*10)) - #note that startcurrent shown as -4A on the display is stored as 4A ! - #CONFIG_COMMAND="/settings?solar_start_current=4" - init_devices - init_currents - for device in $MASTER; do - set_mainsmeter_to_api - $CURLPOST "$device/settings?solar_start_current=4&solar_max_import=15&solar_stop_time=1" - done - #to speed up testing lower max_current - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?current_max=9 - done - sleep 1 - loadbl_master=1 - set_loadbalancing - #SOLAR mode - sleep 2 - mode_master=2 - set_mode - sleep 2 - printf "\n" - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - printf "Feeding total of 18A....chargecurrent should drop to 6A, then triggers stoptimer and when it expires, stops charging because over import limit of 15A\r" - TESTSTRING="SolarStopTimer should have been activated on overload on ImportCurrent" - echo 60 >feed_mains_$MASTER - sleep 40 - for device in $MASTER $SLAVE; do - TIMER=$(curl -s -X GET $device/settings | jq ".evse.solar_stop_timer") - print_results2 "$TIMER" "26" "5" "SOLAR_STOP_TIMER" - done - TESTSTRING="Charging should stop after expiring SolarStopTimer" - printf "$TESTSTRING\r" - sleep 40 - for device in $MASTER $SLAVE; do - STATE_ID=$(curl -s -X GET $device/settings | jq ".evse.state_id") - print_results2 "$STATE_ID" "9" "0" "STATE_ID" - done - TESTSTRING="Feeding total of -6A....should trigger ready-timer 60s" - printf "$TESTSTRING\r" - echo -20 >feed_mains_$MASTER - sleep 63 - read -p "To start charging, set EVSE's to NO CHARGING and then to CHARGING again, then press " dummy - sleep 2 - for device in $MASTER $SLAVE; do - check_charging - done - #set MainsMeter to Sensorbox - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?mainsmeter=1 - done - #kill all running subprocesses - pkill -P $$ -fi - -#TEST2048: modified version of test1024, only testing a master without any slaves -NR=$((2**11)) -if [ $((SEL & NR)) -ne 0 ]; then - TESTSTRING="StartCurrent, StopTimer and ImportCurrent via EM_API for loadbl=1 with only Master" - printf "Starting $TESTSTRING test #$NR:\n" - #the margin for which we will accept the lowering/upping of the charge current, in dA - MARGIN=20 - #make mains_overload feed mains_current with 3A per phase to the grid - TESTVALUE=-3 - TESTVALUE10=$((TESTVALUE*10)) - #note that startcurrent shown as -4A on the display is stored as 4A ! - #CONFIG_COMMAND="/settings?solar_start_current=4" - init_devices - init_currents - for device in $MASTER; do - set_mainsmeter_to_api - $CURLPOST "$device/settings?solar_start_current=4&solar_max_import=15&solar_stop_time=1" - done - #to speed up testing lower max_current - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?current_max=9 - done - loadbl_master=1 - set_loadbalancing - #put slave into multi=disabled - $CURLPOST $SLAVE/automated_testing?loadbl=0 - #SOLAR mode - sleep 2 - mode_master=2 - set_mode - sleep 2 - printf "\n" - read -p "Make sure all EVSE's are set to CHARGING, then press " dummy - printf "Feeding total of 18A....chargecurrent should drop to 6A, then triggers stoptimer and when it expires, stops charging because over import limit of 15A\r" - TESTSTRING="SolarStopTimer should have been activated on overload on ImportCurrent" - echo 60 >feed_mains_$MASTER - sleep 65 - for device in $MASTER; do - TIMER=$(curl -s -X GET $device/settings | jq ".evse.solar_stop_timer") - print_results2 "$TIMER" "8" "5" "SOLAR_STOP_TIMER" - done - TESTSTRING="Charging should stop after expiring SolarStopTimer" - printf "$TESTSTRING\r" - sleep 40 - for device in $MASTER; do - STATE_ID=$(curl -s -X GET $device/settings | jq ".evse.state_id") - print_results2 "$STATE_ID" "9" "0" "STATE_ID" - done - TESTSTRING="Feeding total of -6A....should trigger ready-timer 60s" - printf "$TESTSTRING\r" - echo -20 >feed_mains_$MASTER - sleep 63 - read -p "To start charging, set EVSE's to NO CHARGING and then to CHARGING again, then press " dummy - sleep 2 - for device in $MASTER; do - check_charging - done - #set MainsMeter to Sensorbox - for device in $MASTER $SLAVE; do - $CURLPOST $device/automated_testing?mainsmeter=1 - done - #kill all running subprocesses - pkill -P $$ -fi - -exit 0 diff --git a/SmartEVSE-3/coredumping.txt b/SmartEVSE-3/coredumping.txt deleted file mode 100755 index 15d1e83..0000000 --- a/SmartEVSE-3/coredumping.txt +++ /dev/null @@ -1,26 +0,0 @@ -How to analyze your coredump partition on SmartEVSE; advanced developers only! - -First you have to install esp32-arduino-lib-builder: --cd /usr/local/src/coredump --git clone https://github.com/espressif/esp32-arduino-lib-builder --cd esp32-arduino-lib-builder --vi configs/defconfig.esp32, add to bottom of file: CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y --./build.sh -t esp32 --cp -r tools/* ~/.platformio/packages/framework-arduinoespressif32/ - -Then, every time you want to analyze the coredump partition, you need to add esp-coredump to your path: -cd /usr/local/src/coredump/esp32-arduino-lib-builder/esp-idf; . export.sh; cd - - -Read coredump partition on the fly: -esp-coredump --chip esp32 -p /dev/ttyUSB0 -b 2000000 info_corefile release/firmware.elf - -Store coredump partition in a file: -esptool.py --chip esp32 --port "/dev/ttyUSB0" --baud 2000000 read_flash 0x3F0000 65536 coredump.bin - -Analyze the coredump file: -esp-coredump info_corefile --core coredump.bin --core-format raw release/firmware.elf - -Reminder to myself, the command line for flashing is currently: -esptool.py --chip esp32 --port "/dev/ttyUSB0" --baud 2000000 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x1000 /usr/local/src/SmartEVSE-3.5/SmartEVSE-3/.pio/build/release/bootloader.bin 0x8000 /usr/local/src/SmartEVSE-3.5/SmartEVSE-3/.pio/build/release/partitions.bin 0xe000 /home/hans/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin 0x10000 .pio/build/release/firmware.bin - -REMEMBER this will only work if you rename the alternative partitions_custom.csv.coredump to partitions_custom.csv before compiling! diff --git a/SmartEVSE-3/docs/REST_API.md b/SmartEVSE-3/docs/REST_API.md deleted file mode 100644 index 7e1e204..0000000 --- a/SmartEVSE-3/docs/REST_API.md +++ /dev/null @@ -1,185 +0,0 @@ -# REST API - -The REST API can be accessed through any http tool, here as an example CURL will be used. - -# GET: /settings - -curl -X GET http://ipaddress/settings - -will give output like: -``` -{"version":"21:02:46 @Jan 3 2024","mode":"OFF","mode_id":0,"car_connected":false,"wifi":{"status":"WL_CONNECTED","ssid":"wifi_nomap_EXT","rssi":-82,"bssid":"28:87:BA:D6:B9:DE"},"evse":{"temp":16,"temp_max":60,"connected":false,"access":false,"mode":1,"loadbl":0,"pwm":1024,"solar_stop_timer":0,"state":"Ready to Charge","state_id":0,"error":"None","error_id":0,"rfid":"Not Installed"},"settings":{"charge_current":0,"override_current":0,"current_min":6,"current_max":16,"current_main":25,"current_max_circuit":16,"current_max_sum_mains":600,"solar_max_import":9,"solar_start_current":29,"solar_stop_time":10,"enable_C2":"Always On","modem":"Not present","mains_meter":"InvEastrn","starttime":0,"stoptime":0,"repeat":0},"mqtt":{"host":"10.0.0.28","port":1883,"topic_prefix":"SmartEVSE-51446","username":"homeassistant","password_set":true,"status":"Connected"},"home_battery":{"current":0,"last_update":0},"ev_meter":{"description":"Eastron3P","address":11,"import_active_power":0,"total_kwh":5670.1,"charged_kwh":0,"currents":{"TOTAL":1,"L1":0,"L2":0,"L3":1},"import_active_energy":5670.1,"export_active_energy":0},"mains_meter":{"import_active_energy":8614.8,"export_active_energy":5289.3},"phase_currents":{"TOTAL":75,"L1":57,"L2":6,"L3":12,"last_data_update":1704535684,"charging_L1":false,"charging_L2":false,"charging_L3":false,"original_data":{"TOTAL":75,"L1":57,"L2":6,"L3":12}},"backlight":{"timer":0,"status":"OFF"}} -``` - -This output is often used to add to your bug report, so the developers can see your configuration. - -NOTE: -In the http world, GET parameters are passed like this: -curl -X GET http://ipaddress/endpoint?param1=value1¶m2=value2 -and POST parameters are passed like this: -curl -X POST http://ipaddress/endpoint -d 'param1=value1' -d 'param2=value2' -d '' - -Now in the ESP world, we all have picked up the habit of using the GET way of passing parameters also for POST commands. SmartEVSE development not excluded.... -From version v3.6.0 on, instead of using the Arduino Core webserver libraries, we are now using the Mongoose webserver, which is broadly used. This webserver however sticks to the "normal" http standards. - -This means that if you POST a request to SmartEVSE > 3.6.0, the webserver will be waiting for the -d data until it times out (or you ctrl-C your curl command). -d '' -You can prevent this by adding -''' --d '' -''' - -to your curl POST command. -d '' - -# POST: /settings -* backlight - -  Turns backlight on (1) or off (0) for the duration of the backlighttimer. - -``` - curl -X POST http://ipaddress/settings?backlight=1 -d '' -``` - -* mode - -  Only following values are permitted: -
  0: OFF -
  1: NORMAL -
  2: SOLAR -
  3: SMART - -* stop_timer - -  Set the stop timer to be used when there isn't sufficient solar power. Value must be >=0 and <= 60. -
  Using 0 will disable the stop timer. - -* disable_override_current - -  If this parameter is passed the override current will be reset (value doesn't matter) - -* override_current - -  Works only when using NORMAL or SMART mode -
  Desired current multiplied by 10 -
  If set to 0, override_current is disabled - -
  Examples: -
  If the desired current is 8.3A the value to be sent is 83 -``` - curl -X POST http://ipaddress/settings?override_current=83 -d '' -``` - -* enable_C2 - -  Enables switching between 1 phase mode and 3 phase mode by controlling a 2nd contactor (C2 port) -
   -
  Note 1: The 2nd contactor will only be turned ON when state chages to C (Charging) -
  Note 2: This is just changing the config setting, the contactor will not be controlled immediately but only when there is a -
  state change. -
   -
  If car is charging and you want to change from 1F to 3F or vice versa: -``` - - Change mode to OFF - - Enable or disable C2 contactor - - Change to desired value: 0 "Not present", 1 "Always Off", 2 "Solar Off", 3 "Always On", 4 "Auto" - - Examples: - - If the desired C2 mode is "Solar Off", the string to be sent is 2 -``` -* starttime - -  Enables delayed charging; always has to be combined with sending the mode in which you want to start charging. -
   -
  Note 1: The time string has to be in the format "2023-04-14T23:31". -
  Note 2: The time must be in the future, in local time. -
  Note 3: Only valid when combined with Normal or Smart mode. Solar mode will itself decide when to start... -
   -
  Examples: -
  If you want the car to start charging at 23:31 on April 14th 2023, in Smart mode, the strings to be sent are: - -``` - curl -X POST 'http://ipaddress/settings?starttime="2023-04-14T23:31"&mode=3' -d '' -``` - -* solar_start_current - -  The Start Current at which the car starts charging when in Solar Mode. -
   -
  Examples: -
  If you want the car to start charging when the sum of all 3 phases of the MainsMeter is exporting 6A or more to the grid, -
  the value to be sent is 6 - -* current_min - -  The Minimum Charging Current in Ampères, per phase. -
  Usually you should leave this setting at its default value (6A) since this is standarized. -
  Note: This setting is useful for EV's that don't obey standards, like the Renault Zoe, whose MinCurrents not only differ -
  from the standard, but also change when charging at 1 phase and charging at 2 phases. -
  The values even differ per build year. -
  Examples: -
  If you want the car to start charging at minimally 6A, the value to be sent is 6 - -* solar_max_import - -  The maximum current (sum of all phases) of the MainsMeter that can be imported before the solar timer is fired off, -
  after expiration the car will stop charging. - -
  Examples: -
  If you want the car to stop charging when the sum of all 3 phases of the MainsMeter is importing 0A or more to the grid, -
  the value to be sent is 0 - -* current_max_sum_mains - -  The Maximum allowed Mains Current summed over all phases: 10-600A -
  This is used for the EU Capacity rate limiting, currently only in Belgium. -
  Usually you should leave this setting at its default value (600A) -
  since your electricity provider probably does not supports this. - -# POST: /currents - -* battery_current - -  Actual home battery current multiplied by 10 -
  A positive number means the home battery is charging -
  A negative number means the home battery is discharging - -* L1, L2, L3 - -  Note: Only works when MainsMeter == API -
  L1, L2 and L3 must be send all together otherwise the data won't be registered. -
  Ampere must be multiplied by 10 -``` - curl -X POST "http://ipaddress/currents?L1=100&L2=50&L3=30" -d '' -``` -  P.S.: If you want to send your currents through HomeAsistant, look at the scripts in the (integration)[integration] directory. - -# POST: /modem - -* pwm - -  The duty cycle (PWM) multiplied by 10 -
  Examples: -
  If the desired dutycycle is 5% the value to be sent is 50 -
  Note: EXPERIMENTAL FEATURE ONLY FOR EXPERTS -
  DO NOT USE THIS IF YOU ARE NOT AN EVSE EXPERT. DANGEROUS! - - -# POST: /ev_meter - -* L1, L2, L3 - -  Note: Only works when EVMeter == API -
  L1, L2 and L3 must be send all together otherwise the data won't be registered. -
  Ampere must be multiplied by 10 -``` - curl -X POST "http://ipaddress/ev_meter?L1=100&L2=50&L3=30" -d '' -``` - -* import_active_energy, export_active_energy and import_active_power - -  Note: Only works when EvMeter == API -
  import_active_energy, export_active_energy and import_active_power must be send all together otherwise -
  the data won't be registered. -
  Data should be in Wh (kWh * 1000), for import_active_power data should be in w(att) - -# POST: /reboot - -  Note: no parameters, reboots your device. diff --git a/SmartEVSE-3/docs/SmartEVSEv3_build.pdf b/SmartEVSE-3/docs/SmartEVSEv3_build.pdf deleted file mode 100644 index c7e1ae452b0aa1e7a613eeb19adc03417091f1c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253035 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

O6dgc2*k(^(-Fb>K0r)zs4SU9#3G6&c&` zvVnhH7lq~C$DKpl)iI*>B2O--9pK7jCv*#j^nWjD@8QKlO6sJ+q7;A6*dYK1ZJ~Jf z|E4q^lP``H?NY$6M_4M){=R@`OIbwiVgH>*1QjgBalogUL7Og zpiZGBOqQ=vW~3?D_7?l^v$5B) zf&Uq{2AYlwFUfZQift6$a5Kat7Zv_@F-!n9{E3gz-#Vl`KF9I}fphsbXVgzK?8h;QT-}qCXctrU4 z*}?ut{uXi&Wn@dZOL|~hD2<|q@5O^IM?PPw{6T5|Pau%)@yg>_KSeA9s*9{elmxLh z{zg0)CycL{9hyjYpBULoto~=BnV~C(F&(N(-2nkFP8hQp!%b0?1YY|4@zJ(ocJ_s;xPK^Y2o3tqbK``Yyi073T>$>8 zxNfT*?(K^!xvvM9uP!ET|ARF6h4b{$tENwHw&I_gz7K_mMTD4)eOu3=x)l8lb`oaU zwEpYrHj+6*^nF%D_cYj!kvDN0KiEqqCcCRIyZ@TJYW420aotnzrQm;f{?7~!Mdabc zJd9qtEv?%*Lljhw0D&21aI`0To|W^?5-5 z&DtHxlxWhQR5_KVd4tHVg>GI++^@+WRW53Q=Nsy;Ke)qKFsdbyUK#$EJU3j`hh(wn z%1hu#(1AAFQpcjK7Myz%0f>q5rtgE15m3n*0(pCa zPU4^@;cu3DRWi$|Voe(R+wSB7td5HR-0a2s;4`+J z^Y4E_b8K=)sppwK_K6B0Eqy-iv$4O$IoDqVh0l+DQj6)1zvI*Z3mz(Iy=Dp9utp+D zo(KTO62&9Cm6E<-7xKAy2U+f720MgCgyLW|v_=#)z)r?GCL7vXrc zmxlTRe`}Ckg-V-1s{&EUv&DM?ADU-==Yuo%rS;o?t1;$NHC2$_M2B$dd33p2;uJ%E z@wWL++126~vu!SO>3|Hit#A@R3qd?L{2+CWtB2NG)lcO_d*}%)V@uM)5?JF*UH}K+ zvDVA2%+EvIA3Vq&3o+Bo3PuIUa5X0&Ob}189#^Fo97Pj%2p1CyL67Z5S)6VCkv&f6 z-DT|`z(kab!M_Td6Hhuq=y$mYN{pFBe>`eH3>di{br?K{;^f-M?G=zxfzE{lM~>Fk z*Hzl_^Kf;)3FJga1#>r$$v03cxUNatqZxG;CCMq01ya&i_nWz#p{Mvm*o3;{{j#K& zU3s1TGJT=5PeZ)83>#GbQ`+BWK)El6S(oC?0-yJG^YEVCEt@F37mzs?kY?LUpE#&@ zXwHNT&F~v4XE3N6`Z%4YG9}*KNnfn#b*(VYeezK}I8JjN$%Z#+2#dChVqmiFCDiT- z__0q0@;p0BEad1z4Fd5ONH*5Dnzu;}Zw&hM5~i_n<#>}K=Wn@`c9ts-Q+_aHN-e3y zB(pnmyjLMRMEh)J*C-QbV#n?dEQxZuRj$3L%@vYGT;BqX>Q1b2Owuoh6sbHi@>xA;(vglx!zw!dh`zV1{hB7&gDTiIYB-O-CEs&}& zHUL1Bw9Pli2WgbAs5w7;|BEqpI8Z$ITn}CAiMLJp2j02G9F0wP*UyDCs_T)vrlSiJ z^pz|OQu!w#Y`z$4sDQPi@(}wl(_rLDSyR0IBhheE$Svjd7bciH9RUSCI@vo3Mt3

b3>#kE@Ar)WSIJaLwQ1Y$3O_?r7es^C?b4 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±C!q;RZPf?uOfUm80A-YNbiSp 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 The EV will charge with the current set at MAX - The EV will charge with a dynamic charge current, depending on MAINSMET - data, and MAINS, MAX, MIN settings - The EV will charge on solar power - -CONFIG Configure EVSE with Type 2 Socket or fixed cable: - Your SmartEVSE is connected to a socket, so it will need to sense the - cable used for its maximum capacity - Your SmartEVSE is connected to a fixed cable, so MAX will determine your - maximum charge current - -LOCK (only appears when CONFIG is set to ) - Enable or disable the locking actuator (config = socket) - No lock is used - Dostar, DUOSIDA DSIEC-ELB or Ratio lock - Signal wire reversed, DUOSIDA DSIEC-EL or Phoenix Contact - -PWR SHARE ; formerly known as LOADBALANCING. - 2 to 8 EVSE’s can be connected via modbus, and their load will be balanced - Single SmartEVSE - Set the first SmartEVSE to Master. Make sure there is only one Master. - And the other SmartEVSE's to Node 1-7. - -MAINSMET Set type of MAINS meter (only appears in Smart or Solar mode): - No MAINS meter connected; only Normal mode possible - the Sensorbox will send measurement data to the SmartEVSE - The MAINS meter data will be fed through the REST API or the MQTT API. - / / <...> / a Modbus kWh meter is used - - Note that Eastron1P is for single phase Eastron meters, Eastron3P for Eastron three phase - meters, and InvEastron is for Eastron three phase meter that is fed from below (inverted). - If MAINSMET is not and not , these settings appear: - MAINSADR Set the Modbus address for the kWh meter - GRID (only appears when Sensorbox with CT’s is used) - 3 or 4 wire - CAL Calibrate CT1. CT2 and CT3 will use the same cal value. - 6.0-99.9A A minimum of 6A is required in order to change this value. - Hold both ▼and ▲ buttons to reset to default settings. - -EV METER Set type of EV kWh meter (measures power and charged energy) - No EV meter connected. - The EV meter data will be fed through the REST API or the MQTT API. - / / <...> / a Modbus kWh meter is used - - Note that Eastron1P is for single phase Eastron meters, Eastron3P for Eastron three phase - meters, and InvEastron is for Eastron three phase meter that is fed from below (inverted). - If EV METER is not and not , this setting appears: - EV ADR Set the Modbus address for the EV Meter - -MAINS (only appears when a MAINSMET is configured): - Set Max Mains current: 10-200A (per phase) - -MIN (only appears when a MAINSMET is configured): - Set MIN charge current for the EV: 6-16A (per phase) - -MAX Set MAX charge current for the EV: 10-80A (per phase) - If CONFIG is set to , configure MAX lower or equal to the maximum current - that your fixed cable can carry. - -CIRCUIT (only appears when PWR SHARE set to , or when PWR SHARE set to - and Mode is Smart or Solar and EV METER not set to ): - Set the max current the EVSE circuit can handle (load balancing): 10-200A - (see also subpanel wiring) - -SWITCH Set the function of an external switch connected to pin SW - A push button on io pin SW can be used to STOP charging - A momentary push Button is used to enable/disable access to the charging station - A toggle switch is used to enable/disable access to the charging station - A momentary push Button is used to switch between Smart and Solar modes - A toggle switch is used to switch between Smart and Solar modes - -RCMON RCM14-03 Residual Current Monitor is plugged into connector P1 - The RCD option is not used - When a fault current is detected, the contactor will be opened - -RFID use a RFID card reader to enable/disable access to the EVSE - A maximum of 20 RFID cards can be stored. - / / / / - -WIFI Enable wifi connection to your LAN - No wifi connection - The SmartEVSE presents itself as a Wifi Acces Point "smartevse-xxxx"; - connect with your phone to that access point, goto http://192.168.4.1/ - and configure your Wifi password - Connect to your LAN via Wifi. - -MAX TEMP Maximum allowed temperature for your SmartEVSE; 40-75C, default 65. - You can increase this if your SmartEVSE is in direct sunlight. - -SUMMAINS (only appears when a MAINSMET is configured): - Maximum allowed Mains Current summed over all phases: 10-600A - This is used for the EU Capacity rate limiting, currently only in Belgium - -The following options are only shown when Mode set to and -PWR SHARE set to or : -START set the current on which the EV should start Solar charging: - -0 -48A (sum of all phases) -STOP Stop charging when there is not enough solar power available: - Disabled - 60 minutes (Disabled = never stop charging) -IMPORT Allow additional grid power when solar charging: 0-20A (summed over all phases) - NOTE: A setting of IMPORT lower thant START + MIN makes NO SENSE and will - result in a non-charging SmartEVSE when in Solar mode. - You even need to set IMPORT at least a few Amps higher then START + MIN to get - a desired charging behaviour if you are charging at 1 phase. - You even need to set IMPORT at least a few Amps higher then START + 3 * MIN to get - a desired charging behaviour if you are charging at 3 phases. - NOTE2: Note that START and IMPORT are summed over all phases, and MIN is per phase! -CONTACT2 One can add a second contactor (C2) that switches off 2 of the 3 phases of a - 3 phase Mains installation; this can be useful if one wants to charge of off - Solar; EV's have a minimal charge current of 6A, so switching off 2 phases - allows you to charge with a current of 6-18A, while 3 phases have a - minimum current of 3x6A=18A. - This way you can still charge solar-only on smaller solar installations. -
- IMPORTANT NOTE: You WILL have to wire your C2 contactor according to the schematics - in [Hardware installation](docs/installation.md). If you invent your own wiring - your installation will be UNSAFE! - - No second contactor C2 is present (default) - C2 is always off, so you are single phase charging - C2 is always on, so you are three phase charging (if your Mains are three phase and your EV - supports it) - C2 is always on except in Solar Mode where it is always off - SmartEVSE starts charging at 3phase, but when in Solar mode and not enough - current available for 3 phases, switches off C2 so it will continue on 1 phase - - -``` -# REST API - -For the specification of the REST API, see [REST API](REST_API.md) - -# MQTT API -Your SmartEVSE can now export the most important data to your MQTT-server. Just fill in the configuration data on the webserver and the data will automatically be announced to your MQTT server. - -You can easily show all the MQTT topics published: -``` -mosquitto_sub -v -h ip-of-mosquitto-server -u username -P password -t '#' -``` - -You can feed the SmartEVSE data by publishing to a topic: -``` -mosquitto_pub -h ip-of-mosquitto-server -u username -P password -t 'SmartEVSE-xxxxx/Set/CurrentOverride' -m 150 -``` -...where xxxxx your SmartEVSE's serial number, will set your Override Current to 15.0A. - -Valid topics you can publish to are: -``` -/Set/Mode -/Set/CurrentOverride -/Set/CurrentMaxSumMains -/Set/CPPWMOverride -/Set/MainsMeter -/Set/EVMeter -/Set/HomeBatteryCurrent -/Set/RequiredEVCCID -``` -Your MainsMeter can be fed with: -``` -mosquitto_pub -h ip-of-mosquitto-server -u username -P password -t 'SmartEVSE-xxxxx/Set/MainsMeter' -m L1:L2:L3 -``` -...where L1 - L3 are the currents in deci-Ampères. So 100 means 10.0A. - -You can find test scripts in the test directory that feed EV and MainsMeter data to your MQTT server. - -# Multiple SmartEVSE controllers on one mains supply (Power Share) -Up to eight SmartEVSE modules can share one mains supply. - - Hardware connections - - Connect the A, B and GND connections from the Master to the Node(s). - - So A connects to A, B goes to B etc. - - If you are using Smart/Solar mode, you should connect the A, B , +12V and GND wires from the sensorbox to the same screw terminals of the SmartEVSE! Make sure that the +12V wire from the sensorbox is connected to only -one– SmartEVSE. - - - Software configuration - - Set one SmartEVSE PWR SHARE setting to MASTER, the others to NODE 1-7. Make sure there is only one Master, and the Node numbers are unique. - - On the Master configure the following: - - MODE Set this to Smart if a Sensorbox (or configured kWh meter) is used to measure the current draw on the mains supply. - It will then dynamically vary the charge current for all connected EV’s. If you are using a dedicated mains supply for the EV’s you can leave this set to Normal. - - MAINS Set to the maximum current of the MAINS connection (per phase). - If the sensorbox or other MainsMeter device measures a higher current then this value on one of the phases, it will immediately reduce the current to the EVSE’s - - CIRCUIT Set this to the maximum current of the EVSE circuit (per phase). - This will be split between the connected and charging EV’s. - - MAX Set the maximum charging current for the EV connected to -this- SmartEVSE (per phase). - - MIN Set to the lowest allowable charging current for all connected EV’s. - - On the Nodes configure the following: - - MAX Set the maximum charging current for the EV connected to -this- SmartEVSE (per phase). - -# Home Battery Integration -In a normal EVSE setup a sensorbox is used to read the P1 information to deduce if there is sufficient solar energy available. This however can give unwanted results when also using a home battery as this will result in one battery charging the other one.
- -For this purpose the settings endpoint allows you to pass through the battery current information: -* A positive current means the battery is charging -* A negative current means the battery is discharging - -The EVSE will use the battery current to neutralize the impact of a home battery on the P1 information.
-**Regular updates from the consumer are required to keep this working as values cannot be older than 11 seconds.** - -### Example -* Home battery is charging at 2300W -> 10A -* P1 has an export value of 230W -> -1A -* EVSE will neutralize the battery and P1 will be "exporting" -11A - -The sender has several options when sending the home battery current: -* Send the current AS-IS -> EVSE current will be maximized -* Only send when battery is discharging -> AS-IS operation but EVSE will not discharge the home battery -* Reserve an amount of current for the home battery (e.g. 10A) -> Prioritize the home battery up to a specific limit - -# Integration with Home Assistant -There are three options to integrate SmartEVSE with Home Assistant: -* through the HA-integration - the easy way
- - If you want to integrate your SmartEVSE with Home Asisstant, please have a look at [the SmartEVSE `custom_component` for Home Assistant](https://github.com/dingo35/ha-SmartEVSEv3). This `custom_component` uses the API to share data from the SmartEVSE to Home Assistant, and enables you to set SmartEVSE settings from Home Assistant. You will need firmware version 1.5.2 or higher to use this integration. - -* by manually configuring your configuration.yaml
- - Its a lot of work, but you can have everything exactly your way. See examples in the integrations directory of our github repository. - -* by MQTT
- - If you don't like the integration, e.g. because it only updates its data every 60 seconds, you might like to interface through MQTT; updates are done as soon as values change.... you can even mix it up by using both the integration AND the MQTT interface at the same time! - -# EU Capacity Rate Limiting -An EU directive gives electricity providers the possibility to charge end consumers by a "capacity rate", so consumers will be stimulated to flatten their usage curve. -Currently the only known country that has this active is Belgium. -For more details see https://github.com/serkri/SmartEVSE-3/issues/215 - -* In the Menu screen an item "SumMains" is now available, default set at 600A -* This setting will only be of use in Smart or Solar mode -* Apart from all other limits (Mains, MaxCirCuit), the charge current will be limited so that the sum of all phases of the Mains currents will not be exceeding the SumMains setting -* If you don't understand this setting, or don't live in Belgium, leave this setting at its default value - -# Building the firmware -You can get the latest release off of https://github.com/dingo35/SmartEVSE-3.5/releases, but if you want to build it yourself: -* Install platformio-core https://docs.platformio.org/en/latest/core/installation/methods/index.html -* Clone this github project, cd to the smartevse directory where platformio.ini is located -* Compile firmware.bin: platformio run -For versions older than v3.6.0: -* Compile spiffs.bin: platformio run -t buildfs - -If you are not using the webserver /update endpoint: -* Upload via USB configured in platformio.ini: platformio run --target upload diff --git a/SmartEVSE-3/docs/installation.md b/SmartEVSE-3/docs/installation.md deleted file mode 100644 index 9244039..0000000 --- a/SmartEVSE-3/docs/installation.md +++ /dev/null @@ -1,67 +0,0 @@ -# Hardware installation - -We refer to [this wiring diagram](SmartEVSEv3_build.pdf) for wiring the SmartEVSE. - - -# Inverted wiring of kWh meter -If you are using a 3 phase Eastron kWh meter, you can feed it from below (like in most Dutch power panels). Now the polarity of currents is reversed, so in the MainsMeter or EVMeter configuration you should choose kWh meter type "Inverted Eastron". - -# Subpanel or "garage" configuration -If you have other current-users on a Subpanel, use this wiring and the added configuration: - - mains - | - [main breaker 25A] - | - [kWh meter "Mains"] - | - ----------------------------------- - | | | - [group breaker 16A] [subpanel breaker 16A] - | - [kWh meter "EV"] - | - ---------------- - | | - [washer breaker 16A] [smartevse breaker 16A] - - In this example you configure Mains to 25A, MaxCircuit to 16A; the charger will limit itself so that neither the 25A mains nor the 16A from the subpanel will be - exceeded... - Note that for this functionality you will need to be in Smart or Solar mode; it is no longer necessary to enable Load Balancing for this function. - -# Second Contactor C2 -One can add a second contactor (C2) that switches off 2 of the 3 phases of a three-phase Mains installation; this can be useful if one wants to charge of off - Solar; EV's have a minimal charge current of 6A, so switching off 2 phases allows you to charge with a current of 6-18A, while 3 phases have a minimum current - of 3x6A=18A. This way you can still charge solar-only on smaller solar installations. - - one should wire C2 according to this schema: - - N L1 L2 L3 - | | | | - -------------------- - | 4-p contactor C1 | - -------------------- - | | | | - | | ------------------ - | | |2-p contactor C2| - | | ------------------ - | | | | - -------------------- - | EV-cable | - -------------------- - - This way the (dangerous) situation is avoided that some Phases are switched ON, and Neutral is switched OFF. - Note that it is important that you actually DO NOT switch the L1 pin of the CCS plug with the C2 contactor; some cars (e.g. Tesla Model 3) will go into error; - they expect the charging phase to be on the L1 pin when single-phase charging... - Note also that in case the phases cannot be detected automatically (especially when no EVmeter is connected), and SmartEVSE _knows_ it is charging at a single - phase (e.g. because Contact2 is at "Always Off"), it assumes that L1 is the phase we are charging on!! - - By default C2 is switched OFF ("Not present"); if you want to keep on charging on 3 phases after installing C2, you should change the setting Contact2 in the - Setup Menu. - -# Multiple SmartEVSE controllers on one mains supply (Power Share) -Up to eight SmartEVSE modules can share one mains supply. -Hardware connections -* Connect the A, B and GND connections from the Master to the Node(s). -* So A connects to A, B goes to B etc. -* If you are using Smart/Solar mode, you should connect the A, B , +12V and GND wires from the sensorbox to the same screw terminals of the SmartEVSE! Make sure that the +12V wire from the sensorbox is connected to only -one– SmartEVSE. - diff --git a/SmartEVSE-3/docs/operation.md b/SmartEVSE-3/docs/operation.md deleted file mode 100644 index 84cdb89..0000000 --- a/SmartEVSE-3/docs/operation.md +++ /dev/null @@ -1,80 +0,0 @@ -# Improved starting/stopping through the LCD screen -* When pressing o button longer then 2 seconds you will enter the Menu screen -* When pressing < button shorter then 2 seconds, you will toggle between Smart/Solar mode -* When pressing < button longer then 2 seconds the access will be denied, i.e. the mode will be set to "Off" and charging will stop -* When pressing > button longer then 2 seconds the access will be granted, i.e. the previously set mode will be activated and charging will start - -# Webserver -After configuration of your Wifi parameters, your SmartEVSE will present itself on your LAN via a webserver. This webserver can be accessed through: -* http://ip-address/ -* http://smartevse-xxxx.local/ where xxxx is the serial number of your SmartEVSE. It can be found on a sticker on the bottom of your SmartEVSE. It might be necessary that mDNS is configured on your LAN. -* http://smartevse-xxxx.lan/ where xxxx is the serial number of your SmartEVSE. It can be found on a sticker on the bottom of your SmartEVSE. It might be necessary that mDNS is configured on your LAN. -* OTA update of your firmware: - - surf to http://your-smartevse/update or press the UPDATE button on the webserver - - select the firmware.bin from this archive, OR if you want the debug version (via telnet over your wifi), - rename firmware.debug.bin to firmware.bin and select that. YOU CANNOT FLASH A FILE WITH ANOTHER NAME! - - if you get FAIL, check your wifi connection and try again; - - after OK, wait 10-30 seconds and your new firmware including the webserver should be online! -* Added wifi-debugging: if you flashed the debug version, telnet http://your-smartevse/ will bring you to a debugger that shows you whats going on! -* OTA upload of rfid lists: - - via the "update" button or the /update endpoint you can upload a file called rfid.txt; - - file layout: every line is supposed to contain one RFID (=NFC) TAG UID of size bytes in hex format: -''' -112233445566 -0A3B123FFFA0 -''' - - before upload all existing RFID's are deleted in the SmartEVSE you are uploading to - - if you have PWR SHARE enabled (master/slave configuration), you must upload to every single SmartEVSE; this enables you to maintain different lists for different SmartEVSEs. - -# Mode switching when PWR SHARE is activated -* If you switch mode on the Master, the Slaves will follow that mode switch -* If you switch mode on one Slave, and your Master does not have a Smart/Solar toggle switch configured, the Master and all the other slaves will follow -* If you have a Smart/Solar toggle switch you have to guard yourself that Master and Slaves are all in the same mode. We recommend replacing that toggle switch by a pushbutton switch. - -# Error Messages -If an error occurs, the SmartEVSE will stop charging, and display one of the following messages: -* ERROR NO SERIAL COM CHECK WIRING
No signal from the Sensorbox or other SmartEVSE (when load balancing is used) has been received for 11 seconds. Please check the wiring to the Sensorbox or other SmartEVSE. -* ERROR NO CURRENT
There is not enough current available to start charging, or charging was interrupted because there was not enough current available to keep charging. The SmartEVSE will try again in 60 seconds. -* ERROR HIGH TEMP
The temperature inside the module has reached 65º Celsius. Charging is stopped. -Once the temperature has dropped below 55ºC charging is started again. -* RESIDUAL FAULT CURRENT DETECTED
An optional DC Residual Current Monitor has detected a fault current, the Contactor is switched off. -The error condition can be reset by pressing any button on the SmartEVSE. - -# Changes with regards to the original firmware -* Endpoint to send L1/2/3 data, this removed the need for a SensorBox - * Note: Set MainsMeter to the new 'API' option in the config menu when sending L1/2/3 -* Endpoint to send EvMeter L1/2/3 data (and energy/power) - * Note: Set EvMeter to the new 'API' option in the config menu when sending L1/2/3 -* Callable API endpoints for easy integration (see [REST_API](REST_API.md) and [Home Assistant Integration](configuration.md#integration-with-home-assistant)) - * Change charging mode - * Override charge current - * Pass in current measurements (p1, battery, ...) - this eliminates having to use additional hardware - * Switch between single- and three phase power (requires extra 2P relais on the c2 connecor, see [Second Contactor](installation.md#second-contactor-c2)) - -# Simple Timer - -There is a simple timer implemented on the webserver, for Delayed Charging. -* Upon refreshing your webpage, the StartTime field (next to the Mode buttons) will be filled with the current system time. -* If you press any of the Mode buttons, your charging session will start immediately; -* If you choose to enter a StartTime that is in the future, a StopTime field will open up; - If you leave this to the default value it is considered to be empty; now if you press Normal, Solar or Smart mode - - the StartTime will be registered, - - the mode will switch to OFF, - - a charging session will be started at StartTime, at either Normal or Smart mode; - - the SmartEVSE will stay on indefinitely. -* If you enter a StopTime, a checkbox named "Daily" will open up; if you check this, the startime/stoptime combination will be used on a daily basis, - starting on the date you entered at the StartTime. -* To clear StartTime, StopTime and Repeat, refresh your webpage and choose either Normal, Solar or Smart mode. -* Know bugs: - - if your NTP time is not synchronized yet (e.g. after a reboot), results will be unpredictable. WAIT until time is settled. - - if your StopTime is AFTER your StartTime+24Hours, untested territories are entered. Please enter values that make sense. - -# EU Capacity Rate Limiting -An EU directive gives electricity providers the possibility to charge end consumers by a "capacity rate", so consumers will be stimulated to flatten their usage curve. -Currently the only known country that has this active is Belgium. -For more details see https://github.com/serkri/SmartEVSE-3/issues/215 - -* In the Menu screen an item "SumMains" is now available, default set at 600A -* This setting will only be of use in Smart or Solar mode -* Apart from all other limits (Mains, MaxCirCuit), the charge current will be limited so that the sum of all phases of the Mains currents will not be exceeding the SumMains setting -* If you don't understand this setting, or don't live in Belgium, leave this setting at its default value diff --git a/SmartEVSE-3/integrations/README.md b/SmartEVSE-3/integrations/README.md deleted file mode 100644 index 346a85a..0000000 --- a/SmartEVSE-3/integrations/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Easy integration with Home Assistant -If you want to integrate your SmartEVSE with Home Asisstant, please have a look at the [SmartEVSE `custom_component` for Home Assistant](https://github.com/dingo35/ha-SmartEVSEv3). This `custom_component` uses the SmartEVSE API to share data from the SmartEVSE to Home Assistant, and enables you to set SmartEVSE settings from Home Assistant. You will need firmware version 1.5.2 or higher to use this integration. - -The YAML file in the home-assistant folder is deprecated. - -# Use ESPHome to provide `current` information to SmartEVSE -Your SmartEVSE has an API endpoint to send L1/L2/L3 data, which means that you don't need to connect a SensorBox to retrieve the required information for load-balancing or solar-charging. -If you are using a P1 reader (often also called DSMR-reader) with your electricity meter, you might want to send the `current` information (L1/L2/L3) directly from your ESPHome device to your SmartEVSE. - -See the [esphome folder](/integrations/esphome/) for an example ESPHome configuration. diff --git a/SmartEVSE-3/integrations/home-assistant/HASS-Node-RED.json b/SmartEVSE-3/integrations/home-assistant/HASS-Node-RED.json deleted file mode 100644 index 804c994..0000000 --- a/SmartEVSE-3/integrations/home-assistant/HASS-Node-RED.json +++ /dev/null @@ -1,442 +0,0 @@ -[ - { - "id": "fa7895a2ccea5b3f", - "type": "tab", - "label": "SerKri - EVSE", - "disabled": false, - "info": "", - "env": [] - }, - { - "id": "17800a49b47fa026", - "type": "inject", - "z": "fa7895a2ccea5b3f", - "name": "", - "props": [ - { - "p": "payload" - }, - { - "p": "topic", - "vt": "str" - } - ], - "repeat": "5", - "crontab": "", - "once": false, - "onceDelay": "5", - "topic": "", - "payload": "", - "payloadType": "date", - "x": 330, - "y": 200, - "wires": [ - [ - "ff1480dbbb7f18c7" - ] - ] - }, - { - "id": "ff1480dbbb7f18c7", - "type": "link call", - "z": "fa7895a2ccea5b3f", - "name": "", - "links": [ - "5862ce2c075744ed" - ], - "timeout": "30", - "x": 610, - "y": 200, - "wires": [ - [ - "784e625f0910483a" - ] - ] - }, - { - "id": "a69e33209285ace0", - "type": "function", - "z": "fa7895a2ccea5b3f", - "name": "EVSE - Home Battery Charge Calculation", - "func": "let battery_charge = msg.battery_charge.state;\nlet battery_charge_last_update = new Date(msg.battery_charge.last_updated);\nlet battery_level = msg.battery_level;\nlet voltage = msg.voltage < 100 ? 230 : msg.voltage;\nlet battery_reserve = msg.battery_reserve * 10;\n\nlet current = new Date();\nlet interval = new Date(current.getTime() - (24 * 3600000));\n\nlet battery_ampere = Math.round(battery_charge / voltage * 10);\nmsg.battery_ampere_original=battery_ampere;\n\nif(battery_charge_last_update.getTime() >= interval.getTime() && battery_level < 100) {\n if(battery_ampere <= battery_reserve) {\n battery_ampere = Math.round( (battery_ampere - battery_reserve) * 0.2);\n } else if (battery_ampere > battery_reserve) {\n battery_ampere -= battery_reserve;\n }\n} else {\n battery_ampere = 0;\n}\n\nmsg.battery_charge = battery_charge;\nmsg.last_update = battery_charge_last_update;\n\nmsg.battery_ampere=battery_ampere;\n\nreturn msg;\n", - "outputs": 1, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 480, - "y": 320, - "wires": [ - [ - "1533b6b07d285c0f" - ] - ] - }, - { - "id": "d6cf6a7d5b14cbf7", - "type": "link in", - "z": "fa7895a2ccea5b3f", - "name": "EVSE - Home Battery Charge Calculation", - "links": [], - "x": 255, - "y": 320, - "wires": [ - [ - "a69e33209285ace0" - ] - ] - }, - { - "id": "c3b957aecca6b782", - "type": "comment", - "z": "fa7895a2ccea5b3f", - "name": "CALCULATION", - "info": "", - "x": 320, - "y": 270, - "wires": [] - }, - { - "id": "1533b6b07d285c0f", - "type": "link out", - "z": "fa7895a2ccea5b3f", - "name": "", - "mode": "return", - "links": [], - "x": 725, - "y": 320, - "wires": [] - }, - { - "id": "784e625f0910483a", - "type": "link call", - "z": "fa7895a2ccea5b3f", - "name": "", - "links": [ - "d6cf6a7d5b14cbf7" - ], - "timeout": "30", - "x": 990, - "y": 200, - "wires": [ - [ - "950b5b90f76bc7d4" - ] - ] - }, - { - "id": "950b5b90f76bc7d4", - "type": "link call", - "z": "fa7895a2ccea5b3f", - "name": "", - "links": [ - "09aa17af8f2e1275" - ], - "timeout": "30", - "x": 1350, - "y": 200, - "wires": [ - [] - ] - }, - { - "id": "c2cb7755cbd71b6a", - "type": "comment", - "z": "fa7895a2ccea5b3f", - "name": "SCHEDULE", - "info": "", - "x": 310, - "y": 140, - "wires": [] - }, - { - "id": "d615e1479edfb12a", - "type": "api-current-state", - "z": "fa7895a2ccea5b3f", - "name": "Battery Charge/Discharge", - "server": "ce8f7f94.ea5ce", - "version": 3, - "outputs": 1, - "halt_if": "", - "halt_if_type": "str", - "halt_if_compare": "is", - "entity_id": "sensor.storage_charge_discharge_power_bt21a0492804", - "state_type": "str", - "blockInputOverrides": false, - "outputProperties": [ - { - "property": "battery_charge", - "propertyType": "msg", - "value": "", - "valueType": "entity" - } - ], - "for": "0", - "forType": "num", - "forUnits": "minutes", - "override_topic": false, - "state_location": "payload", - "override_payload": "msg", - "entity_location": "data", - "override_data": "msg", - "x": 440, - "y": 690, - "wires": [ - [ - "e54b4429805d53aa" - ] - ] - }, - { - "id": "e54b4429805d53aa", - "type": "api-current-state", - "z": "fa7895a2ccea5b3f", - "name": "Battery Level", - "server": "ce8f7f94.ea5ce", - "version": 3, - "outputs": 1, - "halt_if": "", - "halt_if_type": "str", - "halt_if_compare": "is", - "entity_id": "sensor.solar_battery_level", - "state_type": "str", - "blockInputOverrides": false, - "outputProperties": [ - { - "property": "battery_level", - "propertyType": "msg", - "value": "", - "valueType": "entityState" - } - ], - "for": "0", - "forType": "num", - "forUnits": "minutes", - "override_topic": false, - "state_location": "payload", - "override_payload": "msg", - "entity_location": "data", - "override_data": "msg", - "x": 680, - "y": 690, - "wires": [ - [ - "29cae9661c1b2f0b" - ] - ] - }, - { - "id": "5862ce2c075744ed", - "type": "link in", - "z": "fa7895a2ccea5b3f", - "name": "EVSE - Fetch Home Battery Data", - "links": [], - "x": 255, - "y": 690, - "wires": [ - [ - "d615e1479edfb12a" - ] - ] - }, - { - "id": "fa6dced73a152860", - "type": "link out", - "z": "fa7895a2ccea5b3f", - "name": "", - "mode": "return", - "links": [], - "x": 1235, - "y": 690, - "wires": [] - }, - { - "id": "29cae9661c1b2f0b", - "type": "api-current-state", - "z": "fa7895a2ccea5b3f", - "name": "Voltage", - "server": "ce8f7f94.ea5ce", - "version": 3, - "outputs": 1, - "halt_if": "", - "halt_if_type": "str", - "halt_if_compare": "is", - "entity_id": "sensor.energy_voltage", - "state_type": "str", - "blockInputOverrides": false, - "outputProperties": [ - { - "property": "voltage", - "propertyType": "msg", - "value": "", - "valueType": "entityState" - } - ], - "for": "0", - "forType": "num", - "forUnits": "minutes", - "override_topic": false, - "state_location": "payload", - "override_payload": "msg", - "entity_location": "data", - "override_data": "msg", - "x": 880, - "y": 690, - "wires": [ - [ - "fdd19243ac817d7a" - ] - ] - }, - { - "id": "fdd19243ac817d7a", - "type": "api-current-state", - "z": "fa7895a2ccea5b3f", - "name": "Battery Reserve", - "server": "ce8f7f94.ea5ce", - "version": 3, - "outputs": 1, - "halt_if": "", - "halt_if_type": "str", - "halt_if_compare": "is", - "entity_id": "input_number.home_battery_reserve", - "state_type": "str", - "blockInputOverrides": false, - "outputProperties": [ - { - "property": "battery_reserve", - "propertyType": "msg", - "value": "", - "valueType": "entityState" - } - ], - "for": "0", - "forType": "num", - "forUnits": "minutes", - "override_topic": false, - "state_location": "payload", - "override_payload": "msg", - "entity_location": "data", - "override_data": "msg", - "x": 1080, - "y": 690, - "wires": [ - [ - "fa6dced73a152860" - ] - ] - }, - { - "id": "09aa17af8f2e1275", - "type": "link in", - "z": "fa7895a2ccea5b3f", - "name": "EVSE - Set Home Battery Current", - "links": [], - "x": 255, - "y": 530, - "wires": [ - [ - "572d40e8e7d6b40d" - ] - ] - }, - { - "id": "1f23fc18269f9a1d", - "type": "link out", - "z": "fa7895a2ccea5b3f", - "name": "", - "mode": "return", - "links": [], - "x": 565, - "y": 530, - "wires": [] - }, - { - "id": "572d40e8e7d6b40d", - "type": "http request", - "z": "fa7895a2ccea5b3f", - "name": "", - "method": "POST", - "ret": "obj", - "paytoqs": "ignore", - "url": "http://10.0.0.1/currents?battery_current={{battery_ampere}}", - "tls": "", - "persist": false, - "proxy": "", - "authType": "", - "senderr": true, - "credentials": { - "user": "", - "password": "" - }, - "x": 420, - "y": 530, - "wires": [ - [ - "1f23fc18269f9a1d" - ] - ] - }, - { - "id": "99331fbb5748fc53", - "type": "inject", - "z": "fa7895a2ccea5b3f", - "name": "Set Battery Current", - "props": [ - { - "p": "payload" - }, - { - "p": "topic", - "vt": "str" - } - ], - "repeat": "", - "crontab": "", - "once": false, - "onceDelay": 0.1, - "topic": "", - "payload": "", - "payloadType": "date", - "x": 210, - "y": 470, - "wires": [ - [ - "572d40e8e7d6b40d" - ] - ] - }, - { - "id": "1278c4ccd68616de", - "type": "comment", - "z": "fa7895a2ccea5b3f", - "name": "CALL EVSE", - "info": "", - "x": 310, - "y": 420, - "wires": [] - }, - { - "id": "1944f244e90c43ef", - "type": "comment", - "z": "fa7895a2ccea5b3f", - "name": "FETCH DATA FOR CALCULATION", - "info": "", - "x": 380, - "y": 640, - "wires": [] - }, - { - "id": "ce8f7f94.ea5ce", - "type": "server", - "name": "Home Assistant", - "version": 2, - "addon": true, - "rejectUnauthorizedCerts": true, - "ha_boolean": "y|yes|true|on|home|open", - "connectionDelay": true, - "cacheJson": true, - "heartbeat": false, - "heartbeatInterval": 30 - } -] \ No newline at end of file diff --git a/SmartEVSE-3/integrations/home-assistant/configuration.yaml b/SmartEVSE-3/integrations/home-assistant/configuration.yaml deleted file mode 100644 index 994ada4..0000000 --- a/SmartEVSE-3/integrations/home-assistant/configuration.yaml +++ /dev/null @@ -1,148 +0,0 @@ -#lines to integrate SmartEVSE with HASS through native rest-API; no NodeRed or MQTT needed. -#adapt lines 6,145,146 to the url or ip-address of your SmartEVSE -#NOTE: this .yaml is deprecated; it is easier to use the HACS integration, just search for smartevse or look at https://github.com/dingo35/ha-SmartEVSEv3 - -sensor: - - platform: rest - resource: http://SmartEVSE-xxxxx.lan/settings - name: smartevse - scan_interval: 300 - timeout: 20 - json_attributes: - - mode -# - mode_id - - car_connected - - evse - - settings - - ev_meter - - mains_meter - - phase_currents - value_template: "OK" - -template: - sensor: - - name: "smartevse_mode" - state: >- - {{ state_attr('sensor.smartevse', 'mode') }} - - name: "smartevse_car_connected" - state: >- - {{ state_attr('sensor.smartevse', 'car_connected') }} - - name: "smartevse_temp" - state: >- - {{ state_attr('sensor.smartevse', 'evse')['temp'] }} - device_class: temperature - unit_of_measurement: "°C" -# - name: "smartevse_connected" -# state: >- -# {{ state_attr('sensor.smartevse', 'evse')['connected'] }} - - name: "smartevse_access" - state: >- - {{ state_attr('sensor.smartevse', 'evse')['access'] }} -# - name: "smartevse_mode2" -# state: >- -# {{ state_attr('sensor.smartevse', 'evse')['mode'] }} -# - name: "smartevse_charge_timer" -# state: >- -# {{ state_attr('sensor.smartevse', 'evse')['charge_timer'] }} - - name: "smartevse_solar_stop_timer" - state: >- - {{ state_attr('sensor.smartevse', 'evse')['solar_stop_timer'] }} - - name: "smartevse_state" - state: >- - {{ state_attr('sensor.smartevse', 'evse')['state'] }} -# - name: "smartevse_state_id" -# state: >- -# {{ state_attr('sensor.smartevse', 'evse')['state_id'] }} -# - name: "smartevse_error" -# state: >- -# {{ state_attr('sensor.smartevse', 'evse')['error'] }} - - name: "smartevse_error_id" - state: >- - {{ state_attr('sensor.smartevse', 'evse')['error_id'] }} - - name: "smartevse_charge_current" - state: >- - {{ state_attr('sensor.smartevse', 'settings')['charge_current'] / 10 }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_override_current" - state: >- - {{ state_attr('sensor.smartevse', 'settings')['override_current'] }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_current_min" - state: >- - {{ state_attr('sensor.smartevse', 'settings')['current_min'] }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_current_max" - state: >- - {{ state_attr('sensor.smartevse', 'settings')['current_max'] }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_current_main" - state: >- - {{ state_attr('sensor.smartevse', 'settings')['current_main'] }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_solar_max_import" - state: >- - {{ state_attr('sensor.smartevse', 'settings')['solar_max_import'] }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_solar_start_current" - state: >- - {{ state_attr('sensor.smartevse', 'settings')['solar_start_current'] }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_solar_stop_time" - state: >- - {{ state_attr('sensor.smartevse', 'settings')['solar_stop_time'] }} - - name: "smartevse_ev_import_active_energy" - state: >- - {{ state_attr('sensor.smartevse', 'ev_meter')['import_active_energy'] }} - unit_of_measurement: "kWh" - device_class: energy - state_class: total - - name: "smartevse_mains_import_active_energy" - state: >- - {{ state_attr('sensor.smartevse', 'mains_meter')['import_active_energy'] }} - unit_of_measurement: "kWh" - device_class: energy - state_class: total - - name: "smartevse_mains_export_active_energy" - state: >- - {{ state_attr('sensor.smartevse', 'mains_meter')['export_active_energy'] }} - unit_of_measurement: "kWh" - device_class: energy - state_class: total - - name: "smartevse_total" - state: >- - {{ state_attr('sensor.smartevse', 'phase_currents')['TOTAL'] / 10 }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_l1" - state: >- - {{ state_attr('sensor.smartevse', 'phase_currents')['L1'] / 10 }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_l2" - state: >- - {{ state_attr('sensor.smartevse', 'phase_currents')['L2'] / 10 }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_l3" - state: >- - {{ state_attr('sensor.smartevse', 'phase_currents')['L3'] / 10 }} - unit_of_measurement: "A" - device_class: current - - name: "smartevse_last_data_update" - state: >- - {{ state_attr('sensor.smartevse', 'phase_currents')['last_data_update'] | timestamp_custom ('%Y/%m/%d %H:%M:%S') }} - -switch: - - platform: command_line - switches: - smartevse_mode_switch: - command_on: "curl -s -X POST http://SmartEVSE-xxxxx.lan/settings?mode=3 -H 'accept: application/json' -H 'Content-Type: application/json' -d '{}'" - command_off: "curl -s -X POST http://SmartEVSE-xxxxx.lan/settings?mode=0 -H 'accept: application/json' -H 'Content-Type: application/json' -d '{}'" - value_template: '{{value_json.mode_id == "3"}}' diff --git a/SmartEVSE-3/integrations/home-assistant/esphome/ET-SM01 smart meter module.yaml b/SmartEVSE-3/integrations/home-assistant/esphome/ET-SM01 smart meter module.yaml deleted file mode 100644 index 9f60106..0000000 --- a/SmartEVSE-3/integrations/home-assistant/esphome/ET-SM01 smart meter module.yaml +++ /dev/null @@ -1,164 +0,0 @@ -substitutions: - device_name: et-sm01 - human_devicename: DSMR - device_description: "espthings.io ET-SM01 DIY P1 module to read your smart meter" - pcb_version: "220818-01" - url: "http://espthings.io/sm01" - -esphome: - name: ${device_name} - comment: "${device_description} ${pcb_version}" - platform: ESP8266 - esp8266_restore_from_flash: true - board: d1_mini - name_add_mac_suffix: false - project: - name: "espthings.io-ET-SM01" - version: "${pcb_version}" - -wifi: - networks: - - ssid: !secret esphome_wifi_ssid - password: !secret esphome_wifi_password - -logger: - baud_rate: 0 - -api: - encryption: - key: !secret esphome_api_key - -ota: - password: !secret esphome_ota_password - -web_server: - port: 80 - -uart: - baud_rate: 115200 - rx_pin: D7 - -http_request: - useragent: esphome/device - timeout: 1s - -dsmr: - id: dsmr_instance - -sensor: - - platform: dsmr - energy_delivered_tariff1: - name: "$human_devicename - Energy Consumed Tariff 1" - state_class: total_increasing - energy_delivered_tariff2: - name: "$human_devicename - Energy Consumed Tariff 2" - state_class: total_increasing - energy_returned_tariff1: - name: "$human_devicename - Energy Produced Tariff 1" - state_class: total_increasing - energy_returned_tariff2: - name: "$human_devicename - Energy Produced Tariff 2" - state_class: total_increasing - power_delivered: - name: "$human_devicename - Power Consumed" - accuracy_decimals: 3 - power_returned: - name: "$human_devicename - Power Produced" - accuracy_decimals: 3 - electricity_failures: - name: "$human_devicename - Electricity Failures" - icon: mdi:alert - electricity_long_failures: - name: "$human_devicename - Long Electricity Failures" - icon: mdi:alert - voltage_l1: - name: "$human_devicename - Voltage Phase 1" - voltage_l2: - name: "$human_devicename - Voltage Phase 2" - voltage_l3: - name: "$human_devicename - Voltage Phase 3" - current_l1: - name: "$human_devicename - Current Phase 1" - id: currentl1 - current_l2: - name: "$human_devicename - Current Phase 2" - id: currentl2 - current_l3: - name: "$human_devicename - Current Phase 3" - id: currentl3 - power_delivered_l1: - name: "$human_devicename - Power Consumed Phase 1" - accuracy_decimals: 3 - power_delivered_l2: - name: "$human_devicename - Power Consumed Phase 2" - accuracy_decimals: 3 - power_delivered_l3: - name: "$human_devicename - Power Consumed Phase 3" - accuracy_decimals: 3 - power_returned_l1: - name: "$human_devicename - Power Produced Phase 1" - accuracy_decimals: 3 - id: returnedl1 - power_returned_l2: - name: "$human_devicename - Power Produced Phase 2" - accuracy_decimals: 3 - id: returnedl2 - power_returned_l3: - name: "$human_devicename - Power Produced Phase 3" - accuracy_decimals: 3 - id: returnedl3 - gas_delivered: - name: "$human_devicename - Gas Consumed" - state_class: total_increasing - gas_delivered_be: - name: "$human_devicename - Gas Consumed Belgium" - state_class: total_increasing - - platform: uptime - name: "$human_devicename - Uptime" - - platform: wifi_signal - name: "$human_devicename - Wi-Fi Signal" - update_interval: 60s - -text_sensor: - - platform: dsmr - identification: - name: "$human_devicename - Identification" - p1_version: - name: "$human_devicename - Version" - p1_version_be: - name: "$human_devicename - Version Belgium" - electricity_tariff: - name: "$human_devicename - Tarief" - - platform: wifi_info - ip_address: - name: "$human_devicename - IP Address" - ssid: - name: "$human_devicename - Wi-Fi SSID" - bssid: - name: "$human_devicename - Wi-Fi BSSID" - - platform: version - name: "$human_devicename - ESPHome Version" - hide_timestamp: true - -switch: - - platform: restart - name: "$human_devicename - Restart" - -interval: - - interval: 5sec - then: - - http_request.post: - url: !lambda |- - std::string url; - - float l1 = id(returnedl1).state > 0 ? - id(currentl1).state : id(currentl1).state; - float l2 = id(returnedl2).state > 0 ? - id(currentl2).state : id(currentl2).state; - float l3 = id(returnedl3).state > 0 ? - id(currentl3).state : id(currentl3).state; - - url.append("http://192.168.207.121/currents?L1="); - url.append(to_string(l1*10)); - url.append("&L2="); - url.append(to_string(l2*10)); - url.append("&L3="); - url.append(to_string(l3*10)); - return url.c_str(); diff --git a/SmartEVSE-3/integrations/home-assistant/mqtt-configuration.yaml b/SmartEVSE-3/integrations/home-assistant/mqtt-configuration.yaml deleted file mode 100644 index bbc3633..0000000 --- a/SmartEVSE-3/integrations/home-assistant/mqtt-configuration.yaml +++ /dev/null @@ -1,44 +0,0 @@ -###### Content below should go in automations.yaml -###### DO NOT COPY THESE INTO CONFIGURATION.YAML - create the automations in the UI then paste the code below in YAML mode - -alias: .EVSE set MQTT MainsMeter from HA -description: "" -trigger: - - platform: state - entity_id: - - sensor.meter_active_power_l1 - for: - hours: 0 - minutes: 0 - seconds: 1 -action: - - service: mqtt.publish - data_template: - topic: SmartEVSE-XXXXX/Set/MainsMeter - payload: |- - {{ - ((states('sensor.meter_active_power_l1')|float / states('sensor.on_grid_l1_voltage')|float ) * (-1) * 10 ) | round(0) - }}:{{ - ((states('sensor.meter_active_power_l2')|float / states('sensor.on_grid_l2_voltage')|float ) * (-1) * 10 ) | round(0) - }}:{{ - ((states('sensor.meter_active_power_l3')|float / states('sensor.on_grid_l3_voltage')|float ) * (-1) * 10 ) | round(0) - }} - -## -------------------------------------------------------------- - -alias: .EVSE set MQTT HomeBatteryCurrent from HA -trigger: - - platform: state - entity_id: - - sensor.battery_current - for: - hours: 0 - minutes: 0 - seconds: 1 -action: - - service: mqtt.publish - data_template: - topic: SmartEVSE-XXXXX/Set/HomeBatteryCurrent - payload: "{{ (states('sensor.battery_current') | float * 10 * (-1)) | int }}" - - diff --git a/SmartEVSE-3/integrations/home-assistant/p1_dsmr_to_SmartEVSE_API/automations.yaml b/SmartEVSE-3/integrations/home-assistant/p1_dsmr_to_SmartEVSE_API/automations.yaml deleted file mode 100644 index 7d0394d..0000000 --- a/SmartEVSE-3/integrations/home-assistant/p1_dsmr_to_SmartEVSE_API/automations.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- id: 'xxxxxxxxxxxxxx' - alias: P1toSmartevse - description: '' - trigger: - - platform: time_pattern - seconds: /1 - condition: [] - action: - - service: shell_command.dsmrtosmartevse - data: {} - mode: single diff --git a/SmartEVSE-3/integrations/home-assistant/p1_dsmr_to_SmartEVSE_API/configuration.yaml b/SmartEVSE-3/integrations/home-assistant/p1_dsmr_to_SmartEVSE_API/configuration.yaml deleted file mode 100644 index a7b1937..0000000 --- a/SmartEVSE-3/integrations/home-assistant/p1_dsmr_to_SmartEVSE_API/configuration.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#Data naar SMARTEVSe -shell_command: - dsmrtosmartevse: 'curl -X POST "http://192.168.x.x/currents?L1={{ states("sensor.nettocurrent_l1") | float*10 }}&L2={{ states("sensor.nettocurrent_l2") | float*10 }}&L3={{ states("sensor.nettocurrent_l3") | float*10 }}" -H "accept: application/json" -H "Content-Type: application/json" -d {}' - -template: - - sensor: - - name: "nettocurrent_l1" - unit_of_measurement: A - device_class: current - state: > - {% set solarl1 = states('sensor.electricity_meter_power_production_phase_l1') | float(0) %} - {% set currentl1 = states('sensor.electricity_meter_current_phase_l1') | float(0) %} - {{ currentl1 * -1 if solarl1 > 0 else currentl1 }} - availability: > - {{ states('sensor.electricity_meter_power_production_phase_l1') | is_number and - states('sensor.electricity_meter_current_phase_l1') | is_number }} - - sensor: - - name: "nettocurrent_l2" - unit_of_measurement: A - device_class: current - state: > - {% set solarl2 = states('sensor.electricity_meter_power_production_phase_l2') | float(0) %} - {% set currentl2 = states('sensor.electricity_meter_current_phase_l2') | float(0) %} - {{ currentl2 * -1 if solarl2 > 0 else currentl2 }} - availability: > - {{ states('sensor.electricity_meter_power_production_phase_l2') | is_number and - states('sensor.electricity_meter_current_phase_l2') | is_number }} - - sensor: - - name: "nettocurrent_l3" - unit_of_measurement: A - device_class: current - state: > - {% set solarl3 = states('sensor.electricity_meter_power_production_phase_l3') | float(0) %} - {% set currentl3 = states('sensor.electricity_meter_current_phase_l3') | float(0) %} - {{ currentl3 * -1 if solarl3 > 0 else currentl3 }} - availability: > - {{ states('sensor.electricity_meter_power_production_phase_l3') | is_number and - states('sensor.electricity_meter_current_phase_l3') | is_number }} diff --git a/SmartEVSE-3/pictures/SmartEVSEv3.png b/SmartEVSE-3/pictures/SmartEVSEv3.png deleted file mode 100644 index b4ee28a7b77ca9cc0f48029eb662fa147ff87ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317134 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%0A=CCe&m2SGzs*=T9Vq(`__=$j?7yaXet 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 i=@B@T}tkx+O z+$f{%Z5=%-3(*SSJ)8(zRmD=BScbLHb@m-LfL(krO)=V-_$!+sKqi2GcweUjiYfOl zoR2ant7sOQV)WibWo|LZS3KFk7D3`8p2a`L&ZbP1L+^uVMH0(3G2&*dgoF@&{d71Z zXEwB(pS+D#N71~*q@HI7p+ia~^h?zf3?6IO;UTwF2_tu?BVJSlG^gJ!N~*B4V)C7y zPx}~R%URoiNaVS^%Cf+sETS$VKSeCoz*1RF5bfy&5PV$huwR4O5}FSFmQW7hX$#ZI z(9FvrPUpBX_pE#7=kc0fm;4AGibqztr;!3Y6z&mBnB7HoEGo=4hU6nlx!m(^jrnz&Q~x9&Eg}c-l+&D4v#Y zwESxxaa5vqvfFCvSbrcVo9wz0GGR0uQH-s_VV1>UL)OUz3E&rIbPg{DAj=%(p0jT< ztZtc~H*{G8ebK>+j5V`mhEUi-n>}COyV}>=iQqIxDnKz_?eSsYEMdx3CDNExM$jzt zp;~fZ_@|j4{n2!EYCP-m-ps|b_tLX?d49eyCDIneY+;qK2O1Kt8DorQP#q-hH7Kfw z6~i?CsdaH&u$2z)mzKBKTj}ElmQ^T1b7ZEO6kwl2XaODzf!&`l9RCcE9A|0^Aj+o0 zS#8NDS=`||Hb9-|n9c}&@GXoK5C}8z|89u4BwV5zYaCVv78pyZ-{%Cqqo+qw#+)cu z?tRVIopv2-4WqY(X4$W?IGm_|TiWR89=zol^}M*wdpTB$0ZK8HlJG1Hl*tV8sezvj zlSOOF{Qb578v!1Lk^X%%WaGdi@?r|5H@p~L!(ZxTE6*}r( zoPSQpyyvngyfRkw-SWelU5YlPBu)7!LNAB^1&K3NUW6v; zEmZVmoa7zcg#f`spea=@&}@)y>mc#tQkKpKEds=jZv?D?a>INRdf=Hn)=>bRn4H1c zfQ~O5+F)}!ET->JkAHFR()8f|zW)JEIyWpQ9byO;of{OR{K6*;i}}LF-n7=G%B3LV z^MzOEu!QcvB*wFb<_hlT4MN4`t^Dez@6WNR4uO=~G?+%Va>$zamLr=5a3}-ToT|ly zt8(8|hUqh(7#+nLFS<5G+MCsTN8v5j>(Qf!ro%Rsj~Hm^m^u%K+a@HJq4z#1E6r9A zWtg?XZ-Zxbvti1`Ge73hhGXQXHzv>FKiVFe4^kOr-QEC-6OHj97hT>o)qI-;Pe2_9H||BGw`;MGs3p!ZN*fK zAmJ06eP%-EECTT!S1X0K_#;$NF!30&iOq%*=RKozuy`9b5QY;Sq$-eqBt|B`LripT zyX~izrN?oZRhw?U!D6xN8_#PVCQq?~UP5TxpX(B;iS^yb;j&g1K7`7>j9RHKUfhX* zgpk|)2loxQJNi8lhBMQl&LC&(JG;9+gWmCUJwIWvaJWHr28GOoBFmDzjjEgJxt!GaVGNMeN`2{;v93v zfW>{R&+cihA8K89wXVqxiD!IGWTj<~Atg*%Yu$WT^7({TA%LTmYWlXtcuaAF^Nh%- zKA}>vy>w=89xYbz4)x-V7?)A#UA@-%Q1hGDE*l>m4JvO2<+$PSR0g}deSW&QducjS zWhY9r*JC;fKfpckGxI+>cVHH^k-%I$7K?kax#rb_Z6@?%VkkFDo5j3t@rpWRn7nc1 z#NJ^QVlehr(tX>P<>w1iA~TqmGB7+;~?rS%rlGTfiIOTH=>cE6MJF+MQCI@2t12M$W;h}C@R;a>Q-DV}sU)3#E1PGO^dI^rhUi#0w&D)~Z zdz}RLK8doNEJzh*!pmw4IMzw^;nH_)y|y<7 z+3n!)zyjr}rDAxH#mYyZHYYr>pxm|uPp}nIfG-v9-dH1hrifa%3G#AdjK4?Qje8qM@Wk4^RGTPzg)g@N%JE1pKA*kz$ce3UYy@cNW7F= zRr77?=zze5nN9Hl-s;ZJM7?uBPFC+wtd@{#28cIj{808q38keIkF%B$8 zg=2k>m*wXRQzCJjTN@W>LTD4E^C9^gUObjXx!4gE+QE7^ch=gN{>2CdI<3sRWHJx6 zX<#9`dg;n^X-~&jiaEBh9{gEcVn)&lbFT-Xmx>#+AXxv8HxpWlMHAQBi*5m2m~u8N z$|CFQt$=Jn#F{j7nOQrA92v{42(47|T1j!N$P2pG9!Oc2%x`WQSwheXG^M*Kx%BuA zED=;k%JtJ#YX;|7#>8_wEZ}rabGj9N9C4oQ@JTbjzCS12y=n=a@ao2i-1oxy3uO^k zv%jK+@2US<=o_4)#0bfCOx|edC)gX(XR&Srf+zv3#m>o`s63QP8EEMc6yYb2HKDdB zrQB!s$|_Ocm3FS~Lupm~yYqHqIM8_o_#1^)aq1pv?@8frho!7oD<|ew{T1e6ZHgbl zBLQAp;j=~GauASnwVl0^Ku(9uI>!?FSLti>Cv+AMyI7+`&xUmPzU9?`=WtFgS&Drbg9AC!M<2B8^Sy76?)m`DS2KUhziXL19 zzx2LGn4D<9zT3}Rd@cu|$nF+HP*Oncqz$2lpvyx9M*HUKTwaBo?bM-|K}b5y$jklK7Y*ThS&lZkXVlfItGTBPRXc3}C~>W~OGS`lGdZebk_7K^z#5 z5g?SiTf5#(ysh5<{2j2ya`H+iJ`U3%#3Z2!kthVvKs$ppjI&w0j#>O#>bciY#k83& zF8ADuo$Cx-vHEABFEB`mCBVRV9E#9cDBcMx%ad`ew1n4Xcm<*1lIV?9oDfxq0-AB> zy7$`4(H&UHYs}VI*Pwe|RU!k2sPHL8$UHFm~W+-g4 z)KW#px>1UqGIRT3F=8rz#qXPJTm{aUx7ob7o%;~Bs{49QJ?>s(eLw9r>(yYZKQrb< zF*y#e?-6Qgc}k%I;m;hl)(Q5`0dxXCG!Kp1OSX4m`ACVhWBE)-lxR!EGI@rWqsJj2)W-H5;M8{cU9APG5-jgCt
DlBK9{Y4ceMkR}507+s(5A=jVgjbiI>2k4?*aH(2S_ptX^7tCto*(ynjY)kYRcxL z2A~i3+!W0>cZic~UCZ0CwK^x*!_*1Og+>gd*BkybcmvGGPjqj^DKTbr|Hr!J*2Udv z`{G{K$;wj-2QOz45s$T#*d0=}r*9yod7pTK6yO1J@L0Kx2VRGr^XI3Hi<{Gidd*R& zkZLj#?D3XOuLxj;8!?cma`Ke?l8Ir^e0(4&dr0SOjT`!IYfUfgX+z$&jkD}m!plx* zv%L=sU-3=dG6ogl%km;mw2n_T_9K2Wcf8R{yVLngm!_w9aB!uD+*M|6tXhiTf0G`$ zsQp3a6~c5Hx5Cy3_a9D&`;Vsdnbc={GC(hjHWzj*+sugn96;kfhO5f^RHVZAP{L}e zdyTV56@(AL>gC9U1v<2h*HMe=FnQ(RtV@u&+&>C-ZShy`{5SW<3sfQ@U;r=kP5Rkl znlP3)W zkY#B~F`bC<_wV1I4j)ko1#?Si_co_XuU?tX33w>A1?0So+4HIA&6=z#V>l2CVMTcn zw0o?-?kgX2?|~TqWV-)w-%NM$!o_L(iuRQ3DKv0l*VZy+yntR?U(AI>F_kg48NIu; zCh3sind#up{&fH5ZS7OJudt33mjGu+9>AsRm#3?5zA86cV86{i494Dx&H^Fp?^t05 zp7Nrw2w9thdk52lukKCr)MwkP8VOlGF^N7`n0350|tbSjx|3v zawS$FyUdr=tfCy_+4-fp{Aix26lPU70SwdCg;| zl+<1a)@1=$AG&2L8lg4lD88>S4)@;w>fUtw^PAJb{*et2!geUdJ$kiW+MCYn?3%r6 z7pAA0iFB2D^5Buqt4I~r3Fn!g-O*UbbvQ(v?S3D@cPtE6an$PdxVNR(Qq|-C(!VikzWiEzcqm1M z5|nWuet5inR=obkbp4y}i0+r|y*nJ~97$k1wo(@;M2MIJ{CrOGe{l1`bo1jcru$#q znl@x)o)K+1B6(Aad+U{p)2rWjQ+#uE(jrfXCsLB+#7vJf)6UlRJa(^V8A>kCt>1ZG z;Qn;rkK%w2;*quSjNI};@>t1{84~Rcq3jb{f7xCyOo`Z?t=OcKk_f#haAFirSb`7) zy{rPvPB9jd3M@?bMUga!=4Y(h#?_IK_9C#-bvw=y-$uXd560u9GgT}SqK9AInZEwT z7XpP_)BU@$$`n)QI>!2R=bXU!+Vs}NV~-mBAjfevAiLz4c0tQfgNOo^E$ zCt}N6zaQ=&PPcyZ#dPzB2Vs6LNDw4o`mjDVDZNH zKbS5^VVy&{$b569o4v&Vr;W=FF-V}W;!jjMd+%2_rpNaL?4rv#C7!QdxU8_muEuyY zJ^0ma3G?mgl@H#Uu7CK(^yK{R^hlPitGFyw09uuQhGW7@0=46N`_qkI-if$C$|o!Ln-xFzWK&<<@&2u-gqjVmx!##Gff^s<({&lpFVsnnnRZx z(}rAwt6Q?Jr8uPiO*ge=n-0EuINiE+Z+h_R#p(6$z3a`Vhw9vL41m+K4SI-2yu-YJ zh49<9Lahg1-kt7<7oP}#&&!j#qUxY{w2yTUeSiP)^x&tTOm_ryZ~WdjrdQv*E)Pyh z=V5pS%uZ-&2~8n`&hg!OIDP%m7t^M&eOq3@wY{rW3|~DG{Y0Z(C5I31A5OP_`Wq|u z>%afubpGEMiLB`?th6}r!%gMVT{0;rX!) zql4Qwr%$w|7v8%$z4N!eJ?#jbPvjX=eoV#JWAR*D;8wEcd6bhTBSY!VFF%`(zIrh2 zN@-yTp554!_b1~>^m+8~aJutnA5Zr`|9X1;hu@ms_}2Rl#T`-M#(ik_Q~8>BQ}J## zWf(qwbUc0Wvrnc+pWTzOCtlZ>6IR=p9&3N-+O1ea`p1G zf3WY;U+>czFlexMtw7pOa0qbpFb1&l_ifCDCwdEjJ$$@>Q?jtmbm7ZwbiZusBjb5t zO2iry#Q=fqJtWyxX$aS>Q%z&n&xU;zh+n3D#Z7wwtOz3Dc411`Ej{B41yG7AN&AYW zW1$JR?1rma+uGg z7-g;U9L@d7%|~L;kEZkQzBaw~owu#v9?2Uzam(n`yffbJWdv9r+}@u)`Ev>T=eMWr z#{wV$09KJt$pic}PtMFZxpgvq_3$&D?D$~%#vgxgx+qZCf3PoL5Pc8;C#W5%_9iO4 zo=INMXMgpZ>EQD_(}e?dVLpGwiRvgR&DDLk;sM-N{v&7XbY^5$>-=?|uh7q#zX|ADIL2s@@s2ZJFVr|vH${ZRD2@mC*D zm$jbPuD&MESISm^jdH_+-q@umWOKSG1Lnq^`_pIt{4b}CKX@ud`-a5Z2~xDDt=FRlRsF4bJMnRKM!x*n)anYw&l(5shoW4{G1UfnP6Yf z`RU5z%hOGjW&iTO{#VnHJmzoz@sFm%?c?cz=7!OB&bbV5DEv#98@{;lSD#G#GM4tl zFPl3TBtzLlbtGCsBlfnz4=C%ee)7@u#iyT6KmO1Dt_&wB;fD{h4+`V1S~LX+z_Et? zKv{Eb+zl|SV9eL$JBC4r!1K9jN4YiL9!3YJGtT?ExNN!WDgge?|MlXOh^d!}+M4E1 z%I8AkB2q#LXqNUXM%~^P?d%4I($6T3T8DYL2uZQAk4`_1OV@5|s%fFho1j3guy=nmKQenK9J)QZEc0Jbkjt@?z2Y2pHpULv)_}=$^ z@C}Ep4yEl}9fR9ii98l&|Mvaq$SO{sWILsC3HEyE~aKZd|k!I<~L5p_ox{D1Gn4phWga>wNpk^yR<#r9+jky#1P$Z*llkCcfXpNZFj;xO`nXjmOik|MkzN@BF>r zH+VmJ`au8WX?EzA5SFez61d;^%TK0PH_lJ5tE|}T37el0uqlLv7Xv+!3tEp{+T1gM zefF<^IbFS`(A;&EpxzCi04*qZ*2sHy6gIpigXY}*lj-t#=%S6M`}+=`a(%+IG$=Lf z%V5}+^}jjYzx8nX%}@Sn`u3j)?3JUUt)^VK9zjP`1t5w{Mqz-|LLEqdhg=&@Qi3DW5JepeQ8rgC1>x-AoPnO-CD55B_t$;F75z@w@6}6}r|H(y>63r0JB z_I9wL4*{gh=It-PnvTA>KkbMqw)b|XOS=L?S&D>`Sk$>To$9LH^9p4M(Drs^{r`IU zH<$nA^v7cU9SPP6Af+6HtETi!auLU3{4aj;o9VnlKbNmuaRSj%sM;ZprA1jPF8qP^ zfAA09zI<+X`t0BQTp@(>(^Y}78?M=^Oi8g7;o+0%=C8h*p58i|t|`>Pedo%hnm1J; zoDRrd5$|%BpzTV)AAWjo`t;xaX8NYAOWgQPV$z}xmX2L}jp^Q}Ur$G$-k)CExjJ1q zBku-!60i2LrIHL=quEf0<;xhaX?ORoXmRega!#)v3+Q*fi&=p)ftkjjaFq)d^z-n` z{b})-t#3hK$e_Fwv1o4Ep`bMWTfey}WqB;)M#_P;lVL%4szbeH z;(0CE6Jtd#+U;rm?|yoB`tsVx(>MR%_pFfdGU12KO?|$lO{NcJu`5)2Ue^-5^3MD6 zfLu!KoIsNK-j_vwfHjrjc30uh8-Mxh>Dzzj4-A~?Y!L68b=#JLy7kF#rkw-v7-ixv zs-Q|uYl}DG%wsw#JW@Whz3S^%uS~CPU6n;~R|@pLl$7{UAbceLa~@UqrT~Jl=Hcg} zow�?Q@c4MFza@OGͶ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%0DYi&3Wg-rRnu=zNHo;Kea4f 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 diff --git a/SmartEVSE-3/schematic/SmartEVSEv3.pdf b/SmartEVSE-3/schematic/SmartEVSEv3.pdf deleted file mode 100644 index 5476dfc7fd14cfd3bd79494d0a33a3c1f65e69b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104057 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

KOy%!y589(~^ks(S+sUopKti)>K+F=NrR%Q} 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