feeder: use FrappyManager to connect to running frappy instances
This commit is contained in:
52
secop.py
52
secop.py
@ -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):
|
||||
|
Reference in New Issue
Block a user