diff --git a/deploy/nginx.conf b/deploy/nginx.conf index fc09ba6..252c7cd 100644 --- a/deploy/nginx.conf +++ b/deploy/nginx.conf @@ -28,6 +28,21 @@ server { proxy_set_header Host $host; } + # WebSocket endpoints (ESP32 simulation, etc.) + # Must come BEFORE the generic /api/ block so nginx matches it first. + location /api/simulation/ws/ { + proxy_pass http://127.0.0.1:8001/api/simulation/ws/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 86400s; + proxy_send_timeout 86400s; + } + # Proxy /api/* requests to the FastAPI backend. # FastAPI Swagger UI is at /api/docs (moved from /docs to avoid # conflicting with the frontend /docs/* documentation routes). diff --git a/frontend/src/data/examples.ts b/frontend/src/data/examples.ts index b814edb..ed4b270 100644 --- a/frontend/src/data/examples.ts +++ b/frontend/src/data/examples.ts @@ -2034,23 +2034,12 @@ void loop() { // Blinks the built-in LED (GPIO2) and an external LED (GPIO4) // Requires arduino-esp32 2.0.17 (IDF 4.4.x) — see docs/ESP32_EMULATION.md -#include -#include #define LED_BUILTIN_PIN 2 // Built-in blue LED on ESP32 DevKit #define LED_EXT_PIN 4 // External red LED -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); pinMode(LED_BUILTIN_PIN, OUTPUT); pinMode(LED_EXT_PIN, OUTPUT); @@ -2058,7 +2047,6 @@ void setup() { } void loop() { - disableAllWDT(); digitalWrite(LED_BUILTIN_PIN, HIGH); digitalWrite(LED_EXT_PIN, HIGH); Serial.println("LED ON"); @@ -2090,20 +2078,9 @@ void loop() { // Echoes anything received on Serial (UART0) back to the sender. // Open the Serial Monitor, type something, and see it echoed back. -#include -#include -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); delay(500); Serial.println("ESP32 Serial Echo ready!"); @@ -2111,7 +2088,6 @@ void setup() { } void loop() { - disableAllWDT(); if (Serial.available()) { String input = Serial.readStringUntil('\\n'); input.trim(); @@ -2933,8 +2909,6 @@ void loop() { code: `// ESP32 — 7-Segment Display Counter 0-9 // Segments: a=12, b=13, c=14, d=25, e=26, f=27, g=32 -#include -#include const int SEG[7] = {12, 13, 14, 25, 26, 27, 32}; @@ -2951,14 +2925,6 @@ const bool DIGITS[10][7] = { {1,1,1,1,0,1,1}, // 9 }; -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void showDigit(int d) { for (int i = 0; i < 7; i++) @@ -2966,14 +2932,12 @@ void showDigit(int d) { } void setup() { - disableAllWDT(); for (int i = 0; i < 7; i++) pinMode(SEG[i], OUTPUT); Serial.begin(115200); Serial.println("ESP32 7-Segment Counter"); } void loop() { - disableAllWDT(); for (int d = 0; d <= 9; d++) { showDigit(d); Serial.print("Digit: "); Serial.println(d); @@ -3751,8 +3715,6 @@ void loop() { // Wiring: DATA → GPIO4 | VCC → 3V3 | GND → GND #include -#include -#include #define DHT_PIN 4 // GPIO 4 #define DHT_TYPE DHT22 @@ -3760,17 +3722,8 @@ void loop() { DHT dht(DHT_PIN, DHT_TYPE); // Disable hardware Timer Group WDTs (QEMU emulation is slower than real time) -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); dht.begin(); delay(2000); @@ -3778,7 +3731,6 @@ void setup() { } void loop() { - disableAllWDT(); delay(2000); float h = dht.readHumidity(); @@ -3810,23 +3762,12 @@ void loop() { code: `// ESP32 — HC-SR04 Ultrasonic Distance Sensor // Wiring: TRIG → D18 | ECHO → D19 | VCC → 3V3 | GND → GND -#include -#include #define TRIG_PIN 18 #define ECHO_PIN 19 -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); @@ -3844,7 +3785,6 @@ long measureCm() { } void loop() { - disableAllWDT(); long cm = measureCm(); if (cm < 0) Serial.println("Out of range"); else Serial.printf("Distance: %ld cm\\n", cm); @@ -3872,25 +3812,14 @@ void loop() { // Requires: Adafruit MPU6050, Adafruit Unified Sensor libraries // Wiring: SDA → D21 | SCL → D22 | VCC → 3V3 | GND → GND -#include -#include #include #include #include Adafruit_MPU6050 mpu; -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); Wire.begin(21, 22); // SDA=21, SCL=22 if (!mpu.begin()) { @@ -3904,7 +3833,6 @@ void setup() { } void loop() { - disableAllWDT(); sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); @@ -3936,8 +3864,6 @@ void loop() { code: `// ESP32 — PIR Motion Sensor // Wiring: OUT → D5 | VCC → 3V3 | GND → GND -#include -#include #define PIR_PIN 5 #define LED_PIN 2 // built-in blue LED on ESP32 DevKit @@ -3945,17 +3871,8 @@ void loop() { bool prevMotion = false; unsigned long detections = 0; -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); pinMode(PIR_PIN, INPUT); pinMode(LED_PIN, OUTPUT); @@ -3965,7 +3882,6 @@ void setup() { } void loop() { - disableAllWDT(); bool motion = (digitalRead(PIR_PIN) == HIGH); if (motion && !prevMotion) { detections++; @@ -4001,8 +3917,6 @@ void loop() { // Pot : SIG → D34 | VCC → 3V3 | GND → GND #include -#include -#include #define SERVO_PIN 13 #define POT_PIN 34 // input-only GPIO (ADC) @@ -4010,24 +3924,14 @@ void loop() { Servo myServo; // Disable hardware Timer Group WDTs (QEMU emulation is slower than real time) -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); myServo.attach(SERVO_PIN, 500, 2400); // standard servo pulse range Serial.println("ESP32 Servo + Pot control"); } void loop() { - disableAllWDT(); // keep WDTs disabled (FreeRTOS may re-enable) int raw = analogRead(POT_PIN); // 0–4095 (12-bit ADC) int angle = map(raw, 0, 4095, 0, 180); myServo.write(angle); @@ -4059,31 +3963,19 @@ void loop() { // Wiring: HORZ → D35 | VERT → D34 | SEL → D15 // VCC → 3V3 | GND → GND -#include -#include #define JOY_HORZ 35 // input-only ADC pin #define JOY_VERT 34 // input-only ADC pin #define JOY_BTN 15 // GPIO with pull-up -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); pinMode(JOY_BTN, INPUT_PULLUP); Serial.println("ESP32 Joystick ready"); } void loop() { - disableAllWDT(); int x = analogRead(JOY_HORZ); // 0–4095 int y = analogRead(JOY_VERT); // 0–4095 bool btn = (digitalRead(JOY_BTN) == LOW); @@ -4121,8 +4013,6 @@ void loop() { // Wiring: DATA → GPIO3 | VCC → 3V3 | GND → GND #include -#include -#include #define DHT_PIN 3 // GPIO 3 #define DHT_TYPE DHT22 @@ -4130,17 +4020,8 @@ void loop() { DHT dht(DHT_PIN, DHT_TYPE); // Disable hardware Timer Group WDTs (QEMU emulation is slower than real time) -void disableAllWDT() { - TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG0.wdt_config0.en = 0; - TIMERG0.wdt_wprotect = 0; - TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config0.en = 0; - TIMERG1.wdt_wprotect = 0; -} void setup() { - disableAllWDT(); Serial.begin(115200); dht.begin(); delay(2000); @@ -4148,7 +4029,6 @@ void setup() { } void loop() { - disableAllWDT(); delay(2000); float h = dht.readHumidity();