Fixed ESI never timing out
This commit is contained in:
parent
edecc01ca1
commit
a3ddaa69d3
2 changed files with 26 additions and 17 deletions
|
|
@ -65,6 +65,7 @@ class ExtensibleSerialInstrument(object):
|
|||
Set up the serial port and so on.
|
||||
"""
|
||||
logging.info("Updating ESI port settings")
|
||||
logging.debug(kwargs)
|
||||
self.port_settings.update(kwargs)
|
||||
logging.info("Opening ESI connection to port {}".format(port))
|
||||
self.open(port, False) # Eventually this shouldn't rely on init...
|
||||
|
|
@ -86,7 +87,9 @@ class ExtensibleSerialInstrument(object):
|
|||
assert (
|
||||
port is not None
|
||||
), "We don't have a serial port to open, meaning you didn't specify a valid port. Are you sure the instrument is connected?"
|
||||
logging.info("Creating serial.Serial instance...")
|
||||
self._ser = serial.Serial(port, **self.port_settings)
|
||||
logging.info(f"Created {self._ser}")
|
||||
# the block above wraps the serial IO layer with a text IO layer
|
||||
# this allows us to read/write in neat lines. NB the buffer size must
|
||||
# be set to 1 byte for maximum responsiveness.
|
||||
|
|
@ -130,11 +133,6 @@ class ExtensibleSerialInstrument(object):
|
|||
assert (
|
||||
self._ser.isOpen()
|
||||
), "Attempted to write to the serial port before it was opened. Perhaps you need to call the 'open' method first?"
|
||||
# TODO: Check if this code is needed and if not kill it
|
||||
# try:
|
||||
# if self._ser.outWaiting()>0: self._ser.flushOutput() #ensure there's nothing waiting
|
||||
# except AttributeError:
|
||||
# if self._ser.out_waiting>0: self._ser.flushOutput() #ensure there's nothing waiting
|
||||
data = query_string + self.termination_character
|
||||
data = data.encode()
|
||||
self._ser.write(data)
|
||||
|
|
@ -145,7 +143,7 @@ class ExtensibleSerialInstrument(object):
|
|||
if self._ser.inWaiting() > 0:
|
||||
self._ser.flushInput()
|
||||
|
||||
def readline(self, timeout=None):
|
||||
def readline(self):
|
||||
"""Read one line from the serial port."""
|
||||
with self.communications_lock:
|
||||
return (
|
||||
|
|
@ -165,7 +163,7 @@ class ExtensibleSerialInstrument(object):
|
|||
self._communications_lock = threading.RLock()
|
||||
return self._communications_lock
|
||||
|
||||
def read_multiline(self, termination_line=None, timeout=None):
|
||||
def read_multiline(self, termination_line=None):
|
||||
"""Read one line from the underlying bus. Must be overriden.
|
||||
|
||||
This should not need to be reimplemented unless there's a more efficient
|
||||
|
|
@ -181,11 +179,11 @@ class ExtensibleSerialInstrument(object):
|
|||
while (
|
||||
termination_line not in last_line and len(last_line) > 0
|
||||
): # read until we get the termination line.
|
||||
last_line = self.readline(timeout)
|
||||
last_line = self.readline()
|
||||
response += last_line
|
||||
return response
|
||||
|
||||
def query(self, queryString, multiline=False, termination_line=None, timeout=None):
|
||||
def query(self, queryString, multiline=False, termination_line=None):
|
||||
"""
|
||||
Write a string to the stage controller and return its response.
|
||||
|
||||
|
|
@ -193,12 +191,17 @@ class ExtensibleSerialInstrument(object):
|
|||
will keep reading until a termination phrase is reached.
|
||||
"""
|
||||
with self.communications_lock:
|
||||
logging.debug("Flushing input buffer...")
|
||||
self.flush_input_buffer()
|
||||
logging.debug(f"Writing query: {queryString}")
|
||||
self.write(queryString)
|
||||
logging.debug("Query written")
|
||||
if self.ignore_echo == True: # Needs Implementing for a multiline read!
|
||||
first_line = self.readline(timeout).strip()
|
||||
logging.debug("Reading first line...")
|
||||
first_line = self.readline().strip()
|
||||
logging.debug(f"Read finished. Got {first_line}")
|
||||
if first_line == queryString:
|
||||
return self.readline(timeout).strip()
|
||||
return self.readline().strip()
|
||||
else:
|
||||
logging.info("This command did not echo!!!")
|
||||
return first_line
|
||||
|
|
@ -206,11 +209,13 @@ class ExtensibleSerialInstrument(object):
|
|||
if termination_line is not None:
|
||||
multiline = True
|
||||
if multiline:
|
||||
logging.debug("Reading multiline...")
|
||||
return self.read_multiline(termination_line)
|
||||
else:
|
||||
return self.readline(
|
||||
timeout
|
||||
).strip() # question: should we strip the final newline?
|
||||
logging.debug("Reading response...")
|
||||
line = self.readline().strip() # question: should we strip the final newline?
|
||||
logging.debug(f"Read finished. Got {line}")
|
||||
return line
|
||||
|
||||
def parsed_query(
|
||||
self,
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ class Sangaboard(ExtensibleSerialInstrument):
|
|||
# Once initialised, `firmware` is a string that identifies the firmware version
|
||||
firmware = None
|
||||
|
||||
def __init__(self, port=None, **kwargs):
|
||||
def __init__(self, port=None, timeout: int = 2, **kwargs):
|
||||
"""Create a sangaboard object.
|
||||
|
||||
Arguments are passed to the constructor of
|
||||
|
|
@ -101,13 +101,16 @@ class Sangaboard(ExtensibleSerialInstrument):
|
|||
"""
|
||||
|
||||
# Initialise basic serial instrument with specified
|
||||
ExtensibleSerialInstrument.__init__(self, port, **kwargs)
|
||||
logging.info(f"Initialising ExtensibleSerialInstrument on port {port}")
|
||||
ExtensibleSerialInstrument.__init__(self, port, timeout=timeout, **kwargs)
|
||||
|
||||
try:
|
||||
# Make absolutely sure that whatever port we're on is valid
|
||||
logging.info("Checking valid firmware...")
|
||||
self.check_valid_firmware()
|
||||
|
||||
# Bit messy: Defining all valid modules as not available, then overwriting with available information if available.
|
||||
logging.info("Loading modules...")
|
||||
self.light_sensor = LightSensor(False)
|
||||
|
||||
for module in self.list_modules():
|
||||
|
|
@ -145,10 +148,11 @@ class Sangaboard(ExtensibleSerialInstrument):
|
|||
"""
|
||||
Overrides superclass, used in self.open(), and port scanning
|
||||
"""
|
||||
logging.info("Testing communication to SangaBoard")
|
||||
return self.check_valid_firmware()
|
||||
|
||||
def check_valid_firmware(self):
|
||||
logging.debug("Running firmware checks")
|
||||
logging.info("Running firmware checks...")
|
||||
|
||||
# Request firmware version from the board
|
||||
self.firmware = self.query("version", timeout=2).rstrip()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue