Stripping all sync-functions

This commit is contained in:
Henrik Ekblad
2014-05-14 10:15:01 +02:00
parent 4b18f9fbf4
commit 710d445815
4 changed files with 48 additions and 54 deletions
+1 -1
View File
@@ -213,7 +213,7 @@ void MyGateway::serial(const char *fmt, ... ) {
} }
void MyGateway::serial(MyMessage msg) { void MyGateway::serial(MyMessage msg) {
serial(PSTR("%d;%d;%d;%d;%s\n"),msg.getSender(), msg.getSensor(), msg.getCommand(), msg.getType(), msg.getString()); serial(PSTR("%d;%d;%d;%d;%s\n"),msg.getSender(), msg.getSensor(), msg.getCommand(), msg.getType(), msg.getString(convBuf));
} }
+1
View File
@@ -49,6 +49,7 @@ class MyGateway : public MySensor
void startInclusionInterrupt(); void startInclusionInterrupt();
private: private:
char convBuf[MAX_PAYLOAD*2+1];
char serialBuffer[MAX_SEND_LENGTH]; // Buffer for building string when sending data to vera char serialBuffer[MAX_SEND_LENGTH]; // Buffer for building string when sending data to vera
unsigned long inclusionStartTime; unsigned long inclusionStartTime;
boolean inclusionMode; // Keeps track on inclusion mode boolean inclusionMode; // Keeps track on inclusion mode
+37 -44
View File
@@ -22,7 +22,7 @@ void MySensor::setupRadio(rf24_pa_dbm_e paLevel, uint8_t channel, rf24_datarate_
RF24::begin(); RF24::begin();
if (!RF24::isPVariant()) { if (!RF24::isPVariant()) {
debug(PSTR("err=check wire\n")); debug(PSTR("check wires\n"));
while(1); while(1);
} }
RF24::setAutoAck(1); RF24::setAutoAck(1);
@@ -81,7 +81,7 @@ void MySensor::begin(void (*_msgCallback)(MyMessage), boolean _relayMode, uint8_
present(NODE_CHILD_ID, relayMode? S_ARDUINO_RELAY : S_ARDUINO_NODE); present(NODE_CHILD_ID, relayMode? S_ARDUINO_RELAY : S_ARDUINO_NODE);
// Send parent information back to sensor net gateway. // Send parent information back to sensor net gateway.
sendInternal(I_RELAY_NODE, itoa(s.parentNodeId, convBuffer, 10)); sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_RELAY_NODE).set(s.parentNodeId));
} }
@@ -91,7 +91,6 @@ uint8_t MySensor::getNodeId() {
void MySensor::requestNodeId() { void MySensor::requestNodeId() {
debug(PSTR("req node id\n")); debug(PSTR("req node id\n"));
RF24::openReadingPipe(CURRENT_NODE_PIPE, TO_ADDR(s.nodeId)); RF24::openReadingPipe(CURRENT_NODE_PIPE, TO_ADDR(s.nodeId));
sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_REQUEST_ID)); sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_REQUEST_ID));
} }
@@ -125,7 +124,7 @@ void MySensor::findParentNode() {
/*
boolean MySensor::sendAck(MyMessage message) { boolean MySensor::sendAck(MyMessage message) {
// Build ack message // Build ack message
ack = message; ack = message;
@@ -133,7 +132,7 @@ boolean MySensor::sendAck(MyMessage message) {
ack.setSender(s.nodeId); ack.setSender(s.nodeId);
ack.setDestination(message.getSender()); ack.setDestination(message.getSender());
return sendRoute(ack); return sendRoute(ack);
} }*/
boolean MySensor::sendRoute(MyMessage message) { boolean MySensor::sendRoute(MyMessage message) {
@@ -150,7 +149,7 @@ boolean MySensor::sendRoute(MyMessage message) {
uint8_t dest = message.getDestination(); uint8_t dest = message.getDestination();
uint8_t route = getChildRoute(dest); uint8_t route = getChildRoute(dest);
if (route>0 && route<255 && dest != GATEWAY_ADDRESS) { if (route>0 && route<255 && dest != GATEWAY_ADDRESS) {
debug(PSTR("ro=%d.\n"), route); debug(PSTR("route %d.\n"), route);
// Message destination is not gateway and is in routing table for this node. // Message destination is not gateway and is in routing table for this node.
// Send it downstream // Send it downstream
return sendWrite(route, message); return sendWrite(route, message);
@@ -158,7 +157,7 @@ boolean MySensor::sendRoute(MyMessage message) {
} }
if (s.nodeId != GATEWAY_ADDRESS) { if (s.nodeId != GATEWAY_ADDRESS) {
debug(PSTR("ro=parent\n")); debug(PSTR("route parent\n"));
// Should be routed back to gateway. // Should be routed back to gateway.
bool ok = sendWrite(s.parentNodeId, message); bool ok = sendWrite(s.parentNodeId, message);
@@ -185,9 +184,6 @@ boolean MySensor::sendWrite(uint8_t next, MyMessage message) {
uint8_t length = message.getLength(); uint8_t length = message.getLength();
message.setLast(s.nodeId); message.setLast(s.nodeId);
message.setCRC(crc8Message(message)); message.setCRC(crc8Message(message));
// Only print payload if string type
debug(PSTR("tx: %d-%d-%d-%d s=%d,c=%d,t=%d:%s\n"),
message.getSender(),message.getLast(), next, message.getDestination(), message.getSensor(), message.getCommand(), message.getType(), message.getString());
bool broadcast = message.getCommand() == C_INTERNAL && message.getType() == I_PING; bool broadcast = message.getCommand() == C_INTERNAL && message.getType() == I_PING;
@@ -198,28 +194,25 @@ boolean MySensor::sendWrite(uint8_t next, MyMessage message) {
bool ok = RF24::write(&message, min(MAX_MESSAGE_LENGTH, HEADER_SIZE + length), broadcast); bool ok = RF24::write(&message, min(MAX_MESSAGE_LENGTH, HEADER_SIZE + length), broadcast);
RF24::startListening(); RF24::startListening();
if (ok) // Only debug print payload if it is of string type
debug(PSTR("s=ok\n")); debug(PSTR("tx: %d-%d-%d-%d s=%d,c=%d,t=%d, st=%s:%s\n"),
else message.getSender(),message.getLast(), next, message.getDestination(), message.getSensor(), message.getCommand(), message.getType(), ok?"ok":"fail", message.getString());
debug(PSTR("s=fail\n"));
return ok; return ok;
} }
void MySensor::sendInternal(uint8_t variableType, const char *value) {
sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, variableType).set(value));
}
bool MySensor::send(MyMessage message, bool enableAck) {
bool MySensor::send(MyMessage message, bool enableAck, uint8_t retry) {
message.setSender(s.nodeId); message.setSender(s.nodeId);
if (enableAck) { if (enableAck) {
message.setCommand(C_SET_WITH_ACK); message.setCommand(C_SET_WITH_ACK);
return wait(message, C_SET_VARIABLE, retry).getCommand() != C_FAILED;
} else {
return sendRoute(message);;
} }
return sendRoute(message);
/* return wait(message, C_SET_VARIABLE, retry).getCommand() != C_FAILED;
} else {
return ;
}*/
} }
@@ -229,27 +222,28 @@ void MySensor::present(uint8_t childSensorId, uint8_t sensorType) {
void MySensor::sketchInfo(const char *name, const char *version) { void MySensor::sketchInfo(const char *name, const char *version) {
if (name != NULL) if (name != NULL)
sendInternal(I_SKETCH_NAME, name); sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_SKETCH_NAME).set(name));
if (version != NULL) if (version != NULL)
sendInternal(I_SKETCH_VERSION, version); sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_SKETCH_VERSION).set(version));
} }
/*
MyMessage MySensor::get( uint8_t childSensorId, uint8_t variableType, uint8_t destination, uint8_t retry) { MyMessage MySensor::get( uint8_t childSensorId, uint8_t variableType, uint8_t destination, uint8_t retry) {
msg.build(s.nodeId, destination, childSensorId, C_REQ_VARIABLE, variableType); msg.build(s.nodeId, destination, childSensorId, C_REQ_VARIABLE, variableType);
return wait(msg, C_SET_VARIABLE, retry); return wait(msg, C_SET_VARIABLE, retry);
} }*/
void MySensor::request(uint8_t childSensorId, uint8_t variableType, uint8_t destination) { void MySensor::request(uint8_t childSensorId, uint8_t variableType, uint8_t destination) {
process(); // Make sure to process any queued messages before sending new request
sendRoute(msg.build(s.nodeId, destination, childSensorId, C_REQ_VARIABLE, variableType)); sendRoute(msg.build(s.nodeId, destination, childSensorId, C_REQ_VARIABLE, variableType));
} }
void MySensor::sendBatteryLevel(int value) { void MySensor::sendBatteryLevel(int value) {
sendInternal(I_BATTERY_LEVEL, ltoa(value, convBuffer, 10)); sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_BATTERY_LEVEL).set(value));
} }
/*
MyMessage MySensor::wait(MyMessage message, uint8_t expectedResponseCommand, uint8_t retry) { MyMessage MySensor::wait(MyMessage message, uint8_t expectedResponseCommand, uint8_t retry) {
while (retry>0) { while (retry>0) {
@@ -274,14 +268,14 @@ MyMessage MySensor::wait(MyMessage message, uint8_t expectedResponseCommand, uin
msg.setCommand(C_FAILED); msg.setCommand(C_FAILED);
return msg; return msg;
} }
*/
/*
MyMessage MySensor::getInternal(uint8_t variableType, uint8_t retry) { MyMessage MySensor::getInternal(uint8_t variableType, uint8_t retry) {
msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, variableType); msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, variableType);
return wait(msg, C_INTERNAL, retry); return wait(msg, C_INTERNAL, retry);
} }*/
/*unsigned long MySensor::getTime(uint8_t retry) { /*unsigned long MySensor::getTime(uint8_t retry) {
MyMessage message = getInternal(I_TIME, retry); MyMessage message = getInternal(I_TIME, retry);
@@ -366,12 +360,13 @@ boolean MySensor::process() {
// Write id to EEPROM // Write id to EEPROM
if (s.nodeId == AUTO) { if (s.nodeId == AUTO) {
// sensor net gateway will return max id if all sensor id are taken // sensor net gateway will return max id if all sensor id are taken
debug(PSTR("full or no reply\n")); debug(PSTR("full\n"));
while (1); // Wait here. Nothing else we can do... while (1); // Wait here. Nothing else we can do...
} else { } else {
RF24::openReadingPipe(CURRENT_NODE_PIPE, TO_ADDR(s.nodeId));
eeprom_write_byte((uint8_t*)EEPROM_NODE_ID_ADDRESS, s.nodeId); eeprom_write_byte((uint8_t*)EEPROM_NODE_ID_ADDRESS, s.nodeId);
} }
debug(PSTR("new node=%d\n"), s.nodeId); debug(PSTR("id=%d\n"), s.nodeId);
} }
return false; return false;
} else if (relayMode && sender == GATEWAY_ADDRESS) { } else if (relayMode && sender == GATEWAY_ADDRESS) {
@@ -379,7 +374,7 @@ boolean MySensor::process() {
// Someone at sensor net gateway side wants this node to refresh its relay node // Someone at sensor net gateway side wants this node to refresh its relay node
findParentNode(); findParentNode();
// Send relay information back to sensor net gateway node device. // Send relay information back to sensor net gateway node device.
sendInternal(I_RELAY_NODE, ltoa(s.parentNodeId, convBuffer, 10)); sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_RELAY_NODE).set(s.parentNodeId));
return false; return false;
} else if (type == I_CHILDREN) { } else if (type == I_CHILDREN) {
if (msg.getByte() == 'F') { if (msg.getByte() == 'F') {
@@ -393,9 +388,13 @@ boolean MySensor::process() {
} }
} }
} }
// If this is variable message from sensor net gateway. Send ack back. // Check if sender requests an ack back.
if (command == C_SET_WITH_ACK) { if (command == C_SET_WITH_ACK) {
sendAck(msg); ack = msg;
ack.setCommand(C_SET_VARIABLE);
ack.setSender(s.nodeId);
ack.setDestination(msg.getSender());
sendRoute(ack);
// The library user should not need to care about this ack request. Just treat it as a normal SET. // The library user should not need to care about this ack request. Just treat it as a normal SET.
msg.setCommand(C_SET_VARIABLE); msg.setCommand(C_SET_VARIABLE);
} }
@@ -474,9 +473,6 @@ boolean MySensor::process() {
} }
MyMessage MySensor::getLastMessage() { MyMessage MySensor::getLastMessage() {
return msg; return msg;
} }
@@ -562,20 +558,17 @@ void MySensor::clearChildRoutes() {
for (unsigned int i=0;i< sizeof(s.childNodeTable); i++) { for (unsigned int i=0;i< sizeof(s.childNodeTable); i++) {
removeChildRoute(i); removeChildRoute(i);
} }
sendInternal(I_CHILDREN, ""); sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_CHILDREN).set(""));
} }
void MySensor::sendChildren() { void MySensor::sendChildren() {
// Send in which children that is using this node as parent. // Send in which children that is using this node as parent.
// TODO: Fix this // TODO: Fix this
debug(PSTR("rd=dump\n"));
for (int i=0;i< 50; i++) { for (int i=0;i< 50; i++) {
// Serial.println(s.childNodeTable[i]); // Serial.println(s.childNodeTable[i]);
debug(PSTR("rd=%d, %d\n"), i, getChildRoute(i) ); debug(PSTR("rd=%d, %d\n"), i, getChildRoute(i) );
} }
sendRoute(msg.build(s.nodeId, GATEWAY_ADDRESS, NODE_CHILD_ID, C_INTERNAL, I_CHILDREN).set("n/a"));
sendInternal(I_CHILDREN, "nit impl");
} }
+9 -9
View File
@@ -114,7 +114,7 @@ class MySensor : public RF24
* @param retry Number of attempts before giving up. Default is SEND_RETRIES * @param retry Number of attempts before giving up. Default is SEND_RETRIES
* @return true Retuns false if ack is enabled and no ack came back * @return true Retuns false if ack is enabled and no ack came back
*/ */
bool send(MyMessage msg, bool ack=false, uint8_t retry=SEND_RETRIES); bool send(MyMessage msg, bool ack=false/*, uint8_t retry=SEND_RETRIES*/);
/** /**
* Send this nodes battery level to gateway. * Send this nodes battery level to gateway.
@@ -133,7 +133,7 @@ class MySensor : public RF24
* @param number of attempts to fetch * @param number of attempts to fetch
* @return Message response * @return Message response
*/ */
MyMessage get(uint8_t childSensorId, uint8_t variableType, uint8_t destination=GATEWAY_ADDRESS, uint8_t retry=SEND_RETRIES); // MyMessage get(uint8_t childSensorId, uint8_t variableType, uint8_t destination=GATEWAY_ADDRESS, uint8_t retry=SEND_RETRIES);
/** /**
* Requests a value from gateway or some other sensor in the radio network. * Requests a value from gateway or some other sensor in the radio network.
@@ -189,8 +189,6 @@ class MySensor : public RF24
#endif #endif
protected: protected:
MyMessage msg; // Buffer for incoming messages.
uint8_t failedTransmissions;
struct settings_t struct settings_t
{ {
uint8_t nodeId; // Current node id uint8_t nodeId; // Current node id
@@ -198,16 +196,18 @@ class MySensor : public RF24
uint8_t distance; // This nodes distance to sensor net gateway (number of hops) uint8_t distance; // This nodes distance to sensor net gateway (number of hops)
uint8_t *childNodeTable; // In memory buffer for routing to other nodes. also stored in EEPROM uint8_t *childNodeTable; // In memory buffer for routing to other nodes. also stored in EEPROM
} s; } s;
MyMessage msg; // Buffer for incoming messages.
uint8_t failedTransmissions;
boolean relayMode; boolean relayMode;
char convBuffer[20]; // char convBuffer[20];
void setupRelayMode(); void setupRelayMode();
void setupRadio(rf24_pa_dbm_e paLevel, uint8_t channel, rf24_datarate_e dataRate); void setupRadio(rf24_pa_dbm_e paLevel, uint8_t channel, rf24_datarate_e dataRate);
void findParentNode(); void findParentNode();
boolean sendRoute(MyMessage message); boolean sendRoute(MyMessage message);
boolean sendWrite(uint8_t dest, MyMessage message); boolean sendWrite(uint8_t dest, MyMessage message);
void sendInternal(uint8_t variableType, const char *value); // void sendInternal(uint8_t variableType, const char *value);
boolean sendAck(MyMessage message); // boolean sendAck(MyMessage message);
boolean sendData(uint8_t from, uint8_t to, uint8_t childId, uint8_t messageType, uint8_t type, const char *data, uint8_t length, boolean binaryMessage); boolean sendData(uint8_t from, uint8_t to, uint8_t childId, uint8_t messageType, uint8_t type, const char *data, uint8_t length, boolean binaryMessage);
uint8_t validate(MyMessage message); uint8_t validate(MyMessage message);
void sendChildren(); void sendChildren();
@@ -230,8 +230,8 @@ class MySensor : public RF24
void requestNodeId(); void requestNodeId();
uint8_t crc8Message(MyMessage); uint8_t crc8Message(MyMessage);
MyMessage wait(MyMessage msg, uint8_t expectedReceiveType, uint8_t retry); // MyMessage wait(MyMessage msg, uint8_t expectedReceiveType, uint8_t retry);
MyMessage getInternal(uint8_t variableType, uint8_t retry=SEND_RETRIES); // MyMessage getInternal(uint8_t variableType, uint8_t retry=SEND_RETRIES);
uint8_t getChildRoute(uint8_t childId); uint8_t getChildRoute(uint8_t childId);
void addChildRoute(uint8_t childId, uint8_t route); void addChildRoute(uint8_t childId, uint8_t route);