]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Base station for 15.4 code. Receive only.
authorscipio <scipio>
Mon, 9 Jun 2008 23:52:25 +0000 (23:52 +0000)
committerscipio <scipio>
Mon, 9 Jun 2008 23:52:25 +0000 (23:52 +0000)
apps/BaseStation15.4/BaseStationC.nc [new file with mode: 0644]
apps/BaseStation15.4/BaseStationP.nc [new file with mode: 0644]
apps/BaseStation15.4/Makefile [new file with mode: 0644]
apps/BaseStation15.4/listen14_5.c [new file with mode: 0644]

diff --git a/apps/BaseStation15.4/BaseStationC.nc b/apps/BaseStation15.4/BaseStationC.nc
new file mode 100644 (file)
index 0000000..2f9a1c6
--- /dev/null
@@ -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.
+ *
+ * <p>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.</p>
+ *
+ * <p>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.</p>
+ *
+ * <p>BaseStation acknowledges a message arriving over the serial link
+ * only if that message was successfully enqueued for delivery to the
+ * radio link.</p>
+ *
+ * <p>The LEDS are programmed to toggle as follows:</p>
+ * <ul>
+ * <li><b>RED Toggle:</b>: Message bridged from serial to radio</li>
+ * <li><b>GREEN Toggle:</b> Message bridged from radio to serial</li>
+ * <li><b>YELLOW/BLUE Toggle:</b> Dropped message due to queue overflow in either direction</li>
+ * </ul>
+ *
+ * @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 (file)
index 0000000..62916d4
--- /dev/null
@@ -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 (file)
index 0000000..3c052e7
--- /dev/null
@@ -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 (file)
index 0000000..7ed64f6
--- /dev/null
@@ -0,0 +1,180 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#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 <device> <rate> - 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);
+    }
+}