Implement notetaking app, ST7796 display with touch support, audio beep navigation, and video streaming
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
#!/usr/bin/env python3
|
||||
import urllib.request
|
||||
import json
|
||||
import base64
|
||||
import time
|
||||
import subprocess
|
||||
import os
|
||||
from PIL import Image
|
||||
|
||||
ESP32_IP = "192.168.68.123"
|
||||
URL = f"http://{ESP32_IP}/api/mcp"
|
||||
ARTIFACTS_DIR = "/Users/adolforeyna/.gemini/antigravity/brain/8b421e8b-10a8-4d06-a7d0-27bd82b42804"
|
||||
|
||||
def capture_screenshot(output_filename):
|
||||
print(f"Requesting screenshot from ESP32 ({ESP32_IP})...")
|
||||
payload = {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"method": "tools/call",
|
||||
"params": {
|
||||
"name": "get_screenshot",
|
||||
"arguments": {}
|
||||
}
|
||||
}
|
||||
|
||||
req_data = json.dumps(payload).encode('utf-8')
|
||||
req = urllib.request.Request(
|
||||
URL,
|
||||
data=req_data,
|
||||
headers={"Content-Type": "application/json"},
|
||||
method="POST"
|
||||
)
|
||||
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=10.0) as response:
|
||||
resp_body = response.read().decode('utf-8')
|
||||
resp_json = json.loads(resp_body)
|
||||
content = resp_json.get("result", {}).get("content", [{}])[0].get("text", "")
|
||||
|
||||
if content.startswith("__PBM_BASE64__:"):
|
||||
pbm_b64 = content.split(":", 1)[1]
|
||||
pbm_bytes = base64.b64decode(pbm_b64)
|
||||
|
||||
temp_pbm = "temp_capture.pbm"
|
||||
with open(temp_pbm, "wb") as pf:
|
||||
pf.write(pbm_bytes)
|
||||
|
||||
# Convert to PNG using Pillow
|
||||
img = Image.open(temp_pbm)
|
||||
dest_path = os.path.join(ARTIFACTS_DIR, output_filename)
|
||||
img.save(dest_path)
|
||||
os.remove(temp_pbm)
|
||||
print(f"Success: Screenshot saved to {dest_path}")
|
||||
return True
|
||||
else:
|
||||
print("Error: Invalid screenshot response format.")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"Failed to capture screenshot: {e}")
|
||||
return False
|
||||
|
||||
def run_stream_test(protocol):
|
||||
print(f"\n--- Starting {protocol.upper()} Stream Verification ---")
|
||||
|
||||
# 1. Start test_stream.py in background
|
||||
cmd = ["python3", "test_stream.py", "--ip", ESP32_IP, "--protocol", protocol, "--source", "animation"]
|
||||
proc = subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
print(f"Stream client process started in background (PID: {proc.pid}).")
|
||||
|
||||
# 2. Wait for frames to stream and render
|
||||
print("Streaming frames... Waiting 3 seconds...")
|
||||
time.sleep(3.0)
|
||||
|
||||
# 3. Capture screen rendering
|
||||
filename = f"{protocol}_stream_success.png"
|
||||
capture_screenshot(filename)
|
||||
|
||||
# 4. Terminate stream client
|
||||
print(f"Terminating stream client process...")
|
||||
proc.terminate()
|
||||
proc.wait()
|
||||
print(f"Stream client stopped.")
|
||||
|
||||
def main():
|
||||
if not os.path.exists(ARTIFACTS_DIR):
|
||||
os.makedirs(ARTIFACTS_DIR)
|
||||
|
||||
# Test TCP
|
||||
run_stream_test("tcp")
|
||||
|
||||
# Test Dashboard Auto-Timeout (stream timeout is 3.0s, let's wait 4.0s)
|
||||
print("\n--- Verifying Stream Inactivity Timeout ---")
|
||||
print("Waiting 4 seconds for stream to time out on ESP32...")
|
||||
time.sleep(4.0)
|
||||
capture_screenshot("dashboard_resumed.png")
|
||||
|
||||
# Test UDP
|
||||
run_stream_test("udp")
|
||||
|
||||
# Clean up stream
|
||||
print("\nWait 4 seconds to let the screen return to dashboard...")
|
||||
time.sleep(4.0)
|
||||
|
||||
print("\nVerification Completed successfully.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user