feeder: use FrappyManager to connect to running frappy instances

This commit is contained in:
l_samenv
2025-03-03 14:13:11 +01:00
parent a5b5d1de8d
commit b5c770e7d8
4 changed files with 80 additions and 16 deletions

View File

@ -4,7 +4,7 @@ import json
import time
import socket
from select import select
from streams import Stream, Base
from streams import Stream, Base, StreamDead
IDN = re.compile('.*ISSE.*,SEC[oO]P,')
DESCRIBING = re.compile(r'describing \S* (.*)$')
@ -50,8 +50,8 @@ class SecopStream(Stream):
raise ValueError('missing describing message')
self.descr = json.loads(match.group(1))
self.device = device or self.descr['equipment_id']
if self.device.endswith('psi.ch'):
self.device[-6:] = []
if self.device.endswith('.psi.ch'):
self.device = self.device[:-7]
self.tags['device'] = self.device
self.modules = self.descr['modules']
self.convert = {}
@ -144,7 +144,7 @@ class ScanReply(UdpStream):
except OSError as e:
print('could not send the broadcast:', e)
self.socket = sock
self.select_dict[sock.fileno()] = self
self.select_read[sock.fileno()] = self
class ScanStream(UdpStream):
@ -158,7 +158,49 @@ class ScanStream(UdpStream):
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.bind(('0.0.0.0', SECOP_UDP_PORT))
self.socket = sock
self.select_dict[sock.fileno()] = self
self.select_read[sock.fileno()] = self
class TrySecopConnect(Base):
def __init__(self, uri):
self.uri = uri
host, port = self.uri.split(':')
sock = socket.socket()
sock.setblocking(False)
self.socket = sock
self.fno = sock.fileno()
self.select_write[self.fno] = self
try:
sock.connect((host, int(port)))
except BlockingIOError:
pass
self.idn = b''
def events(self):
if self.select_write.pop(self.fno, None):
try:
self.socket.sendall(b'*IDN?\n')
self.idn_sent = True
print('SEND IDN', self.uri)
self.select_read[self.fno] = self
return
except Exception as e:
print('NO CONN TO', self.uri)
print(e)
else:
reply = b''
try:
chunk = self.socket.recv(99)
if chunk:
self.idn += chunk
if b'SECoP' in self.idn:
print('CONN TO', self.uri)
yield SecopStream, self.uri, {'stream': self.uri}
if b'\n' not in self.idn:
return
except Exception as e:
print(e)
self.select_read.pop(self.fno)
def send_fake_udp(uri, device=None, instrument=None):