Contiki 2.6

gateway.c

00001 #include <stdio.h>
00002 #include <sys/etimer.h>
00003 #include <sys/process.h>
00004 #include <sys/autostart.h>
00005 #include <usb/usb-api.h>
00006 #include <usb/cdc-acm.h>
00007 #include <dev/leds.h>
00008 #include <debug-uart.h>
00009 
00010 #include <net/uip-fw-drv.h>
00011 #include <net/uip-over-mesh.h>
00012 #include <dev/slip.h>
00013 
00014 #include "contiki-main.h"
00015 
00016 /* SLIP interface */
00017 
00018 extern struct uip_fw_netif cc2420if;
00019 
00020 rimeaddr_t node_addr = {{0,129}};
00021 
00022 static struct uip_fw_netif slipif =
00023 {UIP_FW_NETIF(0,0,0,0, 255,255,255,255, slip_send)};
00024 
00025 /* USB buffers */
00026 static unsigned char input_buffer[128];
00027 static unsigned char output_buffer[128];
00028 static unsigned char interrupt_buffer[16];
00029 
00030 #define DEV_TO_HOST 0x81
00031 #define HOST_TO_DEV 0x02
00032 
00033 #define GATEWAY_TRICKLE_CHANNEL 8
00034 void
00035 slip_arch_init(unsigned long ubr)
00036 {
00037 }
00038 
00039 void
00040 slip_arch_writeb(unsigned char c)
00041 {
00042   while(usb_send_data(DEV_TO_HOST, &c, 1) != 1);
00043 }
00044 
00045 #if WITH_UIP
00046 
00047 static void
00048 set_gateway(void)
00049 {
00050   struct gateway_msg msg;
00051   /* Make this node the gateway node, unless it already is the
00052      gateway. */
00053   if(!is_gateway) {
00054     leds_on(LEDS_RED);
00055     printf("%d.%d: making myself the gateway\n",
00056            rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1]);
00057     uip_over_mesh_set_gateway(&rimeaddr_node_addr);
00058     rimeaddr_copy(&(msg.gateway), &rimeaddr_node_addr);
00059     rimebuf_copyfrom(&msg, sizeof(struct gateway_msg));
00060     trickle_send(&gateway_trickle);
00061     is_gateway = 1;
00062   }
00063 }
00064 #endif /* WITH_UIP */
00065 
00066 PROCESS(gateway_process, "Gateway process");
00067 
00068 
00069 PROCESS_THREAD(gateway_process, ev , data)
00070 {
00071   static struct etimer timer;
00072   PROCESS_BEGIN();
00073   usb_set_user_process(process_current);
00074   usb_setup();
00075   usb_cdc_acm_setup();
00076 
00077   uip_fw_default(&slipif);
00078   uip_over_mesh_set_gateway_netif(&slipif);
00079 
00080   process_start(&slip_process, NULL);
00081 
00082   set_gateway();
00083   
00084   while(ev != PROCESS_EVENT_EXIT) {
00085     PROCESS_WAIT_EVENT();
00086     if (ev == PROCESS_EVENT_TIMER) {
00087       leds_toggle(LEDS_YELLOW);
00088       /* printf("FIFOP: %d\n", FIFOP_IS_1); */
00089       etimer_restart(&timer);
00090     } else if (ev == PROCESS_EVENT_MSG) {
00091       const struct usb_user_msg * const msg = data;
00092       switch(msg->type) {
00093       case USB_USER_MSG_TYPE_CONFIG:
00094         printf("User config\n");
00095         if (msg->data.config != 0) {
00096           usb_setup_bulk_endpoint(DEV_TO_HOST,
00097                                   input_buffer, sizeof(input_buffer));
00098           usb_setup_bulk_endpoint(HOST_TO_DEV,
00099                                   output_buffer, sizeof(output_buffer));
00100           usb_setup_interrupt_endpoint(0x83,interrupt_buffer,
00101                                        sizeof(interrupt_buffer));
00102           etimer_set(&timer, CLOCK_SECOND);
00103         } else {
00104           etimer_stop(&timer);
00105           usb_disable_endpoint(DEV_TO_HOST);
00106           usb_disable_endpoint(HOST_TO_DEV);
00107           usb_disable_endpoint(0x83);
00108 
00109         }
00110         break;
00111       case USB_USER_MSG_TYPE_EP_OUT(2):
00112         {
00113           /*unsigned int len = msg->data.length; 
00114             printf("Received %d:\n", len);  */
00115           {
00116             unsigned char ch;
00117             unsigned int xfer;
00118             while((xfer = usb_recv_data(HOST_TO_DEV, &ch, 1)) > 0) {
00119               /* printf(" %02x",ch); */
00120               if (slip_input_byte(ch)) break;
00121             }
00122             /* printf("\n"); */
00123           }
00124         }
00125         break;
00126       }
00127       
00128     }
00129   }
00130   printf("USB test process exited\n");
00131   PROCESS_END();
00132 }
00133 
00134 AUTOSTART_PROCESSES(&gateway_process);