From 3eeae182ee8f85785724aac4177df1ea12c2e407 Mon Sep 17 00:00:00 2001 From: ZanzyTHEbar Date: Thu, 9 Mar 2023 20:21:10 +0000 Subject: [PATCH] feat: add esp32s3 support - add beta simulator environment --- ESP/diagram.json | 76 ++++++++ ESP/ini/boards.ini | 32 +++- ESP/ini/sim.ini | 40 ++++ ESP/lib/src/network/api/baseAPI/baseAPI.hpp | 4 +- ESP/platformio.ini | 3 +- ESP/src/main.cpp | 192 +++++++++++--------- ESP/tools/createwokwi.py | 41 +++++ ESP/wokwi.toml | 7 + 8 files changed, 305 insertions(+), 90 deletions(-) create mode 100644 ESP/diagram.json create mode 100644 ESP/ini/sim.ini create mode 100644 ESP/tools/createwokwi.py create mode 100644 ESP/wokwi.toml diff --git a/ESP/diagram.json b/ESP/diagram.json new file mode 100644 index 0000000..8e6b680 --- /dev/null +++ b/ESP/diagram.json @@ -0,0 +1,76 @@ +{ + "version": 1, + "author": "DaOfficialWizard", + "editor": "wokwi", + "parts": [ + { + "type": "wokwi-esp32-devkit-v1", + "id": "esp", + "top": 0, + "left": 0, + "attrs": {} + }, + { + "type": "wokwi-led", + "id": "led1", + "top": 82.91, + "left": 128.93, + "rotate": 180, + "attrs": { + "color": "red" + } + }, + { + "type": "wokwi-resistor", + "id": "r1", + "top": 149.11, + "left": 125.63, + "attrs": { + "value": "1000" + } + } + ], + "connections": [ + [ + "esp:TX0", + "$serialMonitor:RX", + "", + [] + ], + [ + "esp:RX0", + "$serialMonitor:TX", + "", + [] + ], + [ + "esp:GND.1", + "r1:1", + "black", + [ + "h0" + ] + ], + [ + "led1:C", + "r1:2", + "green", + [ + "v-4.6", + "h38.86", + "v72.64" + ] + ], + [ + "led1:A", + "esp:D4", + "green", + [ + "v-3.11", + "h-23.78", + "v30.85" + ] + ] + ], + "dependencies": {} +} \ No newline at end of file diff --git a/ESP/ini/boards.ini b/ESP/ini/boards.ini index 9398752..3834533 100644 --- a/ESP/ini/boards.ini +++ b/ESP/ini/boards.ini @@ -130,7 +130,7 @@ build_flags = ${env.build_flags} board = esp-wrover-kit board_build.f_flash = 80000000L board_build.flash_mode = qio -build_type = debug +build_type = release build_flags = ${env.build_flags} -DDEBUG_MODE=0 ; Set the debug mode -DCORE_DEBUG_LEVEL=1 @@ -145,4 +145,34 @@ upload_protocol = espota upload_flags = --port=${ota.otaserverport} --auth=${ota.otapassword} + +[env:wrovers3] +board = esp32-s3-devkitc-1 +#board_build.f_flash = 80000000L +#board_build.flash_mode = qio +build_type = debug +build_flags = ${env.build_flags} + -DCORE_DEBUG_LEVEL=4 ; set the debug level + -DDEBUG_MODE=1 ; Set the debug mode + ; CAMERA PINOUT DEFINITIONS + ${pinoutsESPWROVER.build_flags} + +[env:wrovers3_release] +board = esp32-s3-devkitc-1 +#board_build.f_flash = 80000000L +#board_build.flash_mode = qio build_type = release +build_flags = ${env.build_flags} + -DDEBUG_MODE=0 ; Set the debug mode + -DCORE_DEBUG_LEVEL=1 + -DDEBUG_ESP_OTA + ; CAMERA PINOUT DEFINITIONS + ${pinoutsESPWROVER.build_flags} + +[env:wrovers3_OTA] +extends = env:wrover_release +upload_port = ${ota.otaserverip} +upload_protocol = espota +upload_flags = + --port=${ota.otaserverport} + --auth=${ota.otapassword} diff --git a/ESP/ini/sim.ini b/ESP/ini/sim.ini new file mode 100644 index 0000000..a2fd6ed --- /dev/null +++ b/ESP/ini/sim.ini @@ -0,0 +1,40 @@ +[sim] +ssid = "Wokwi-GUEST" # required for simulator +password = "" + +[env:esp32AIThinker_sim] +board = esp32cam +build_type = debug +extra_scripts = + ${env.extra_scripts} + post:tools/createwokwi.py +build_flags = -DENABLE_ADHOC=${wifi.enableadhoc} + -DADHOC_CHANNEL=${wifi.adhocchannel} + -DWIFI_CHANNEL=${wifi.channel} + -DDEBUG_ESP_PORT=Serial ; set the debug port + '-DMDNS_HOSTNAME=${wifi.mDNSName}' ; Set the OTA password + # required for simulator + '-DWIFI_SSID=${sim.ssid}' + '-DWIFI_PASSWORD=${sim.password}' + '-DWIFI_AP_SSID=${wifi.ap_ssid}' + '-DWIFI_AP_PASSWORD=${wifi.ap_password}' + '-DWIFI_AP_CHANNEL=${wifi.adhocchannel}' + + -DENABLE_OTA=${ota.enableota} + -DOTA_SERVER_PORT=${ota.otaserverport} + '-DOTA_PASSWORD=${ota.otapassword}' ; Set the OTA password + '-DOTA_IP=${ota.otaserverip}' ; Set the OTA password + + -O2 ; optimize for speed + -DASYNCWEBSERVER_REGEX ; enable regex in asyncwebserver + + # Comment these out if you are not using psram + -DBOARD_HAS_PSRAM ; enable psram + -mfix-esp32-psram-cache-issue ; fix for psram + ; Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run faster + -DHTTP_PARSER_STRICT=0 + -DCORE_DEBUG_LEVEL=4 ; set the debug level + -DDEBUG_MODE=1 + -DSIM_ENABLED + ; CAMERA PINOUT DEFINITIONS + ${pinoutsAIThinker.build_flags} diff --git a/ESP/lib/src/network/api/baseAPI/baseAPI.hpp b/ESP/lib/src/network/api/baseAPI/baseAPI.hpp index 473f8bc..5230497 100644 --- a/ESP/lib/src/network/api/baseAPI/baseAPI.hpp +++ b/ESP/lib/src/network/api/baseAPI/baseAPI.hpp @@ -15,8 +15,8 @@ #define XHTTP_OPTIONS 0b01000000; #define XHTTP_ANY 0b01111111; */ -#define HTTP_ANY 0b01111111 -#define HTTP_GET 0b00000001 +//constexpr int HTTP_GET = 0b00000001; +constexpr int HTTP_ANY = 0b01111111; #include #include diff --git a/ESP/platformio.ini b/ESP/platformio.ini index def8c5b..0a46bca 100644 --- a/ESP/platformio.ini +++ b/ESP/platformio.ini @@ -9,10 +9,11 @@ ; https://docs.platformio.org/page/projectconf.html [platformio] -default_envs = esp32AIThinker ; do not change this value unless you know what you are doing +default_envs = esp32AIThinker ; do not change this value unless you know what you are doing description = Open Source ESP Camera firmware extra_configs = ini/boards.ini ini/pinouts.ini ini/user_config.ini ini/dev_config.ini + ini/sim.ini diff --git a/ESP/src/main.cpp b/ESP/src/main.cpp index d653365..3d2ba76 100644 --- a/ESP/src/main.cpp +++ b/ESP/src/main.cpp @@ -1,17 +1,18 @@ #include -#include -#include -#include #include -#include +#include +#include #include +#include +#include -//! TODO: Setup OTA enabled state to be controllable by API if enabled at compile time +//! TODO: Setup OTA enabled state to be controllable by API if enabled at +//! compile time #if ENABLE_OTA #include -#endif // ENABLE_OTA -#include +#endif // ENABLE_OTA #include +#include int STREAM_SERVER_PORT = 80; int CONTROL_SERVER_PORT = 81; @@ -25,96 +26,115 @@ ProjectConfig deviceConfig("openiris", MDNS_HOSTNAME); #if ENABLE_OTA OTA ota(&deviceConfig); -#endif // ENABLE_OTA +#endif // ENABLE_OTA LEDManager ledManager(33); + +#ifndef SIM_ENABLED CameraHandler cameraHandler(&deviceConfig, &ledStateManager); +#endif // SIM_ENABLED +WiFiHandler wifiHandler(&deviceConfig, + &wifiStateManager, + WIFI_SSID, + WIFI_PASSWORD, + WIFI_CHANNEL); -WiFiHandler wifiHandler(&deviceConfig, &wifiStateManager, WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL); -APIServer apiServer(CONTROL_SERVER_PORT, &deviceConfig, &cameraHandler, &wifiStateManager, "/control"); +#ifndef SIM_ENABLED +APIServer apiServer(CONTROL_SERVER_PORT, + &deviceConfig, + &cameraHandler, + &wifiStateManager, + "/control"); +#else +APIServer apiServer(CONTROL_SERVER_PORT, + &deviceConfig, + NULL, + &wifiStateManager, + "/control"); +#endif // SIM_ENABLED MDNSHandler mdnsHandler(&mdnsStateManager, &deviceConfig); + +#ifndef SIM_ENABLED StreamServer streamServer(STREAM_SERVER_PORT, &wifiStateManager); +#endif // SIM_ENABLED -void setup() -{ - setCpuFrequencyMhz(240); // set to 240mhz for performance boost - Serial.begin(115200); - //Serial.setDebugOutput(DEBUG_MODE); - //Serial.println("Free Heap: " + String(ESP.getFreeHeap())); - Logo::printASCII(); - Serial.flush(); - //Serial.println("Free Heap: " + String(ESP.getFreeHeap())); +void setup() { + setCpuFrequencyMhz(240); // set to 240mhz for performance boost + Serial.begin(115200); + // Serial.setDebugOutput(DEBUG_MODE); + // Serial.println("Free Heap: " + String(ESP.getFreeHeap())); + Logo::printASCII(); + Serial.flush(); + // Serial.println("Free Heap: " + String(ESP.getFreeHeap())); - ledManager.begin(); - deviceConfig.attach(&cameraHandler); - deviceConfig.attach(&mdnsHandler); - deviceConfig.initConfig(); - deviceConfig.load(); - wifiHandler._enable_adhoc = ENABLE_ADHOC; - wifiHandler.setupWifi(); - mdnsHandler.startMDNS(); + ledManager.begin(); +#ifndef SIM_ENABLED + deviceConfig.attach(&cameraHandler); +#endif // SIM_ENABLED + deviceConfig.attach(&mdnsHandler); + deviceConfig.initConfig(); + deviceConfig.load(); + wifiHandler._enable_adhoc = ENABLE_ADHOC; + wifiHandler.setupWifi(); + mdnsHandler.startMDNS(); - /* mdnsStateManager.setState(MDNSState_e::MDNSState_Starting); - switch (mdnsStateManager.getCurrentState()) - { - case MDNSState_e::MDNSState_Starting: - break; - case MDNSState_e::MDNSState_Error: - break; - case MDNSState_e::MDNSState_QueryComplete: - mdnsHandler.startMDNS(); - break; - default: - break; - } */ + /* mdnsStateManager.setState(MDNSState_e::MDNSState_Starting); + switch (mdnsStateManager.getCurrentState()) + { + case MDNSState_e::MDNSState_Starting: + break; + case MDNSState_e::MDNSState_Error: + break; + case MDNSState_e::MDNSState_QueryComplete: + mdnsHandler.startMDNS(); + break; + default: + break; + } */ - switch (wifiStateManager.getCurrentState()) - { - case WiFiState_e::WiFiState_Disconnected: - { - //! TODO: Implement - break; - } - case WiFiState_e::WiFiState_Disconnecting: - { - //! TODO: Implement - break; - } - case WiFiState_e::WiFiState_ADHOC: - { - streamServer.startStreamServer(); - log_d("[SETUP]: Starting Stream Server"); - apiServer.begin(); - log_d("[SETUP]: Starting API Server"); - break; - } - case WiFiState_e::WiFiState_Connected: - { - streamServer.startStreamServer(); - log_d("[SETUP]: Starting Stream Server"); - apiServer.begin(); - log_d("[SETUP]: Starting API Server"); - break; - } - case WiFiState_e::WiFiState_Connecting: - { - //! TODO: Implement - break; - } - case WiFiState_e::WiFiState_Error: - { - //! TODO: Implement - break; - } - } + switch (wifiStateManager.getCurrentState()) { + case WiFiState_e::WiFiState_Disconnected: { + //! TODO: Implement + break; + } + case WiFiState_e::WiFiState_Disconnecting: { + //! TODO: Implement + break; + } + case WiFiState_e::WiFiState_ADHOC: { +#ifndef SIM_ENABLED + streamServer.startStreamServer(); + log_d("[SETUP]: Starting Stream Server"); +#endif // SIM_ENABLED + apiServer.begin(); + log_d("[SETUP]: Starting API Server"); + break; + } + case WiFiState_e::WiFiState_Connected: { +#ifndef SIM_ENABLED + streamServer.startStreamServer(); + log_d("[SETUP]: Starting Stream Server"); +#endif // SIM_ENABLED + apiServer.begin(); + log_d("[SETUP]: Starting API Server"); + break; + } + case WiFiState_e::WiFiState_Connecting: { + //! TODO: Implement + break; + } + case WiFiState_e::WiFiState_Error: { + //! TODO: Implement + break; + } + } #if ENABLE_OTA - ota.begin(); -#endif // ENABLE_OTA + ota.begin(); +#endif // ENABLE_OTA } -void loop() -{ +void loop() { #if ENABLE_OTA - ota.handleOTAUpdate(); -#endif // ENABLE_OTA - ledManager.handleLED(&ledStateManager); + ota.handleOTAUpdate(); +#endif // ENABLE_OTA + ledManager.handleLED(&ledStateManager); } diff --git a/ESP/tools/createwokwi.py b/ESP/tools/createwokwi.py new file mode 100644 index 0000000..9b3f0ec --- /dev/null +++ b/ESP/tools/createwokwi.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +# https://docs.wokwi.com/vscode/getting-started + +# TODO: Add generation of diagram.json file per board environment + +Import("env") +try: + + def createTOML(source, target, env): + try: + firmware_name = env.subst("$BUILD_DIR\${PROGNAME}") + firmware_name = firmware_name.split(".pio")[1] + + firmware_name = firmware_name.replace("\\", "/") + + print("Creating wokwi.toml for %s" % firmware_name) + + wokwi_string = """\ +[wokwi] +version = 1 +elf = ".pio{name}.elf" +firmware = ".pio{name}.bin" +[[net.forward]] +from = "localhost:8180" +to = "target:80" +""" + toml_string = wokwi_string.format(name=firmware_name) + print(toml_string) + with open("wokwi.toml", "w") as f: + f.write(toml_string) + f.close() + + print("wokwi.toml created \n") + + except Exception as e: + print("Error creating wokwi.toml: %s" % e) + + env.AddPostAction("$BUILD_DIR\${PROGNAME}.bin", createTOML) + +except Exception as e: + print("Error creating wokwi.toml: %s" % e) diff --git a/ESP/wokwi.toml b/ESP/wokwi.toml new file mode 100644 index 0000000..fee500c --- /dev/null +++ b/ESP/wokwi.toml @@ -0,0 +1,7 @@ +[wokwi] +version = 1 +elf = ".pio/build/esp32AIThinker_sim/OpenIris-v1.9.4-esp32AIThinker_sim-b4d56af-master.elf" +firmware = ".pio/build/esp32AIThinker_sim/OpenIris-v1.9.4-esp32AIThinker_sim-b4d56af-master.bin" +[[net.forward]] +from = "localhost:8180" +to = "target:80"