diff --git a/libraries/MySensors/MyGateway.cpp b/libraries/MySensors/MyGateway.cpp index 9040bbc..f9ce0e9 100644 --- a/libraries/MySensors/MyGateway.cpp +++ b/libraries/MySensors/MyGateway.cpp @@ -160,7 +160,8 @@ void MyGateway::parseAndSend(char *commandBuffer) { msg.sensor = sensor; msg.type = type; mSetCommand(msg,command); - mSetAck(msg,ack==0?false:true); + mSetRequestAck(msg,ack==0?false:true); + mSetAck(msg,false); msg.set(value); ok = sendRoute(msg); if (!ok) { diff --git a/libraries/MySensors/MyMessage.cpp b/libraries/MySensors/MyMessage.cpp index 96ae96e..ed394b6 100644 --- a/libraries/MySensors/MyMessage.cpp +++ b/libraries/MySensors/MyMessage.cpp @@ -14,6 +14,11 @@ MyMessage::MyMessage(uint8_t _sensor, uint8_t _type) { } +bool MyMessage::isAck() const { + return miGetAck(); +} + + /* Getters for payload converted to desired form */ void* MyMessage::getCustom() const { return (void *)data; diff --git a/libraries/MySensors/MyMessage.h b/libraries/MySensors/MyMessage.h index c3ae7e3..2c5dc21 100644 --- a/libraries/MySensors/MyMessage.h +++ b/libraries/MySensors/MyMessage.h @@ -74,28 +74,40 @@ typedef enum { // Insert a new bitfield value x into y. #define BF_SET(y, x, start, len) ( y= ((y) &~ BF_MASK(start, len)) | BF_PREP(x, start, len) ) -// Getters/setters for special fields in header +// Getters/setters for special bit fields in header #define mSetVersion(_msg,_version) BF_SET(_msg.version_length, _version, 0, 3) -#define mSetLength(_msg,_length) BF_SET(_msg.version_length, _length, 3, 5) - -#define mSetCommand(_msg,_command) BF_SET(_msg.command_ack_payload, _command, 0, 3) -#define mSetAck(_msg,_command) BF_SET(_msg.command_ack_payload, _command, 3, 1) -#define mSetPayloadType(_msg, _pt) BF_SET(_msg.command_ack_payload, _pt, 4, 4) - #define mGetVersion(_msg) BF_GET(_msg.version_length, 0, 3) + +#define mSetLength(_msg,_length) BF_SET(_msg.version_length, _length, 3, 5) #define mGetLength(_msg) BF_GET(_msg.version_length, 3, 5) +#define mSetCommand(_msg,_command) BF_SET(_msg.command_ack_payload, _command, 0, 3) #define mGetCommand(_msg) BF_GET(_msg.command_ack_payload, 0, 3) -#define mGetAck(_msg) BF_GET(_msg.command_ack_payload, 3, 1) -#define mGetPayloadType(_msg) BF_GET(_msg.command_ack_payload, 4, 4) + +#define mSetRequestAck(_msg,_rack) BF_SET(_msg.command_ack_payload, _rack, 3, 1) +#define mGetRequestAck(_msg) BF_GET(_msg.command_ack_payload, 3, 1) + +#define mSetAck(_msg,_ack) BF_SET(_msg.command_ack_payload, _ack, 4, 1) +#define mGetAck(_msg) BF_GET(_msg.command_ack_payload, 4, 1) + +#define mSetPayloadType(_msg, _pt) BF_SET(_msg.command_ack_payload, _pt, 5, 3) +#define mGetPayloadType(_msg) BF_GET(_msg.command_ack_payload, 5, 3) // internal access for special fields +#define miSetPayloadType(_pt) BF_SET(command_ack_payload, _pt, 4, 4) #define miGetPayloadType() BF_GET(command_ack_payload, 4, 4) -#define miGetLength() BF_GET(version_length, 3, 5) #define miSetLength(_length) BF_SET(version_length, _length, 3, 5) -#define miSetPayloadType(_pt) BF_SET(command_ack_payload, _pt, 4, 4) +#define miGetLength() BF_GET(version_length, 3, 5) + +#define miSetRequestAck(_rack) BF_SET(command_ack_payload, _rack, 3, 1) +#define miGetRequestAck() BF_GET(command_ack_payload, 3, 1) + +#define miSetAck(_ack) BF_SET(command_ack_payload, _ack, 4, 1) +#define miGetAck() BF_GET(command_ack_payload, 4, 1) + + class MyMessage @@ -122,6 +134,9 @@ public: int getInt() const; unsigned int getUInt() const; + // Getter for ack-flag. True if this is an ack message. + bool isAck() const; + // Setters for building message "on the fly" MyMessage& setType(uint8_t type); MyMessage& setSensor(uint8_t sensor); @@ -141,8 +156,9 @@ public: uint8_t version_length; // 3 bit - Protocol version // 5 bit - Length of payload uint8_t command_ack_payload; // 3 bit - Command type - // 1 bit - Indicator that receiver should send an ack back. - // 4 bit - Payload data type + // 1 bit - Request an ack - Indicator that receiver should send an ack back. + // 1 bit - Is ack messsage - Indicator that this is the actual ack message. + // 3 bit - Payload data type uint8_t sender; // 8 bit - Id of sender node uint8_t last; // 8 bit - Id of last node this message passed uint8_t destination; // 8 bit - Id of destination node diff --git a/libraries/MySensors/MySensor.cpp b/libraries/MySensors/MySensor.cpp index a0ddcf2..ad342b2 100644 --- a/libraries/MySensors/MySensor.cpp +++ b/libraries/MySensors/MySensor.cpp @@ -22,7 +22,8 @@ inline MyMessage& build (MyMessage &msg, uint8_t sender, uint8_t destination, ui msg.sensor = sensor; msg.type = type; mSetCommand(msg,command); - mSetAck(msg,enableAck); + mSetRequestAck(msg,enableAck); + mSetAck(msg,false); return msg; } @@ -226,7 +227,7 @@ boolean MySensor::sendWrite(uint8_t next, MyMessage &message, bool broadcast) { bool MySensor::send(MyMessage &message, bool enableAck) { message.sender = nc.nodeId; mSetCommand(message,C_SET); - mSetAck(message,enableAck); + mSetRequestAck(message,enableAck); return sendRoute(message); } @@ -293,10 +294,11 @@ boolean MySensor::process() { return false; } else if (destination == nc.nodeId) { // Check if sender requests an ack back. - if (mGetAck(msg)) { + if (mGetRequestAck(msg)) { // Copy message ack = msg; - mSetAck(ack,false); // Reply without ack flag (otherwise we would end up in an eternal loop) + mSetRequestAck(ack,false); // Reply without ack flag (otherwise we would end up in an eternal loop) + mSetAck(ack,true); ack.sender = nc.nodeId; ack.destination = msg.sender; sendRoute(ack);