Dependents:   New

Committer:
SangSTBK
Date:
Mon Jul 02 01:29:58 2012 +0000
Revision:
0:e16ffa7cb900
RF

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SangSTBK 0:e16ffa7cb900 1 // RF22Mesh.h
SangSTBK 0:e16ffa7cb900 2 //
SangSTBK 0:e16ffa7cb900 3 // Author: Mike McCauley (mikem@open.com.au)
SangSTBK 0:e16ffa7cb900 4 // Copyright (C) 2011 Mike McCauley
SangSTBK 0:e16ffa7cb900 5 // $Id: RF22Mesh.h,v 1.3 2011/02/15 04:51:59 mikem Exp $
SangSTBK 0:e16ffa7cb900 6 // ported to mbed by Karl Zweimueller
SangSTBK 0:e16ffa7cb900 7
SangSTBK 0:e16ffa7cb900 8 #ifndef RF22Mesh_h
SangSTBK 0:e16ffa7cb900 9 #define RF22Mesh_h
SangSTBK 0:e16ffa7cb900 10
SangSTBK 0:e16ffa7cb900 11 #include <RF22Router.h>
SangSTBK 0:e16ffa7cb900 12
SangSTBK 0:e16ffa7cb900 13 // Types of RF22Mesh message, used to set msgType in the RF22MeshHeader
SangSTBK 0:e16ffa7cb900 14 #define RF22_MESH_MESSAGE_TYPE_APPLICATION 0
SangSTBK 0:e16ffa7cb900 15 #define RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_REQUEST 1
SangSTBK 0:e16ffa7cb900 16 #define RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_RESPONSE 2
SangSTBK 0:e16ffa7cb900 17 #define RF22_MESH_MESSAGE_TYPE_ROUTE_FAILURE 3
SangSTBK 0:e16ffa7cb900 18
SangSTBK 0:e16ffa7cb900 19 /////////////////////////////////////////////////////////////////////
SangSTBK 0:e16ffa7cb900 20 /// \class RF22Mesh RF22Mesh.h <RF22Mesh.h>
SangSTBK 0:e16ffa7cb900 21 /// \brief RF22 subclass for sending addressed, optionally acknowledged datagrams
SangSTBK 0:e16ffa7cb900 22 /// multi-hop routed across a network, with automatic route discovery
SangSTBK 0:e16ffa7cb900 23 ///
SangSTBK 0:e16ffa7cb900 24 /// Extends RF22Router to add automatic route discovery within a mesh of adjacent nodes,
SangSTBK 0:e16ffa7cb900 25 /// and route signalling.
SangSTBK 0:e16ffa7cb900 26 ///
SangSTBK 0:e16ffa7cb900 27 /// Unlike RF22Router, RF22Mesh can be used in networks where the network topology is fluid, or unknown,
SangSTBK 0:e16ffa7cb900 28 /// or if nodes can mode around or go in or out of service. When a node wants to send a
SangSTBK 0:e16ffa7cb900 29 /// message to another node, it will automcatically discover a route to the destaintion node and use it.
SangSTBK 0:e16ffa7cb900 30 /// If the route becomes unavailable, a new route will be discovered.
SangSTBK 0:e16ffa7cb900 31 ///
SangSTBK 0:e16ffa7cb900 32 /// \par Route Discovery
SangSTBK 0:e16ffa7cb900 33 ///
SangSTBK 0:e16ffa7cb900 34 /// When a RF22Mesh mesh node is initialised, it doe not know any routes to any other nodes
SangSTBK 0:e16ffa7cb900 35 /// (see RF22Router for details on route and the routing table).
SangSTBK 0:e16ffa7cb900 36 /// When you attempt to send a message with sendtoWait, will first check to see if there is a route to the
SangSTBK 0:e16ffa7cb900 37 /// destinastion node in the routing tabl;e. If not, it wil initialite 'Route Discovery'.
SangSTBK 0:e16ffa7cb900 38 /// When a node needs to discover a route to another node, it broadcasts MeshRouteDiscoveryMessage
SangSTBK 0:e16ffa7cb900 39 /// with a message type of RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_REQUEST.
SangSTBK 0:e16ffa7cb900 40 /// Any node that receives such a request checks to see if it is a request for a route to itself
SangSTBK 0:e16ffa7cb900 41 /// (in which case it makes a unicast reply to the originating node with a
SangSTBK 0:e16ffa7cb900 42 /// MeshRouteDiscoveryMessage
SangSTBK 0:e16ffa7cb900 43 /// with a message type of RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_RESPONSE)
SangSTBK 0:e16ffa7cb900 44 /// otherwise it rebroadcasts the request, after adding itself to the list of nodes visited so
SangSTBK 0:e16ffa7cb900 45 /// far by the request.
SangSTBK 0:e16ffa7cb900 46 ///
SangSTBK 0:e16ffa7cb900 47 /// If a node receives a RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_REQUEST that already has itself
SangSTBK 0:e16ffa7cb900 48 /// listed in the visited nodes, it knows it has already seen and rebroadcast this request,
SangSTBK 0:e16ffa7cb900 49 /// and threfore ignores it. This prevents broadcast storms.
SangSTBK 0:e16ffa7cb900 50 /// When a node receives a RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_REQUEST it can use the list of
SangSTBK 0:e16ffa7cb900 51 /// nodes aready visited to deduce routes back towards the originating (requesting node).
SangSTBK 0:e16ffa7cb900 52 /// This also means that when the destination node of the request is reached, it (and all
SangSTBK 0:e16ffa7cb900 53 /// the previous nodes the request visited) will have a route back to the originating node.
SangSTBK 0:e16ffa7cb900 54 /// This means the unicast RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_RESPONSE
SangSTBK 0:e16ffa7cb900 55 /// reply will be routed successfully back to the original route requester.
SangSTBK 0:e16ffa7cb900 56 ///
SangSTBK 0:e16ffa7cb900 57 /// The RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_RESPONSE sent back by the destination node contains
SangSTBK 0:e16ffa7cb900 58 /// the full list of nodes that were visited on the way to the destination.
SangSTBK 0:e16ffa7cb900 59 /// Therefore, intermediate nodes that route the reply back towards the originating node can use the
SangSTBK 0:e16ffa7cb900 60 /// node list in the reply to deduce routes to all the nodes between it and the destination node.
SangSTBK 0:e16ffa7cb900 61 ///
SangSTBK 0:e16ffa7cb900 62 /// Therefore, RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_REQUEST and
SangSTBK 0:e16ffa7cb900 63 /// RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_RESPONSE together ensure the original requester and all
SangSTBK 0:e16ffa7cb900 64 /// the intermediate nodes know how to route to the source and destination nodes and every node along the path.
SangSTBK 0:e16ffa7cb900 65 ///
SangSTBK 0:e16ffa7cb900 66 /// Note that there is a race condition here that can effect routing on multipath routes. For example,
SangSTBK 0:e16ffa7cb900 67 /// if the route to the destination can traverse several paths, last reply from the destination
SangSTBK 0:e16ffa7cb900 68 /// will be the one used.
SangSTBK 0:e16ffa7cb900 69 ///
SangSTBK 0:e16ffa7cb900 70 /// \par Route Failure
SangSTBK 0:e16ffa7cb900 71 ///
SangSTBK 0:e16ffa7cb900 72 /// RF22Router (and therefore RF22Mesh) use reliable hop-to-hop delivery of messages using
SangSTBK 0:e16ffa7cb900 73 /// hop-to-hop acknowledgements, but not end-to-end acknowledgements. When sendtoWait() returns,
SangSTBK 0:e16ffa7cb900 74 /// you know that the message has been delivered to the next hop, but not if it is (or even if it can be)
SangSTBK 0:e16ffa7cb900 75 /// delivered to the destination node. If during the course of hop-to-hop routing of a message,
SangSTBK 0:e16ffa7cb900 76 /// one of the intermediate RF22Mesh nodes finds it cannot deliver to the next hop
SangSTBK 0:e16ffa7cb900 77 /// (say due to a lost route or no acknwledgement from the next hop), it replies to the
SangSTBK 0:e16ffa7cb900 78 /// originator with a unicast MeshRouteFailureMessage RF22_MESH_MESSAGE_TYPE_ROUTE_FAILURE message.
SangSTBK 0:e16ffa7cb900 79 /// Intermediate nodes (on the way beack to the originator)
SangSTBK 0:e16ffa7cb900 80 /// and the originating node use this message to delete the route to the destination
SangSTBK 0:e16ffa7cb900 81 /// node of the original message. This means that if a route to a destination becomes unusable
SangSTBK 0:e16ffa7cb900 82 /// (either because an intermediate node is off the air, or has moved out of range) a new route
SangSTBK 0:e16ffa7cb900 83 /// will be established the next time a message is to be sent.
SangSTBK 0:e16ffa7cb900 84 ///
SangSTBK 0:e16ffa7cb900 85 /// \par Message Format
SangSTBK 0:e16ffa7cb900 86 ///
SangSTBK 0:e16ffa7cb900 87 /// RF22Mesh uses a number of message formats layered on top of RF22Router:
SangSTBK 0:e16ffa7cb900 88 /// - MeshApplicationMessage (message type RF22_MESH_MESSAGE_TYPE_APPLICATION).
SangSTBK 0:e16ffa7cb900 89 /// Carries an application layer message for the caller of RF22Mesh
SangSTBK 0:e16ffa7cb900 90 /// - MeshRouteDiscoveryMessage (message types RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_REQUEST
SangSTBK 0:e16ffa7cb900 91 /// and RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_RESPONSE). Carries Route Discovery messages
SangSTBK 0:e16ffa7cb900 92 /// (broadcast) and replies (unicast).
SangSTBK 0:e16ffa7cb900 93 /// - MeshRouteFailureMessage (message type RF22_MESH_MESSAGE_TYPE_ROUTE_FAILURE) Informs nodes of
SangSTBK 0:e16ffa7cb900 94 /// route failures.
SangSTBK 0:e16ffa7cb900 95 ///
SangSTBK 0:e16ffa7cb900 96 /// Part of the Arduino RF22 library for operating with HopeRF RF22 compatible transceivers
SangSTBK 0:e16ffa7cb900 97 /// (see http://www.hoperf.com)
SangSTBK 0:e16ffa7cb900 98 class RF22Mesh : public RF22Router
SangSTBK 0:e16ffa7cb900 99 {
SangSTBK 0:e16ffa7cb900 100 public:
SangSTBK 0:e16ffa7cb900 101
SangSTBK 0:e16ffa7cb900 102 /// The maximum length permitted for the application payload data in a RF22Mesh message
SangSTBK 0:e16ffa7cb900 103 #define RF22_MESH_MAX_MESSAGE_LEN (RF22_ROUTER_MAX_MESSAGE_LEN - sizeof(RF22Mesh::MeshMessageHeader))
SangSTBK 0:e16ffa7cb900 104
SangSTBK 0:e16ffa7cb900 105 /// Structure of the basic RF22Mesh header.
SangSTBK 0:e16ffa7cb900 106 typedef struct
SangSTBK 0:e16ffa7cb900 107 {
SangSTBK 0:e16ffa7cb900 108 uint8_t msgType; ///< Type of RF22Mesh message, one of RF22_MESH_MESSAGE_TYPE_*
SangSTBK 0:e16ffa7cb900 109 } MeshMessageHeader;
SangSTBK 0:e16ffa7cb900 110
SangSTBK 0:e16ffa7cb900 111 /// Signals an application layer message for the caller of RF22Mesh
SangSTBK 0:e16ffa7cb900 112 typedef struct
SangSTBK 0:e16ffa7cb900 113 {
SangSTBK 0:e16ffa7cb900 114 MeshMessageHeader header; ///< msgType = RF22_MESH_MESSAGE_TYPE_APPLICATION
SangSTBK 0:e16ffa7cb900 115 uint8_t data[RF22_MESH_MAX_MESSAGE_LEN]; ///< Applicaiotn layer payload data
SangSTBK 0:e16ffa7cb900 116 } MeshApplicationMessage;
SangSTBK 0:e16ffa7cb900 117
SangSTBK 0:e16ffa7cb900 118 /// Signals a route discovery request or reply
SangSTBK 0:e16ffa7cb900 119 /// At present only supports physical dest addresses of length 1 octet
SangSTBK 0:e16ffa7cb900 120 typedef struct
SangSTBK 0:e16ffa7cb900 121 {
SangSTBK 0:e16ffa7cb900 122 MeshMessageHeader header; ///< msgType = RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_*
SangSTBK 0:e16ffa7cb900 123 uint8_t destlen; ///< Reserved. Must be 1.
SangSTBK 0:e16ffa7cb900 124 uint8_t dest; ///< The address of the destination node whose route is being sought
SangSTBK 0:e16ffa7cb900 125 uint8_t route[RF22_MESH_MAX_MESSAGE_LEN - 1]; ///< List of node addresses visited so far. Length is implcit
SangSTBK 0:e16ffa7cb900 126 } MeshRouteDiscoveryMessage;
SangSTBK 0:e16ffa7cb900 127
SangSTBK 0:e16ffa7cb900 128 /// Signals a route failure
SangSTBK 0:e16ffa7cb900 129 typedef struct
SangSTBK 0:e16ffa7cb900 130 {
SangSTBK 0:e16ffa7cb900 131 MeshMessageHeader header; ///< msgType = RF22_MESH_MESSAGE_TYPE_ROUTE_FAILURE
SangSTBK 0:e16ffa7cb900 132 uint8_t dest; ///< The address of the destination towards which the route failed
SangSTBK 0:e16ffa7cb900 133 } MeshRouteFailureMessage;
SangSTBK 0:e16ffa7cb900 134
SangSTBK 0:e16ffa7cb900 135 /// Constructor.
SangSTBK 0:e16ffa7cb900 136 /// \param[in] thisAddress The address to assign to this node. Defaults to 0
SangSTBK 0:e16ffa7cb900 137 /// \param[in] slaveSelectPin the Arduino pin number of the output to use to select the RF22 before
SangSTBK 0:e16ffa7cb900 138 /// accessing it
SangSTBK 0:e16ffa7cb900 139 /// \param[in] interrupt The interrupt number to use. Default is interrupt 0 (Arduino input pin 2)
SangSTBK 0:e16ffa7cb900 140 RF22Mesh(uint8_t thisAddress ,PinName slaveSelectPin , PinName mosi, PinName miso, PinName sclk, PinName interrupt );
SangSTBK 0:e16ffa7cb900 141
SangSTBK 0:e16ffa7cb900 142 /// Sends a message to the destination node. Initialises the RF22Router message header
SangSTBK 0:e16ffa7cb900 143 /// (the SOURCE address is set to the address of this node, HOPS to 0) and calls
SangSTBK 0:e16ffa7cb900 144 /// route() which looks up in the routing table the next hop to deliver to.
SangSTBK 0:e16ffa7cb900 145 /// If no route is known, initiates route discovery and waits for a reply.
SangSTBK 0:e16ffa7cb900 146 /// Then sends the message to the next hop
SangSTBK 0:e16ffa7cb900 147 /// Then waits for an acknowledgement from the next hop
SangSTBK 0:e16ffa7cb900 148 /// (but not from the destination node (if that is different).
SangSTBK 0:e16ffa7cb900 149 /// \param [in] buf The application message data
SangSTBK 0:e16ffa7cb900 150 /// \param [in] len Number of octets in the application message data. 0 is permitted
SangSTBK 0:e16ffa7cb900 151 /// \param [in] dest The destination node address
SangSTBK 0:e16ffa7cb900 152 /// \return The result code:
SangSTBK 0:e16ffa7cb900 153 /// - RF22_ROUTER_ERROR_NONE Message was routed and deliverd to the next hop
SangSTBK 0:e16ffa7cb900 154 /// (not necessarily to the final dest address)
SangSTBK 0:e16ffa7cb900 155 /// - RF22_ROUTER_ERROR_NO_ROUTE There was no route for dest in the local routing table
SangSTBK 0:e16ffa7cb900 156 /// - RF22_ROUTER_ERROR_UNABLE_TO_DELIVER Noyt able to deliver to the next hop
SangSTBK 0:e16ffa7cb900 157 /// (usually because it dod not acknowledge due to being off the air or out of range
SangSTBK 0:e16ffa7cb900 158 uint8_t sendtoWait(uint8_t* buf, uint8_t len, uint8_t dest);
SangSTBK 0:e16ffa7cb900 159
SangSTBK 0:e16ffa7cb900 160 /// Starts the receiver if it is not running already.
SangSTBK 0:e16ffa7cb900 161 /// If there is a valid application layer message available for this node (or RF22_BROADCAST_ADDRESS),
SangSTBK 0:e16ffa7cb900 162 /// send an acknowledgement to the last hop
SangSTBK 0:e16ffa7cb900 163 /// address (blocking until this is complete), then copy the application message payload data
SangSTBK 0:e16ffa7cb900 164 /// to buf and return true
SangSTBK 0:e16ffa7cb900 165 /// else return false.
SangSTBK 0:e16ffa7cb900 166 /// If a message is copied, *len is set to the length..
SangSTBK 0:e16ffa7cb900 167 /// If from is not NULL, the originator SOURCE address is placed in *source.
SangSTBK 0:e16ffa7cb900 168 /// If to is not NULL, the DEST address is placed in *dest. This might be this nodes address or
SangSTBK 0:e16ffa7cb900 169 /// RF22_BROADCAST_ADDRESS.
SangSTBK 0:e16ffa7cb900 170 /// This is the preferred function for getting messages addressed to this node.
SangSTBK 0:e16ffa7cb900 171 /// If the message is not a broadcast, acknowledge to the sender before returning.
SangSTBK 0:e16ffa7cb900 172 /// \param[in] buf Location to copy the received message
SangSTBK 0:e16ffa7cb900 173 /// \param[in,out] len Available space in buf. Set to the actual number of octets copied.
SangSTBK 0:e16ffa7cb900 174 /// \param[in] source If present and not NULL, the referenced uint8_t will be set to the SOURCE address
SangSTBK 0:e16ffa7cb900 175 /// \param[in] dest If present and not NULL, the referenced uint8_t will be set to the DEST address
SangSTBK 0:e16ffa7cb900 176 /// \param[in] id If present and not NULL, the referenced uint8_t will be set to the ID
SangSTBK 0:e16ffa7cb900 177 /// \param[in] flags If present and not NULL, the referenced uint8_t will be set to the FLAGS
SangSTBK 0:e16ffa7cb900 178 /// (not just those addressed to this node).
SangSTBK 0:e16ffa7cb900 179 /// \return true if a valid message was recvived for this node and copied to buf
SangSTBK 0:e16ffa7cb900 180 boolean recvfromAck(uint8_t* buf, uint8_t* len, uint8_t* source = NULL, uint8_t* dest = NULL, uint8_t* id = NULL, uint8_t* flags = NULL);
SangSTBK 0:e16ffa7cb900 181
SangSTBK 0:e16ffa7cb900 182 /// Starts the receiver if it is not running already.
SangSTBK 0:e16ffa7cb900 183 /// Similar to recvfromAck(), this will block until either a valid application layer
SangSTBK 0:e16ffa7cb900 184 /// message available for this node
SangSTBK 0:e16ffa7cb900 185 /// or the timeout expires.
SangSTBK 0:e16ffa7cb900 186 /// \param[in] buf Location to copy the received message
SangSTBK 0:e16ffa7cb900 187 /// \param[in,out] len Available space in buf. Set to the actual number of octets copied.
SangSTBK 0:e16ffa7cb900 188 /// \param[in] timeout Maximum time to wait in milliseconds
SangSTBK 0:e16ffa7cb900 189 /// \param[in] source If present and not NULL, the referenced uint8_t will be set to the SOURCE address
SangSTBK 0:e16ffa7cb900 190 /// \param[in] dest If present and not NULL, the referenced uint8_t will be set to the DEST address
SangSTBK 0:e16ffa7cb900 191 /// \param[in] id If present and not NULL, the referenced uint8_t will be set to the ID
SangSTBK 0:e16ffa7cb900 192 /// \param[in] flags If present and not NULL, the referenced uint8_t will be set to the FLAGS
SangSTBK 0:e16ffa7cb900 193 /// (not just those addressed to this node).
SangSTBK 0:e16ffa7cb900 194 /// \return true if a valid message was copied to buf
SangSTBK 0:e16ffa7cb900 195 boolean recvfromAckTimeout(uint8_t* buf, uint8_t* len, uint16_t timeout, uint8_t* source = NULL, uint8_t* dest = NULL, uint8_t* id = NULL, uint8_t* flags = NULL);
SangSTBK 0:e16ffa7cb900 196
SangSTBK 0:e16ffa7cb900 197 protected:
SangSTBK 0:e16ffa7cb900 198
SangSTBK 0:e16ffa7cb900 199 /// Internal function that inspects messages being received and adjusts the routing table if necessary.
SangSTBK 0:e16ffa7cb900 200 /// Called by recvfromAck() immediately after it gets the message from RF22ReliableDatagram
SangSTBK 0:e16ffa7cb900 201 /// \param [in] message Pointer to the RF22Router message that was received.
SangSTBK 0:e16ffa7cb900 202 /// \param [in] messageLen Length of message in octets
SangSTBK 0:e16ffa7cb900 203 virtual void peekAtMessage(RoutedMessage* message, uint8_t messageLen);
SangSTBK 0:e16ffa7cb900 204
SangSTBK 0:e16ffa7cb900 205 /// Internal function that inspects messages being received and adjusts the routing table if necessary.
SangSTBK 0:e16ffa7cb900 206 /// This is virtual, which lets subclasses override or intercept the route() function.
SangSTBK 0:e16ffa7cb900 207 /// Called by sendtoWait after the message header has been filled in.
SangSTBK 0:e16ffa7cb900 208 /// \param [in] message Pointer to the RF22Router message to be sent.
SangSTBK 0:e16ffa7cb900 209 /// \param [in] messageLen Length of message in octets
SangSTBK 0:e16ffa7cb900 210 virtual uint8_t route(RoutedMessage* message, uint8_t messageLen);
SangSTBK 0:e16ffa7cb900 211
SangSTBK 0:e16ffa7cb900 212 /// Try to resolve a route for the given address. Blocks while discovering the route
SangSTBK 0:e16ffa7cb900 213 /// which may take up to 4000 msec.
SangSTBK 0:e16ffa7cb900 214 /// Virtual so subclasses can override.
SangSTBK 0:e16ffa7cb900 215 /// \param [in] address The physical addres to resolve
SangSTBK 0:e16ffa7cb900 216 /// \return true if the address was resolved and added to the local routing table
SangSTBK 0:e16ffa7cb900 217 virtual boolean doArp(uint8_t address);
SangSTBK 0:e16ffa7cb900 218
SangSTBK 0:e16ffa7cb900 219 /// Tests if the given address of length addresslen is indentical to the
SangSTBK 0:e16ffa7cb900 220 /// physical addres of this node.
SangSTBK 0:e16ffa7cb900 221 /// RF22Mesh always ikmplements p[hysical addresses as the 1 octet address of the node
SangSTBK 0:e16ffa7cb900 222 /// given by _thisAddress
SangSTBK 0:e16ffa7cb900 223 /// Called by recvfromAck() to test whether a RF22_MESH_MESSAGE_TYPE_ROUTE_DISCOVERY_REQUEST
SangSTBK 0:e16ffa7cb900 224 /// is for this node.
SangSTBK 0:e16ffa7cb900 225 /// Subclasses may want to override to implemnt mode complicated or longer physical addresses
SangSTBK 0:e16ffa7cb900 226 /// \param [in] address Address of the pyysical addres being tested
SangSTBK 0:e16ffa7cb900 227 /// \param [in] addresslen Lengthof the address in bytes
SangSTBK 0:e16ffa7cb900 228 /// \return true if the physical address of this node is identical to address
SangSTBK 0:e16ffa7cb900 229 virtual boolean isPhysicalAddress(uint8_t* address, uint8_t addresslen);
SangSTBK 0:e16ffa7cb900 230
SangSTBK 0:e16ffa7cb900 231 private:
SangSTBK 0:e16ffa7cb900 232 /// Temporary mesage buffer
SangSTBK 0:e16ffa7cb900 233 static uint8_t _tmpMessage[RF22_ROUTER_MAX_MESSAGE_LEN];
SangSTBK 0:e16ffa7cb900 234
SangSTBK 0:e16ffa7cb900 235 };
SangSTBK 0:e16ffa7cb900 236
SangSTBK 0:e16ffa7cb900 237 #endif
SangSTBK 0:e16ffa7cb900 238