Files
mcp_screen/verify_streaming.py
T

108 lines
3.4 KiB
Python

#!/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()