/** 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; } }