feat: add WebSocket support for ESP32 simulation in nginx configuration; clean up example code by removing unused WDT functions
parent
9d45484fce
commit
dc335c666e
|
|
@ -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).
|
||||
|
|
|
|||
|
|
@ -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 <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
#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 <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
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 <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
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 <DHT.h>
|
||||
#include <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
#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 <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
#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 <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
#include <Adafruit_MPU6050.h>
|
||||
#include <Adafruit_Sensor.h>
|
||||
#include <Wire.h>
|
||||
|
||||
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 <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
#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 <ESP32Servo.h>
|
||||
#include <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
#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 <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
#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 <DHT.h>
|
||||
#include <soc/timer_group_struct.h>
|
||||
#include <soc/timer_group_reg.h>
|
||||
|
||||
#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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue