From: scipio Date: Mon, 9 Jun 2008 23:52:25 +0000 (+0000) Subject: Base station for 15.4 code. Receive only. X-Git-Tag: release_tinyos_2_1_0_0~327 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=b3c91920f9d2dd814400e1aff27e8aece53789ce Base station for 15.4 code. Receive only. --- diff --git a/apps/BaseStation15.4/BaseStationC.nc b/apps/BaseStation15.4/BaseStationC.nc new file mode 100644 index 00000000..2f9a1c6c --- /dev/null +++ b/apps/BaseStation15.4/BaseStationC.nc @@ -0,0 +1,87 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2003 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * The TinyOS 2.x base station that forwards packets between the UART + * and radio.It replaces the GenericBase of TinyOS 1.0 and the + * TOSBase of TinyOS 1.1. + * + *

On the serial link, BaseStation sends and receives simple active + * messages (not particular radio packets): on the radio link, it + * sends radio active messages, whose format depends on the network + * stack being used. BaseStation will copy its compiled-in group ID to + * messages moving from the serial link to the radio, and will filter + * out incoming radio messages that do not contain that group ID.

+ * + *

BaseStation includes queues in both directions, with a guarantee + * that once a message enters a queue, it will eventually leave on the + * other interface. The queues allow the BaseStation to handle load + * spikes.

+ * + *

BaseStation acknowledges a message arriving over the serial link + * only if that message was successfully enqueued for delivery to the + * radio link.

+ * + *

The LEDS are programmed to toggle as follows:

