-
Notifications
You must be signed in to change notification settings - Fork 50
/
RF24Client.h
182 lines (151 loc) · 5.52 KB
/
RF24Client.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/*
RF24Client.h - Arduino implementation of a uIP wrapper class.
Copyright (c) 2014 [email protected], github.com/TMRh20
Copyright (c) 2013 Norbert Truchsess <[email protected]>
All rights reserved.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef RF24CLIENT_H
#define RF24CLIENT_H
#include "Print.h"
#include "Client.h"
//#define UIP_SOCKET_DATALEN UIP_TCP_MSS
//#define UIP_SOCKET_NUMPACKETS UIP_RECEIVE_WINDOW/UIP_TCP_MSS+1
//#ifndef UIP_SOCKET_NUMPACKETS
//#define UIP_SOCKET_NUMPACKETS 5
//#endif
#define UIP_CLIENT_CONNECTED 0x10
#define UIP_CLIENT_CLOSE 0x20
#define UIP_CLIENT_REMOTECLOSED 0x40
#define UIP_CLIENT_RESTART 0x80
#define UIP_CLIENT_STATEFLAGS (UIP_CLIENT_CONNECTED | UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED | UIP_CLIENT_RESTART)
#define UIP_CLIENT_SOCKETS ~UIP_CLIENT_STATEFLAGS
/**
* @warning <b> This is used internally and should not be accessed directly by users </b>
*/
typedef struct
{
uint8_t state;
uint8_t packets_in[UIP_SOCKET_NUMPACKETS];
/** The local TCP port, in network byte order. */
uint16_t lport;
} uip_userdata_closed_t;
/**
* Data structure for holding per connection data
* @warning <b> This is used internally and should not be accessed directly by users </b>
*/
typedef struct __attribute__((__packed__))
{
bool hold;
bool packets_in;
bool packets_out;
bool windowOpened;
uint8_t state;
uint16_t in_pos;
uint16_t out_pos;
uint16_t dataCnt;
#if UIP_CLIENT_TIMER >= 0
uint32_t timer;
#endif
uint32_t restartTime;
uint32_t restartInterval;
#if UIP_CONNECTION_TIMEOUT > 0
uint32_t connectTimeout;
uint32_t connectTimer;
#endif
uint8_t myData[OUTPUT_BUFFER_SIZE];
} uip_userdata_t;
class RF24Client : public Client
{
public:
/** Basic constructor */
RF24Client();
/** Establish a connection to a specified IP address and port */
int connect(IPAddress ip, uint16_t port);
/**
* Establish a connection to a given hostname and port
* @note UDP must be enabled in uip-conf.h for DNS lookups to work
*
* @note Tip: DNS lookups generally require a buffer size of 250-300 bytes or greater.
* Lookups will generally return responses with a single A record if using hostnames like
* "www.google.com" instead of "google.com" which works well with the default buffer size
*/
int connect(const char* host, uint16_t port);
/**
* Read available data into a buffer
* @code
* uint8_t buf[size];
* client.read(buf,size);
* @endcode
*/
int read(uint8_t* buf, size_t size);
/**
* Read data one byte at a time
* @code
* char c = client.read();
* @endcode
*/
int read();
/** Disconnects from the current active connection */
void stop();
/** Indicates whether the client is connected or not */
uint8_t connected();
/**
* Write a single byte of data to the stream
* @note This will write an entire TCP payload with only 1 byte in it
*/
size_t write(uint8_t);
/** Write a buffer of data, to be sent in a single TCP packet */
size_t write(const uint8_t* buf, size_t size);
/**
* Indicates whether data is available to be read by the client.
* @return Returns the number of bytes available to be read
* @note Calling client or server available() keeps the IP stack and RF24Network layer running, so needs to be called regularly,
* even when disconnected or delaying for extended periods.
*/
int available();
/**
* Wait Available
*
* Helps to ensure all incoming data has been received, prior to writing data back to the client, etc.
*
* Indicates whether data is available to be read by the client, after waiting a maximum period of time.
* @return Returns the number of bytes available to be read or 0 if timed out
* @note Calling client or server available() keeps the IP stack and RF24Network layer running, so needs to be called regularly,
* even when disconnected or delaying for extended periods.
*/
int waitAvailable(uint32_t timeout = 750);
/** Read a byte from the incoming buffer without advancing the point of reading */
int peek();
/** Flush all incoming client data from the current connection/buffer */
void flush();
using Print::write;
operator bool();
virtual bool operator==(const EthernetClient&);
virtual bool operator!=(const EthernetClient& rhs)
{
return !this->operator==(rhs);
};
static uip_userdata_t all_data[UIP_CONNS];
private:
RF24Client(struct uip_conn* _conn);
RF24Client(uip_userdata_t* conn_data);
uip_userdata_t* data;
static int _available(uip_userdata_t*);
static uip_userdata_t* _allocateData();
static size_t _write(uip_userdata_t*, const uint8_t* buf, size_t size);
friend class RF24EthernetClass;
friend class RF24Server;
friend void serialip_appcall(void);
friend void uip_log(char* msg);
};
#endif // RF24CLIENT_H