New ack bit in header indicating of message is an actual ack of a message.
Use msg.getAck() to check in incoming message callback.
This commit is contained in:
@@ -160,7 +160,8 @@ void MyGateway::parseAndSend(char *commandBuffer) {
|
|||||||
msg.sensor = sensor;
|
msg.sensor = sensor;
|
||||||
msg.type = type;
|
msg.type = type;
|
||||||
mSetCommand(msg,command);
|
mSetCommand(msg,command);
|
||||||
mSetAck(msg,ack==0?false:true);
|
mSetRequestAck(msg,ack==0?false:true);
|
||||||
|
mSetAck(msg,false);
|
||||||
msg.set(value);
|
msg.set(value);
|
||||||
ok = sendRoute(msg);
|
ok = sendRoute(msg);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
|
|||||||
@@ -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 */
|
/* Getters for payload converted to desired form */
|
||||||
void* MyMessage::getCustom() const {
|
void* MyMessage::getCustom() const {
|
||||||
return (void *)data;
|
return (void *)data;
|
||||||
|
|||||||
@@ -74,28 +74,40 @@ typedef enum {
|
|||||||
// Insert a new bitfield value x into y.
|
// 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) )
|
#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 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 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 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 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
|
// 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 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 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
|
class MyMessage
|
||||||
@@ -122,6 +134,9 @@ public:
|
|||||||
int getInt() const;
|
int getInt() const;
|
||||||
unsigned int getUInt() 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"
|
// Setters for building message "on the fly"
|
||||||
MyMessage& setType(uint8_t type);
|
MyMessage& setType(uint8_t type);
|
||||||
MyMessage& setSensor(uint8_t sensor);
|
MyMessage& setSensor(uint8_t sensor);
|
||||||
@@ -141,8 +156,9 @@ public:
|
|||||||
uint8_t version_length; // 3 bit - Protocol version
|
uint8_t version_length; // 3 bit - Protocol version
|
||||||
// 5 bit - Length of payload
|
// 5 bit - Length of payload
|
||||||
uint8_t command_ack_payload; // 3 bit - Command type
|
uint8_t command_ack_payload; // 3 bit - Command type
|
||||||
// 1 bit - Indicator that receiver should send an ack back.
|
// 1 bit - Request an ack - Indicator that receiver should send an ack back.
|
||||||
// 4 bit - Payload data type
|
// 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 sender; // 8 bit - Id of sender node
|
||||||
uint8_t last; // 8 bit - Id of last node this message passed
|
uint8_t last; // 8 bit - Id of last node this message passed
|
||||||
uint8_t destination; // 8 bit - Id of destination node
|
uint8_t destination; // 8 bit - Id of destination node
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ inline MyMessage& build (MyMessage &msg, uint8_t sender, uint8_t destination, ui
|
|||||||
msg.sensor = sensor;
|
msg.sensor = sensor;
|
||||||
msg.type = type;
|
msg.type = type;
|
||||||
mSetCommand(msg,command);
|
mSetCommand(msg,command);
|
||||||
mSetAck(msg,enableAck);
|
mSetRequestAck(msg,enableAck);
|
||||||
|
mSetAck(msg,false);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,7 +227,7 @@ boolean MySensor::sendWrite(uint8_t next, MyMessage &message, bool broadcast) {
|
|||||||
bool MySensor::send(MyMessage &message, bool enableAck) {
|
bool MySensor::send(MyMessage &message, bool enableAck) {
|
||||||
message.sender = nc.nodeId;
|
message.sender = nc.nodeId;
|
||||||
mSetCommand(message,C_SET);
|
mSetCommand(message,C_SET);
|
||||||
mSetAck(message,enableAck);
|
mSetRequestAck(message,enableAck);
|
||||||
return sendRoute(message);
|
return sendRoute(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,10 +294,11 @@ boolean MySensor::process() {
|
|||||||
return false;
|
return false;
|
||||||
} else if (destination == nc.nodeId) {
|
} else if (destination == nc.nodeId) {
|
||||||
// Check if sender requests an ack back.
|
// Check if sender requests an ack back.
|
||||||
if (mGetAck(msg)) {
|
if (mGetRequestAck(msg)) {
|
||||||
// Copy message
|
// Copy message
|
||||||
ack = msg;
|
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.sender = nc.nodeId;
|
||||||
ack.destination = msg.sender;
|
ack.destination = msg.sender;
|
||||||
sendRoute(ack);
|
sendRoute(ack);
|
||||||
|
|||||||
Reference in New Issue
Block a user