def handler(_): # if we timeout m will be None if m is not None and m[4] != 0: return # success logging.warning("[%s] RequestNodeInfo failed: %s", _NodeName(n), zmessage.PrettifyRawMessage(m)) self._RequestNodeInfo(n, retries - 1)
def DriverLogs(driver): out = [] for t, sent, m, comment in driver._raw_history: t = TimeFormatMs(t) d = sent and "=>" or "<=" m = zmessage.PrettifyRawMessage(m) out.append({"t": t, "c": comment, "d": d, "m": m}) return out
def put(self, ts, m): if m[3] == z.API_APPLICATION_COMMAND_HANDLER: self._HandleMessageApplicationCommand(ts, m) elif m[3] == z.API_ZW_APPLICATION_UPDATE: self._HandleMessageApplicationUpdate(ts, m) else: logging.error("unhandled message: %s", zmessage.PrettifyRawMessage(m))
def put(self, ts, m): """ this is how the CommandTranslator receives its input. output is send to its listeners""" if m[3] == z.API_APPLICATION_COMMAND_HANDLER: self._HandleMessageApplicationCommand(ts, m) elif m[3] == z.API_ZW_APPLICATION_UPDATE: self._HandleMessageApplicationUpdate(ts, m) else: logging.error("unhandled message: %s", zmessage.PrettifyRawMessage(m))
def handler(mesg): if mesg is None: return logging.info("[%s] is failed check: %d, %s", _NodeName(n), mesg[4], zmessage.PrettifyRawMessage(mesg)) failed = mesg[4] != 0 self._PushToListeners( n, time.time(), command.CUSTOM_COMMAND_FAILED_NODE, {"failed": failed}) if cb: cb(failed)
def DriverBad(driver): out = [] for m in driver._history: if not m.end: continue if not m.WasAborted(): continue dur = int(1000.0 * (m.end - m.start)) d = "%4d" % dur t = TimeFormatMs(m.start) m = zmessage.PrettifyRawMessage(m.payload) out.append({"d": d, "t": t, "m": m}) return out
def DriverSlow(driver): out = [] for m in driver._history: if not m.end: continue dur = int(1000.0 * (m.end - m.start)) if dur < 300: continue d = "%4d%s" % (dur, "*" if m.WasAborted() else " ") t = TimeFormatMs(m.start) m = zmessage.PrettifyRawMessage(m.payload) out.append({"d": d, "t": t, "m": m}) return out
def _ProcessReceivedMessage(ts, inflight: zmessage.Message, m): """ Process an message arriving at the driver and determines the course of action taking the current inflight message into acoount. """ # logging.debug("rx buffer: %s", buf) if m[0] == z.NAK: return DO_NOTHING, "" elif m[0] == z.CAN: if inflight is None: logging.error("nothing to re-send after CAN") return DO_NOTHING, "stray" logging.error("re-sending message after CAN ==== %s", zmessage.PrettifyRawMessage(inflight.payload)) return DO_RETRY, "" elif m[0] == z.ACK: if inflight is None: logging.error("nothing to re-send after ACK") return DO_NOTHING, "stray" return False, inflight.MaybeComplete(ts, m) elif m[0] == z.SOF: if zmessage.Checksum(m) != z.SOF: # maybe send a CAN? logging.error("bad checksum") return DO_NOTHING, "bad-checksum" if m[2] == z.RESPONSE: if inflight is None: logging.error("nothing to re-send after RESPONSE") return DO_ACK, "stray" return DO_ACK, inflight.MaybeComplete(ts, m) elif m[2] == z.REQUEST: if (m[3] == z.API_ZW_APPLICATION_UPDATE or m[3] == z.API_APPLICATION_COMMAND_HANDLER): return DO_PROPAGATE, "" else: if inflight is None: logging.error("nothing to re-send after REQUEST") return DO_ACK, "stray" return DO_ACK, inflight.MaybeComplete(ts, m) else: logging.error("message is neither request nor response") return DO_NOTHING, "bad" else: logging.error("received unknown start byte: %s", m[0]) return DO_NOTHING, "bad-unknown-start-byte"
def _HandleMessageApplicationCommand(self, ts, m): _ = m[4] # status n = m[5] size = m[6] try: data = [int(x) for x in m[7:7 + size]] data = command.MaybePatchCommand(data) value = command.ParseCommand(data) if value is None: logging.error("[%d] parsing failed for %s", n, Hexify(data)) return except Exception as _e: logging.error("[%d] cannot parse: %s", n, zmessage.PrettifyRawMessage(m)) print("-" * 60) traceback.print_exc(file=sys.stdout) print("-" * 60) return self._PushToListeners(n, ts, (data[0], data[1]), value)
def _HandleMessageApplicationCommand(self, ts, m): _ = m[4] # status n = m[5] size = m[6] try: data = [int(x) for x in m[7:7 + size]] if len(data) < 2: logging.error("impossible short message: %s", repr(data)) return data = command.MaybePatchCommand(data) value = command.ParseCommand(data) if value is None: logging.error("[%d] parsing failed for %s", n, Hexify(data)) return # hack for multichannel devices if (data[0], data[1]) == z.MultiChannel_CapabilityReport: logging.warning("FOUND MULTICHANNEL ENDPOINT: %s", value) # fake node number n = MakeSplitMultiChannelNode(n, value["endpoint"]) # fake NIF value["commands"] = value["classes"] value["controls"] = [] self._PushToListeners( n, ts, command.CUSTOM_COMMAND_APPLICATION_UPDATE, value) return elif (data[0], data[1]) == z.MultiChannel_CmdEncap: n = MakeSplitMultiChannelNode(n, data[2]) data = data[4:] value = command.ParseCommand(data) except Exception as e: logging.error("[%d] cannot parse: %s", n, zmessage.PrettifyRawMessage(m)) print("-" * 60) traceback.print_exc(file=sys.stdout) print("-" * 60) return self._PushToListeners(n, ts, (data[0], data[1]), value)
def _HandleMessageApplicationUpdate(self, ts, m: bytes): kind = m[4] if kind == z.UPDATE_STATE_NODE_INFO_REQ_FAILED: n = m[5] if n != 0: logging.error("update request failed: %s", zmessage.PrettifyRawMessage(m)) elif kind == z.UPDATE_STATE_NODE_INFO_RECEIVED: # the node is awake now and/or has changed values n = m[5] length = m[6] m = m[7:7 + length] commands = [] controls = [] seen_marker = False for i in m[3:]: if i == z.Mark: seen_marker = True elif seen_marker: controls.append(i) else: commands.append(i) value = { "basic": m[0], "generic": m[1], "specific": m[2], "commands": commands, "controls": controls, } self._PushToListeners(n, ts, command.CUSTOM_COMMAND_APPLICATION_UPDATE, value) elif kind == z.UPDATE_STATE_SUC_ID: logging.warning("succ id updated: needs work") else: logging.error("unknown kind: %x", kind) assert False
def _LogReceived(self, ts, m, comment): logging.info("recv: %s", zmessage.PrettifyRawMessage(m)) self._raw_history.append((ts, False, m, comment))
def _LogSent(self, ts, m, comment): self._raw_history.append((ts, True, m, comment)) logging.info("sent: %s", zmessage.PrettifyRawMessage(m))