Files
m5stack-automation-tool/pull_ble_log.py
T
2026-07-17 15:29:53 -04:00

63 lines
1.8 KiB
Python

"""Pull the device's in-memory BLE debug ring buffer over USB-CDC.
Usage:
python pull_ble_log.py # auto-detect port, write to config/.ble_device_log.json
python pull_ble_log.py COM7 # specify port
python pull_ble_log.py --clear # also clear device-side buffer after pulling
Run this AFTER reproducing the BLE issue so the buffer captures the failure.
The Python desktop app must NOT be running (it holds the serial port).
"""
import json
import os
import sys
from pathlib import Path
from serial_manager import SerialManager
from utils.constants import APPDATA_DIR
def main(argv: list[str]) -> int:
clear = "--clear" in argv
args = [a for a in argv[1:] if not a.startswith("--")]
port = args[0] if args else None
sm = SerialManager()
if port:
sm.connect(port)
else:
sm.scan_and_connect()
if not sm.connected:
print("ERROR: device not found on USB. Is the desktop app running and holding the port?")
return 1
print(f"Connected to {sm.port}")
entries = sm.get_ble_log()
if entries is None:
print("ERROR: get_ble_log returned no response (firmware too old? reflash needed.)")
sm.disconnect()
return 2
out_path = Path(APPDATA_DIR) / ".ble_device_log.json"
out_path.parent.mkdir(parents=True, exist_ok=True)
out_path.write_text(json.dumps(entries, indent=2), encoding="utf-8")
print(f"Wrote {len(entries)} entries to {out_path}")
# Pretty-print to stdout so you can pipe to a file or grep.
for e in entries:
print(f"[{e.get('t', 0)}ms] {e.get('m', '')}")
if clear:
if sm.clear_ble_log():
print("Device buffer cleared.")
else:
print("WARNING: clear_ble_log failed.")
sm.disconnect()
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))