Added a socket_generator_send() function that allows data to be dynamically generated using an external function
diff --git a/contiki/uip/socket.c b/contiki/uip/socket.c
index cd6b257..6f217ab 100644
--- a/contiki/uip/socket.c
+++ b/contiki/uip/socket.c
@@ -55,7 +55,7 @@
s->state = SOCKET_STATE_NONE;
while(s->sendlen > 0) {
- PT_WAIT_UNTIL(&s->socketpt, data_sent(s) & send_data(s));
+ PT_WAIT_UNTIL(&s->socketpt, data_sent(s) & send_data(s));
}
s->state = SOCKET_STATE_NONE;
@@ -63,6 +63,31 @@
PT_END(&s->socketpt);
}
/*---------------------------------------------------------------------------*/
+PT_THREAD(socket_generator_send(register struct socket *s,
+ unsigned short (*generate)(void *), void *arg))
+{
+ PT_BEGIN(&s->socketpt);
+
+ if(generate == NULL) {
+ PT_EXIT(&s->socketpt);
+ }
+
+ s->state = SOCKET_STATE_NONE;
+ s->sendlen = generate(arg);
+ s->sendptr = uip_appdata;
+ do {
+
+ if(uip_rexmit()) {
+ generate(arg);
+ }
+ PT_WAIT_UNTIL(&s->socketpt, data_sent(s) & send_data(s));
+ } while(s->sendlen > 0);
+
+ s->state = SOCKET_STATE_NONE;
+
+ PT_END(&s->socketpt);
+}
+/*---------------------------------------------------------------------------*/
char
socket_newdata(struct socket *s)
{
@@ -105,9 +130,7 @@
if(uipbuf_len(&socket->buf) == 0) {
socket->state = SOCKET_STATE_NONE;
PT_RESTART(&socket->socketpt);
- }
-
-
+ }
PT_END(&socket->socketpt);
}
/*---------------------------------------------------------------------------*/
diff --git a/contiki/uip/socket.h b/contiki/uip/socket.h
index 42abde8..cfd5491 100644
--- a/contiki/uip/socket.h
+++ b/contiki/uip/socket.h
@@ -240,11 +240,15 @@
* \hideinitializer
*/
#define SOCKET_SEND(socket, data, datalen) \
- PT_WAIT_THREAD(&((socket)->pt), socket_send(socket, data, datalen));
+ PT_WAIT_THREAD(&((socket)->pt), socket_send(socket, data, datalen))
-/*
-#define SOCKET_SEND_DYNAMIC(socket, dataptr, function_call)
-*/
+PT_THREAD(socket_generator_send(struct socket *socket,
+ unsigned short (*f)(void *), void *arg));
+
+#define SOCKET_GENERATOR_SEND(socket, generator, arg) \
+ PT_WAIT_THREAD(&((socket)->pt), \
+ socket_generator_send(socket, generator, arg))
+
/*PT_THREAD(socket_closew(struct socket *socket));
#define SOCKET_CLOSEW(socket) \