From 9eb0c5466fab588ada4f49c573d87c69d87b9953 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Fri, 21 Nov 2014 09:44:25 +0100 Subject: [PATCH] initial uplaod --- examples/osd/slip-radio/project-conf.h | 81 ++++++ examples/osd/slip-radio/slip-net.c | 103 ++++++++ examples/osd/slip-radio/slip-radio-cc2420.c | 60 +++++ examples/osd/slip-radio/slip-radio-mc1322x.c | 61 +++++ examples/osd/slip-radio/slip-radio-rf230.c | 72 ++++++ .../osd/slip-radio/slip-radio-sky-sensors.c | 90 +++++++ examples/osd/slip-radio/slip-radio.c | 239 ++++++++++++++++++ examples/osd/slip-radio/slip-radio.h | 41 +++ 8 files changed, 747 insertions(+) create mode 100644 examples/osd/slip-radio/project-conf.h create mode 100644 examples/osd/slip-radio/slip-net.c create mode 100644 examples/osd/slip-radio/slip-radio-cc2420.c create mode 100644 examples/osd/slip-radio/slip-radio-mc1322x.c create mode 100644 examples/osd/slip-radio/slip-radio-rf230.c create mode 100644 examples/osd/slip-radio/slip-radio-sky-sensors.c create mode 100644 examples/osd/slip-radio/slip-radio.c create mode 100644 examples/osd/slip-radio/slip-radio.h diff --git a/examples/osd/slip-radio/project-conf.h b/examples/osd/slip-radio/project-conf.h new file mode 100644 index 000000000..4a2950c59 --- /dev/null +++ b/examples/osd/slip-radio/project-conf.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2010, 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. + */ + +#ifndef PROJECT_CONF_H_ +#define PROJECT_CONF_H_ + +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 140 + +#undef UIP_CONF_ROUTER +#define UIP_CONF_ROUTER 0 + +#undef UIP_CONF_IPV6_RPL +#define UIP_CONF_IPV6_RPL 0 + +#define CMD_CONF_OUTPUT slip_radio_cmd_output + +/* add the cmd_handler_cc2420 + some sensors if TARGET_SKY */ +#ifdef CONTIKI_TARGET_SKY +#define CMD_CONF_HANDLERS slip_radio_cmd_handler,cmd_handler_cc2420 +#define SLIP_RADIO_CONF_SENSORS slip_radio_sky_sensors +/* add the cmd_handler_rf230 if TARGET_NOOLIBERRY. Other RF230 platforms can be added */ +#elif CONTIKI_TARGET_NOOLIBERRY +#define CMD_CONF_HANDLERS slip_radio_cmd_handler,cmd_handler_rf230 +#elif CONTIKI_TARGET_ECONOTAG +#define CMD_CONF_HANDLERS slip_radio_cmd_handler,cmd_handler_mc1322x +#else +#define CMD_CONF_HANDLERS slip_radio_cmd_handler +#endif + + +/* configuration for the slipradio/network driver */ +#undef NETSTACK_CONF_MAC +#define NETSTACK_CONF_MAC nullmac_driver + +#undef NETSTACK_CONF_RDC +/* #define NETSTACK_CONF_RDC nullrdc_noframer_driver */ +#define NETSTACK_CONF_RDC contikimac_driver + +#undef NETSTACK_CONF_NETWORK +#define NETSTACK_CONF_NETWORK slipnet_driver + +#undef NETSTACK_CONF_FRAMER +#define NETSTACK_CONF_FRAMER no_framer + +#undef CC2420_CONF_AUTOACK +#define CC2420_CONF_AUTOACK 1 + +#undef UART1_CONF_RX_WITH_DMA +#define UART1_CONF_RX_WITH_DMA 1 + +#endif /* PROJECT_CONF_H_ */ diff --git a/examples/osd/slip-radio/slip-net.c b/examples/osd/slip-radio/slip-net.c new file mode 100644 index 000000000..1482aefed --- /dev/null +++ b/examples/osd/slip-radio/slip-net.c @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2011, 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. + */ + +#include "contiki.h" +#include "net/netstack.h" +#include "net/ip/uip.h" +#include "net/packetbuf.h" +#include "dev/slip.h" +#include + +#define SLIP_END 0300 +#define SLIP_ESC 0333 +#define SLIP_ESC_END 0334 +#define SLIP_ESC_ESC 0335 + +#define DEBUG 0 + +/*---------------------------------------------------------------------------*/ +void +slipnet_init(void) +{ +} +/*---------------------------------------------------------------------------*/ +void +slip_send_packet(const uint8_t *ptr, int len) +{ + uint16_t i; + uint8_t c; + + slip_arch_writeb(SLIP_END); + for(i = 0; i < len; ++i) { + c = *ptr++; + if(c == SLIP_END) { + slip_arch_writeb(SLIP_ESC); + c = SLIP_ESC_END; + } else if(c == SLIP_ESC) { + slip_arch_writeb(SLIP_ESC); + c = SLIP_ESC_ESC; + } + slip_arch_writeb(c); + } + slip_arch_writeb(SLIP_END); +} +/*---------------------------------------------------------------------------*/ +void +slipnet_input(void) +{ + int i; + /* radio should be configured for filtering so this should be simple */ + /* this should be sent over SLIP! */ + /* so just copy into uip-but and send!!! */ + /* Format: !R ? */ + uip_len = packetbuf_datalen(); + i = packetbuf_copyto(uip_buf); + + if(DEBUG) { + printf("Slipnet got input of len: %d, copied: %d\n", + packetbuf_datalen(), i); + + for(i = 0; i < uip_len; i++) { + printf("%02x", (unsigned char) uip_buf[i]); + if((i & 15) == 15) printf("\n"); + else if((i & 7) == 7) printf(" "); + } + printf("\n"); + } + + /* printf("SUT: %u\n", uip_len); */ + slip_send_packet(uip_buf, uip_len); +} +/*---------------------------------------------------------------------------*/ +const struct network_driver slipnet_driver = { + "slipnet", + slipnet_init, + slipnet_input +}; +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/slip-radio/slip-radio-cc2420.c b/examples/osd/slip-radio/slip-radio-cc2420.c new file mode 100644 index 000000000..f49e3c4e9 --- /dev/null +++ b/examples/osd/slip-radio/slip-radio-cc2420.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2011, 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. + * + * Sets up some commands for the CC2420 radio chip. + */ + +#include "contiki.h" +#include "cc2420.h" +#include "cmd.h" +#include + +int +cmd_handler_cc2420(const uint8_t *data, int len) +{ + if(data[0] == '!') { + if(data[1] == 'C') { + printf("cc2420_cmd: setting channel: %d\n", data[2]); + cc2420_set_channel(data[2]); + return 1; + } + } else if(data[0] == '?') { + if(data[1] == 'C') { + uint8_t buf[4]; + printf("cc2420_cmd: getting channel: %d\n", data[2]); + buf[0] = '!'; + buf[1] = 'C'; + buf[2] = cc2420_get_channel(); + cmd_send(buf, 3); + return 1; + } + } + return 0; +} diff --git a/examples/osd/slip-radio/slip-radio-mc1322x.c b/examples/osd/slip-radio/slip-radio-mc1322x.c new file mode 100644 index 000000000..da518b11c --- /dev/null +++ b/examples/osd/slip-radio/slip-radio-mc1322x.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2011, 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. + * + * Sets up some commands for the MC1322x radio chip. + */ + +#include "contiki.h" +#include "mc1322x.h" +#include "cmd.h" +#include + +int +cmd_handler_mc1322x(const uint8_t *data, int len) +{ + if(data[0] == '!') { + if(data[1] == 'C') { + printf("mc1322x_cmd: setting channel: %d\n", data[2]); + set_channel(data[2]-11); + return 1; + } + } else if(data[0] == '?') { + if(data[1] == 'C') { + uint8_t buf[4]; + printf("mc1322x_cmd: getting channel: %d\n", data[2]); + buf[0] = '!'; + buf[1] = 'C'; + //Not implemented in MACA driver + buf[2] = 0; + cmd_send(buf, 3); + return 1; + } + } + return 0; +} diff --git a/examples/osd/slip-radio/slip-radio-rf230.c b/examples/osd/slip-radio/slip-radio-rf230.c new file mode 100644 index 000000000..1f254386d --- /dev/null +++ b/examples/osd/slip-radio/slip-radio-rf230.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2011, 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. + * + * Sets up some commands for the RF230 radio. + */ + +#include "contiki.h" +#include "cmd.h" + +#include "radio/rf230/radio.h" +#include "radio/rf230bb/rf230bb.h" + + +#define DEBUG 0 +#if DEBUG +#include +#define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args) +#define PRINTSHORT(FORMAT,args...) printf_P(PSTR(FORMAT),##args) +#else +#define PRINTF(...) +#define PRINTSHORT(...) +#endif + +int +cmd_handler_rf230(const uint8_t *data, int len) +{ + if(data[0] == '!') { + if(data[1] == 'C') { + PRINTF("CMD: Setting channel: %d\n", data[2]); + rf230_set_channel(data[2]); + return 1; + } + } else if(data[0] == '?') { + if(data[1] == 'C') { + uint8_t buf[4]; + PRINTF("CMD: Getting channel: %d\n", data[2]); + buf[0] = '!'; + buf[1] = 'C'; + buf[2] = rf230_get_channel(); + cmd_send(buf, 3); + return 1; + } + } + return 0; +} diff --git a/examples/osd/slip-radio/slip-radio-sky-sensors.c b/examples/osd/slip-radio/slip-radio-sky-sensors.c new file mode 100644 index 000000000..9cf238741 --- /dev/null +++ b/examples/osd/slip-radio/slip-radio-sky-sensors.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2011, 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. + */ + +#include "contiki.h" +#include "lib/sensors.h" +#include "dev/sht11/sht11-sensor.h" +#include "slip-radio.h" +#include "cmd.h" +#include + +/*---------------------------------------------------------------------------*/ +static void +init(void) +{ +} +/*---------------------------------------------------------------------------*/ +static int +write_percent_float(char *data, int maxlen, int temp) +{ + int t; + t = temp % 100; + if(t < 0) { + t = -t; + } + return snprintf(data, maxlen, "%d.%02d", temp / 100, t); +} +/*---------------------------------------------------------------------------*/ +static void +send(void) +{ +#define MAX_SIZE 40 + char data[MAX_SIZE]; + int temperature; + int ms; + long hum; + int pos = 0; + + /* SENSORS_ACTIVATE(light_sensor); */ + SENSORS_ACTIVATE(sht11_sensor); + + pos += snprintf(data, MAX_SIZE, "!D"); + /* int light1 = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); */ + /* int light2 = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); */ + temperature = -3970 + sht11_sensor.value(SHT11_SENSOR_TEMP); + ms = sht11_sensor.value(SHT11_SENSOR_HUMIDITY); + /* this is in * 10000 */ + /* -2.0468 + 0.0367 * ms + -1.5955e-6 * ms * ms ...too small value... */ + hum = (-20468L + 367L * ms) / 100L; + + /* SENSORS_DEACTIVATE(light_sensor); */ + SENSORS_DEACTIVATE(sht11_sensor); + + pos += snprintf(&data[pos], MAX_SIZE - pos, "temp="); + pos += write_percent_float(&data[pos], MAX_SIZE - pos, temperature); + pos += snprintf(&data[pos], MAX_SIZE - pos, ";hum="); + pos += write_percent_float(&data[pos], MAX_SIZE - pos, hum); + + cmd_send((uint8_t *)data, pos); +} +/* ---------------------------------------------------------------------- */ +const struct slip_radio_sensors slip_radio_sky_sensors = { + init, send +}; +/* ---------------------------------------------------------------------- */ diff --git a/examples/osd/slip-radio/slip-radio.c b/examples/osd/slip-radio/slip-radio.c new file mode 100644 index 000000000..255cfefb5 --- /dev/null +++ b/examples/osd/slip-radio/slip-radio.c @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2011, 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. + */ + +/** + * \file + * Slip-radio driver + * \author + * Niclas Finne + * Joakim Eriksson + */ +#include "contiki.h" +#include "net/ip/uip.h" +#include "net/ipv6/uip-ds6.h" +#include "dev/slip.h" +#include +#include "net/netstack.h" +#include "net/packetbuf.h" + +#define DEBUG DEBUG_NONE +#include "net/ip/uip-debug.h" +#include "cmd.h" +#include "slip-radio.h" +#include "packetutils.h" + +#ifdef SLIP_RADIO_CONF_SENSORS +extern const struct slip_radio_sensors SLIP_RADIO_CONF_SENSORS; +#endif + +void slip_send_packet(const uint8_t *ptr, int len); + + /* max 16 packets at the same time??? */ +uint8_t packet_ids[16]; +int packet_pos; + +static int slip_radio_cmd_handler(const uint8_t *data, int len); + +#if CONTIKI_TARGET_NOOLIBERRY +int cmd_handler_rf230(const uint8_t *data, int len); +#elif CONTIKI_TARGET_ECONOTAG +int cmd_handler_mc1322x(const uint8_t *data, int len); +#else /* Leave CC2420 as default */ +int cmd_handler_cc2420(const uint8_t *data, int len); +#endif /* CONTIKI_TARGET */ + +/*---------------------------------------------------------------------------*/ +#ifdef CMD_CONF_HANDLERS +CMD_HANDLERS(CMD_CONF_HANDLERS); +#else +CMD_HANDLERS(slip_radio_cmd_handler); +#endif +/*---------------------------------------------------------------------------*/ +static void +packet_sent(void *ptr, int status, int transmissions) +{ + uint8_t buf[20]; + uint8_t sid; + int pos; + sid = *((uint8_t *)ptr); + PRINTF("Slip-radio: packet sent! sid: %d, status: %d, tx: %d\n", + sid, status, transmissions); + /* packet callback from lower layers */ + /* neighbor_info_packet_sent(status, transmissions); */ + pos = 0; + buf[pos++] = '!'; + buf[pos++] = 'R'; + buf[pos++] = sid; + buf[pos++] = status; /* one byte ? */ + buf[pos++] = transmissions; + cmd_send(buf, pos); +} +/*---------------------------------------------------------------------------*/ +static int +slip_radio_cmd_handler(const uint8_t *data, int len) +{ + int i; + if(data[0] == '!') { + /* should send out stuff to the radio - ignore it as IP */ + /* --- s e n d --- */ + if(data[1] == 'S') { + int pos; + packet_ids[packet_pos] = data[2]; + + packetbuf_clear(); + pos = packetutils_deserialize_atts(&data[3], len - 3); + if(pos < 0) { + PRINTF("slip-radio: illegal packet attributes\n"); + return 1; + } + pos += 3; + len -= pos; + if(len > PACKETBUF_SIZE) { + len = PACKETBUF_SIZE; + } + memcpy(packetbuf_dataptr(), &data[pos], len); + packetbuf_set_datalen(len); + + PRINTF("slip-radio: sending %u (%d bytes)\n", + data[2], packetbuf_datalen()); + + /* parse frame before sending to get addresses, etc. */ + no_framer.parse(); + NETSTACK_LLSEC.send(packet_sent, &packet_ids[packet_pos]); + + packet_pos++; + if(packet_pos >= sizeof(packet_ids)) { + packet_pos = 0; + } + + return 1; + } + } else if(uip_buf[0] == '?') { + PRINTF("Got request message of type %c\n", uip_buf[1]); + if(data[1] == 'M') { + /* this is just a test so far... just to see if it works */ + uip_buf[0] = '!'; + uip_buf[1] = 'M'; + for(i = 0; i < 8; i++) { + uip_buf[2 + i] = uip_lladdr.addr[i]; + } + uip_len = 10; + cmd_send(uip_buf, uip_len); + return 1; + } + } + return 0; +} +/*---------------------------------------------------------------------------*/ +void +slip_radio_cmd_output(const uint8_t *data, int data_len) +{ + slip_send_packet(data, data_len); +} +/*---------------------------------------------------------------------------*/ +static void +slip_input_callback(void) +{ + PRINTF("SR-SIN: %u '%c%c'\n", uip_len, uip_buf[0], uip_buf[1]); + cmd_input(uip_buf, uip_len); + uip_len = 0; +} +/*---------------------------------------------------------------------------*/ +static void +init(void) +{ +#ifndef BAUD2UBR +#define BAUD2UBR(baud) baud +#endif + slip_arch_init(BAUD2UBR(115200)); + process_start(&slip_process, NULL); + slip_set_input_callback(slip_input_callback); + packet_pos = 0; +} +/*---------------------------------------------------------------------------*/ +#if !SLIP_RADIO_CONF_NO_PUTCHAR +#undef putchar +int +putchar(int c) +{ +#define SLIP_END 0300 + static char debug_frame = 0; + + if(!debug_frame) { /* Start of debug output */ + slip_arch_writeb(SLIP_END); + slip_arch_writeb('\r'); /* Type debug line == '\r' */ + debug_frame = 1; + } + + /* Need to also print '\n' because for example COOJA will not show + any output before line end */ + slip_arch_writeb((char)c); + + /* + * Line buffered output, a newline marks the end of debug output and + * implicitly flushes debug output. + */ + if(c == '\n') { + slip_arch_writeb(SLIP_END); + debug_frame = 0; + } + return c; +} +#endif +/*---------------------------------------------------------------------------*/ +PROCESS(slip_radio_process, "Slip radio process"); +AUTOSTART_PROCESSES(&slip_radio_process); +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(slip_radio_process, ev, data) +{ + static struct etimer et; + PROCESS_BEGIN(); + + init(); + NETSTACK_RDC.off(1); +#ifdef SLIP_RADIO_CONF_SENSORS + SLIP_RADIO_CONF_SENSORS.init(); +#endif + printf("Slip Radio started...\n"); + + etimer_set(&et, CLOCK_SECOND * 3); + + while(1) { + PROCESS_YIELD(); + + if(etimer_expired(&et)) { + etimer_reset(&et); +#ifdef SLIP_RADIO_CONF_SENSORS + SLIP_RADIO_CONF_SENSORS.send(); +#endif + } + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/slip-radio/slip-radio.h b/examples/osd/slip-radio/slip-radio.h new file mode 100644 index 000000000..a80e81c4f --- /dev/null +++ b/examples/osd/slip-radio/slip-radio.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2011, 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. + * + */ + +#ifndef SLIP_RADIO_H_ +#define SLIP_RADIO_H_ + +struct slip_radio_sensors { + /** Initialize the driver */ + void (* init)(void); + /** Send the sensor data packet via the command send */ + void (* send)(void); +}; + +#endif /* SLIP_RADIO_H_ */