User | Revision | Line number | New 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
|
|