В процессе доработки. Сейчас невозможно понять, что сигнал на входе перешел с ACTIVE в INACTIVE из-за того, что прерывание включено только на Rising Edge и только там взводится флаг pending
54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
"""
|
|
m5/power.py — управление питанием таргета через M5 RLY1.
|
|
|
|
Использование:
|
|
python m5/power.py --port /dev/ttyACM1 --state on
|
|
python m5/power.py --port /dev/ttyACM1 --state off
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import sys
|
|
import time
|
|
|
|
import serial
|
|
|
|
|
|
def main() -> None:
|
|
parser = argparse.ArgumentParser(description="M5 target power control")
|
|
parser.add_argument("--port", required=True, help="M5 serial port")
|
|
parser.add_argument("--state", required=True, choices=["on", "off"])
|
|
args = parser.parse_args()
|
|
|
|
state = args.state == "on"
|
|
cmd = json.dumps({"cmd": "power", "state": state})
|
|
|
|
ser = serial.Serial(args.port, 115200, timeout=3)
|
|
time.sleep(0.1)
|
|
ser.reset_input_buffer()
|
|
ser.write(cmd.encode("ascii") + b"\r\n")
|
|
|
|
deadline = time.monotonic() + 3
|
|
while time.monotonic() < deadline:
|
|
line = ser.readline().decode("ascii", errors="replace").strip()
|
|
if not line.startswith("{"):
|
|
continue
|
|
resp = json.loads(line)
|
|
if resp.get("ok"):
|
|
label = "включено" if state else "выключено"
|
|
print(f" Питание таргета {label}")
|
|
ser.close()
|
|
return
|
|
print(f" M5 error: {resp.get('err', '?')}")
|
|
ser.close()
|
|
sys.exit(1)
|
|
|
|
ser.close()
|
|
print(" Нет ответа от M5")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|