def configure(self, config_string): message = None if self.runner: message = 'Configuring a new session before previous session has been terminated.' log.warning(message) if self.runner.is_running: self.runner.stop() config = DeviceConfiguration.deserialize(config_string) config.validate() self.output_directory = self._create_output_directory() self.labels = config.labels log.info('Writing port files to {}'.format(self.output_directory)) self.runner = DaqRunner(config, self.output_directory) return message
def configure(self, config_kwargs): """Configure the DAQ""" if self.runner: message = 'Configuring a new session before previous session has been terminated.' self.logger.warning(message) if self.runner.is_running: self.runner.stop() config = DeviceConfiguration(**config_kwargs) config.validate() self.output_directory = self._create_output_directory() self.labels = config.labels self.logger.info('Writing port files to %s', self.output_directory) self.opened_files = OpenFileTracker() self.runner = DaqRunner(config, self.output_directory)
class DaqServer(object): def __init__(self, base_output_directory): self.base_output_directory = os.path.abspath(base_output_directory) if os.path.isdir(self.base_output_directory): log.info('Using output directory: {}'.format(self.base_output_directory)) else: log.info('Creating new output directory: {}'.format(self.base_output_directory)) os.makedirs(self.base_output_directory) self.runner = None self.output_directory = None self.labels = None def configure(self, config_string): message = None if self.runner: message = 'Configuring a new session before previous session has been terminated.' log.warning(message) if self.runner.is_running: self.runner.stop() config = DeviceConfiguration.deserialize(config_string) config.validate() self.output_directory = self._create_output_directory() self.labels = config.labels log.info('Writing port files to {}'.format(self.output_directory)) self.runner = DaqRunner(config, self.output_directory) return message def start(self): if self.runner: if not self.runner.is_running: self.runner.start() else: message = 'Calling start() before stop() has been called. Data up to this point will be lost.' log.warning(message) self.runner.stop() self.runner.start() return message else: raise ProtocolError('Start called before a session has been configured.') def stop(self): if self.runner: if self.runner.is_running: self.runner.stop() else: message = 'Attempting to stop() before start() was invoked.' log.warning(message) self.runner.stop() return message else: raise ProtocolError('Stop called before a session has been configured.') def list_devices(self): # pylint: disable=no-self-use return list_available_devices() def list_ports(self): return self.labels def list_port_files(self): if not self.runner: raise ProtocolError('Attempting to list port files before session has been configured.') ports_with_files = [] for port_id in self.labels: path = self.get_port_file_path(port_id) if os.path.isfile(path): ports_with_files.append(port_id) return ports_with_files def get_port_file_path(self, port_id): if not self.runner: raise ProtocolError('Attepting to get port file path before session has been configured.') return self.runner.get_port_file_path(port_id) def terminate(self): message = None if self.runner: if self.runner.is_running: message = 'Terminating session before runner has been stopped.' log.warning(message) self.runner.stop() self.runner = None if self.output_directory and os.path.isdir(self.output_directory): shutil.rmtree(self.output_directory) self.output_directory = None log.info('Session terminated.') else: # Runner has not been created. message = 'Attempting to close session before it has been configured.' log.warning(message) return message def _create_output_directory(self): basename = datetime.now().strftime('%Y-%m-%d_%H%M%S%f') dirname = os.path.join(self.base_output_directory, basename) os.makedirs(dirname) return dirname def __del__(self): if self.runner: self.runner.stop() def __str__(self): return '({})'.format(self.base_output_directory) __repr__ = __str__
class DaqServer(object): def __init__(self, base_output_directory): self.base_output_directory = os.path.abspath(base_output_directory) if os.path.isdir(self.base_output_directory): log.info('Using output directory: {}'.format( self.base_output_directory)) else: log.info('Creating new output directory: {}'.format( self.base_output_directory)) os.makedirs(self.base_output_directory) self.runner = None self.output_directory = None self.labels = None def configure(self, config_string): message = None if self.runner: message = 'Configuring a new session before previous session has been terminated.' log.warning(message) if self.runner.is_running: self.runner.stop() config = DeviceConfiguration.deserialize(config_string) config.validate() self.output_directory = self._create_output_directory() self.labels = config.labels log.info('Writing port files to {}'.format(self.output_directory)) self.runner = DaqRunner(config, self.output_directory) return message def start(self): if self.runner: if not self.runner.is_running: self.runner.start() else: message = 'Calling start() before stop() has been called. Data up to this point will be lost.' log.warning(message) self.runner.stop() self.runner.start() return message else: raise ProtocolError( 'Start called before a session has been configured.') def stop(self): if self.runner: if self.runner.is_running: self.runner.stop() else: message = 'Attempting to stop() before start() was invoked.' log.warning(message) self.runner.stop() return message else: raise ProtocolError( 'Stop called before a session has been configured.') def list_devices(self): # pylint: disable=no-self-use return list_available_devices() def list_ports(self): return self.labels def list_port_files(self): if not self.runner: raise ProtocolError( 'Attempting to list port files before session has been configured.' ) ports_with_files = [] for port_id in self.labels: path = self.get_port_file_path(port_id) if os.path.isfile(path): ports_with_files.append(port_id) return ports_with_files def get_port_file_path(self, port_id): if not self.runner: raise ProtocolError( 'Attepting to get port file path before session has been configured.' ) return self.runner.get_port_file_path(port_id) def terminate(self): message = None if self.runner: if self.runner.is_running: message = 'Terminating session before runner has been stopped.' log.warning(message) self.runner.stop() self.runner = None if self.output_directory and os.path.isdir(self.output_directory): shutil.rmtree(self.output_directory) self.output_directory = None log.info('Session terminated.') else: # Runner has not been created. message = 'Attempting to close session before it has been configured.' log.warning(message) return message def _create_output_directory(self): basename = datetime.now().strftime('%Y-%m-%d_%H%M%S%f') dirname = os.path.join(self.base_output_directory, basename) os.makedirs(dirname) return dirname def __del__(self): if self.runner: self.runner.stop() def __str__(self): return '({})'.format(self.base_output_directory) __repr__ = __str__
class DaqServer(object): """Interface between a DaqRunner and a remote client""" def __init__(self, base_output_directory): self.logger = logging.getLogger('{}.{}'.format(__name__, self.__class__.__name__)) self.base_output_directory = os.path.abspath(base_output_directory) if os.path.isdir(self.base_output_directory): self.logger.info('Using output directory: %s', self.base_output_directory) else: self.logger.info('Creating new output directory: %s', self.base_output_directory) os.makedirs(self.base_output_directory) self.cleanup_directory_thread = CleanupDirectoryThread(self.base_output_directory) self.cleanup_directory_thread.start() self.runner = None self.opened_files = None self.output_directory = None self.labels = None def configure(self, config_kwargs): """Configure the DAQ""" if self.runner: message = 'Configuring a new session before previous session has been terminated.' self.logger.warning(message) if self.runner.is_running: self.runner.stop() config = DeviceConfiguration(**config_kwargs) config.validate() self.output_directory = self._create_output_directory() self.labels = config.labels self.logger.info('Writing port files to %s', self.output_directory) self.opened_files = OpenFileTracker() self.runner = DaqRunner(config, self.output_directory) def start(self): """Start capturing. configure() must have been called before""" self.logger.info('Start capturing') if self.runner: if not self.runner.is_running: self.runner.start() else: message = 'Calling start() before stop() has been called. Data up to this point will be lost.' self.logger.warning(message) self.runner.stop() self.runner.start() else: raise ProtocolError('Start called before a session has been configured.') def stop(self): """Stop capturing""" self.logger.info('Stop capturing') if self.runner: if self.runner.is_running: self.runner.stop() else: self.logger.warning('Attempting to stop() before start() was invoked.') self.runner.stop() else: raise ProtocolError('Stop called before a session has been configured.') def list_devices(self): # pylint: disable=no-self-use """List all devices attached to the DAQ if it supports enumeration""" if not CAN_ENUMERATE_DEVICES: raise TypeError('Server does not support DAQ device enumeration') return list_available_devices() def list_ports(self): """ List all the ports for the configured DAQ. You need to call configure() before being able to list ports """ return self.labels def list_port_files(self): """List port files after a capturing session.""" if not self.runner: raise ProtocolError('Attempting to list port files before session has been configured.') ports_with_files = [] for port_id in self.labels: path = self._get_port_file_path(port_id) if os.path.isfile(path): ports_with_files.append(port_id) return ports_with_files def open_port_file(self, port_id): """ Start transfer of a port file. You can get a list of valid port_id by calling list_port_files. The returned string is a descriptor that can be used with read_port_file() and close_port_file() """ filename = self._get_port_file_path(port_id) try: return self.opened_files.open(filename) except FileNotFoundError: raise ValueError('File for port {} does not exist.'.format(port_id)) except AttributeError: if not self.opened_files: raise ProtocolError('open_port_file called on an unconfigured session') raise def read_port_file(self, port_descriptor, size): """ Read from a port file after it has been opened with open_port_file(). size is the amount of bytes you want to read """ if not self.opened_files: raise ProtocolError('read_port_file called on an unconfigured session') return self.opened_files.read(port_descriptor, size) def close_port_file(self, port_descriptor): """ Close a port file opened by open_port_file(). After calling this, any call to read_port_file() for this port_descriptor will fail. """ if not self.opened_files: raise ProtocolError('close_port_file called on an unconfigured session') self.opened_files.close(port_descriptor) def _get_port_file_path(self, port_id): if not self.runner: raise ProtocolError('Attepting to get port file path before session has been configured.') return self.runner.get_port_file_path(port_id) def close(self): """Close a session, stopping the DAQ and removing all temporary files""" if not self.runner: message = 'Attempting to close session before it has been configured.' self.logger.warning(message) return if self.runner.is_running: message = 'Terminating session before runner has been stopped.' self.logger.warning(message) self.runner.stop() self.runner = None self.opened_files.terminate() self.opened_files = None if self.output_directory and os.path.isdir(self.output_directory): shutil.rmtree(self.output_directory) self.output_directory = None self.logger.info('Session terminated.') def _create_output_directory(self): basename = datetime.now().strftime('%Y-%m-%d_%H%M%S%f') dirname = os.path.join(self.base_output_directory, basename) os.makedirs(dirname) return dirname def __del__(self): if self.runner: self.runner.stop() def __str__(self): return '({})'.format(self.base_output_directory) __repr__ = __str__