From 404b735cc47b6500f85520978ed778ec8d129505 Mon Sep 17 00:00:00 2001 From: "Enric M. Calvo" Date: Sun, 27 Feb 2011 12:35:19 +0100 Subject: [PATCH] Fixed radio and contiki conf to get RIME working cc2420 isr handled at cc2420-arch, disabled accel. interrupts and modified platform/z1/contiki-conf.h to use same mac as sky. Added example-broadcast-button, sends packets every second or when button pushed. Works with other Z1s and Sky --- examples/rime/example-broadcast-button.c | 91 +++++++++++++++++++++++ platform/z1/contiki-conf.h | 8 +- platform/z1/dev/cc2420-arch.c | 2 +- tools/sky/serial/__init__.pyc | Bin 535 -> 0 bytes tools/sky/serial/serialposix.pyc | Bin 16103 -> 0 bytes tools/sky/serial/serialutil.pyc | Bin 3216 -> 0 bytes 6 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 examples/rime/example-broadcast-button.c delete mode 100644 tools/sky/serial/__init__.pyc delete mode 100644 tools/sky/serial/serialposix.pyc delete mode 100644 tools/sky/serial/serialutil.pyc diff --git a/examples/rime/example-broadcast-button.c b/examples/rime/example-broadcast-button.c new file mode 100644 index 000000000..47224ad33 --- /dev/null +++ b/examples/rime/example-broadcast-button.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2007, 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: example-broadcast.c,v 1.3 2010/11/06 15:03:48 adamdunkels Exp $ + */ + +/** + * \file + * Testing the broadcast layer in Rime + * \author + * Adam Dunkels + */ + +#include "contiki.h" +#include "net/rime.h" +#include "random.h" + +#include "dev/button-sensor.h" + +#include "dev/leds.h" + +#include +/*---------------------------------------------------------------------------*/ +PROCESS(example_broadcast_process, "Broadcast example"); +AUTOSTART_PROCESSES(&example_broadcast_process); +/*---------------------------------------------------------------------------*/ +static void +broadcast_recv(struct broadcast_conn *c, const rimeaddr_t *from) +{ + printf("broadcast message received from %d.%d: '%s'\n", + from->u8[0], from->u8[1], (char *)packetbuf_dataptr()); +} +static const struct broadcast_callbacks broadcast_call = {broadcast_recv}; +static struct broadcast_conn broadcast; +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(example_broadcast_process, ev, data) +{ + static struct etimer et; + + PROCESS_EXITHANDLER(broadcast_close(&broadcast);) + + PROCESS_BEGIN(); + + SENSORS_ACTIVATE(button_sensor); + broadcast_open(&broadcast, 129, &broadcast_call); + + while(1) { + + /* Delay 2-4 seconds */ + //etimer_set(&et, CLOCK_SECOND * 4 + random_rand() % (CLOCK_SECOND * 4)); + etimer_set(&et, CLOCK_SECOND); + + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et) || (ev == sensors_event && + data == &button_sensor)); + + packetbuf_copyfrom("Hello", 6); + broadcast_send(&broadcast); + printf("broadcast message sent\n"); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ + diff --git a/platform/z1/contiki-conf.h b/platform/z1/contiki-conf.h index c09b44635..65534cdf6 100644 --- a/platform/z1/contiki-conf.h +++ b/platform/z1/contiki-conf.h @@ -54,7 +54,9 @@ #define CXMAC_CONF_ANNOUNCEMENTS 0 #define XMAC_CONF_ANNOUNCEMENTS 0 -#define QUEUEBUF_CONF_NUM 4 +//Enric #define QUEUEBUF_CONF_NUM 4 +#define QUEUEBUF_CONF_NUM 8 //Enric like in SKY + #else /* WITH_UIP6 */ @@ -63,7 +65,9 @@ #define NETSTACK_CONF_NETWORK rime_driver #define NETSTACK_CONF_MAC csma_driver /* #define NETSTACK_CONF_RDC contikimac_driver */ -#define NETSTACK_CONF_RDC nullrdc_driver + #define NETSTACK_CONF_RDC contikimac_driver +//#define NETSTACK_CONF_RDC nullrdc_driver +#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8 //Enric like in SKY #define NETSTACK_CONF_FRAMER framer_802154 #define CC2420_CONF_AUTOACK 0 diff --git a/platform/z1/dev/cc2420-arch.c b/platform/z1/dev/cc2420-arch.c index 1588131a1..ca72686b8 100644 --- a/platform/z1/dev/cc2420-arch.c +++ b/platform/z1/dev/cc2420-arch.c @@ -47,7 +47,7 @@ #endif /*---------------------------------------------------------------------------*/ -#if 0 +#if 1 // this is now handled in the ADXL345 accelerometer code as it uses irq on port1 too. interrupt(CC2420_IRQ_VECTOR) cc24240_port1_interrupt(void) diff --git a/tools/sky/serial/__init__.pyc b/tools/sky/serial/__init__.pyc deleted file mode 100644 index e81d9f74e94bff26b55a87c81180950338447f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 535 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 diff --git a/tools/sky/serial/serialutil.pyc b/tools/sky/serial/serialutil.pyc deleted file mode 100644 index 1ded9ffd89a12ffbcb6d62057bdd2ef3f31e6aea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3216 zcmdOW%gc3nf1Fz~0|NsCGXn!du^9scLp=jSJrhF;14AkULmDGP3L`@c14Aq zLp>`)3KK&b149ZkT$G6+g@qwlgB7HopMilPIJGD3=Hw{d5O8H@$to6U`}p+N@-4Ne7pw8eF&mh zih+SaPd_O$Prn#!7nCY3$;{C!s4T|f2quPNkR_aq#UN|kGILUWGP6^`PGbf+tsLYu zR;bfb7#O0M80rNX>V=`ck78!17XkUag@GZ8g`r-IA(a&r1Su>GEldniYz*~kFcDU; z2s=Z)8CZmkp@oqlii4rviXnv^6l77H4E1&lDI8!n7bpxkLB4;*$iU#3r;wObTvC*n zT%wScnUkuJlbM~WkeriPT&%~XprD`tCPFeYiy?vvnYjfysky0nCB+Iwsfj5$nR%%S ziFqk-PO(B#VsUDULVg}t2qXtKqP!@xBo(9@NdZ_4Vhyql#R{b$6H4+G3X1Z}GE-6& zN-|Ov5|i@FQWerl^O8X^T&$3mU!+iyuKX{E)f#UPKD z=NDxwXk?Zs6eVVYgc9=d5jE<^$H9%j0`1g3|X8E`2q}#CF~$g&5R(?ELMn8MTpWo zRtCm;Wrl!4Q3l5FdKHkm;1p(tU=2{n7H2UqFo1$rAyEO8q7=$AGLthDGK&>TQj2mk z^Aby7DLgeVMK?c97pzDlH9tpFAvq%vR05QC6?xtXe#6v zLDM`mYZQaZ$4pRo`DuX4H*k6Y83|?-!%_&yLEunLE(R6$srfk&`OKNObZHNkPr$WX$>ki`LxrFt!f5@t}6Xkuaj$D%ev zIs-WNbr>p=80vLE=^;Oyfw5i}tQTB#*Dx_OGcbbEf*vUD@(mam>-9mYB9jBeZw93X z0}v~Pg+UUOQkWspZ-^BA#tZ?47NF=i0ci|QVPy!`U<2hzd*tXZE>Xx&11E!G9n^S( z$1o^pGcxl^Kq(|MJukl~HKo{s0alel%0}PN;1Gq3#IjU{)V#!`oYWL}!3ZvWLA3&` zKvo2&1z22V{{R2~zn=!Unt?|sI|Bm)EcJi{!Eq0&b;A;KN>jmQOfe`=g5s$dTxr5$ z4Q4Dj$$+InUQR41NX<(@OEsX#hItKB8{Bx}QxC`waCfL7l8-Q>05l1SGIB8rFp5Bu z54@BW2PGdfhI(^`dJAw8U<5U2f>Rh7f*~cT4g&*2R%vmGLULkG4pK#+tB{delnSoj zlJj#55=%0ZGIKIZDxqx_P{@I^7mC9mM#ANgLxFg&g5shA?pHGgaBwp-GBYNFN<(m_ z&;$9(ilN?`p+XT0uDPz*{u%#2(NoQ%ng3?RtN zP|OSRm>omCJwv?%C|^S(3DoRM%PB3+0Ocn{0}0y7@Pjx4R35=y3lRd9j^L68Pn!|s zU9j19h>+Ic2IXathjFw^i$S?4K0YNsIX)h2Cn&za*#_)Iun;(7fy@BOfjy0qR=_P? zL_CAJV9j8qV6(u^LihyCBIF&Ag|JpGE2Ndd&%?~b!^p!VBp@Wf&%(pv2Z>maYv65l hY)xly=7*UDN!nN%*r=*NAx@M#L9t~IZJf(60{|A#`SSn(