+ * + * + * @author Phil Buonadonna + * @author Gilman Tolle + * @author David Gay + * @author Philip Levis + * @date August 10 2005 + */ + +configuration BaseStationC { +} +implementation { + components MainC, BaseStationP, LedsC; + components ActiveMessageC as Radio; + components Serial802_15_4C as Serial; + + MainC.Boot <- BaseStationP; + + BaseStationP.RadioControl -> Radio; + BaseStationP.SerialControl -> Serial; + + BaseStationP.UartSend -> Serial; + + BaseStationP.RadioReceive -> Radio.Receive; + BaseStationP.RadioSnoop -> Radio.Snoop; + BaseStationP.RadioPacket -> Radio; + BaseStationP.RadioAMPacket -> Radio; + + BaseStationP.Leds -> LedsC; +} diff --git a/apps/BaseStation15.4/BaseStationP.nc b/apps/BaseStation15.4/BaseStationP.nc new file mode 100644 index 00000000..62916d41 --- /dev/null +++ b/apps/BaseStation15.4/BaseStationP.nc @@ -0,0 +1,196 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/* + * @author Phil Buonadonna + * @author Gilman Tolle + * @author David Gay + * Revision: $Id$ + */ + +/* + * BaseStationP bridges packets between a serial channel and the radio. + * Messages moving from serial to radio will be tagged with the group + * ID compiled into the TOSBase, and messages moving from radio to + * serial will be filtered by that same group id. + */ + +#include "AM.h" +#include "Serial.h" + +module BaseStationP { + uses { + interface Boot; + interface SplitControl as SerialControl; + interface SplitControl as RadioControl; + + interface Send as UartSend; + + interface Receive as RadioReceive[am_id_t id]; + interface Receive as RadioSnoop[am_id_t id]; + interface Packet as RadioPacket; + interface AMPacket as RadioAMPacket; + + interface Leds; + } +} + +implementation +{ + enum { + UART_QUEUE_LEN = 12, + RADIO_QUEUE_LEN = 12, + }; + + message_t uartQueueBufs[UART_QUEUE_LEN]; + message_t * ONE_NOK uartQueue[UART_QUEUE_LEN]; + uint8_t uartIn, uartOut; + bool uartBusy, uartFull; + + task void uartSendTask(); + + void dropBlink() { + call Leds.led2Toggle(); + } + + void failBlink() { + call Leds.led2Toggle(); + } + + event void Boot.booted() { + uint8_t i; + + for (i = 0; i < UART_QUEUE_LEN; i++) + uartQueue[i] = &uartQueueBufs[i]; + uartIn = uartOut = 0; + uartBusy = FALSE; + uartFull = TRUE; + + call RadioControl.start(); + call SerialControl.start(); + } + + event void RadioControl.startDone(error_t error) { + } + + event void SerialControl.startDone(error_t error) { + if (error == SUCCESS) { + uartFull = FALSE; + } + } + + event void SerialControl.stopDone(error_t error) {} + event void RadioControl.stopDone(error_t error) {} + + uint8_t count = 0; + + message_t* ONE receive(message_t* ONE msg, void* payload, uint8_t len); + + event message_t *RadioSnoop.receive[am_id_t id](message_t *msg, + void *payload, + uint8_t len) { + return receive(msg, payload, len); + } + + event message_t *RadioReceive.receive[am_id_t id](message_t *msg, + void *payload, + uint8_t len) { + return receive(msg, payload, len); + } + + message_t* receive(message_t *msg, void *payload, uint8_t len) { + message_t *ret = msg; + + atomic { + if (!uartFull) + { + ret = uartQueue[uartIn]; + uartQueue[uartIn] = msg; + + uartIn = (uartIn + 1) % UART_QUEUE_LEN; + + if (uartIn == uartOut) + uartFull = TRUE; + + if (!uartBusy) + { + post uartSendTask(); + uartBusy = TRUE; + } + } + else + dropBlink(); + } + + return ret; + } + + uint8_t tmpLen; + + task void uartSendTask() { + uint8_t len; + message_t* msg; + + atomic { + if (uartIn == uartOut && !uartFull) { + uartBusy = FALSE; + return; + } + } + + msg = uartQueue[uartOut]; + tmpLen = len = call RadioPacket.payloadLength(msg); + + if (call UartSend.send(uartQueue[uartOut], len) == SUCCESS) { + call Leds.led1Toggle(); + } + else { + failBlink(); + post uartSendTask(); + } + } + + event void UartSend.sendDone(message_t* msg, error_t error) { + if (error != SUCCESS) + failBlink(); + else + atomic + if (msg == uartQueue[uartOut]) + { + if (++uartOut >= UART_QUEUE_LEN) + uartOut = 0; + if (uartFull) + uartFull = FALSE; + } + post uartSendTask(); + } + +} diff --git a/apps/BaseStation15.4/Makefile b/apps/BaseStation15.4/Makefile new file mode 100644 index 00000000..3c052e79 --- /dev/null +++ b/apps/BaseStation15.4/Makefile @@ -0,0 +1,6 @@ +COMPONENT=BaseStationC +CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS +CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION + +include $(MAKERULES) + diff --git a/apps/BaseStation15.4/listen14_5.c b/apps/BaseStation15.4/listen14_5.c new file mode 100644 index 00000000..7ed64f6f --- /dev/null +++ b/apps/BaseStation15.4/listen14_5.c @@ -0,0 +1,180 @@ +#include +#include + +#include "serialsource.h" + +static char *msgs[] = { + "unknown_packet_type", + "ack_timeout" , + "sync" , + "too_long" , + "too_short" , + "bad_sync" , + "bad_crc" , + "closed" , + "no_memory" , + "unix_error" +}; + +void stderr_msg(serial_source_msg problem) +{ + fprintf(stderr, "Note: %s\n", msgs[problem]); +} + +enum { + TOS_SERIAL_802_15_4_ID = 2, +}; + +int main(int argc, char **argv) +{ + serial_source src; + + if (argc != 3) + { + fprintf(stderr, "Usage: %s - dump packets from a serial port\n", argv[0]); + exit(2); + } + src = open_serial_source(argv[1], platform_baud_rate(argv[2]), 0, stderr_msg); + if (!src) + { + fprintf(stderr, "Couldn't open serial port at %s:%s\n", + argv[1], argv[2]); + exit(1); + } + for (;;) + { + int len, i, plen; + short fcf; + const unsigned char *packet = read_serial_packet(src, &len); + int intraPan = 0; + + if (!packet) + exit(0); + else if (packet[0] != TOS_SERIAL_802_15_4_ID) { + printf("bad packet (serial type is %02x, not %02x)\n", packet[0], TOS_SERIAL_802_15_4_ID); + } + + plen = packet[1]; + printf("Received packet of length %i: \n", plen); + if (plen != len) { + printf("Packet format error: read packet length (%hhx) is different than expected from frame (%hhx).\n", plen, len); + } + + i = 2; + // Read in FCF and i+=2 + fcf = packet[i+1] << 8 | packet[i]; + i += 2; + + + { + if ((fcf & 0x7) == 0x01) { + printf(" Frame type: data\n"); + } + else if ((fcf & 0x7) == 0x02) { + printf(" Frame type: acknowledgement\n"); + } + else { + printf(" Frame type: other\n"); + } + + printf(" Security: %s\n", (fcf & (1 << 3)) ? "enabled":"disabled"); + printf(" Frame pending: %s\n", (fcf & (1 << 4)) ? "yes":"no"); + printf(" Ack request: %s\n", (fcf & (1 << 5)) ? "yes":"no"); + printf(" Intra-PAN: %s\n", (fcf & (1 << 6)) ? "yes":"no"); + intraPan = (fcf & (1 << 6)); + } + + + { + char seqno = packet[i++]; + printf(" Sequence number: %hhx\n", seqno); + } + + { + char addrLen = (fcf >> 10) & 0x3; + short saddr = 0; + long long laddr = 0; + + // 16- and 64-bit destinations have a PAN ID + if (addrLen == 2 || addrLen == 3) { + short destPan = packet[i++] << 8 | packet[i++]; + printf(" Destination PAN: %hx\n", destPan); + } + + switch (addrLen) { + case 0: + printf(" Destination address: none\n"); + break; + case 1: + printf(" Destination address: invalid? (0x01)\n"); + break; + case 2: + saddr = (packet[i++] << 8 | packet[i++]); + printf(" Destination address: %hx\n", saddr); + break; + case 3: { + int j; + for (j = 0; j < 8; j++) { + laddr = laddr << 8; + laddr |= packet[i++]; + } + printf(" Destination address: %llx\n", laddr); + break; + } + default: + printf(" Destination address: parse serror\n"); + } + } + + + { + char addrLen = (fcf >> 14) & 0x3; + short saddr = 0; + long long laddr = 0; + + if (!intraPan) { // Intra-PAN packet + short srcPan = packet[i++] << 8 | packet[i++]; + printf(" Source PAN: %hx\n", srcPan); + } + + switch (addrLen) { + case 0: + printf(" Source address: none\n"); + break; + case 1: + printf(" Source address: invalid? (0x01)\n"); + break; + case 2: + saddr = (packet[i++] << 8 | packet[i++]); + printf(" Source address: %hx\n", saddr); + break; + case 3: { + int j; + for (j = 0; j < 8; j++) { + laddr = laddr << 8; + laddr |= packet[i++]; + } + printf(" Source address: %llx\n", laddr); + break; + } + default: + printf(" Source address: parse serror\n"); + } + } + + printf(" AM type: %hhx\n", packet[i++]); + + if (i >= plen) { + printf("Packet format error: read packet is shorter than expected.\n"); + } + else { + printf(" Payload: "); + for (; i < plen; i++) { + printf("%hhx ", packet[i]); + } + printf("\n\n"); + putchar('\n'); + } + free((void *)packet); + } +}