import logging import subprocess import time import zmq from config import LIVE_REP_SOCKET, CONFIG from nodes.Node import Node from utils.Msg import ImageArgMsg, KillMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \ DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg logger = logging.getLogger(__name__) class Device(Node): topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg] def __init__(self): super(Device, self).__init__() self.arg = ImageArgMsg('',t_start=0, t_end=1499) 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)) else: logger.error(f"Device msg: {rb}") def disable(self): self.device_rep_socket.send(b'disable') rb = self.device_rep_socket.recv() if rb == self.ok: self.send(DeviceEnabledMsg(False)) else: logger.error(f"Device msg: {rb}") def online(self): code = subprocess.run(['curl', '-m', '1', f'http://{LIVE_REP_SOCKET}'], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL).returncode print(code) match code: case 28 | 7: self.send(DeviceOnlineMsg(False)) return False case _: self.send(DeviceOnlineMsg(True)) return True 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)) case b'false': self.send(DeviceEnabledMsg(False)) 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)) case b'false': self.send(DeviceConnectedMsg(False)) case _: logger.error(f"Device msg: {rb}") def setfile(self, s: str): 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}") 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)) if arr.__len__() > 0: self.setfile(arr[0][1]) while True: msg = self.recv() 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)