flandre/src/nodes/Device.py

159 lines
5.0 KiB
Python
Raw Normal View History

2025-01-19 18:27:26 +08:00
import logging
2025-01-19 19:05:56 +08:00
import subprocess
2025-01-19 18:27:26 +08:00
import time
import zmq
2025-01-19 19:05:56 +08:00
from config import LIVE_REP_SOCKET, CONFIG
2025-01-19 18:27:26 +08:00
from nodes.Node import Node
2025-01-19 19:05:56 +08:00
from utils.Msg import ImageArgMsg, KillMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \
2025-01-19 18:27:26 +08:00
DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg
logger = logging.getLogger(__name__)
class Device(Node):
topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg]
2025-01-20 17:21:53 +08:00
def __init__(self, level=logging.INFO):
super(Device, self).__init__(level=level)
self.arg = ImageArgMsg('', t_start=0, t_end=1499)
2025-01-19 18:27:26 +08:00
self.seq_meta = None
self.device_rep_socket = None
self.ok = b'ok\x00'
def connect(self):
self.device_rep_socket.send(b'connect')
rb = self.device_rep_socket.recv()
if rb == self.ok:
self.send(DeviceConnectedMsg(True))
else:
logger.error(f"Device msg: {rb}")
def disconnect(self):
self.device_rep_socket.send(b'disconnect')
rb = self.device_rep_socket.recv()
if rb == self.ok:
self.send(DeviceConnectedMsg(False))
else:
logger.error(f"Device msg: {rb}")
def enable(self):
self.device_rep_socket.send(b'enable')
rb = self.device_rep_socket.recv()
if rb == self.ok:
self.send(DeviceEnabledMsg(True))
2025-01-20 17:21:53 +08:00
return True
2025-01-19 18:27:26 +08:00
else:
logger.error(f"Device msg: {rb}")
2025-01-20 17:21:53 +08:00
return False
2025-01-19 18:27:26 +08:00
def disable(self):
self.device_rep_socket.send(b'disable')
rb = self.device_rep_socket.recv()
if rb == self.ok:
self.send(DeviceEnabledMsg(False))
2025-01-20 17:21:53 +08:00
return True
2025-01-19 18:27:26 +08:00
else:
logger.error(f"Device msg: {rb}")
2025-01-20 17:21:53 +08:00
return False
2025-01-19 18:27:26 +08:00
def online(self):
2025-01-20 13:03:02 +08:00
code = subprocess.run(['curl', '-m', '1', f'http://{LIVE_REP_SOCKET}'], stderr=subprocess.DEVNULL,
2025-01-19 18:27:26 +08:00
stdout=subprocess.DEVNULL).returncode
2025-01-20 17:21:53 +08:00
logger.info(f'detect curl code: {code}')
2025-01-20 13:03:02 +08:00
match code:
case 28 | 7:
self.send(DeviceOnlineMsg(False))
return False
case _:
self.send(DeviceOnlineMsg(True))
return True
2025-01-19 18:27:26 +08:00
def enabled(self):
self.device_rep_socket.send(b'enabled')
rb = self.device_rep_socket.recv()
match rb:
case b'true':
self.send(DeviceEnabledMsg(True))
2025-01-20 17:21:53 +08:00
return True
2025-01-19 18:27:26 +08:00
case b'false':
self.send(DeviceEnabledMsg(False))
2025-01-20 17:21:53 +08:00
return False
2025-01-19 18:27:26 +08:00
case _:
logger.error(f"Device msg: {rb}")
def connected(self):
self.device_rep_socket.send(b'connected')
rb = self.device_rep_socket.recv()
match rb:
case b'true':
self.send(DeviceConnectedMsg(True))
2025-01-20 17:21:53 +08:00
return True
2025-01-19 18:27:26 +08:00
case b'false':
self.send(DeviceConnectedMsg(False))
2025-01-20 17:21:53 +08:00
return False
2025-01-19 18:27:26 +08:00
case _:
logger.error(f"Device msg: {rb}")
2025-01-20 17:21:53 +08:00
def setfile00(self, s: str):
2025-01-19 18:27:26 +08:00
self.device_rep_socket.send(b'file' + s.encode())
rb = self.device_rep_socket.recv()
if rb == self.ok:
pass
# self.send(DeviceConnectedMsg(True))
else:
logger.error(f"Device msg: {rb}")
2025-01-20 17:21:53 +08:00
def setfile(self, config_str: str):
if self.enabled():
self.disable()
self.setfileonly(config_str)
self.enable()
elif self.connected():
self.setfileonly(config_str)
else:
logger.warning(f"Device not connect, cannot set config")
def setfileonly(self, s: str):
self.device_rep_socket.send(b'fileonly' + s.encode())
rb = self.device_rep_socket.recv()
if rb == self.ok:
return True
else:
logger.error(f"Device msg: {rb}")
return False
2025-01-19 18:27:26 +08:00
def loop(self):
arr = []
self.device_rep_socket = self.context.socket(zmq.REQ)
self.device_rep_socket.connect(f"tcp://{LIVE_REP_SOCKET}")
time.sleep(1)
if self.online():
self.connected()
self.enabled()
for f in CONFIG.glob('*.txt'):
arr.append((f.stem, f.read_text()))
self.send(DeviceConfigListMsg(arr))
2025-01-20 17:21:53 +08:00
# if arr.__len__() > 0:
# self.setfile(arr[0][1])
logger.debug(f'device start loop')
2025-01-19 18:27:26 +08:00
while True:
msg = self.recv()
2025-01-20 17:21:53 +08:00
logger.debug(f'{msg}')
2025-01-19 18:27:26 +08:00
if isinstance(msg, KillMsg):
if msg.name == '':
return
elif isinstance(msg, SetDeviceEnabledMsg):
if msg.value:
self.enable()
else:
self.disable()
elif isinstance(msg, SetDeviceConnectedMsg):
if msg.value:
self.connect()
else:
self.disconnect()
elif isinstance(msg, SetDeviceConfigMsg):
self.setfile(msg.value)