Initial public release
This commit is contained in:
+110
@@ -0,0 +1,110 @@
|
||||
"""Test serial communication with the ATOMS3 MacroPad device."""
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
import json
|
||||
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
|
||||
import serial
|
||||
import serial.tools.list_ports
|
||||
|
||||
ESPRESSIF_VID = 0x303A
|
||||
DEVICE_ID = "ATOMS3-MACROPAD"
|
||||
|
||||
|
||||
def find_device():
|
||||
ports = serial.tools.list_ports.comports()
|
||||
candidates = []
|
||||
for port in ports:
|
||||
if port.vid == ESPRESSIF_VID:
|
||||
candidates.append(port)
|
||||
print(f" Found Espressif device: {port.device} "
|
||||
f"(VID={hex(port.vid)}, PID={hex(port.pid)}, desc={port.description})")
|
||||
return candidates
|
||||
|
||||
|
||||
def test_connection(port_name, attempt=1):
|
||||
"""Try to connect and ping the device."""
|
||||
print(f"\n--- Attempt {attempt} on {port_name} ---")
|
||||
try:
|
||||
ser = serial.Serial()
|
||||
ser.port = port_name
|
||||
ser.baudrate = 115200
|
||||
ser.timeout = 2
|
||||
ser.dtr = False
|
||||
ser.rts = False
|
||||
ser.open()
|
||||
print(f" Port opened")
|
||||
|
||||
time.sleep(0.1)
|
||||
ser.dtr = True
|
||||
time.sleep(0.5)
|
||||
ser.reset_input_buffer()
|
||||
|
||||
cmd = b'{"cmd":"ping"}\n'
|
||||
ser.write(cmd)
|
||||
print(f" Sent: {cmd.strip()}")
|
||||
|
||||
line = ser.readline().decode("utf-8", errors="ignore").strip()
|
||||
print(f" Received: {repr(line)}")
|
||||
|
||||
if line:
|
||||
try:
|
||||
data = json.loads(line)
|
||||
if data.get("id") == DEVICE_ID:
|
||||
print(f" PING OK - Device identified as {DEVICE_ID}")
|
||||
ser.close()
|
||||
return True
|
||||
else:
|
||||
print(f" Wrong device ID: {data}")
|
||||
except json.JSONDecodeError:
|
||||
print(f" Invalid JSON response")
|
||||
else:
|
||||
print(f" No response (empty)")
|
||||
|
||||
ser.close()
|
||||
return False
|
||||
|
||||
except serial.SerialException as e:
|
||||
print(f" Serial error: {e}")
|
||||
return False
|
||||
except OSError as e:
|
||||
print(f" OS error: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def test_reconnect(port_name):
|
||||
print(f"\n=== Testing reconnect cycle on {port_name} ===")
|
||||
for i in range(3):
|
||||
if not test_connection(port_name, i + 1):
|
||||
print(f"\nRECONNECT TEST FAILED on attempt {i + 1}")
|
||||
return False
|
||||
if i < 2:
|
||||
print(" Waiting 1s before reconnect...")
|
||||
time.sleep(1)
|
||||
print(f"\nRECONNECT TEST PASSED - 3/3 cycles successful")
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
print("=== ATOMS3 MacroPad Serial Test ===\n")
|
||||
print("Scanning for Espressif USB devices...")
|
||||
candidates = find_device()
|
||||
|
||||
if not candidates:
|
||||
print("\nNo Espressif USB devices found!")
|
||||
print("Make sure the ATOMS3 is connected via USB.")
|
||||
return 1
|
||||
|
||||
for port in candidates:
|
||||
if test_reconnect(port.device):
|
||||
print(f"\nAll tests PASSED on {port.device}")
|
||||
return 0
|
||||
|
||||
print("\nAll tests FAILED")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user