16
16
17
17
#include " C027Interface.h"
18
18
#include " mbed.h"
19
+ #include " rtos.h"
19
20
20
21
21
22
// C027Interface implementation
@@ -85,8 +86,32 @@ struct c027_socket {
85
86
MDMParser::IpProtocol proto;
86
87
MDMParser::IP ip;
87
88
int port;
89
+
90
+ MDMSerial *mdm;
91
+ Thread thread;
92
+ Mutex mutex;
93
+ volatile bool running;
94
+ void (*callback)(void *);
95
+ void *data;
88
96
};
89
97
98
+ static void socket_poll (struct c027_socket *socket) {
99
+ bool was_readable = false ;
100
+
101
+ while (socket->running ) {
102
+ socket->mutex .lock ();
103
+ bool is_readable = !!socket->mdm ->socketReadable (socket->socket );
104
+
105
+ if (is_readable != was_readable) {
106
+ if (socket->callback ) {
107
+ socket->callback (socket->data );
108
+ }
109
+ was_readable = is_readable;
110
+ }
111
+ socket->mutex .unlock ();
112
+ }
113
+ }
114
+
90
115
int C027Interface::socket_open (void **handle, nsapi_protocol_t proto)
91
116
{
92
117
MDMParser::IpProtocol mdmproto = (proto == NSAPI_UDP) ? MDMParser::IPPROTO_UDP : MDMParser::IPPROTO_TCP;
@@ -103,13 +128,22 @@ int C027Interface::socket_open(void **handle, nsapi_protocol_t proto)
103
128
104
129
socket->socket = fd;
105
130
socket->proto = mdmproto;
131
+ socket->mdm = _mdm;
132
+
133
+ socket->running = true ;
134
+ socket->thread .start (socket, socket_poll);
135
+
106
136
*handle = socket;
107
137
return 0 ;
108
138
}
109
139
110
140
int C027Interface::socket_close (void *handle)
111
141
{
112
142
struct c027_socket *socket = (struct c027_socket *)handle;
143
+
144
+ socket->running = false ;
145
+ socket->thread .join ();
146
+
113
147
_mdm->socketFree (socket->socket );
114
148
115
149
delete socket;
@@ -129,8 +163,12 @@ int C027Interface::socket_listen(void *handle, int backlog)
129
163
int C027Interface::socket_connect (void *handle, const SocketAddress &addr)
130
164
{
131
165
struct c027_socket *socket = (struct c027_socket *)handle;
132
-
133
- if (!_mdm->socketConnect (socket->socket , addr.get_ip_address (), addr.get_port ())) {
166
+
167
+ socket->mutex .lock ();
168
+ bool success = _mdm->socketConnect (socket->socket , addr.get_ip_address (), addr.get_port ());
169
+ socket->mutex .unlock ();
170
+
171
+ if (!success) {
134
172
return NSAPI_ERROR_DEVICE_ERROR;
135
173
}
136
174
@@ -146,7 +184,10 @@ int C027Interface::socket_send(void *handle, const void *data, unsigned size)
146
184
{
147
185
struct c027_socket *socket = (struct c027_socket *)handle;
148
186
187
+ socket->mutex .lock ();
149
188
int sent = _mdm->socketSend (socket->socket , (const char *)data, size);
189
+ socket->mutex .unlock ();
190
+
150
191
if (sent == SOCKET_ERROR) {
151
192
return NSAPI_ERROR_DEVICE_ERROR;
152
193
}
@@ -157,11 +198,16 @@ int C027Interface::socket_send(void *handle, const void *data, unsigned size)
157
198
int C027Interface::socket_recv (void *handle, void *data, unsigned size)
158
199
{
159
200
struct c027_socket *socket = (struct c027_socket *)handle;
201
+
202
+ socket->mutex .lock ();
160
203
if (!_mdm->socketReadable (socket->socket )) {
204
+ socket->mutex .unlock ();
161
205
return NSAPI_ERROR_WOULD_BLOCK;
162
206
}
163
207
164
208
int recv = _mdm->socketRecv (socket->socket , (char *)data, size);
209
+ socket->mutex .unlock ();
210
+
165
211
if (recv == SOCKET_ERROR) {
166
212
return NSAPI_ERROR_DEVICE_ERROR;
167
213
}
@@ -173,9 +219,11 @@ int C027Interface::socket_sendto(void *handle, const SocketAddress &addr, const
173
219
{
174
220
struct c027_socket *socket = (struct c027_socket *)handle;
175
221
222
+ socket->mutex .lock ();
176
223
int sent = _mdm->socketSendTo (socket->socket ,
177
224
*(MDMParser::IP *)addr.get_ip_bytes (), addr.get_port (),
178
225
(const char *)data, size);
226
+ socket->mutex .unlock ();
179
227
180
228
if (sent == SOCKET_ERROR) {
181
229
return NSAPI_ERROR_DEVICE_ERROR;
@@ -187,14 +235,19 @@ int C027Interface::socket_sendto(void *handle, const SocketAddress &addr, const
187
235
int C027Interface::socket_recvfrom (void *handle, SocketAddress *addr, void *data, unsigned size)
188
236
{
189
237
struct c027_socket *socket = (struct c027_socket *)handle;
238
+
239
+ socket->mutex .lock ();
190
240
if (!_mdm->socketReadable (socket->socket )) {
241
+ socket->mutex .unlock ();
191
242
return NSAPI_ERROR_WOULD_BLOCK;
192
243
}
193
244
194
245
MDMParser::IP ip;
195
246
int port;
196
247
197
248
int recv = _mdm->socketRecvFrom (socket->socket , &ip, &port, (char *)data, size);
249
+ socket->mutex .unlock ();
250
+
198
251
if (recv == SOCKET_ERROR) {
199
252
return NSAPI_ERROR_DEVICE_ERROR;
200
253
}
@@ -209,4 +262,9 @@ int C027Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data
209
262
210
263
void C027Interface::socket_attach (void *handle, void (*callback)(void *), void *data)
211
264
{
265
+ struct c027_socket *socket = (struct c027_socket *)handle;
266
+ socket->mutex .lock ();
267
+ socket->callback = callback;
268
+ socket->data = data;
269
+ socket->mutex .unlock ();
212
270
}
0 commit comments