def initialize_loggable_devices(self): """ This function creates the actual objects for each device out of the configuration """ # start the timers for device in self._config['devices']: if len(device['uid']) == 0: EventLogger.warning('Ignoring "{0}" with empty UID'.format(device['name'])) continue try: decoded_uid = base58decode(device['uid']) except: EventLogger.warning('Ignoring "{0}" with invalid UID: {1}'.format(device['name'], device['uid'])) continue if decoded_uid < 1 or decoded_uid > 0xFFFFFFFF: EventLogger.warning('Ignoring "{0}" with out-of-range UID: {1}'.format(device['name'], device['uid'])) continue try: loggable_device = DeviceImpl(device, self) loggable_device.start_timer() except Exception as e: msg = "A critical error occur: " + str(e) self.stop() raise DataLoggerException(DataLoggerException.DL_CRITICAL_ERROR, msg) self.loggable_devices.append(loggable_device) self.apply_options()
def initialize_loggable_devices(self): """ This function creates the actual objects for each device out of the configuration """ # start the timers for device in self._config['devices']: if len(device['uid']) == 0: EventLogger.warning('Ignoring "{0}" with empty UID'.format( device['name'])) continue try: decoded_uid = base58decode(device['uid']) except: EventLogger.warning( 'Ignoring "{0}" with invalid UID: {1}'.format( device['name'], device['uid'])) continue if decoded_uid < 1 or decoded_uid > 0xFFFFFFFF: EventLogger.warning( 'Ignoring "{0}" with out-of-range UID: {1}'.format( device['name'], device['uid'])) continue try: loggable_device = DeviceImpl(device, self) loggable_device.start_timer() except Exception as e: msg = "A critical error occur: " + str(e) self.stop() raise DataLoggerException( DataLoggerException.DL_CRITICAL_ERROR, msg) self.loggable_devices.append(loggable_device) self.apply_options()
def uid_save_clicked(self): device, port = self.current_device_and_port() uid = self.edit_uid.text() if len(uid) == 0: self.popup_fail('Bricklet', 'UID cannot be empty') return for c in uid: if c not in BASE58: self.popup_fail('Bricklet', "UID cannot contain '{0}'".format(c)) return try: if base58decode(uid) > 0xFFFFFFFF: self.popup_fail('Bricklet', 'UID is too long') return except: self.popup_fail('Bricklet', 'UID is invalid') return try: self.parent.ipcon.write_bricklet_uid(device, port, uid) except Error as e: self.popup_fail('Bricklet', 'Could not write UID: ' + error_to_name(e)) return try: uid_read = self.parent.ipcon.read_bricklet_uid(device, port) except Error as e: self.popup_fail('Bricklet', 'Could not read written UID: ' + error_to_name(e)) return if uid == uid_read: self.popup_ok('Bricklet', 'Successfully wrote UID.\nNew UID will be used after reset of the connected Brick.') else: self.popup_fail('Bricklet', 'Could not write UID: Verification failed')
def _validate_devices(self): try: devices = self._config['devices'] except KeyError: self._report_error('Config has no "devices" section') return if not isinstance(devices, list): self._report_error('"devices" section is not a list') return for device in devices: # uid try: uid = device['uid'] except KeyError: self._report_error('Device has no UID') continue if not isinstance(uid, basestring): self._report_error('Device UID is not a string') continue if len(uid) > 0: try: decoded_uid = base58decode(uid) except Exception as e: self._report_error('Invalid device UID: {0}'.format(uid)) continue if decoded_uid < 1 or decoded_uid > 0xFFFFFFFF: self._report_error('Device UID is out-of-range: {0}'.format(uid)) continue # name try: name = device['name'] except KeyError: self._report_error('Device "{0}" has no name'.format(uid)) continue if not isinstance(name, basestring): self._report_error('Name of device "{0}" is not a string'.format(uid)) continue elif len(name) == 0: self._report_error('Device "{0}" has empty name'.format(uid)) continue elif name not in device_specs: self._report_error('Device "{0}" has unknwon name: {1}'.format(uid, name)) continue device_spec = device_specs[name] # host try: host = device['host'] except KeyError: self._report_error('Device "{0}" has no host'.format(uid)) else: if not isinstance(host, basestring): self._report_error('Host of device "{0}" is not a string'.format(uid)) elif len(host) == 0: self._report_error('Host of device "{0}" is empty'.format(uid)) elif host not in self._config['hosts']: self._report_error('Host of device "{0}" is unknown: {1}'.format(uid, host)) # values try: values = device['values'] except KeyError: self._report_error('Device "{0}" has no values'.format(uid)) else: if not isinstance(values, dict): self._report_error('"values" of device "{0}" is not a dict'.format(uid)) elif len(values) == 0: self._report_error('"values" of device "{0}" is empty'.format(uid)) else: for value_spec in device_spec['values']: try: value = values[value_spec['name']] except KeyError: self._report_error('Value "{0}" of device "{1}" is missing'.format(value_spec['name'], uid)) continue # interval try: interval = value['interval'] except KeyError: self._report_error('Value "{0}" of device "{1}" has no interval'.format(value_spec['name'], uid)) else: if not isinstance(interval, int) and not isinstance(interval, float): self._report_error('Interval of value "{0}" of device "{1}" is neiter an int nor a float'.format(value_spec['name'], uid)) elif interval < 0: self._report_error('Interval of value "{0}" of device "{1}" is ouf-of-range'.format(value_spec['name'], uid)) # subvalues if value_spec['subvalues'] != None: try: subvalues = value['subvalues'] except KeyError: self._report_error('Value "{0}" of device "{1}" has no subvalues'.format(value_spec['name'], uid)) else: if not isinstance(subvalues, dict): self._report_error('Subvalues of value "{0}" of device "{1}" is not a dict'.format(value_spec['name'], uid)) else: for subvalue_spec_name in value_spec['subvalues']: try: subvalue_value = subvalues[subvalue_spec_name] except: self._report_error('Subvalue "{0}" of value "{1}" of device "{2}" is missing' .format(subvalue_spec_name, value_spec['name'], uid)) continue if not isinstance(subvalue_value, bool): self._report_error('Subvalue "{0}" of value "{1}" of device "{2}" is not a bool' .format(subvalue_spec_name, value_spec['name'], uid)) # options if device_spec['options'] != None: try: options = device['options'] except KeyError: self._report_error('Device "{0}" has no options'.format(uid)) else: if not isinstance(options, dict): self._report_error('"options" of device "{0}" is not a dict'.format(uid)) elif len(options) == 0: self._report_error('"options" of device "{0}" is empty'.format(uid)) else: for option_spec in device_spec['options']: try: option = options[option_spec['name']] except KeyError: self._report_error('Option "{0}" of device "{1}" is missing'.format(option_spec['name'], uid)) continue # value try: value = option['value'] except KeyError: self._report_error('Option "{0}" of device "{1}" has no interval'.format(option_spec['name'], uid)) else: valid = False if option_spec['type'] == 'choice': if not isinstance(value, basestring): self._report_error('Value of option "{0}" of device "{1}" is not a string' .format(option_spec['name'], uid)) continue for option_value_spec in option_spec['values']: if option_value_spec[0] == value: valid = True break elif option_spec['type'] == 'int': if not isinstance(value, int): self._report_error('Value of option "{0}" of device "{1}" is not an int' .format(option_spec['name'], uid)) continue valid = value >= option_spec['minimum'] and value <= option_spec['maximum'] elif option_spec['type'] == 'bool': if not isinstance(value, bool): self._report_error('Value of option "{0}" of device "{1}" is not a bool' .format(option_spec['name'], uid)) continue valid = True if not valid: self._report_error('Value of option "{0}" of device "{1}" is invalid: {2}' .format(option_spec['name'], uid, value))