lift_indicator_suite/tools/hil/m5/power.py
Ezra Maccabee f037bea91f # 13 Слой bsp_opto
В процессе доработки. Сейчас невозможно понять, что сигнал на входе перешел с ACTIVE в INACTIVE из-за того, что прерывание включено только на Rising Edge и только там взводится флаг pending
2026-03-26 17:54:54 +03:00

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()