/*-----------------------------------------------------------------------------------*/ static void doInterfaceActionsBeforeTick(void) { int i; if (!simSerialReceivingFlag) { return; } if (simSerialReceivingLength == 0) { /* Error, should not be zero */ simSerialReceivingFlag = 0; return; } /* Notify specified rs232 handler */ if(input_handler != NULL) { for (i=0; i < simSerialReceivingLength; i++) { input_handler(simSerialReceivingData[i]); } } else { /* Notify serial process */ for (i=0; i < simSerialReceivingLength; i++) { serial_line_input_byte(simSerialReceivingData[i]); } serial_line_input_byte(0x0a); } simSerialReceivingLength = 0; simSerialReceivingFlag = 0; }
/*-----------------------------------------------------------------------------------*/ u16_t ether_client_read(u8_t *buf, int bufsize) { int ret, len; fd_set fdset; struct timeval tv; struct ether_hdr *hdr = (struct ether_hdr *)rxbuffer; FD_ZERO(&fdset); FD_SET(sc, &fdset); tv.tv_sec = 0; tv.tv_usec = 10000; ret = select(sc + 1, &fdset, NULL, NULL, &tv); if(ret == 0) { /* printf("ret 0\n");*/ return 0; } if(FD_ISSET(sc, &fdset)) { ret = recv(sc, &rxbuffer[0], sizeof(rxbuffer), 0); if(ret == -1) { perror("ether_client_poll: recv"); return 0; } len = ret; if(len > bufsize) { PRINTF("ether_client_read: packet truncated from %d to %d\n", len, bufsize); len = bufsize; } /* printf("Incoming len %d\n", len);*/ memcpy(buf, &rxbuffer[sizeof(struct ether_hdr)], len); radio_sensor_signal = hdr->signal; if(hdr->type == PTYPE_DATA && hdr->srcid != node.id) { return len - sizeof(struct ether_hdr); } else if(hdr->type == PTYPE_CLOCK) { node_set_time(hdr->clock); } else if(hdr->type == PTYPE_SENSOR) { int strength = sensor_strength() - ((hdr->srcx - node_x()) * (hdr->srcx - node_x()) + (hdr->srcy - node_y()) * (hdr->srcy - node_y())) / sensor_strength(); /* printf("Dist %d \n", strength);*/ if(strength > 0) { sensor_input(&hdr->sensor_data, strength); } } else if(hdr->type == PTYPE_SERIAL) { char *ptr = hdr->text; printf("serial input %s\n", ptr); for(ptr = hdr->text; *ptr != 0; ++ptr) { serial_line_input_byte(*ptr); } } } return 0; }
/*---------------------------------------------------------------------------*/ int main(void) { printf("Starting Contiki\n"); process_init(); ctimer_init(); netstack_init(); procinit_init(); serial_line_init(); autostart_start(autostart_processes); /* Make standard output unbuffered. */ setvbuf(stdout, (char *)NULL, _IONBF, 0); while(1) { fd_set fds; int n; struct timeval tv; clock_time_t next_event; n = process_run(); next_event = etimer_next_expiration_time()-clock_time(); #if DEBUG_SLEEP if(n > 0) { printf("%d events pending\n",n); } else { printf("next event: T-%.03f\n",(double)next_event/(double)CLOCK_SECOND); } #endif if(next_event>CLOCK_SECOND*2) next_event = CLOCK_SECOND*2; tv.tv_sec = n?0:next_event/CLOCK_SECOND; tv.tv_usec = n?0:next_event%1000*1000; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); select(1, &fds, NULL, NULL, &tv); if(FD_ISSET(STDIN_FILENO, &fds)) { char c; if(read(STDIN_FILENO, &c, 1) > 0) { serial_line_input_byte(c); } } etimer_request_poll(); } return 0; }
static void stdin_handle_fd(fd_set *rset, fd_set *wset) { char c; if(FD_ISSET(STDIN_FILENO, rset)) { if(read(STDIN_FILENO, &c, 1) > 0) { serial_line_input_byte(c); } } }
/*---------------------------------------------------------------------------*/ int main(void) { printf("Starting Contiki\n"); process_init(); ctimer_init(); netstack_init(); procinit_init(); serial_line_init(); //autostart_start(autostart_processes); /* Make standard output unbuffered. */ setvbuf(stdout, (char *)NULL, _IONBF, 0); while(1) { fd_set fds; int n; struct timeval tv; n = process_run(); tv.tv_sec = 0; tv.tv_usec = 1; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); select(1, &fds, NULL, NULL, &tv); if(FD_ISSET(STDIN_FILENO, &fds)) { char c; if(read(STDIN_FILENO, &c, 1) > 0) { serial_line_input_byte(c); } } etimer_request_poll(); } return 0; }
static void stdin_handle_fd(fd_set *rset, fd_set *wset) { ssize_t ret; char c; if(is_stdin_open && FD_ISSET(STDIN_FILENO, rset)) { ret = read(STDIN_FILENO, &c, 1); if(ret > 0) { serial_line_input_byte(c); } else if(ret == 0) { /* Standard in closed */ is_stdin_open = 0; fprintf(stderr, "*** stdin closed\n"); } else if(errno != EAGAIN) { err(1, "stdin: read"); } } }
/*---------------------------------------------------------------------------*/ static int serial_input_byte_intercept(unsigned char c) { /* Detect checkpoint request */ if(command_checkpoint[command_checkpoint_state] == c) { command_checkpoint_state++; if(command_checkpoint_state == sizeof(command_checkpoint)) { serial_interrupt_checkpoint(); command_checkpoint_state = 0; } } else { command_checkpoint_state = 0; } /* Detect rollback request */ if(command_rollback[command_rollback_state] == c) { command_rollback_state++; if(command_rollback_state == sizeof(command_rollback)) { serial_interrupt_rollback(); command_rollback_state = 0; } } else { command_rollback_state = 0; } /* Detect metrics request */ if(command_metrics[command_metrics_state] == c) { command_metrics_state++; if(command_metrics_state == sizeof(command_metrics)) { serial_interrupt_metrics(); command_metrics_state = 0; } } else { command_metrics_state = 0; } /* Forward to serial line input byte */ return serial_line_input_byte(c); }
int main() { unsigned char ser_byte; int res; /* Don't do ANYTHING before this. */ lowlevel_init(); leds_off(LEDS_ALL); //pm_stop_mode(0); uip_init(); autostart_start(autostart_processes); while(1) { do { } while(process_run() > 0); idle_count++; if (dbg_getbyte(&ser_byte)) { //leds_toggle(LEDS_ALL); printf("%c", ser_byte); res = serial_line_input_byte(ser_byte); if (!res) { printf("No?\n"); /* Well... */ } } /* Idle! */ /* Stop processor clock */ //asm("wfi"::); } return 0; }
/*---------------------------------------------------------------------------*/ int main(void) { process_init(); procinit_init(); ctimer_init(); autostart_start(autostart_processes); #if !UIP_CONF_IPV6 uip_ipaddr_t addr; uip_ipaddr(&addr, 192,168,1,2); printf("IP Address: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); uip_sethostaddr(&addr); uip_ipaddr(&addr, 255,255,255,0); printf("Subnet Mask: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); uip_setnetmask(&addr); uip_ipaddr(&addr, 192,168,1,1); printf("Def. Router: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); uip_setdraddr(&addr); #else { uip_ipaddr_t ipaddr; uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); uip_netif_addr_autoconf_set(&ipaddr, &uip_lladdr); uip_netif_addr_add(&ipaddr, 16, 0, TENTATIVE); } #endif /* Make standard output unbuffered. */ setvbuf(stdout, (char *)NULL, _IONBF, 0); while(1) { fd_set fds; int n; struct timeval tv; n = process_run(); /* if(n > 0) { printf("%d processes in queue\n"); }*/ tv.tv_sec = 0; tv.tv_usec = 1; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); select(1, &fds, NULL, NULL, &tv); if(FD_ISSET(STDIN_FILENO, &fds)) { char c; if(read(STDIN_FILENO, &c, 1) > 0) { serial_line_input_byte(c); } } etimer_request_poll(); } return 0; }
/*---------------------------------------------------------------------------*/ int main(void) { #if UIP_CONF_IPV6 /* A hard coded address overrides the stack default MAC address to allow multiple instances. * uip6.c defines it as {0x00,0x06,0x98,0x00,0x02,0x32} giving an ipv6 address of [fe80::206:98ff:fe00:232] * We make it simpler, {0x02,0x00,0x00 + the last three bytes of the hard coded address (if any are nonzero). * HARD_CODED_ADDRESS can be defined in the contiki-conf.h file, or here to allow quick builds using different addresses. * If HARD_CODED_ADDRESS has a prefix it also applied, unless built as a RPL end node. * E.g. bbbb::12:3456 becomes fe80::ff:fe12:3456 and prefix bbbb::/64 if non-RPL * ::10 becomes fe80::ff:fe00:10 and prefix awaits RA or RPL formation * bbbb:: gives an address of bbbb::206:98ff:fe00:232 if non-RPL */ //#define HARD_CODED_ADDRESS "bbbb::20" #ifdef HARD_CODED_ADDRESS { uip_ipaddr_t ipaddr; uiplib_ipaddrconv(HARD_CODED_ADDRESS, &ipaddr); if ((ipaddr.u8[13]!=0) || (ipaddr.u8[14]!=0) || (ipaddr.u8[15]!=0)) { if (sizeof(uip_lladdr)==6) { //Minimal-net uses ethernet MAC uip_lladdr.addr[0]=0x02;uip_lladdr.addr[1]=0;uip_lladdr.addr[2]=0; uip_lladdr.addr[3]=ipaddr.u8[13];; uip_lladdr.addr[4]=ipaddr.u8[14]; uip_lladdr.addr[5]=ipaddr.u8[15]; } } } #endif #endif process_init(); /* procinit_init initializes RPL which sets a ctimer for the first DIS */ /* We must start etimers and ctimers,before calling it */ process_start(&etimer_process, NULL); ctimer_init(); procinit_init(); autostart_start(autostart_processes); #if RPL_BORDER_ROUTER process_start(&border_router_process, NULL); printf("Border Router Process started\n"); #elif UIP_CONF_IPV6_RPL printf("RPL enabled\n"); #endif /* Set default IP addresses if not specified */ #if !UIP_CONF_IPV6 uip_ipaddr_t addr; uip_gethostaddr(&addr); if (addr.u8[0]==0) { uip_ipaddr(&addr, 10,1,1,1); } printf("IP Address: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); uip_sethostaddr(&addr); uip_getnetmask(&addr); if (addr.u8[0]==0) { uip_ipaddr(&addr, 255,0,0,0); uip_setnetmask(&addr); } printf("Subnet Mask: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); uip_getdraddr(&addr); if (addr.u8[0]==0) { uip_ipaddr(&addr, 10,1,1,100); uip_setdraddr(&addr); } printf("Def. Router: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); #else /* UIP_CONF_IPV6 */ #if !UIP_CONF_IPV6_RPL #ifdef HARD_CODED_ADDRESS uip_ipaddr_t ipaddr; uiplib_ipaddrconv(HARD_CODED_ADDRESS, &ipaddr); if ((ipaddr.u16[0]!=0) || (ipaddr.u16[1]!=0) || (ipaddr.u16[2]!=0) || (ipaddr.u16[3]!=0)) { #if UIP_CONF_ROUTER uip_ds6_prefix_add(&ipaddr, UIP_DEFAULT_PREFIX_LEN, 0, 0, 0, 0); #else /* UIP_CONF_ROUTER */ uip_ds6_prefix_add(&ipaddr, UIP_DEFAULT_PREFIX_LEN, 0); #endif /* UIP_CONF_ROUTER */ #if !UIP_CONF_IPV6_RPL uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr); uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); #endif } #endif /* HARD_CODED_ADDRESS */ #endif #if !RPL_BORDER_ROUTER //Border router process prints addresses later { uint8_t i; for (i=0;i<UIP_DS6_ADDR_NB;i++) { if (uip_ds6_if.addr_list[i].isused) { printf("IPV6 Addresss: ");sprint_ip6(uip_ds6_if.addr_list[i].ipaddr);printf("\n"); } } } #endif #endif /* !UIP_CONF_IPV6 */ /* Make standard output unbuffered. */ setvbuf(stdout, (char *)NULL, _IONBF, 0); while(1) { fd_set fds; int n; struct timeval tv; n = process_run(); /* if(n > 0) { printf("%d processes in queue\n"); }*/ tv.tv_sec = 0; tv.tv_usec = 1; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); select(1, &fds, NULL, NULL, &tv); if(FD_ISSET(STDIN_FILENO, &fds)) { char c; if(read(STDIN_FILENO, &c, 1) > 0) { serial_line_input_byte(c); } } etimer_request_poll(); } return 0; }
static void console_receive(const char *buf, unsigned len) { while (len--) serial_line_input_byte(*buf++); }
/*---------------------------------------------------------------------------*/ static void char_rx(handler_arg_t arg, uint8_t c) { serial_line_input_byte(c); }
/*---------------------------------------------------------------------------*/ int main(void) { clock_init(); #if UIP_CONF_IPV6 /* A hard coded address overrides the stack default MAC address to allow multiple instances. uip6.c defines it as {0x00,0x06,0x98,0x00,0x02,0x32} giving an ipv6 address of [fe80::206:98ff:fe00:232] We make it simpler, {0x02,0x00,0x00 + the last three bytes of the hard coded address (if any are nonzero). HARD_CODED_ADDRESS can be defined in the contiki-conf.h file, or here to allow quick builds using different addresses. If HARD_CODED_ADDRESS has a prefix it also applied, unless built as a RPL end node. E.g. bbbb::12:3456 becomes fe80::ff:fe12:3456 and prefix bbbb::/64 if non-RPL ::10 becomes fe80::ff:fe00:10 and prefix awaits RA or RPL formation bbbb:: gives an address of bbbb::206:98ff:fe00:232 if non-RPL */ #ifdef HARD_CODED_ADDRESS { uip_ipaddr_t ipaddr; uiplib_ipaddrconv(HARD_CODED_ADDRESS, &ipaddr); if((ipaddr.u8[13] != 0) || (ipaddr.u8[14] != 0) || (ipaddr.u8[15] != 0)) { if(sizeof(uip_lladdr) == 6) { /* Minimal-net uses ethernet MAC */ uip_lladdr.addr[0] = 0x02; uip_lladdr.addr[1] = 0; uip_lladdr.addr[2] = 0; uip_lladdr.addr[3] = ipaddr.u8[13]; uip_lladdr.addr[4] = ipaddr.u8[14]; uip_lladdr.addr[5] = ipaddr.u8[15]; } } } #endif /* HARD_CODED_ADDRESS */ #endif /* UIP_CONF_IPV6 */ process_init(); /* procinit_init initializes RPL which sets a ctimer for the first DIS */ /* We must start etimers and ctimers,before calling it */ process_start(&etimer_process, NULL); ctimer_init(); #if RPL_BORDER_ROUTER process_start(&border_router_process, NULL); printf("Border Router Process started\n"); #elif UIP_CONF_IPV6_RPL printf("RPL enabled\n"); #endif procinit_init(); autostart_start(autostart_processes); /* Set default IP addresses if not specified */ #if !UIP_CONF_IPV6 { uip_ipaddr_t addr; uip_gethostaddr(&addr); if(addr.u8[0] == 0) { uip_ipaddr(&addr, 172,18,0,2); } printf("IP Address: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); uip_sethostaddr(&addr); uip_getnetmask(&addr); if(addr.u8[0] == 0) { uip_ipaddr(&addr, 255,255,0,0); uip_setnetmask(&addr); } printf("Subnet Mask: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); uip_getdraddr(&addr); if(addr.u8[0] == 0) { uip_ipaddr(&addr, 172,18,0,1); uip_setdraddr(&addr); } printf("Def. Router: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&addr)); } #else /* UIP_CONF_IPV6 */ #if !UIP_CONF_IPV6_RPL { uip_ipaddr_t ipaddr; #ifdef HARD_CODED_ADDRESS uiplib_ipaddrconv(HARD_CODED_ADDRESS, &ipaddr); #else uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); #endif if((ipaddr.u16[0] != 0) || (ipaddr.u16[1] != 0) || (ipaddr.u16[2] != 0) || (ipaddr.u16[3] != 0)) { #if UIP_CONF_ROUTER if(!uip_ds6_prefix_add(&ipaddr, UIP_DEFAULT_PREFIX_LEN, 0, 0, 0, 0)) { fprintf(stderr,"uip_ds6_prefix_add() failed.\n"); exit(EXIT_FAILURE); } #else /* UIP_CONF_ROUTER */ if(!uip_ds6_prefix_add(&ipaddr, UIP_DEFAULT_PREFIX_LEN, 0)) { fprintf(stderr,"uip_ds6_prefix_add() failed.\n"); exit(EXIT_FAILURE); } #endif /* UIP_CONF_ROUTER */ uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr); uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); } } #endif /* !UIP_CONF_IPV6_RPL */ #endif /* !UIP_CONF_IPV6 */ // procinit_init(); // autostart_start(autostart_processes); /* Make standard output unbuffered. */ setvbuf(stdout, (char *)NULL, _IONBF, 0); printf("\n*******%s online*******\n",CONTIKI_VERSION_STRING); #if UIP_CONF_IPV6 && !RPL_BORDER_ROUTER /* Border router process prints addresses later */ { int i = 0; int interface_count = 0; for(i = 0; i < UIP_DS6_ADDR_NB; i++) { if(uip_ds6_if.addr_list[i].isused) { printf("IPV6 Addresss: "); sprint_ip6(uip_ds6_if.addr_list[i].ipaddr); printf("\n"); interface_count++; } } assert(0 < interface_count); } #endif while(1) { fd_set fds; int n; struct timeval tv; clock_time_t next_event; n = process_run(); next_event = etimer_next_expiration_time() - clock_time(); #if DEBUG_SLEEP if(n > 0) printf("sleep: %d events pending\n",n); else printf("sleep: next event @ T-%.03f\n",(double)next_event / (double)CLOCK_SECOND); #endif #ifdef __CYGWIN__ /* wpcap doesn't appear to support select, so * we can't idle the process on windows. */ next_event = 0; #endif if(next_event > (CLOCK_SECOND * 2)) next_event = CLOCK_SECOND * 2; tv.tv_sec = n ? 0 : (next_event / CLOCK_SECOND); tv.tv_usec = n ? 0 : ((next_event % 1000) * 1000); FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); #ifdef __CYGWIN__ select(1, &fds, NULL, NULL, &tv); #else FD_SET(tapdev_fd(), &fds); if(0 > select(tapdev_fd() + 1, &fds, NULL, NULL, &tv)) { perror("Call to select() failed."); exit(EXIT_FAILURE); } #endif if(FD_ISSET(STDIN_FILENO, &fds)) { char c; if(read(STDIN_FILENO, &c, 1) > 0) { serial_line_input_byte(c); } } #ifdef __CYGWIN__ process_poll(&wpcap_process); #else process_poll(&tapdev_process); #endif etimer_request_poll(); } return 0; }