Exemple #1
0
 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)
Exemple #2
0
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))
Exemple #4
0
 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)
Exemple #6
0
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
Exemple #7
0
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
Exemple #8
0
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)
Exemple #11
0
    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
Exemple #12
0
 def _LogReceived(self, ts, m, comment):
     logging.info("recv: %s", zmessage.PrettifyRawMessage(m))
     self._raw_history.append((ts, False, m, comment))
Exemple #13
0
 def _LogSent(self, ts, m, comment):
     self._raw_history.append((ts, True, m, comment))
     logging.info("sent: %s", zmessage.PrettifyRawMessage(m))