diff --git a/apps/shell/Makefile.shell b/apps/shell/Makefile.shell index 12de7e050..4d0eb7064 100644 --- a/apps/shell/Makefile.shell +++ b/apps/shell/Makefile.shell @@ -3,7 +3,7 @@ shell_src = shell.c serial-shell.c shell-reboot.c \ shell-blink.c shell-text.c shell-time.c \ shell-file.c shell-netfile.c shell-run.c \ shell-rime-ping.c shell-rime-sniff.c shell-rime-netcmd.c \ - shell-coffee.c + shell-rime-debug.c shell-coffee.c #shell-rsh.c shell_dsc = shell-dsc.c diff --git a/apps/shell/shell-rime-debug.c b/apps/shell/shell-rime-debug.c new file mode 100644 index 000000000..494cf394b --- /dev/null +++ b/apps/shell/shell-rime-debug.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2008, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * $Id: shell-rime-debug.c,v 1.1 2008/07/04 08:23:00 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "contiki.h" +#include "contiki-conf.h" +#include "shell-rime-debug.h" + +#include "dev/leds.h" + +#include "lib/random.h" + +#include "net/rime.h" +#include "net/rime/neighbor.h" +#include "net/rime/route.h" +#include "net/rime/trickle.h" + +#include "net/rime/timesynch.h" + +#include +#ifndef HAVE_SNPRINTF +int snprintf(char *str, size_t size, const char *format, ...); +#endif /* HAVE_SNPRINTF */ +#include + + +#define COLLECT_MSG_HDRSIZE 2 +struct collect_msg { + uint16_t timestamp; + uint8_t data[1]; +}; + +static struct broadcast_conn broadcast; +static struct unicast_conn uc; +/*---------------------------------------------------------------------------*/ +PROCESS(shell_broadcast_process, "broadcast"); +SHELL_COMMAND(broadcast_command, + "broadcast", + "broadcast: broadcast data to all neighbors", + &shell_broadcast_process); +PROCESS(shell_unicast_process, "unicast"); +SHELL_COMMAND(unicast_command, + "unicast", + "unicast : unicast data to specific neighbor", + &shell_unicast_process); +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(shell_broadcast_process, ev, data) +{ + struct shell_input *input; + int len; + struct collect_msg *msg; + + PROCESS_BEGIN(); + + while(1) { + PROCESS_WAIT_EVENT_UNTIL(ev == shell_event_input); + input = data; + + len = input->len1 + input->len2; + + if(len == 0) { + PROCESS_EXIT(); + } + + if(len < RIMEBUF_SIZE) { + rimebuf_clear(); + rimebuf_set_datalen(len + COLLECT_MSG_HDRSIZE); + msg = rimebuf_dataptr(); + memcpy(msg->data, input->data1, input->len1); + memcpy(msg->data + input->len1, input->data2, input->len2); +#if TIMESYNCH_CONF_ENABLED + msg->timestamp = timesynch_time(); +#else + msg->timestamp = 0; +#endif + /* printf("Sending %d bytes\n", len);*/ + broadcast_send(&broadcast); + } + } + PROCESS_END(); +} +static void +recv_broadcast(struct broadcast_conn *c, rimeaddr_t *from) +{ + struct collect_msg *msg; + rtimer_clock_t latency; + + msg = rimebuf_dataptr(); + +#if TIMESYNCH_CONF_ENABLED + latency = timesynch_time() - msg->timestamp; +#else + latency = 0; +#endif + + printf("broadcast message received from %d.%d, latency %lu ms, data '%.*s'\n", + from->u8[0], from->u8[1], + (1000L * latency) / RTIMER_ARCH_SECOND, + rimebuf_datalen() - COLLECT_MSG_HDRSIZE, + msg->data); +} +static const struct broadcast_callbacks broadcast_callbacks = {recv_broadcast}; +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(shell_unicast_process, ev, data) +{ + struct shell_input *input; + static rimeaddr_t receiver; + int len; + const char *nextptr; + struct collect_msg *msg; + char buf[30]; + + PROCESS_BEGIN(); + + receiver.u8[0] = shell_strtolong(data, &nextptr); + if(nextptr == data || *nextptr != '.') { + shell_output_str(&unicast_command, + "unicast : recevier must be specified", ""); + PROCESS_EXIT(); + } + ++nextptr; + receiver.u8[1] = shell_strtolong(nextptr, &nextptr); + + snprintf(buf, sizeof(buf), "%d.%d", receiver.u8[0], receiver.u8[1]); + shell_output_str(&unicast_command, "Sending unicast packets to ", buf); + + while(1) { + PROCESS_WAIT_EVENT_UNTIL(ev == shell_event_input); + input = data; + + len = input->len1 + input->len2; + + if(len == 0) { + PROCESS_EXIT(); + } + + if(len < RIMEBUF_SIZE) { + rimebuf_clear(); + rimebuf_set_datalen(len + COLLECT_MSG_HDRSIZE); + msg = rimebuf_dataptr(); + memcpy(msg->data, input->data1, input->len1); + memcpy(msg->data + input->len1, input->data2, input->len2); +#if TIMESYNCH_CONF_ENABLED + msg->timestamp = timesynch_time(); +#else + msg->timestamp = 0; +#endif + /* printf("Sending %d bytes\n", len);*/ + unicast_send(&uc, &receiver); + } + } + PROCESS_END(); +} +static void +recv_uc(struct unicast_conn *c, rimeaddr_t *from) +{ + struct collect_msg *msg; + rtimer_clock_t latency; + + msg = rimebuf_dataptr(); + +#if TIMESYNCH_CONF_ENABLED + latency = timesynch_time() - msg->timestamp; +#else + latency = 0; +#endif + + printf("unicast message received from %d.%d, latency %lu ms, data '%.*s'\n", + from->u8[0], from->u8[1], + (1000L * latency) / RTIMER_ARCH_SECOND, + rimebuf_datalen() - COLLECT_MSG_HDRSIZE, + msg->data); +} +static const struct unicast_callbacks unicast_callbacks = {recv_uc}; +/*---------------------------------------------------------------------------*/ +void +shell_rime_debug_init(void) +{ + unicast_open(&uc, 14, &unicast_callbacks); + broadcast_open(&broadcast, 15, &broadcast_callbacks); + shell_register_command(&broadcast_command); + shell_register_command(&unicast_command); +} +/*---------------------------------------------------------------------------*/ diff --git a/apps/shell/shell-rime-debug.h b/apps/shell/shell-rime-debug.h new file mode 100644 index 000000000..1ad0855de --- /dev/null +++ b/apps/shell/shell-rime-debug.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2008, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * $Id: shell-rime-debug.h,v 1.1 2008/07/04 08:23:00 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __SHELL_RIME_DEBUG_H__ +#define __SHELL_RIME_DEBUG_H__ + +#include "shell.h" + +void shell_rime_debug_init(void); + +#endif /* __SHELL_RIME_DEBUG_H__ */ diff --git a/apps/shell/shell-rime.c b/apps/shell/shell-rime.c index 2066a9d2f..5773d007c 100644 --- a/apps/shell/shell-rime.c +++ b/apps/shell/shell-rime.c @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: shell-rime.c,v 1.5 2008/07/03 09:52:15 adamdunkels Exp $ + * $Id: shell-rime.c,v 1.6 2008/07/04 08:23:00 adamdunkels Exp $ */ /** @@ -53,8 +53,6 @@ #include "net/rime/timesynch.h" -#define WITH_DEBUG_COMMANDS 0 - #if NETSIM #include "ether.h" #endif /* NETSIM */ @@ -82,11 +80,6 @@ struct collect_msg { uint8_t data[1]; }; -#if WITH_DEBUG_COMMANDS -static struct abc_conn abc; -static struct uc_conn uc; -#endif /* WITH_DEBUG_COMMANDS */ - static struct collect_conn collect; static struct trickle_conn trickle; static struct ctimer ctimer; @@ -173,19 +166,6 @@ PROCESS_THREAD(shell_mac_process, ev, data) PROCESS_END(); } /*---------------------------------------------------------------------------*/ -#if WITH_DEBUG_COMMANDS -PROCESS(shell_broadcast_process, "broadcast"); -SHELL_COMMAND(broadcast_command, - "broadcast", - "broadcast: broadcast data to all neighbors", - &shell_broadcast_process); -PROCESS(shell_unicast_process, "unicast"); -SHELL_COMMAND(unicast_command, - "unicast", - "unicast : unicast data to specific neighbor", - &shell_unicast_process); -#endif /* WITH_DEBUG_COMMANDS */ -/*---------------------------------------------------------------------------*/ PROCESS_THREAD(shell_packetize_process, ev, data) { static struct queuebuf *q = NULL; @@ -403,107 +383,6 @@ PROCESS_THREAD(shell_send_process, ev, data) PROCESS_END(); } /*---------------------------------------------------------------------------*/ -#if WITH_DEBUG_COMMANDS -PROCESS_THREAD(shell_broadcast_process, ev, data) -{ - struct shell_input *input; - int len; - struct collect_msg *msg; - - PROCESS_BEGIN(); - - while(1) { - PROCESS_WAIT_EVENT_UNTIL(ev == shell_event_input); - input = data; - - len = input->len1 + input->len2; - - if(len == 0) { - PROCESS_EXIT(); - } - - if(len < RIMEBUF_SIZE) { - rimebuf_clear(); - rimebuf_set_datalen(len + COLLECT_MSG_HDRSIZE); - msg = rimebuf_dataptr(); - memcpy(msg->data, input->data1, input->len1); - memcpy(msg->data + input->len1, input->data2, input->len2); -#if TIMESYNCH_CONF_ENABLED - msg->timestamp = timesynch_time(); -#else - msg->timestamp = 0; -#endif - /* printf("Sending %d bytes\n", len);*/ - abc_send(&abc); - } - } - PROCESS_END(); -} -static void -recv_abc(struct abc_conn *c) -{ - printf("abc message received\n"); -} -static const struct abc_callbacks abc_callbacks = {recv_abc}; -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(shell_unicast_process, ev, data) -{ - struct shell_input *input; - static rimeaddr_t receiver; - int len; - const char *nextptr; - struct collect_msg *msg; - char buf[30]; - - PROCESS_BEGIN(); - - receiver.u8[0] = shell_strtolong(data, &nextptr); - if(nextptr == data || *nextptr != '.') { - shell_output_str(&unicast_command, - "unicast : recevier must be specified", ""); - PROCESS_EXIT(); - } - ++nextptr; - receiver.u8[1] = shell_strtolong(nextptr, &nextptr); - - snprintf(buf, sizeof(buf), "%d.%d", receiver.u8[0], receiver.u8[1]); - shell_output_str(&unicast_command, "Sending unicast packets to ", buf); - - while(1) { - PROCESS_WAIT_EVENT_UNTIL(ev == shell_event_input); - input = data; - - len = input->len1 + input->len2; - - if(len == 0) { - PROCESS_EXIT(); - } - - if(len < RIMEBUF_SIZE) { - rimebuf_clear(); - rimebuf_set_datalen(len + COLLECT_MSG_HDRSIZE); - msg = rimebuf_dataptr(); - memcpy(msg->data, input->data1, input->len1); - memcpy(msg->data + input->len1, input->data2, input->len2); -#if TIMESYNCH_CONF_ENABLED - msg->timestamp = timesynch_time(); -#else - msg->timestamp = 0; -#endif - /* printf("Sending %d bytes\n", len);*/ - uc_send(&uc, &receiver); - } - } - PROCESS_END(); -} -static void -recv_uc(struct uc_conn *c, rimeaddr_t *from) -{ - printf("uc message received from %d.%d\n", from->u8[0], from->u8[1]); -} -static const struct uc_callbacks uc_callbacks = {recv_uc}; -#endif /* WITH_DEBUG_COMMANDS */ -/*---------------------------------------------------------------------------*/ static void recv_collect(const rimeaddr_t *originator, u8_t seqno, u8_t hops) { @@ -594,11 +473,5 @@ shell_rime_init(void) shell_register_command(&treedepth_command); #endif /* WITH_TREEDEPTH */ -#if WITH_DEBUG_COMMANDS - uc_open(&uc, 14, &uc_callbacks); - abc_open(&abc, 15, &abc_callbacks); - shell_register_command(&broadcast_command); - shell_register_command(&unicast_command); -#endif /* WITH_DEBUG_COMMANDS */ } /*---------------------------------------------------------------------------*/ diff --git a/apps/shell/shell.h b/apps/shell/shell.h index 5acb4f000..6b3149474 100644 --- a/apps/shell/shell.h +++ b/apps/shell/shell.h @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: shell.h,v 1.7 2008/07/03 17:57:26 adamdunkels Exp $ + * $Id: shell.h,v 1.8 2008/07/04 08:23:00 adamdunkels Exp $ */ /** @@ -99,6 +99,8 @@ struct shell_input { int len1, len2; }; +#include "serial-shell.h" + #include "shell-blink.h" #include "shell-coffee.h" #include "shell-exec.h" @@ -106,6 +108,7 @@ struct shell_input { #include "shell-netfile.h" #include "shell-ps.h" #include "shell-reboot.h" +#include "shell-rime-debug.h" #include "shell-rime-netcmd.h" #include "shell-rime-ping.h" #include "shell-rime-sniff.h"