コード例 #1
0
  /** Handles initialization, output and polling from within the running thread */
  protected synchronized AbstractMRMessage pollMessage() {
    // ensure validity of call
    if (getNumNodes() <= 0) {
      return null;
    }

    // move to a new node
    curSerialNodeIndex++;
    if (curSerialNodeIndex >= getNumNodes()) {
      curSerialNodeIndex = 0;
    }
    // ensure that each node is initialized
    if (getMustInit(curSerialNodeIndex)) {
      setMustInit(curSerialNodeIndex, false);
      AbstractMRMessage m = getNode(curSerialNodeIndex).createInitPacket();
      if (m != null) { // SECSI boards don't need this yet
        log.debug("send init message: " + m);
        m.setTimeout(2000); // wait for init to finish (milliseconds)
        return m;
      } // else fall through to continue
    }
    // send Output packet if needed
    if (getNode(curSerialNodeIndex).mustSend()) {
      log.debug("request write command to send");
      AbstractMRMessage m = getNode(curSerialNodeIndex).createOutPacket();
      getNode(curSerialNodeIndex).resetMustSend();
      m.setTimeout(500);
      return m;
    }
    // poll for Sensor input
    if (getNode(curSerialNodeIndex).getSensorsActive()) {
      // Some sensors are active for this node, issue poll
      SerialMessage m = SerialMessage.getPoll(getNode(curSerialNodeIndex).getNodeAddress());
      if (curSerialNodeIndex >= getNumNodes()) {
        curSerialNodeIndex = 0;
      }
      return m;
    } else {
      // no Sensors (inputs) are active for this node
      return null;
    }
  }