Daniele Lacamera / PicoTCP Featured

Dependents:   lpc1768-picotcp-demo ZeroMQ_PicoTCP_Publisher_demo TCPSocket_HelloWorld_PicoTCP Pico_TCP_UDP_Test ... more

PicoTCP. Copyright (c) 2013 TASS Belgium NV.

Released under the GNU General Public License, version 2.

Different licensing models may exist, at the sole discretion of the Copyright holders.

Official homepage: http://www.picotcp.com

Bug tracker: https://github.com/tass-belgium/picotcp/issues

Development steps:

  • initial integration with mbed RTOS
  • generic mbed Ethernet driver
  • high performance NXP LPC1768 specific Ethernet driver
  • Multi-threading support for mbed RTOS
  • Berkeley sockets and integration with the New Socket API
  • Fork of the apps running on top of the New Socket API
  • Scheduling optimizations
  • Debugging/benchmarking/testing

Demo application (measuring TCP sender performance):

Import programlpc1768-picotcp-demo

A PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.

Committer:
daniele
Date:
Sun Jun 16 20:19:44 2013 +0000
Revision:
29:1a47b7151851
Child:
32:865c101e0874
Updated from masterbranch;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 29:1a47b7151851 1 /*********************************************************************
daniele 29:1a47b7151851 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 29:1a47b7151851 3 See LICENSE and COPYING for usage.
daniele 29:1a47b7151851 4
daniele 29:1a47b7151851 5 Authors: Daniele Lacamera
daniele 29:1a47b7151851 6 *********************************************************************/
daniele 29:1a47b7151851 7
daniele 29:1a47b7151851 8 #include "wrapper.h"
daniele 29:1a47b7151851 9 #include "rtos.h"
daniele 29:1a47b7151851 10 #include "cmsis_os.h"
daniele 29:1a47b7151851 11 #include "mbed.h"
daniele 29:1a47b7151851 12 #include "Socket.h"
daniele 29:1a47b7151851 13 #include "Mutex.h"
daniele 29:1a47b7151851 14
daniele 29:1a47b7151851 15 //#define ptsock_dbg printf
daniele 29:1a47b7151851 16 #define ptsock_dbg(...)
daniele 29:1a47b7151851 17
daniele 29:1a47b7151851 18 int in_the_stack = 0;
daniele 29:1a47b7151851 19 Mutex *PicoTcpLock;
daniele 29:1a47b7151851 20 Queue<void,16> *PicoTcpEvents;
daniele 29:1a47b7151851 21
daniele 29:1a47b7151851 22 static struct stack_endpoint *ep_accepting;
daniele 29:1a47b7151851 23 static Thread * serverThread = NULL;
daniele 29:1a47b7151851 24
daniele 29:1a47b7151851 25 #define pt_proxy_dbg(...)
daniele 29:1a47b7151851 26
daniele 29:1a47b7151851 27 /* Testing ng blocking mechanism */
daniele 29:1a47b7151851 28
daniele 29:1a47b7151851 29 /*
daniele 29:1a47b7151851 30 * backend of select function, used in blocking (like picotcp_read()...)
daniele 29:1a47b7151851 31 * calls. Sleeps on the message queue
daniele 29:1a47b7151851 32 *
daniele 29:1a47b7151851 33 *
daniele 29:1a47b7151851 34 * WARNING: PicoTcpLock (big stack lock) must be acquired before entering this.
daniele 29:1a47b7151851 35 */
daniele 29:1a47b7151851 36
daniele 29:1a47b7151851 37 static inline int __critical_select(struct stack_endpoint *ep, uint32_t time)
daniele 29:1a47b7151851 38 {
daniele 29:1a47b7151851 39 int retval = 0;
daniele 29:1a47b7151851 40 uint16_t ev = ep->revents;
daniele 29:1a47b7151851 41 uint32_t in_time = PICO_TIME_MS();
daniele 29:1a47b7151851 42
daniele 29:1a47b7151851 43 PicoTcpLock->unlock();
daniele 29:1a47b7151851 44 while ((ep->events & ep->revents) == 0) {
daniele 29:1a47b7151851 45 ep->queue->get(time);
daniele 29:1a47b7151851 46 if ((time != osWaitForever) && (PICO_TIME_MS() > in_time + time)) {
daniele 29:1a47b7151851 47 printf("TIMEOUT in critical select... (ev:%04x rev:%04x \n", ep->events, ep->revents);
daniele 29:1a47b7151851 48 PicoTcpLock->lock();
daniele 29:1a47b7151851 49 return 0;
daniele 29:1a47b7151851 50 }
daniele 29:1a47b7151851 51 }
daniele 29:1a47b7151851 52 PicoTcpLock->lock();
daniele 29:1a47b7151851 53 return 1;
daniele 29:1a47b7151851 54 }
daniele 29:1a47b7151851 55
daniele 29:1a47b7151851 56 static void wakeup(uint16_t ev, struct pico_socket *s)
daniele 29:1a47b7151851 57 {
daniele 29:1a47b7151851 58 struct stack_endpoint *ep = (struct stack_endpoint *)s->priv;
daniele 29:1a47b7151851 59 if (!ep) {
daniele 29:1a47b7151851 60 if (ep_accepting != NULL) {
daniele 29:1a47b7151851 61 printf("Delivering %02x to accepting socket...\n", ev);
daniele 29:1a47b7151851 62 ep = ep_accepting;
daniele 29:1a47b7151851 63 } else {
daniele 29:1a47b7151851 64 printf("WAKEUP: socket not found! ev=%04x\n", ev);
daniele 29:1a47b7151851 65 return;
daniele 29:1a47b7151851 66 }
daniele 29:1a47b7151851 67 }
daniele 29:1a47b7151851 68 //if (((ep->revents & PICO_SOCK_EV_RD) == 0) && (ev & PICO_SOCK_EV_RD))
daniele 29:1a47b7151851 69 // printf("Activating RD\n");
daniele 29:1a47b7151851 70 ep->revents |= ev;
daniele 29:1a47b7151851 71
daniele 29:1a47b7151851 72 if ((ev & PICO_SOCK_EV_CLOSE) || (ev & PICO_SOCK_EV_FIN)) {
daniele 29:1a47b7151851 73 ep->connected = 0;
daniele 29:1a47b7151851 74 }
daniele 29:1a47b7151851 75 if ((ev & PICO_SOCK_EV_CONN) || (ev & PICO_SOCK_EV_RD)) {
daniele 29:1a47b7151851 76 ep->connected = 1;
daniele 29:1a47b7151851 77 }
daniele 29:1a47b7151851 78 ep->queue->put((void *)0);
daniele 29:1a47b7151851 79 }
daniele 29:1a47b7151851 80
daniele 29:1a47b7151851 81
daniele 29:1a47b7151851 82 struct stack_endpoint *picotcp_socket(uint16_t net, uint16_t proto, uint16_t timeout)
daniele 29:1a47b7151851 83 {
daniele 29:1a47b7151851 84 struct stack_endpoint *ep = (struct stack_endpoint *)pico_zalloc(sizeof(struct stack_endpoint));
daniele 29:1a47b7151851 85 uint16_t p_net = ((net == AF_INET6)?PICO_PROTO_IPV6:PICO_PROTO_IPV4);
daniele 29:1a47b7151851 86 uint16_t p_proto = ((proto == SOCK_DGRAM)?PICO_PROTO_UDP:PICO_PROTO_TCP);
daniele 29:1a47b7151851 87 PicoTcpLock->lock();
daniele 29:1a47b7151851 88 ep->s = pico_socket_open( p_net, p_proto, &wakeup );
daniele 29:1a47b7151851 89 if (ep->s == NULL) {
daniele 29:1a47b7151851 90 delete(ep->queue);
daniele 29:1a47b7151851 91 pico_free(ep);
daniele 29:1a47b7151851 92 ep = NULL;
daniele 29:1a47b7151851 93 printf("Error opening socket!\n");
daniele 29:1a47b7151851 94 } else {
daniele 29:1a47b7151851 95 ep->s->priv = ep;
daniele 29:1a47b7151851 96 printf("Added socket (open)\n");
daniele 29:1a47b7151851 97 ep->queue = new Queue<void,1>();
daniele 29:1a47b7151851 98 }
daniele 29:1a47b7151851 99 PicoTcpLock->unlock();
daniele 29:1a47b7151851 100 return ep;
daniele 29:1a47b7151851 101 }
daniele 29:1a47b7151851 102
daniele 29:1a47b7151851 103
daniele 29:1a47b7151851 104 int picotcp_state(struct stack_endpoint *ep)
daniele 29:1a47b7151851 105 {
daniele 29:1a47b7151851 106 /* TODO: return one of:
daniele 29:1a47b7151851 107 SOCK_OPEN,
daniele 29:1a47b7151851 108 SOCK_BOUND,
daniele 29:1a47b7151851 109 SOCK_LISTEN,
daniele 29:1a47b7151851 110 SOCK_CONNECTED,
daniele 29:1a47b7151851 111 SOCK_CLOSED
daniele 29:1a47b7151851 112 */
daniele 29:1a47b7151851 113 return ep->state;
daniele 29:1a47b7151851 114 }
daniele 29:1a47b7151851 115
daniele 29:1a47b7151851 116 int picotcp_bind(struct stack_endpoint *ep, struct sockaddr *_local_addr, socklen_t len)
daniele 29:1a47b7151851 117 {
daniele 29:1a47b7151851 118 int ret;
daniele 29:1a47b7151851 119 struct sockaddr_in *local_addr;
daniele 29:1a47b7151851 120 local_addr = (struct sockaddr_in *)_local_addr;
daniele 29:1a47b7151851 121
daniele 29:1a47b7151851 122 PicoTcpLock->lock();
daniele 29:1a47b7151851 123 ret = pico_socket_bind(ep->s, (struct pico_ip4 *)(&local_addr->sin_addr.s_addr), &local_addr->sin_port);
daniele 29:1a47b7151851 124 PicoTcpLock->unlock();
daniele 29:1a47b7151851 125 return ret;
daniele 29:1a47b7151851 126 }
daniele 29:1a47b7151851 127
daniele 29:1a47b7151851 128 int picotcp_listen(struct stack_endpoint *ep, int queue)
daniele 29:1a47b7151851 129 {
daniele 29:1a47b7151851 130 int ret;
daniele 29:1a47b7151851 131 PicoTcpLock->lock();
daniele 29:1a47b7151851 132 ret = pico_socket_listen(ep->s, queue);
daniele 29:1a47b7151851 133 ep_accepting = (struct stack_endpoint *) pico_zalloc(sizeof(struct stack_endpoint));
daniele 29:1a47b7151851 134 ep_accepting->queue = new Queue<void,1>();
daniele 29:1a47b7151851 135 if (!ep_accepting)
daniele 29:1a47b7151851 136 ret = -1;
daniele 29:1a47b7151851 137 PicoTcpLock->unlock();
daniele 29:1a47b7151851 138 return ret;
daniele 29:1a47b7151851 139 }
daniele 29:1a47b7151851 140
daniele 29:1a47b7151851 141 int picotcp_connect(struct stack_endpoint *ep, struct sockaddr *_srv_addr, socklen_t len)
daniele 29:1a47b7151851 142 {
daniele 29:1a47b7151851 143 int retval;
daniele 29:1a47b7151851 144 struct sockaddr_in *srv_addr;
daniele 29:1a47b7151851 145 srv_addr = (struct sockaddr_in *)_srv_addr;
daniele 29:1a47b7151851 146 PicoTcpLock->lock();
daniele 29:1a47b7151851 147 pico_socket_connect(ep->s, (struct pico_ip4 *)(&srv_addr->sin_addr.s_addr), srv_addr->sin_port);
daniele 29:1a47b7151851 148 ep->events = PICO_SOCK_EV_CONN | PICO_SOCK_EV_ERR;
daniele 29:1a47b7151851 149 __critical_select(ep, osWaitForever);
daniele 29:1a47b7151851 150 if ((ep->revents & PICO_SOCK_EV_CONN) && ep->connected) {
daniele 29:1a47b7151851 151 ep->revents &= (~PICO_SOCK_EV_CONN);
daniele 29:1a47b7151851 152 ep->revents |= PICO_SOCK_EV_WR;
daniele 29:1a47b7151851 153 ptsock_dbg("Established. sock state: %x\n", ep->s->state);
daniele 29:1a47b7151851 154 retval = 0;
daniele 29:1a47b7151851 155 } else {
daniele 29:1a47b7151851 156 retval = -1;
daniele 29:1a47b7151851 157 }
daniele 29:1a47b7151851 158 PicoTcpLock->unlock();
daniele 29:1a47b7151851 159 return retval;
daniele 29:1a47b7151851 160 }
daniele 29:1a47b7151851 161
daniele 29:1a47b7151851 162 struct stack_endpoint *picotcp_accept(struct stack_endpoint *ep, struct sockaddr *_cli_addr, socklen_t *len)
daniele 29:1a47b7151851 163 {
daniele 29:1a47b7151851 164 int retval;
daniele 29:1a47b7151851 165 struct stack_endpoint *aep = ep_accepting;
daniele 29:1a47b7151851 166 struct sockaddr_in *cli_addr = (struct sockaddr_in *)_cli_addr;
daniele 29:1a47b7151851 167 ep_accepting = (struct stack_endpoint *) pico_zalloc(sizeof(struct stack_endpoint));
daniele 29:1a47b7151851 168 if (ep_accepting)
daniele 29:1a47b7151851 169 ep_accepting->queue = new Queue<void,1>();
daniele 29:1a47b7151851 170
daniele 29:1a47b7151851 171
daniele 29:1a47b7151851 172 if (!aep)
daniele 29:1a47b7151851 173 return aep;
daniele 29:1a47b7151851 174
daniele 29:1a47b7151851 175 PicoTcpLock->lock();
daniele 29:1a47b7151851 176 ep->events = PICO_SOCK_EV_CONN | PICO_SOCK_EV_ERR;
daniele 29:1a47b7151851 177 __critical_select(ep, osWaitForever);
daniele 29:1a47b7151851 178 if (ep->revents & PICO_SOCK_EV_CONN) {
daniele 29:1a47b7151851 179 printf("Calling Accept\n");
daniele 29:1a47b7151851 180 aep->s = pico_socket_accept(ep->s, (struct pico_ip4 *)(&cli_addr->sin_addr.s_addr), &cli_addr->sin_port);
daniele 29:1a47b7151851 181 printf("Accept returned\n");
daniele 29:1a47b7151851 182 aep->s->priv = aep;
daniele 29:1a47b7151851 183 ep->revents &= (~PICO_SOCK_EV_CONN);
daniele 29:1a47b7151851 184 aep->revents |= PICO_SOCK_EV_WR;
daniele 29:1a47b7151851 185 printf("Added socket (accept)\n");
daniele 29:1a47b7151851 186
daniele 29:1a47b7151851 187 *len = sizeof(struct sockaddr_in);
daniele 29:1a47b7151851 188 ptsock_dbg("Established. sock state: %x\n", aep->s->state);
daniele 29:1a47b7151851 189 } else {
daniele 29:1a47b7151851 190 pico_free(aep);
daniele 29:1a47b7151851 191 aep = NULL;
daniele 29:1a47b7151851 192 }
daniele 29:1a47b7151851 193 PicoTcpLock->unlock();
daniele 29:1a47b7151851 194 return aep;
daniele 29:1a47b7151851 195 }
daniele 29:1a47b7151851 196
daniele 29:1a47b7151851 197 int picotcp_select(struct stack_endpoint *ep, struct timeval *timeout, int read, int write)
daniele 29:1a47b7151851 198 {
daniele 29:1a47b7151851 199 int ret;
daniele 29:1a47b7151851 200 ep->timeout |= timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
daniele 29:1a47b7151851 201 ep->events = PICO_SOCK_EV_ERR;
daniele 29:1a47b7151851 202 ep->events |= PICO_SOCK_EV_FIN;
daniele 29:1a47b7151851 203 ep->events |= PICO_SOCK_EV_CLOSE;
daniele 29:1a47b7151851 204 ep->events |= PICO_SOCK_EV_CONN;
daniele 29:1a47b7151851 205 if (read) {
daniele 29:1a47b7151851 206 ep->events |= PICO_SOCK_EV_RD;
daniele 29:1a47b7151851 207 }
daniele 29:1a47b7151851 208 if (write)
daniele 29:1a47b7151851 209 ep->events |= PICO_SOCK_EV_WR;
daniele 29:1a47b7151851 210 ret = __critical_select(ep, ep->timeout);
daniele 29:1a47b7151851 211 return ret;
daniele 29:1a47b7151851 212 }
daniele 29:1a47b7151851 213
daniele 29:1a47b7151851 214 int picotcp_send(struct stack_endpoint *ep,void * buff, int len, int flags)
daniele 29:1a47b7151851 215 {
daniele 29:1a47b7151851 216 /* TODO */
daniele 29:1a47b7151851 217 return -1;
daniele 29:1a47b7151851 218 }
daniele 29:1a47b7151851 219
daniele 29:1a47b7151851 220 int picotcp_recv(struct stack_endpoint *ep,void * buff, int len, int flags)
daniele 29:1a47b7151851 221 {
daniele 29:1a47b7151851 222 /* TODO */
daniele 29:1a47b7151851 223 return -1;
daniele 29:1a47b7151851 224 }
daniele 29:1a47b7151851 225
daniele 29:1a47b7151851 226 int picotcp_sendto(struct stack_endpoint *ep,void * buff, int len, struct sockaddr *a, socklen_t l)
daniele 29:1a47b7151851 227 {
daniele 29:1a47b7151851 228 /* TODO */
daniele 29:1a47b7151851 229 return -1;
daniele 29:1a47b7151851 230 }
daniele 29:1a47b7151851 231
daniele 29:1a47b7151851 232 int picotcp_recvfrom(struct stack_endpoint *ep,void * buff, int len, struct sockaddr *a, socklen_t *l)
daniele 29:1a47b7151851 233 {
daniele 29:1a47b7151851 234 /* TODO */
daniele 29:1a47b7151851 235 return -1;
daniele 29:1a47b7151851 236 }
daniele 29:1a47b7151851 237
daniele 29:1a47b7151851 238 int picotcp_read(struct stack_endpoint *ep,void *buf, int len)
daniele 29:1a47b7151851 239 {
daniele 29:1a47b7151851 240 int retval = 0;
daniele 29:1a47b7151851 241 int tot_len = 0;
daniele 29:1a47b7151851 242 if (!buf || (len <= 0))
daniele 29:1a47b7151851 243 return 0;
daniele 29:1a47b7151851 244 PicoTcpLock->lock();
daniele 29:1a47b7151851 245 while (tot_len < len) {
daniele 29:1a47b7151851 246 retval = pico_socket_read(ep->s, ((uint8_t *)buf) + tot_len , len - tot_len);
daniele 29:1a47b7151851 247 if (retval == 0) {
daniele 29:1a47b7151851 248 if (tot_len < len)
daniele 29:1a47b7151851 249 ep->revents &= ~PICO_SOCK_EV_RD;
daniele 29:1a47b7151851 250 break;
daniele 29:1a47b7151851 251 }
daniele 29:1a47b7151851 252 if (retval < 0) {
daniele 29:1a47b7151851 253 tot_len = -1;
daniele 29:1a47b7151851 254 break;
daniele 29:1a47b7151851 255 }
daniele 29:1a47b7151851 256 tot_len += retval;
daniele 29:1a47b7151851 257 }
daniele 29:1a47b7151851 258 PicoTcpLock->unlock();
daniele 29:1a47b7151851 259 picotcp_async_interrupt(NULL);
daniele 29:1a47b7151851 260 return tot_len;
daniele 29:1a47b7151851 261 }
daniele 29:1a47b7151851 262
daniele 29:1a47b7151851 263 int picotcp_write(struct stack_endpoint *ep,void *buf, int len)
daniele 29:1a47b7151851 264 {
daniele 29:1a47b7151851 265 int retval = 0;
daniele 29:1a47b7151851 266 int tot_len = 0;
daniele 29:1a47b7151851 267 if (!buf || (len <= 0))
daniele 29:1a47b7151851 268 return 0;
daniele 29:1a47b7151851 269 PicoTcpLock->lock();
daniele 29:1a47b7151851 270 while (tot_len < len) {
daniele 29:1a47b7151851 271 retval = pico_socket_write(ep->s, ((uint8_t *)buf) + tot_len , len - tot_len);
daniele 29:1a47b7151851 272 retval = pico_socket_read(ep->s, ((uint8_t *)buf) + tot_len , len - tot_len);
daniele 29:1a47b7151851 273 if (retval == 0) {
daniele 29:1a47b7151851 274 if (tot_len < len)
daniele 29:1a47b7151851 275 ep->revents &= ~PICO_SOCK_EV_RD;
daniele 29:1a47b7151851 276 break;
daniele 29:1a47b7151851 277 }
daniele 29:1a47b7151851 278 if (retval < 0) {
daniele 29:1a47b7151851 279 tot_len = -1;
daniele 29:1a47b7151851 280 break;
daniele 29:1a47b7151851 281 }
daniele 29:1a47b7151851 282 tot_len += retval;
daniele 29:1a47b7151851 283
daniele 29:1a47b7151851 284 }
daniele 29:1a47b7151851 285 PicoTcpLock->unlock();
daniele 29:1a47b7151851 286 picotcp_async_interrupt(NULL);
daniele 29:1a47b7151851 287 return tot_len;
daniele 29:1a47b7151851 288 }
daniele 29:1a47b7151851 289
daniele 29:1a47b7151851 290
daniele 29:1a47b7151851 291 int picotcp_setsockopt(struct stack_endpoint *ep, int option, void *value)
daniele 29:1a47b7151851 292 {
daniele 29:1a47b7151851 293 /* TODO */
daniele 29:1a47b7151851 294 return -1;
daniele 29:1a47b7151851 295 }
daniele 29:1a47b7151851 296
daniele 29:1a47b7151851 297 int picotcp_getsockopt(struct stack_endpoint *ep, int option, void *value)
daniele 29:1a47b7151851 298 {
daniele 29:1a47b7151851 299 /* TODO */
daniele 29:1a47b7151851 300 return -1;
daniele 29:1a47b7151851 301 }
daniele 29:1a47b7151851 302
daniele 29:1a47b7151851 303 int picotcp_close(struct stack_endpoint *ep)
daniele 29:1a47b7151851 304 {
daniele 29:1a47b7151851 305 PicoTcpLock->lock();
daniele 29:1a47b7151851 306 pico_socket_close(ep->s);
daniele 29:1a47b7151851 307 ep->s->priv = NULL;
daniele 29:1a47b7151851 308 printf("Socket closed!\n");
daniele 29:1a47b7151851 309 delete(ep->queue);
daniele 29:1a47b7151851 310 pico_free(ep);
daniele 29:1a47b7151851 311 PicoTcpLock->unlock();
daniele 29:1a47b7151851 312 }
daniele 29:1a47b7151851 313
daniele 29:1a47b7151851 314 int picotcp_join_multicast(struct stack_endpoint *ep,const char* address,const char* local)
daniele 29:1a47b7151851 315 {
daniele 29:1a47b7151851 316 /* TODO */
daniele 29:1a47b7151851 317 return -1;
daniele 29:1a47b7151851 318 }
daniele 29:1a47b7151851 319
daniele 29:1a47b7151851 320
daniele 29:1a47b7151851 321
daniele 29:1a47b7151851 322 void pico_wrapper_loop(const void * arg)
daniele 29:1a47b7151851 323 {
daniele 29:1a47b7151851 324 (void)arg;
daniele 29:1a47b7151851 325 int ret = 0;
daniele 29:1a47b7151851 326 struct pico_device *dev;
daniele 29:1a47b7151851 327 while(1) {
daniele 29:1a47b7151851 328
daniele 29:1a47b7151851 329 osEvent evt = PicoTcpEvents->get(5);
daniele 29:1a47b7151851 330
daniele 29:1a47b7151851 331 if (evt.status == osEventMessage) {
daniele 29:1a47b7151851 332 dev = (struct pico_device *)evt.value.p;
daniele 29:1a47b7151851 333 } else {
daniele 29:1a47b7151851 334 dev = NULL;
daniele 29:1a47b7151851 335 }
daniele 29:1a47b7151851 336 PicoTcpLock->lock();
daniele 29:1a47b7151851 337 if (dev && dev->dsr)
daniele 29:1a47b7151851 338 dev->dsr(dev, 5);
daniele 29:1a47b7151851 339 pico_stack_tick();
daniele 29:1a47b7151851 340 pico_stack_tick();
daniele 29:1a47b7151851 341 PicoTcpLock->unlock();
daniele 29:1a47b7151851 342 }
daniele 29:1a47b7151851 343 }
daniele 29:1a47b7151851 344
daniele 29:1a47b7151851 345 void picotcp_start(void)
daniele 29:1a47b7151851 346 {
daniele 29:1a47b7151851 347 if (serverThread == NULL) {
daniele 29:1a47b7151851 348 PicoTcpLock = new Mutex();
daniele 29:1a47b7151851 349 PicoTcpEvents = new Queue<void,16>();
daniele 29:1a47b7151851 350 printf (" *** PicoTCP initialized *** \n");
daniele 29:1a47b7151851 351 serverThread = new Thread(pico_wrapper_loop);
daniele 29:1a47b7151851 352 serverThread->set_priority(osPriorityIdle);
daniele 29:1a47b7151851 353 }
daniele 29:1a47b7151851 354 }
daniele 29:1a47b7151851 355
daniele 29:1a47b7151851 356 void picotcp_init(void)
daniele 29:1a47b7151851 357 {
daniele 29:1a47b7151851 358 picotcp_start();
daniele 29:1a47b7151851 359 }
daniele 29:1a47b7151851 360
daniele 29:1a47b7151851 361 int picotcp_async_interrupt(void *arg)
daniele 29:1a47b7151851 362 {
daniele 29:1a47b7151851 363 PicoTcpEvents->put(arg);
daniele 29:1a47b7151851 364 }