コード例 #1
0
  private boolean handleErrorResponse(byte error, byte nodeId, String funcStr, boolean sleepcheck) {
    Node node = getNode(nodeId);
    if (error == Defs.TRANSMIT_COMPLETE_NOROUTE) {
      logs.add(String.format("Error: %s failed. No route found.", funcStr));
      // if (node != null) {
      // node.setNodeAlive(false);
      // }
    } else if (error == Defs.TRANSMIT_COMPLETE_NO_ACK) {
      logs.add(String.format("Error: %s failed. No ACK found.", funcStr));
      if (queue.getCurrentMsg() != null) {
        if (moveMsgToWakeUpQueue(SafeCast.nodeIdFromMsg(queue.getCurrentMsg()), sleepcheck)) {
          return true;
        }
      }
    } else if (error == Defs.TRANSMIT_COMPLETE_FAIL) {
      logs.add(String.format("Error: %s failed. Network busy.", funcStr));
    } else if (error == Defs.TRANSMIT_COMPLETE_NOT_IDLE) {
      logs.add(String.format("Error: %s failed. Network busy.", funcStr));
    }

    if (node != null && node.incErrorCount() >= 3) {
      node.setNodeAlive(false);
    }
    return false;
  }
コード例 #2
0
  public boolean handleApplicationUpdateRequest(byte[] data) {
    boolean messageRemoved = false;
    byte nodeId = data[3];
    Node node = getNode(nodeId);
    Node tnode = null;

    if (node != null && !node.isNodeAlive()) {
      node.setNodeAlive(true);
    }
    switch (data[2]) {
      case Defs.UPDATE_STATE_SUC_ID:
        logs.add(String.format("Update SUC Id node %d", SafeCast.toInt(nodeId)));
        sucNodeId = nodeId;
        break;
      case Defs.UPDATE_STATE_DELETE_DONE:
        logs.add(String.format("Remove node %d", SafeCast.toInt(nodeId)));
        removeNode(nodeId);
        break;
      case Defs.UPDATE_STATE_NEW_ID_ASSIGNED:
        logs.add(String.format("Add node %d", SafeCast.toInt(nodeId)));
        addNode(nodeId);
        break;
      case Defs.UPDATE_STATE_ROUTING_PENDING:
        logs.add(String.format("Routing pending node %d", nodeId));
        break;
      case Defs.UPDATE_STATE_NODE_INFO_REQ_FAILED:
        if (queue.getCurrentMsg() != null) {
          logs.add(
              String.format(
                  "Update failed node %d", SafeCast.nodeIdFromMsg(queue.getCurrentMsg())));
          tnode = getNode(SafeCast.nodeIdFromMsg(queue.getCurrentMsg()));
          if (tnode != null) {
            tnode.queryStageRetry(QueryStage.NodeInfo, (byte) 2);
            if (moveMsgToWakeUpQueue(tnode.getNodeId(), true)) {
              messageRemoved = true;
            }
          }
        }
        break;
      case Defs.UPDATE_STATE_NODE_INFO_REQ_DONE:
        logs.add(String.format("Update done node %d", nodeId));
        break;
      case Defs.UPDATE_STATE_NODE_INFO_RECEIVED:
        logs.add(String.format("Update info receive node %d", nodeId));
        if (node != null) {
          node.updateNodeInfo(
              Arrays.copyOfRange(data, 8, data.length), (byte) ((SafeCast.toInt(data[4]) - 3)));
        }
        break;
    }

    if (messageRemoved) {
      queue.removeExpectedAndACK();
    }
    return messageRemoved;
  }
コード例 #3
0
 // -----------------------------------------------------------------------------------------
 // Request Methods
 // -----------------------------------------------------------------------------------------
 public void handleSendDataRequest(byte[] data, boolean replication) {
   byte nodeId = SafeCast.nodeIdFromMsg(queue.getCurrentMsg());
   if (data[2] != queue.getExpectedCallbackId()) {
     logs.add(
         String.format(
             "Unexpected callback id: received %d != %d",
             SafeCast.toInt(data[2]), SafeCast.toInt(queue.getExpectedCallbackId())));
   } else {
     Node node = getNode(nodeId);
     if (node != null && queue.getCurrentMsg() != null) {
       if (data[3] != 0) {
         if (!handleErrorResponse(
             data[3],
             nodeId,
             replication ? "ZW_REPLICATION_END_DATA" : "ZW_SEND_DATA",
             !replication)) {
           if (queue.getCurrentMsg().isNoOperation()
               && (node.getQueryStage() == QueryStage.Probe1
                   || node.getQueryStage() == QueryStage.Probe2)) {
             node.queryStageRetry(node.getQueryStage(), (byte) 3);
           }
         }
       } else {
         if (queue.getCurrentMsg().isWakeUpNoMoreInformationCommand()) {
           WakeUp wu =
               (WakeUp) node.getCommandClassManager().getCommandClass(WakeUp.COMMAND_CLASS_ID);
           if (wu != null) {
             wu.setAwake(false);
           }
         }
         if (!node.isNodeAlive()) {
           node.setNodeAlive(true);
         }
       }
     }
     queue.setExpectedCallbackId((byte) 0);
   }
 }