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
Пример #2
0
 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)
Пример #3
0
 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
Пример #4
0
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__
Пример #6
0
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__