示例#1
0
  public void handleSerialAPIGetInitDataResponse(byte[] data) {
    if (!initAllNodes) {
      /* load jika ada settings */
    } else {
      /* driver & setting hilang */
    }

    logs.add("FUNC_ID_SERIAL_API_GET_INIT_DATA");
    primaryController.setInitVersion(data[2]);
    primaryController.setInitCapabilities(data[3]);

    if (data[4] == Defs.NUM_NODE_BITFIELD_BYTES) {
      for (int i = 0; i < Defs.NUM_NODE_BITFIELD_BYTES; ++i) {
        for (int j = 0; j < 8; ++j) {
          byte nodeId = (byte) ((i * 8) + j + 1);
          if ((data[i + 5] & (0x01 << j)) != 0) {
            Node node = getNode(nodeId);
            if (node != null) {
              if (node.getNodeId() == primaryController.getNodeId()) {
                node.setQueryStage(QueryStage.ProtocolInfo);
              }
              if (!initAllNodes) {
                node.setQueryStage(QueryStage.Probe1);
              }
            } else {
              addNode(nodeId);
            }
          } else if (getNode(nodeId) != null) {
            removeNode(nodeId);
          }
        }
      }
    }

    initAllNodes = true;
  }
示例#2
0
  public void handleRemoveNodeFromNetworkRequest(byte[] data) {
    ControllerCmd cci = queue.getCurrentControllerCmd();

    if (cci == null) {
      return;
    }

    ControllerState state = cci.getControllerState();
    switch (data[3]) {
      case Defs.REMOVE_NODE_STATUS_LEARN_READY:
        logs.add("REMOVE_NODE_STATUS_LEARN_READY");
        state = ControllerState.Waiting;
        cci.setControllerCommandNode((byte) 0);
        if (cci != null && cci.getControllerCallback() != null) {
          cci.getControllerCallback().onAction(state, null, null);
        }
        break;
      case Defs.REMOVE_NODE_STATUS_NODE_FOUND:
        logs.add("REMOVE_NODE_STATUS_NODE_FOUND");
        state = ControllerState.InProgress;
        if (cci != null && cci.getControllerCallback() != null) {
          cci.getControllerCallback().onAction(state, null, null);
        }
        break;
      case Defs.REMOVE_NODE_STATUS_REMOVING_SLAVE:
        logs.add("REMOVE_NODE_STATUS_REMOVING_SLAVE --- Node: " + String.valueOf(data[4]));
        cci.setControllerCommandNode(data[4]);
        break;
      case Defs.REMOVE_NODE_STATUS_REMOVING_CONTROLLER:
        logs.add("REMOVE_NODE_STATUS_REMOVING_CONTROLLER --- Node: " + String.valueOf(data[4]));
        // mCurrentControllerCommand.mControllerCommandNode = data[4];
        cci.setControllerCommandNode(data[4]);
        if (data[4] == (byte) 0) {
          if (data[5] >= 3) {
            for (int i = 0; i < Defs.MAX_TOTAL_NODES; i++) {
              Node node = getNode((byte) i);
              synchronized (node) {
                if (node == null || primaryController == null) {
                  continue;
                }
                if (node.getNodeId() == primaryController.getNodeId()) {
                  continue;
                } // Ignore primary controller
                // See if we can match another way
                if (node.getBasicDeviceClassID() == data[6]
                    && node.getGenericDeviceClassID() == data[7]
                    && node.getSpecificDeviceClassID() == data[8]) {
                  if (cci.getControllerCommandNode() != 0) {
                    // TODO: Alternative controller found
                  } else {
                    cci.setControllerCommandNode(node.getNodeId());
                  }
                }
              }
            }
          } else {
            // TODO: error message not enough data
          }
        } else {
          cci.setControllerCommandNode(data[4]);
        }
        break;
      case Defs.REMOVE_NODE_STATUS_DONE:
        logs.add("REMOVE_NODE_STATUS_DONE");
        state = ControllerState.Completed;
        if (cci != null && cci.getControllerCallback() != null) {
          cci.getControllerCallback().onAction(state, null, null);
        }
        if (!cci.isControllerCommandDone()) {
          primaryController.updateControllerState(ControllerState.Completed);
          primaryController.addNodeStop(Defs.FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK);
          if (cci.getControllerCommandNode() == (byte) 0) {
            if (data[4] != (byte) 0) {
              cci.setControllerCommandNode(data[4]);
            }
          }

          if (cci.getControllerCommandNode() != (byte) 0
              && cci.getControllerCommandNode() != (byte) 0xFF) {
            removeNode(cci.getControllerCommandNode());
          }
        }
        return;
      case Defs.REMOVE_NODE_STATUS_FAILED:
        logs.add("REMOVE_NODE_STATUS_FAILED");
        primaryController.addNodeStop(Defs.FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK);
        state = ControllerState.Failed;
        if (cci != null && cci.getControllerCallback() != null) {
          cci.getControllerCallback().onAction(state, null, null);
        }
        break;
      default:
        logs.add("No Detected ...");
        break;
    }

    primaryController.updateControllerState(state);
  }
示例#3
0
 public byte getPrimaryNodeId() {
   return primaryController.getNodeId();
 }
示例#4
0
  public boolean moveMsgToWakeUpQueue(byte targetNodeId, boolean move) {
    Node node = getNode(targetNodeId);
    if (node != null
        && !node.isListeningDevice()
        && !node.isFrequentListeningDevice()
        && primaryController != null
        && targetNodeId != primaryController.getNodeId()) {
      WakeUp wu = (WakeUp) node.getCommandClassManager().getCommandClass(WakeUp.COMMAND_CLASS_ID);
      if (wu != null) {
        wu.setAwake(false);
        if (move) {
          if (queue.getCurrentControllerCmd() != null) {
            queue.removeCurrentMsg();
          }
          if (queue.getCurrentMsg() != null) {
            Msg msg = queue.getCurrentMsg();
            if (targetNodeId == SafeCast.nodeIdFromMsg(msg)) {
              if (!msg.isWakeUpNoMoreInformationCommand() && !msg.isNoOperation()) {
                QueueItem item = new QueueItem();
                item.setCommand(QueueCommand.SendMessage);
                item.setMsg(msg);
                wu.queueItem(item);
              }
              queue.removeCurrentMsg();
            }
          }

          for (int i = 0; i < queue.size(); ++i) {
            Iterator<QueueItem> iter = queue.getQueue().iterator();
            while (iter.hasNext()) {
              boolean remove = false;
              QueueItem it = iter.next();
              if (it.getCommand() == QueueCommand.SendMessage
                  && targetNodeId == SafeCast.nodeIdFromMsg(it.getMsg())) {
                if (!it.getMsg().isWakeUpNoMoreInformationCommand()
                    && !it.getMsg().isNoOperation()) {
                  wu.queueItem(it);
                } else {
                  it.setMsg(null);
                }
                remove = true;
              } else if (it.getCommand() == QueueCommand.QueryStageComplete
                  && targetNodeId == SafeCast.nodeIdFromMsg(it.getMsg())) {
                wu.queueItem(it);
                remove = true;
              } else if (it.getCommand() == QueueCommand.Controller
                  && targetNodeId == SafeCast.nodeIdFromMsg(it.getMsg())) {
                wu.queueItem(it);
                remove = true;
              }

              if (remove) {
                iter.remove();
              }
            }
          }

          if (queue.getCurrentControllerCmd() != null) {
            primaryController.updateControllerState(ControllerState.Sleeping);
            queue.sendControllerCommand(queue.getCurrentControllerCmd());
          }
          return true;
        }
      }
    }

    return false;
  }