def update(self, state_words, values): sw = tuple(state_words) values.setdefault('Current', 0.0) values.setdefault('CurrentSetpoint', 0.0) values.setdefault('pending_bits', None) self._last_state_words = state_words alarms = self.alarms alarms.clear() sw_masked = [ sw[i] ^ M for i,M in enumerate(self.mask) ] sw_masked[3] = sw_masked[3] & 0xFFFE values['StateWords'] = sw_masked st, ione, itwo, regf, inff = sw_masked # translate error bits set in state byte to error message if bit(st, BIT_INTERLOCK_BYPASS): alarms += [ self.msg_state[BIT_INTERLOCK_BYPASS] ] # global interlock bit is silently ignored ilk_msg = bit_filter_msg(ione, self.msg_interlock1) + \ bit_filter_msg(itwo, self.msg_interlock2) + \ bit_filter_msg(regf, self.msg_regulation_fault) + \ bit_filter_msg(inff, self.msg_internal_fault) alarms += ilk_msg values["Alarm"] = ", ".join(ilk_msg) alarms += bit_filter_msg(regf, self.msg_regulation_fault) alarms += bit_filter_msg(inff, self.msg_internal_fault) self.power_on = bit(st, BIT_POWERON) if self.power_on and (not bit(st, BIT_REGOK) or time()<self.move_min_t): self.CURRENT_ADJUST() elif self.power_on: self.ON() elif len(ilk_msg): self.ALARMS(alarms) elif bit(st, BIT_GLOBAL_FAULT): self.ALARM('interlock or fault had been detected, please acknowledge') elif bit(st, BIT_STANDBY): self.STANDBY() elif bit(st, BIT_POWEROFF): self.OFF() else: ststr = '%04x '*5 % sw msg = "internal error, unforseen state words " + ststr self.device._fault(msg) pend_bit = values["pending_bits"] if pend_bit == BIT_POWERON: self.SWITCH_ON(**values) elif pend_bit == BIT_POWEROFF: self.SWITCH_OFF(**values)
def update_stat2(self): '''Updates stat attribute from self.state_id and self.error_code ''' self.alarms = bit_filter_msg(self.error_code, self.errors) if not self.errors: self.stat = DevState.INIT, 'module type not detected (yet)' elif self.alarms: status = '\n'.join(self.alarms) self.stat = DevState.ALARM, status elif self.state_id is None: self.stat = [ DevState.UNKNOWN, 'okay' ] elif self.state_id > len(self.machine_stat): self.stat = [ DevState.FAULT, 'unknown state [%02d]' % self.state_id ] else: self.stat = self.machine_stat[self.state_id]