from flask import Flask, render_template_string, request, jsonify
import serial
import serial.tools.list_ports
import time
app = Flask(__name__)
ser = None
HTML_TEMPLATE = """
ESP32-P4 Waveform Gen Dual
Connection
Disconnected
Channel A (Pin 33)
Channel B (Pin 32)
Log waiting...
"""
@app.route('/')
def index():
ports = [p.device for p in serial.tools.list_ports.comports()]
return render_template_string(HTML_TEMPLATE, ports=ports)
@app.route('/connect', methods=['POST'])
def connect():
global ser
port = request.json.get('port')
try:
if ser: ser.close()
ser = serial.Serial(port, 115200, timeout=0.1)
return jsonify(success=True, message=f"Connected to {port}")
except Exception as e:
return jsonify(success=False, message=str(e))
@app.route('/cmd', methods=['POST'])
def cmd():
global ser
if not ser: return jsonify(success=False, response="Not connected")
command = request.json.get('cmd')
try:
# Clear buffer
ser.reset_input_buffer()
ser.write((command + "\n").encode())
# Wait a bit longer for the ESP to process and respond
time.sleep(0.2)
# Read the line response
resp = ser.read_all().decode(errors='replace').strip()
if not resp:
# Try one more read in case it's slow
time.sleep(0.3)
resp = ser.read_all().decode(errors='replace').strip()
return jsonify(success=True, response=resp or "Empty response")
except Exception as e:
return jsonify(success=False, response=str(e))
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)