diff --git a/ohmpi.py b/ohmpi.py index ce32bfb3b8e056297503b4a9100054475ee1b314..bd75b59a80ee3256d429e23b6271d1f506044c3d 100644 --- a/ohmpi.py +++ b/ohmpi.py @@ -171,13 +171,14 @@ class OhmPi(object): @property def sequence(self): - """Gets or sets sequence""" + """Gets sequence""" if self._sequence is not None: assert isinstance(self._sequence, np.ndarray) return self._sequence @sequence.setter def sequence(self, sequence): + """Sets sequence""" if sequence is not None: assert isinstance(sequence, np.ndarray) self.use_mux = True @@ -201,7 +202,7 @@ class OhmPi(object): self.update_settings(config) def update_settings(self, config): - """Update acquisition settings from a json file or dictionary. + """Updates acquisition settings from a json file or dictionary. Parameters can be: - nb_electrodes (number of electrode used, if 4, no MUX needed) - injection_duration (in seconds) @@ -215,18 +216,28 @@ class OhmPi(object): config : str Path to the .json or dictionary. """ - if isinstance(config, dict): - self.settings.update(config) + status = False + if config is not None: + try: + if isinstance(config, dict): + self.settings.update(config) + else: + with open(config) as json_file: + dic = json.load(json_file) + self.settings.update(dic) + self.exec_logger.debug('Acquisition parameters updated: ' + str(self.settings)) + status = True + except Exception as e: + self.exec_logger.warning('Unable to update settings.') + status = False else: - with open(config) as json_file: - dic = json.load(json_file) - self.settings.update(dic) - self.exec_logger.debug('Acquisition parameters updated: ' + str(self.settings)) + self.exec_logger.warning('Settings are missing...') + return status def _read_hardware_config(self): - """Read hardware configuration from config.py + """Reads hardware configuration from config.py """ - from config import OHMPI_CONFIG + self.exec_logger.debug('Getting hardware config') self.id = OHMPI_CONFIG['id'] # ID of the OhmPi self.r_shunt = OHMPI_CONFIG['R_shunt'] # reference resistance value in ohm self.Imax = OHMPI_CONFIG['Imax'] # maximum current @@ -241,8 +252,8 @@ class OhmPi(object): @staticmethod def _find_identical_in_line(quads): - """Find quadrupole where A and B are identical. - If A and B are connected to the same relay, the Pi burns (short-circuit). + """Finds quadrupole where A and B are identical. + If A and B are connected to the same electrode, the Pi burns (short-circuit). Parameters ---------- @@ -256,31 +267,17 @@ class OhmPi(object): """ # TODO is this needed for M and N? - # if we have a 1D array (so only 1 quadrupole), make it 2D + # if we have a 1D array (so only 1 quadrupole), make it a 2D array if len(quads.shape) == 1: quads = quads[None, :] output = np.where(quads[:, 0] == quads[:, 1])[0] - # output = [] - # if array_object.ndim == 1: - # temp = np.zeros(4) - # for i in range(len(array_object)): - # temp[i] = np.count_nonzero(array_object == array_object[i]) - # if any(temp > 1): - # output.append(0) - # else: - # for i in range(len(array_object[:,1])): - # temp = np.zeros(len(array_object[1,:])) - # for j in range(len(array_object[1,:])): - # temp[j] = np.count_nonzero(array_object[i,:] == array_object[i,j]) - # if any(temp > 1): - # output.append(i) return output @staticmethod def _get_platform(): - """Get platform name and check if it is a raspberry pi + """Gets platform name and checks if it is a raspberry pi Returns ======= str, bool @@ -982,62 +979,42 @@ class OhmPi(object): w.writeheader() w.writerow(last_measurement) - def _process_commands(self, command): + def _process_commands(self, message): """ TODO Parameters ---------- - command + message : str + command arguments + kwargs: str + command keywords and arguments Returns ------- - """ try: cmd_id = None - decoded_message = json.loads(command) + decoded_message = json.loads(message) cmd_id = decoded_message.pop('cmd_id', None) cmd = decoded_message.pop('cmd', None) - args = decoded_message.pop('args', None) + args = decoded_message.pop('args', '[]') + args = json.loads(args) + kwargs = decoded_message.pop('kwargs', '{}') + kwargs = json.loads(kwargs) + self.exec_logger.debug(f'Calling method {cmd}({args}, {kwargs})') status = False - e = None - if cmd is not None and cmd_id is not None: - if cmd == 'update_settings' and args is not None: - self.update_settings(args) + e = None # NOTE: Why this? + if cmd_id is None: + self.exec_logger.warning('You should use a unique identifier for cmd_id') + if cmd is not None: + try: + output = getattr(self, cmd)(*args, **kwargs) status = True - elif cmd == 'set_sequence' and args is not None: - try: - self.sequence = np.loadtxt(StringIO(args)).astype('uint32') - status = True - except Exception as e: - self.exec_logger.warning(f'Unable to set sequence: {e}') - status = False - elif cmd == 'run_sequence': - self.run_sequence(cmd_id) - while not self.status == 'idle': - time.sleep(0.1) - status = True - elif cmd == 'interrupt': - self.interrupt() - status = True - elif cmd == 'load_sequence': - try: - self.load_sequence(args) - status = True - except Exception as e: - self.exec_logger.warning(f'Unable to load sequence: {e}') - status = False - elif cmd == 'rs_check': - try: - self.rs_check() - status = True - except Exception as e: - print('error====', e) - self.exec_logger.warning(f'Unable to run rs-check: {e}') - else: - self.exec_logger.warning(f'Unknown command {cmd} - cmd_id: {cmd_id}') + except Exception as e: + self.exec_logger.error(f'{e}\nUnable to execute {cmd}({args}, {kwargs}') + status = False except Exception as e: - self.exec_logger.warning(f'Unable to decode command {command}: {e}') + self.exec_logger.warning(f'Unable to decode command {message}: {e}') status = False finally: reply = {'cmd_id': cmd_id, 'status': status} @@ -1048,22 +1025,22 @@ class OhmPi(object): warnings.warn('This function is deprecated. Use load_sequence instead.', DeprecationWarning) self.run_sequence(self, *args, **kwargs) - def set_sequence(self, args): + def set_sequence(self, sequence=sequence): try: - self.sequence = np.loadtxt(StringIO(args)).astype('uint32') + self.sequence = np.loadtxt(StringIO(sequence)).astype('uint32') status = True except Exception as e: self.exec_logger.warning(f'Unable to set sequence: {e}') status = False - def run_sequence(self, cmd_id=None, **kwargs): + def run_sequence(self, **kwargs): """ Run the sequence in a separate thread. Can be stopped by 'OhmPi.stop()'. """ # self.run = True self.status = 'running' self.exec_logger.debug(f'Status: {self.status}') self.exec_logger.debug(f'Measuring sequence: {self.sequence}') - + cmd_id = kwargs.pop('cmd_id', None) def func(): for g in range(0, self.settings["nbr_meas"]): # for time-lapse monitoring if self.status != 'running':