bool vistle::VistleConnection::barrier() const { message::Buffer buf; message::Barrier m; for (;;) { if (!waitForReply(m, buf.msg)) { return false; } switch(buf.msg.type()) { case message::Message::BARRIERREACHED: { const message::BarrierReached &reached = static_cast<const message::BarrierReached &>(buf.msg); assert(m.uuid() == reached.uuid()); return true; break; } case message::Message::BARRIER: { continue; break; } default: std::cerr << "VistleConnection: expected BarrierReached, got " << buf.msg << std::endl; assert("expected BarrierReached message" == 0); break; } } return false; }
void MySensor::begin(void (*_msgCallback)(const MyMessage &), uint8_t _nodeId, boolean _repeaterMode, uint8_t _parentNodeId, rf24_pa_dbm_e paLevel, uint8_t channel, rf24_datarate_e dataRate) { Serial.begin(BAUD_RATE); isGateway = false; repeaterMode = _repeaterMode; msgCallback = _msgCallback; if (repeaterMode) { setupRepeaterMode(); } setupRadio(paLevel, channel, dataRate); // Read settings from EEPROM eeprom_read_block((void*)&nc, (void*)EEPROM_NODE_ID_ADDRESS, sizeof(NodeConfig)); // Read latest received controller configuration from EEPROM eeprom_read_block((void*)&cc, (void*)EEPROM_LOCAL_CONFIG_ADDRESS, sizeof(ControllerConfig)); if (cc.isMetric == 0xff) { // Eeprom empty, set default to metric cc.isMetric = 0x01; } if (_parentNodeId != AUTO) { nc.parentNodeId = _parentNodeId; autoFindParent = false; } else { autoFindParent = true; } if (_nodeId != AUTO) { // Set static id nc.nodeId = _nodeId; } // If no parent was found in eeprom. Try to find one. if (autoFindParent && nc.parentNodeId == 0xff) { findParentNode(); } // Try to fetch node-id from gateway if (nc.nodeId == AUTO) { requestNodeId(); } debug(PSTR("%s started, id %d\n"), repeaterMode?"repeater":"sensor", nc.nodeId); // Open reading pipe for messages directed to this node (set write pipe to same) RF24::openReadingPipe(WRITE_PIPE, TO_ADDR(nc.nodeId)); RF24::openReadingPipe(CURRENT_NODE_PIPE, TO_ADDR(nc.nodeId)); // Send presentation for this radio node (attach present(NODE_SENSOR_ID, repeaterMode? S_ARDUINO_REPEATER_NODE : S_ARDUINO_NODE); // Send a configuration exchange request to controller // Node sends parent node. Controller answers with latest node configuration // which is picked up in process() sendRoute(build(msg, nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_CONFIG, false).set(nc.parentNodeId)); // Wait configuration reply. waitForReply(); }
void MySensor::findParentNode() { failedTransmissions = 0; // Set distance to max nc.distance = 255; // Send ping message to BROADCAST_ADDRESS (to which all relaying nodes and gateway listens and should reply to) build(msg, nc.nodeId, BROADCAST_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_FIND_PARENT, false).set(""); sendWrite(BROADCAST_ADDRESS, msg, true); // Wait for ping response. waitForReply(); }
void MySensor::requestNodeId() { debug(PSTR("req node id\n")); RF24::openReadingPipe(CURRENT_NODE_PIPE, TO_ADDR(nc.nodeId)); sendRoute(build(msg, nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_ID_REQUEST, false).set("")); waitForReply(); }
am_status_t Connection::waitForReply(char *&reply, std::size_t& receivedLen, std::size_t bufferLen) { reply = NULL; // Make sure that this field is initialized. return waitForReply(reply, 0, bufferLen, receivedLen); }