flandre/src/nodes/Device.py

128 lines
4.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]
def __init__(self):
super(Device, self).__init__()
self.arg = ImageArgMsg('', v1=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', 'http://11.6.1.66:22'], stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL).returncode
if code == 28:
self.send(DeviceOnlineMsg(False))
return False
else:
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)