47 #include "contiki-net.h"
49 #include "httpd-cgi.h"
51 #include "httpd-fsdata.h"
53 #include "net/nbr-table.h"
61 #if CONTIKI_TARGET_REDBEE_ECONOTAG
65 #if WEBSERVER_CONF_CGI
66 static struct httpd_cgi_call *calls =
NULL;
68 #if WEBSERVER_CONF_HEADER
69 static const char hdr_name[] HTTPD_STRING_ATTR =
"header";
71 #if WEBSERVER_CONF_FILESTATS
72 static const char file_name[] HTTPD_STRING_ATTR =
"file-stats";
74 #if WEBSERVER_CONF_TCPSTATS
75 static const char tcp_name[] HTTPD_STRING_ATTR =
"tcp-connections";
77 #if WEBSERVER_CONF_PROCESSES
78 static const char proc_name[] HTTPD_STRING_ATTR =
"processes";
80 #if WEBSERVER_CONF_SENSORS
81 static const char sensor_name[] HTTPD_STRING_ATTR =
"sensors";
83 #if WEBSERVER_CONF_ADDRESSES
84 static const char adrs_name[] HTTPD_STRING_ATTR =
"addresses";
86 #if WEBSERVER_CONF_NEIGHBORS
87 static const char nbrs_name[] HTTPD_STRING_ATTR =
"neighbors";
89 #if WEBSERVER_CONF_ROUTES
90 static const char rtes_name[] HTTPD_STRING_ATTR =
"routes";
92 #if WEBSERVER_CONF_TICTACTOE
93 static const char tictac_name[] HTTPD_STRING_ATTR =
"tictac";
95 #if WEBSERVER_CONF_AJAX
96 static const char ajax_name[] HTTPD_STRING_ATTR =
"ajaxdata";
102 #if WEBSERVER_CONF_PROCESSES || WEBSERVER_CONF_TCPSTATS
103 static const char closed[] HTTPD_STRING_ATTR =
"CLOSED";
104 static const char syn_rcvd[] HTTPD_STRING_ATTR =
"SYN-RCVD";
105 static const char syn_sent[] HTTPD_STRING_ATTR =
"SYN-SENT";
106 static const char established[] HTTPD_STRING_ATTR =
"ESTABLISHED";
107 static const char fin_wait_1[] HTTPD_STRING_ATTR =
"FIN-WAIT-1";
108 static const char fin_wait_2[] HTTPD_STRING_ATTR =
"FIN-WAIT-2";
109 static const char closing[] HTTPD_STRING_ATTR =
"CLOSING";
110 static const char time_wait[] HTTPD_STRING_ATTR =
"TIME-WAIT";
111 static const char last_ack[] HTTPD_STRING_ATTR =
"LAST-ACK";
112 static const char none[] HTTPD_STRING_ATTR =
"NONE";
113 static const char running[] HTTPD_STRING_ATTR =
"RUNNING";
114 static const char called[] HTTPD_STRING_ATTR =
"CALLED";
115 static const char *states[] = {
130 #if WEBSERVER_CONF_SENSORS
131 static char sensor_temperature[14]=
"Not Available";
132 static char sensor_extvoltage[14]=
"Not Available";
133 static unsigned long last_tempupdate;
136 extern unsigned long radioontime;
137 static unsigned long savedradioontime;
138 extern uint8_t RF230_radio_on, rf230_last_rssi;
139 extern uint16_t RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail;
145 web_set_temp(
char *s)
147 strcpy(sensor_temperature, s);
149 last_tempupdate=seconds;
152 web_set_voltage(
char *s)
154 strcpy(sensor_extvoltage, s);
156 last_extvoltageupdate=seconds;
160 #if WEBSERVER_CONF_CGI
163 PT_THREAD(nullfunction(
struct httpd_state *s,
char *ptr))
170 httpd_cgi(
char *name)
172 struct httpd_cgi_call *f;
175 for(f = calls; f !=
NULL; f = f->next) {
176 if(httpd_strncmp(name, f->name, httpd_strlen(f->name)) == 0) {
182 #if WEBSERVER_CONF_HEADER
184 static unsigned short
185 generate_header(
void *arg)
187 unsigned short numprinted=0;
189 #if WEBSERVER_CONF_HEADER_W3C
191 static const char httpd_cgi_headerw[] HTTPD_STRING_ATTR =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">";
192 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerw);
195 #if WEBSERVER_CONF_HEADER_ICON
197 #ifdef WEBSERVER_CONF_PAGETITLE
198 static const char httpd_cgi_header1[] HTTPD_STRING_ATTR =
"<html><head><title>%s</title><link rel=\"icon\" href=\"favicon.gif\" type=\"image/gif\"></head><body>";
200 static const char httpd_cgi_header1[] HTTPD_STRING_ATTR =
"<html><head><title>Contiki-Nano</title><link rel=\"icon\" href=\"favicon.gif\" type=\"image/gif\"></head><body>";
204 #ifdef WEBSERVER_CONF_PAGETITLE
205 static const char httpd_cgi_header1[] HTTPD_STRING_ATTR =
"<html><head><title>%s</title></head><body>";
207 static const char httpd_cgi_header1[] HTTPD_STRING_ATTR =
"<html><head><title>Contiki-Nano</title></head><body>";
211 #ifdef WEBSERVER_CONF_PAGETITLE
212 #define WAD ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])->destipaddr.u8
214 WEBSERVER_CONF_PAGETITLE;
215 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_header1,buf);
218 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_header1);
221 #if WEBSERVER_CONF_HEADER_MENU
223 static const char httpd_cgi_headerm1[] HTTPD_STRING_ATTR =
"<pre><a href=\"/\">Front page</a>";
224 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerm1);
225 #if WEBSERVER_CONF_SENSORS
227 static const char httpd_cgi_headerm2[] HTTPD_STRING_ATTR =
"|<a href=\"status.shtml\">Status</a>";
228 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerm2);
230 #if WEBSERVER_CONF_TCPSTATS
232 static const char httpd_cgi_headerm3[] HTTPD_STRING_ATTR =
"|<a href=\"tcp.shtml\">Network connections</a>";
233 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerm3);
235 #if WEBSERVER_CONF_PROCESSES
237 static const char httpd_cgi_headerm4[] HTTPD_STRING_ATTR =
"|<a href=\"processes.shtml\">System processes</a>";
238 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerm4);
240 #if WEBSERVER_CONF_FILESTATS
242 static const char httpd_cgi_headerm5[] HTTPD_STRING_ATTR =
"|<a href=\"files.shtml\">File statistics</a>";
243 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerm5);
245 #if WEBSERVER_CONF_TICTACTOE
247 static const char httpd_cgi_headerm6[] HTTPD_STRING_ATTR =
"|<a href=\"/ttt/ttt.shtml\">TicTacToe</a>";
248 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerm6);
250 #if WEBSERVER_CONF_AJAX
252 static const char httpd_cgi_headerm7[] HTTPD_STRING_ATTR =
"|<a href=\"ajax.shtml\">Ajax</a>";
253 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerm7);
255 static const char httpd_cgi_headerme[] HTTPD_STRING_ATTR =
"</pre>";
256 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_headerme);
259 #if UIP_RECEIVE_WINDOW < _MSS1+_MSS2+_MSS3_+MSS4_+MSS5_MSS6+_MSS7+_MSS8+_MSS9
260 #warning ************************************************************
261 #warning UIP_RECEIVE_WINDOW not large enough for header cgi output.
262 #warning Web pages will not render properly!
263 #warning ************************************************************
269 PT_THREAD(header(
struct httpd_state *s,
char *ptr))
280 #if WEBSERVER_CONF_FILESTATS
282 static unsigned short
283 generate_file_stats(
void *arg)
285 struct httpd_state *s = (
struct httpd_state *)arg;
286 #if WEBSERVER_CONF_LOADTIME
287 static const char httpd_cgi_filestat1[] HTTPD_STRING_ATTR =
"<p align=\"right\"><br><br><i>This page has been sent %u times (%1u.%02u sec)</i></body></html>";
289 static const char httpd_cgi_filestat1[] HTTPD_STRING_ATTR =
"<p align=\"right\"><br><br><i>This page has been sent %u times</i></body></html>";
291 static const char httpd_cgi_filestat2[] HTTPD_STRING_ATTR =
"<tr><td><a href=\"%s\">%s</a></td><td>%d</td>";
292 static const char httpd_cgi_filestat3[] HTTPD_STRING_ATTR =
"%5u";
294 struct httpd_fsdata_file_noconst *f,fram;
296 unsigned short numprinted;
298 httpd_fs_cpy(&tmp, s->u.ptr, 20);
302 #if WEBSERVER_CONF_LOADTIME
304 numprinted=httpd_snprintf((
char *)
uip_appdata,
uip_mss(), httpd_cgi_filestat1, httpd_fs_open(s->filename, 0),
307 numprinted=httpd_snprintf((
char *)
uip_appdata,
uip_mss(), httpd_cgi_filestat1, httpd_fs_open(s->filename, 0));
312 }
else if (tmp[0]==
'*') {
314 for(f = (
struct httpd_fsdata_file_noconst *)httpd_fs_get_root();
316 f = (
struct httpd_fsdata_file_noconst *)fram.next) {
319 httpd_memcpy(&fram,f,
sizeof(fram));
321 httpd_fs_cpy(&tmp, fram.name,
sizeof(tmp));
322 #if WEBSERVER_CONF_FILESTATS==2
323 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_filestat2, tmp, tmp, f->count);
325 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_filestat2, tmp, tmp, httpd_filecount[i]);
332 numprinted=httpd_snprintf((
char *)
uip_appdata,
uip_mss(), httpd_cgi_filestat3, httpd_fs_open(tmp, 0));
338 PT_THREAD(file_stats(
struct httpd_state *s,
char *ptr))
351 #if WEBSERVER_CONF_TCPSTATS
353 static unsigned short
354 make_tcp_stats(
void *arg)
356 static const char httpd_cgi_tcpstat1[] HTTPD_STRING_ATTR =
"<tr align=\"center\"><td>%d</td><td>";
357 static const char httpd_cgi_tcpstat2[] HTTPD_STRING_ATTR =
"-%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n";
358 static const char httpd_cgi_tcpstat3[] HTTPD_STRING_ATTR =
"[Room for %d more]";
361 struct httpd_state *s = (
struct httpd_state *)arg;
366 for(numprinted = 0; numprinted <
UIP_CONNS; numprinted++ ) {
367 if((uip_conns[numprinted].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) s->u.count--;
369 return(httpd_snprintf((
char *)
uip_appdata,
uip_mss(), httpd_cgi_tcpstat3, s->u.count));
372 conn = &uip_conns[s->u.count];
376 httpd_strcpy(tstate,states[conn->
tcpstateflags & UIP_TS_MASK]);
377 numprinted += httpd_snprintf((
char *)
uip_appdata + numprinted,
uip_mss() - numprinted,
383 (uip_outstanding(conn))?
'*':
' ',
390 PT_THREAD(tcp_stats(
struct httpd_state *s,
char *ptr))
398 for(s->u.count = 0; s->u.count < UIP_CONNS; ++s->u.count) {
399 if((uip_conns[s->u.count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) {
408 #if WEBSERVER_CONF_PROCESSES
410 static unsigned short
411 make_processes(
void *p)
413 static const char httpd_cgi_proc[] HTTPD_STRING_ATTR =
"<tr align=\"center\"><td>%p</td><td>%s</td><td>%p</td><td>%s</td></tr>\r\n";
414 char name[40],tstate[20];
416 strncpy(name, PROCESS_NAME_STRING((
struct process *)p), 40);
417 petsciiconv_toascii(name, 40);
418 httpd_strcpy(tstate,states[9 + ((
struct process *)p)->state]);
421 * (
char **)(&(((
struct process *)p)->thread)),
426 PT_THREAD(processes(
struct httpd_state *s,
char *ptr))
429 for(s->u.ptr = PROCESS_LIST(); s->u.ptr !=
NULL; s->u.ptr = ((
struct process *)s->u.ptr)->next) {
436 #if WEBSERVER_CONF_ADDRESSES || WEBSERVER_CONF_NEIGHBORS || WEBSERVER_CONF_ROUTES
437 #if WEBSERVER_CONF_SHOW_ROOM
438 static const char httpd_cgi_addrf[] HTTPD_STRING_ATTR =
"[Room for %u more]\n";
440 static const char httpd_cgi_addrf[] HTTPD_STRING_ATTR =
"[Table is full]\n";
442 static const char httpd_cgi_addrn[] HTTPD_STRING_ATTR =
"[None]\n";
445 #if WEBSERVER_CONF_ADDRESSES
449 static unsigned short
450 make_addresses(
void *p)
453 uint16_t numprinted = 0;
454 for (i=0; i<UIP_DS6_ADDR_NB;i++) {
455 if (uip_ds6_if.addr_list[i].isused) {
457 numprinted += httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr,
uip_appdata + numprinted);
461 #if WEBSERVER_CONF_SHOW_ROOM
462 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_addrf, UIP_DS6_ADDR_NB-j);
464 if(UIP_DS6_ADDR_NB == j) {
465 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_addrf);
472 PT_THREAD(addresses(
struct httpd_state *s,
char *ptr))
482 #if WEBSERVER_CONF_NEIGHBORS
484 static unsigned short
485 make_neighbors(
void *p)
488 uint16_t numprinted=0;
489 struct httpd_state *s=p;
493 i=s->starti;j=s->startj;
494 for(nbr = nbr_table_head(ds6_neighbors);
496 nbr = nbr_table_next(ds6_neighbors, nbr), i++) {
499 #if WEBSERVER_CONF_NEIGHBOR_STATUS
500 static const char httpd_cgi_nbrs1[] HTTPD_STRING_ATTR =
" INCOMPLETE";
501 static const char httpd_cgi_nbrs2[] HTTPD_STRING_ATTR =
" REACHABLE";
502 static const char httpd_cgi_nbrs3[] HTTPD_STRING_ATTR =
" STALE";
503 static const char httpd_cgi_nbrs4[] HTTPD_STRING_ATTR =
" DELAY";
504 static const char httpd_cgi_nbrs5[] HTTPD_STRING_ATTR =
" NBR_PROBE";
505 {uint16_t k=numprinted+25;
506 numprinted += httpd_cgi_sprint_ip6(nbr->ipaddr,
uip_appdata + numprinted);
507 while (numprinted < k) {*((
char *)
uip_appdata+numprinted++) =
' ';}
508 switch (nbr->state) {
510 case NBR_REACHABLE: numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_nbrs2);
break;
511 case NBR_STALE: numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_nbrs3);
break;
512 case NBR_DELAY: numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_nbrs4);
break;
513 case NBR_PROBE: numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_nbrs5);
break;
517 numprinted += httpd_cgi_sprint_ip6(nbr->ipaddr,
uip_appdata + numprinted);
522 if(numprinted > (
uip_mss() - 50)) {
523 s->savei=i;s->savej=j;
527 #if WEBSERVER_CONF_SHOW_ROOM
528 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_addrf,NBR_TABLE_MAX_NEIGHBORS-j);
530 if(NBR_TABLE_MAX_NEIGHBORS == j) {
531 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_addrf);
541 PT_THREAD(neighbors(
struct httpd_state *s,
char *ptr))
547 s->starti=s->startj=0;
550 s->starti=s->savei+1;s->startj=s->savej;
557 #if WEBSERVER_CONF_ROUTES
558 #if WEBSERVER_CONF_ROUTE_LINKS
559 static const char httpd_cgi_rtesl1[] HTTPD_STRING_ATTR =
"<a href=http://[";
560 static const char httpd_cgi_rtesl2[] HTTPD_STRING_ATTR =
"]/status.shtml>";
561 static const char httpd_cgi_rtesl3[] HTTPD_STRING_ATTR =
"</a>";
564 static unsigned short
567 static const char httpd_cgi_rtes1[] HTTPD_STRING_ATTR =
"/%u (via ";
568 static const char httpd_cgi_rtes2[] HTTPD_STRING_ATTR =
") %lus\n";
569 static const char httpd_cgi_rtes3[] HTTPD_STRING_ATTR =
")\n";
571 uint16_t numprinted=0;
572 struct httpd_state *s=p;
576 i=s->starti;j=s->startj;
577 for(r = uip_ds6_route_head();
579 r = uip_ds6_route_next(r)) {
582 #if WEBSERVER_CONF_ROUTE_LINKS
583 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtesl1);
584 numprinted += httpd_cgi_sprint_ip6(r->ipaddr,
uip_appdata + numprinted);
585 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtesl2);
586 numprinted += httpd_cgi_sprint_ip6(r->ipaddr,
uip_appdata + numprinted);
587 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtesl3);
589 numprinted += httpd_cgi_sprint_ip6(r->ipaddr,
uip_appdata + numprinted);
592 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtes1, r->length);
593 numprinted += httpd_cgi_sprint_ip6(uip_ds6_route_nexthop(r),
uip_appdata + numprinted);
594 if(1 || r->state.lifetime < 3600) {
595 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtes2, (
long unsigned int)r->state.lifetime);
597 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtes3);
600 if(numprinted > (
uip_mss() - 200)) {
601 s->savei=i;s->savej=j;
606 if (j==0) numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_addrn);
607 #if WEBSERVER_CONF_SHOW_ROOM
608 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_addrf,UIP_DS6_ROUTE_NB-j);
610 if(UIP_DS6_ROUTE_NB == j) {
611 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_addrf);
615 static const char httpd_cgi_defr1[] HTTPD_STRING_ATTR =
"\n<big><b>RPL Parent</b></big>\n";
616 static const char httpd_cgi_defr2[] HTTPD_STRING_ATTR =
" (%u sec)\n";
618 uip_ip6addr_t *nexthop = uip_ds6_defrt_choose();
620 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_defr1);
621 numprinted += httpd_cgi_sprint_ip6(*nexthop,
uip_appdata + numprinted);
622 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_defr2,nexthop->lifetime.start+nexthop->lifetime.interval-
clock_seconds());
627 for(locdefrt = uip_ds6_defrt_list;
628 locdefrt < uip_ds6_defrt_list + UIP_DS6_DEFRT_NB; locdefrt++) {
629 if(locdefrt->isused) {
630 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_defr1);
632 #if WEBSERVER_CONF_ROUTE_LINKS && 0
633 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtesl1);
634 numprinted += httpd_cgi_sprint_ip6(locdefrt->ipaddr,
uip_appdata + numprinted);
635 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtesl2);
636 numprinted += httpd_cgi_sprint_ip6(locdefrt->ipaddr,
uip_appdata + numprinted);
637 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_rtesl3);
639 numprinted += httpd_cgi_sprint_ip6(locdefrt->ipaddr,
uip_appdata + numprinted);
641 numprinted += httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_defr2,locdefrt->lifetime.start+locdefrt->lifetime.interval-
clock_seconds());
654 PT_THREAD(routes(
struct httpd_state *s,
char *ptr))
660 s->starti=s->startj=0;
663 s->starti=s->savei+1;s->startj=s->savej;
670 #if WEBSERVER_CONF_SENSORS
672 static unsigned short
673 generate_sensor_readings(
void *arg)
675 uint16_t numprinted=0;
678 static const char httpd_cgi_sensor0[] HTTPD_STRING_ATTR =
"[Updated %d seconds ago]\n";
679 static const char httpd_cgi_sensor1[] HTTPD_STRING_ATTR =
"<em>Temperature:</em> %s\n";
680 static const char httpd_cgi_sensor2[] HTTPD_STRING_ATTR =
"<em>Battery :</em> %s\n";
681 static const char httpd_cgi_sensor3[] HTTPD_STRING_ATTR =
"<em>Uptime :</em> %02d:%02d:%02d\n";
682 static const char httpd_cgi_sensor3d[] HTTPD_STRING_ATTR =
"<em>Uptime :</em> %u days %02u:%02u:%02u\n";
685 #if CONTIKI_TARGET_AVR_ATMEGA128RFA1
700 while (ADCSRA&(1<<ADSC));
702 while (ADCSRA&(1<<ADSC));
708 static const char httpd_cgi_sensor1_printf[] HTTPD_STRING_ATTR =
"%d.%d C";
709 httpd_snprintf(sensor_temperature,
sizeof(sensor_temperature),httpd_cgi_sensor1_printf,m,s);
714 for ( i=16; i<31; i++) {
716 if ((BATMON&(1<<BATMON_OK))==0)
break;
718 h=2550-75*16-75+75*i;
719 static const char httpd_cgi_sensor2_printf[] HTTPD_STRING_ATTR =
"%u mv";
720 httpd_snprintf(sensor_extvoltage,
sizeof(sensor_extvoltage),httpd_cgi_sensor2_printf,h);
722 #elif CONTIKI_TARGET_AVR_RAVEN
732 while (ADCSRA&(1<<ADSC));
734 while (ADCSRA&(1<<ADSC));
740 static const char httpd_cgi_sensor2_printf[] HTTPD_STRING_ATTR =
"%u mv";
741 httpd_snprintf(sensor_extvoltage,
sizeof(sensor_extvoltage),httpd_cgi_sensor2_printf,h);
744 #elif CONTIKI_TARGET_REDBEE_ECONOTAG
752 while (adc_reading[8]==0) adc_service();
757 static const char httpd_cgi_sensorv[] HTTPD_STRING_ATTR =
"<em>ADC chans :</em> %u %u %u %u %u %u %u %u \n";
758 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensorv,
759 adc_reading[0],adc_reading[1],adc_reading[2],adc_reading[3],adc_reading[4],adc_reading[5],adc_reading[6],adc_reading[7]);
764 if (last_tempupdate) {
765 numprinted =httpd_snprintf((
char *)
uip_appdata,
uip_mss(), httpd_cgi_sensor0,(
unsigned int) (seconds-last_tempupdate));
767 if (sensor_temperature[0]!=
'N') {
768 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor1, sensor_temperature);
771 #if CONTIKI_TARGET_REDBEE_ECONOTAG
773 static const char httpd_cgi_sensor2u[] HTTPD_STRING_ATTR =
"<em>Vcc (USB) :</em> %s\n";
774 if(adc_reading[8]<1368) {
775 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor2u, sensor_extvoltage);
777 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor2, sensor_extvoltage);
780 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor2, sensor_extvoltage);
785 savedradioontime = radioontime;
787 h=seconds/3600;s=seconds-h*3600;m=s/60;s=s-m*60;
790 numprinted+=httpd_snprintf((
char *)
uip_appdata + numprinted,
uip_mss() - numprinted, httpd_cgi_sensor3, h,m,s);
793 numprinted+=httpd_snprintf((
char *)
uip_appdata + numprinted,
uip_mss() - numprinted, httpd_cgi_sensor3d, days,h,m,s);
797 #if WEBSERVER_CONF_STATISTICS
799 static unsigned short
800 generate_stats(
void *arg)
807 static const char httpd_cgi_stats[] HTTPD_STRING_ATTR =
"\n<big><b>Statistics</b></big>\n";
815 for (p1=1;p1<ENERGEST_TYPE_MAX;p1++) {
816 if (energest_current_mode[p1]) {
824 static const char httpd_cgi_sensor4[] HTTPD_STRING_ATTR =
"<em>CPU time (ENERGEST):</em> %02u:%02u:%02u (%u.%02u%%)\n";
825 static const char httpd_cgi_sensor10[] HTTPD_STRING_ATTR =
"<em>Radio (ENERGEST):</em> Tx %02u:%02u:%02u (%u.%02u%%) ";
826 static const char httpd_cgi_sensor11[] HTTPD_STRING_ATTR =
"Rx %02u:%02u:%02u (%u.%02u%%)\n";
827 sl=energest_total_time[ENERGEST_TYPE_CPU].current/RTIMER_ARCH_SECOND;
828 h=(10000UL*sl)/seconds;p1=h/100;p2=h-p1*100;h=sl/3600;s=sl-h*3600;m=s/60;s=s-m*60;
829 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor4, h,m,s,p1,p2);
831 sl=energest_total_time[ENERGEST_TYPE_TRANSMIT].current/RTIMER_ARCH_SECOND;
832 h=(10000UL*sl)/seconds;p1=h/100;p2=h-p1*100;h=sl/3600;s=sl-h*3600;m=s/60;s=s-m*60;
833 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor10, h,m,s,p1,p2);
835 sl=energest_total_time[ENERGEST_TYPE_LISTEN].current/RTIMER_ARCH_SECOND;
836 h=(10000UL*sl)/seconds;p1=h/100;p2=h-p1*100;h=sl/3600;s=sl-h*3600;m=s/60;s=s-m*60;
837 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor11, h,m,s,p1,p2);
841 #if CONTIKIMAC_CONF_COMPOWER
845 static const char httpd_cgi_sensor31[] HTTPD_STRING_ATTR =
"<em>ContikiMAC (COMPOWER):</em> Tx %02u:%02u:%02u (%u.%02u%%) ";
846 static const char httpd_cgi_sensor32[] HTTPD_STRING_ATTR =
"Rx %02u:%02u:%02u (%u.%02u%%)\n";
850 p1=h/100;p2=h-p1*100;h=s/3600;s=s-h*3600;m=s/60;s=s-m*60;
851 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor31, h,m,s,p1,p2);
855 p1=h/100;p2=h-p1*100;h=s/3600;s=s-h*3600;m=s/60;s=s-m*60;
856 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor32, h,m,s,p1,p2);
861 #if RIMESTATS_CONF_ENABLED
863 static const char httpd_cgi_sensor21[] HTTPD_STRING_ATTR =
"<em>Packets (RIMESTATS):</em> Tx=%5lu Rx=%5lu TxL=%4lu RxL=%4lu\n";
864 numprinted+=httpd_snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted, httpd_cgi_sensor21,
865 RIMESTATS_GET(tx),RIMESTATS_GET(rx),RIMESTATS_GET(lltx)-RIMESTATS_GET(tx),RIMESTATS_GET(llrx)-RIMESTATS_GET(rx));
870 static const char httpd_cgi_sensor10[] HTTPD_STRING_ATTR =
"<em>Radio on (RF230BB) :</em> %02d:%02d:%02d (%d.%02d%%)\n";
871 static const char httpd_cgi_sensor11[] HTTPD_STRING_ATTR =
"<em>Packets: (RF230BB) :</em> Tx=%5d Rx=%5d TxL=%5d RxL=%5d RSSI=%2ddBm\n";
873 s=(10000UL*savedradioontime)/seconds;
876 h=savedradioontime/3600;
877 s=savedradioontime-h*3600;
885 numprinted+=httpd_snprintf((
char *)
uip_appdata + numprinted,
uip_mss() - numprinted, httpd_cgi_sensor11,\
886 RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail,-92+rf230_last_rssi);
891 numprinted+=httpd_snprintf((
char *)
uip_appdata + numprinted,
uip_mss() - numprinted, httpd_cgi_sensor11,\
892 RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail,p1);
900 PT_THREAD(sensor_readings(
struct httpd_state *s,
char *ptr))
905 #if WEBSERVER_CONF_STATISTICS
913 #if WEBSERVER_CONF_TICTACTOE
915 static uint8_t whowon(
char x) {
917 if (httpd_query[0]==x) {
918 if(((httpd_query[1]==x)&&(httpd_query[2]==x))
919 || ((httpd_query[4]==x)&&(httpd_query[8]==x))
920 || ((httpd_query[3]==x)&&(httpd_query[6]==x))){
924 if (httpd_query[1]==x) {
925 if ((httpd_query[4]==x)&&(httpd_query[7]==x)) {
929 if (httpd_query[2]==x) {
930 if(((httpd_query[4]==x)&&(httpd_query[6]==x))
931 || ((httpd_query[5]==x)&&(httpd_query[8]==x))){
935 if (httpd_query[3]==x) {
936 if ((httpd_query[4]==x)&&(httpd_query[5]==x)) {
940 if (httpd_query[6]==x) {
941 if ((httpd_query[7]==x)&&(httpd_query[8]==x)) {
949 static unsigned short
950 make_tictactoe(
void *p)
952 uint8_t i,newgame,iwon,uwon,nx,no;
954 unsigned short numprinted=0;
957 newgame=0;httpd_query[9]=0;
958 if ((httpd_query[0]==0)||(httpd_query[0]==
' ')) {
960 for (i=0;i<9;i++) httpd_query[i]=
'b';
961 }
else for (i=0;i<9;i++) {
962 if (!((httpd_query[i]==
'x')||(httpd_query[i]==
'o'))) {
968 for (nx=0,no=0,i=0;i<9;i++) {
969 if (httpd_query[i]==
'x') nx++;
970 else if (httpd_query[i]==
'o') no++;
972 if ((no>=nx)&&!newgame) {me=
'x';you=
'o';}
973 else {me=
'o';you=
'x';};
978 if (newgame||iwon||uwon||(nx+no)>=9)
goto showboard;
981 if (me==
'x') nx++;
else no++;
982 if (httpd_query[4]==
'b') httpd_query[4]=me;
983 else if (httpd_query[0]==
'b') httpd_query[0]=me;
984 else if (httpd_query[2]==
'b') httpd_query[2]=me;
985 else if (httpd_query[6]==
'b') httpd_query[6]=me;
986 else if (httpd_query[8]==
'b') httpd_query[8]=me;
987 else if (httpd_query[1]==
'b') httpd_query[1]=me;
988 else if (httpd_query[3]==
'b') httpd_query[3]=me;
989 else if (httpd_query[5]==
'b') httpd_query[5]=me;
990 else if (httpd_query[7]==
'b') httpd_query[7]=me;
998 if (i==4) locater=
'c';
999 else if ((i==1)||(i==7)) locater=
'v';
1000 else if ((i==3)||(i==5)) locater=
'h';
1003 if ((httpd_query[i]==
'b')&&(!(iwon||uwon))) {
1005 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"<a href=ttt.shtml?%s><img src=b",httpd_query);
1008 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"<img src=%c",httpd_query[i]);
1011 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"%c",locater);
1014 if (httpd_query[i]==
'b') {
1017 if ((i==2)||(i==5)) {
1022 if ((nx>(no+1))||(no>(nx+1))) {
1023 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"<br><h2>You cheated!!!</h2>");
1025 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"<br><h2>I Win!</h2>");
1027 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"<br><h2>You Win!</h2>");
1028 }
else if ((nx+no)==9) {
1029 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"<br><h2>Draw!</h2>");
1031 if (iwon||uwon||((nx+no)==9)) {
1032 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"<br><a href=ttt.shtml>Play Again</a>");
1036 if ((nx==0)&&(no==0)) {
1037 numprinted+=snprintf((
char *)
uip_appdata+numprinted,
uip_mss()-numprinted,
"<br><br><a href=ttt.shtml?bbbbbbbb>Let computer move first</a>");
1045 PT_THREAD(tictactoe(
struct httpd_state *s,
char *ptr))
1053 #if WEBSERVER_CONF_AJAX
1056 PT_THREAD(ajax_call(
struct httpd_state *s,
char *ptr))
1058 static struct timer t;
1060 static char buf[128];
1061 static uint8_t numprinted;
1064 #if WEBSERVER_CONF_PASSQUERY
1067 uint8_t i;uint16_t dt=0;
1068 for (i=0;i<WEBSERVER_CONF_PASSQUERY;i++) {
1069 if (httpd_query[i] <
'0' || httpd_query[i] >
'9')
break;
1070 dt = dt*10 + httpd_query[i]-
'0';
1076 if (dt > WEBSERVER_CONF_TIMEOUT/2) s->ajax_timeout = 2*dt;
else s->ajax_timeout = WEBSERVER_CONF_TIMEOUT;
1087 #if CONTIKI_TARGET_SKY
1088 SENSORS_ACTIVATE(sht11_sensor);
1089 SENSORS_ACTIVATE(light_sensor);
1090 numprinted = snprintf(buf,
sizeof(buf),
1091 "t(%d);h(%d);l1(%d);l2(%d);",
1092 sht11_sensor.value(SHT11_SENSOR_TEMP),
1093 sht11_sensor.value(SHT11_SENSOR_HUMIDITY),
1094 light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC),
1095 light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR));
1096 SENSORS_DEACTIVATE(sht11_sensor);
1097 SENSORS_DEACTIVATE(light_sensor);
1099 #elif CONTIKI_TARGET_MB851
1100 SENSORS_ACTIVATE(acc_sensor);
1101 numprinted = snprintf(buf,
sizeof(buf),
"t(%d);ax(%d);ay(%d);az(%d);",
1103 acc_sensor.value(ACC_X_AXIS),
1104 acc_sensor.value(ACC_Y_AXIS),
1105 acc_sensor.value(ACC_Z_AXIS));
1106 SENSORS_DEACTIVATE(acc_sensor);
1108 #elif CONTIKI_TARGET_REDBEE_ECONOTAG
1114 while (adc_reading[8]==0) adc_service();
1120 numprinted = snprintf(buf,
sizeof(buf),
"b(%u);adc(%u,%u,%u,%u,%u,%u,%u,%u);",
1121 1200*0xfff/adc_reading[8],adc_reading[0],adc_reading[1],adc_reading[2],adc_reading[3],adc_reading[4],adc_reading[5],adc_reading[6],adc_reading[7]);
1124 numprinted = snprintf(buf,
sizeof(buf),
"b(%u);adc(%u,%u,%u);",1200*0xfff/adc_reading[8],adc_reading[1],adc_reading[7],adc_reading[8]);
1128 static const char httpd_cgi_ajax11[] HTTPD_STRING_ATTR =
"wt('Econtag [";
1129 static const char httpd_cgi_ajax12[] HTTPD_STRING_ATTR =
"]');";
1130 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax11);
1131 #if WEBSERVER_CONF_PRINTADDR
1134 for (i=0; i<UIP_DS6_ADDR_NB;i++) {
1135 if (uip_ds6_if.addr_list[i].isused) {
1136 numprinted += httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr, buf + numprinted);
1142 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax12);
1144 #elif CONTIKI_TARGET_MINIMAL_NET
1145 static uint16_t c0=0x3ff,c1=0x3ff,c2=0x3ff,c3=0x3ff,c4=0x3ff,c5=0x3ff,c6=0x3ff,c7=0x3ff;
1146 numprinted = snprintf(buf,
sizeof(buf),
"t(%d);b(%u);v(%u);",273+(rand()&0x3f),3300-iter/10,iter);
1147 numprinted += snprintf(buf+numprinted,
sizeof(buf)-numprinted,
"adc(%u,%u,%u,%u,%u,%u,%u,%u);",c0,c1,c2,c3,c4,c5,c6,c7);
1151 c3+=(rand()&0x1f)-15;
1157 static const char httpd_cgi_ajax11[] HTTPD_STRING_ATTR =
"wt('Minimal-net ";
1158 static const char httpd_cgi_ajax12[] HTTPD_STRING_ATTR =
"');";
1159 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax11);
1160 #if WEBSERVER_CONF_PRINTADDR
1163 for (i=0; i<UIP_DS6_ADDR_NB;i++) {
1164 if (uip_ds6_if.addr_list[i].isused) {
1165 numprinted += httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr, buf + numprinted);
1171 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax12);
1174 #elif CONTIKI_TARGET_AVR_ATMEGA128RFA1
1175 { uint8_t i;int16_t tmp,bat;
1188 while (ADCSRA&(1<<ADSC));
1190 while (ADCSRA&(1<<ADSC));
1192 tmp=11*tmp-2728+(tmp>>2);
1198 for ( i=16; i<31; i++) {
1200 if ((BATMON&(1<<BATMON_OK))==0)
break;
1202 bat=2550-75*16-75+75*i;
1203 static const char httpd_cgi_ajax10[] HTTPD_STRING_ATTR =
"t(%u),b(%u);adc(%d,%d,%u,%u,%u,%u,%u,%lu);";
1204 numprinted = httpd_snprintf(buf,
sizeof(buf),httpd_cgi_ajax10,tmp,bat,iter,tmp,bat,sleepcount,OCR2A,0,
clock_time(),
clock_seconds());
1206 static const char httpd_cgi_ajax11[] HTTPD_STRING_ATTR =
"wt('128rfa1 [";
1207 static const char httpd_cgi_ajax12[] HTTPD_STRING_ATTR =
"]');";
1208 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax11);
1209 #if WEBSERVER_CONF_PRINTADDR
1212 for (i=0; i<UIP_DS6_ADDR_NB;i++) {
1213 if (uip_ds6_if.addr_list[i].isused) {
1214 numprinted += httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr, buf + numprinted);
1220 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax12);
1223 #elif CONTIKI_TARGET_AVR_RAVEN
1233 while (ADCSRA&(1<<ADSC));
1235 while (ADCSRA&(1<<ADSC));
1246 static const char httpd_cgi_ajax10[] HTTPD_STRING_ATTR =
"t(%u),b(%u);adc(%d,%d,%u,%u,%u,%u,%u,%lu);";
1247 numprinted = httpd_snprintf(buf,
sizeof(buf),httpd_cgi_ajax10,tmp,bat,iter,tmp,bat,sleepcount,OCR2A,0,
clock_time(),
clock_seconds());
1249 static const char httpd_cgi_ajax11[] HTTPD_STRING_ATTR =
"wt('Raven [";
1250 static const char httpd_cgi_ajax12[] HTTPD_STRING_ATTR =
"]');";
1251 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax11);
1252 #if WEBSERVER_CONF_PRINTADDR
1255 for (i=0; i<UIP_DS6_ADDR_NB;i++) {
1256 if (uip_ds6_if.addr_list[i].isused) {
1257 numprinted += httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr, buf + numprinted);
1263 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax12);
1270 static const char httpd_cgi_ajax10[] HTTPD_STRING_ATTR =
"v(%u);";
1271 numprinted = httpd_snprintf(buf,
sizeof(buf),httpd_cgi_ajax10,iter);
1273 static const char httpd_cgi_ajax11[] HTTPD_STRING_ATTR =
"wt('Contiki Ajax ";
1274 static const char httpd_cgi_ajax12[] HTTPD_STRING_ATTR =
"');";
1275 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax11);
1276 #if WEBSERVER_CONF_PRINTADDR
1279 for (i=0; i<UIP_DS6_ADDR_NB;i++) {
1280 if (uip_ds6_if.addr_list[i].isused) {
1281 numprinted += httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr, buf + numprinted);
1287 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajax12);
1292 #if CONTIKIMAC_CONF_COMPOWER
1300 #if RIMESTATS_CONF_ENABLED
1303 static const char httpd_cgi_ajaxr1[] HTTPD_STRING_ATTR =
"rime(%lu,%lu,%lu,%lu);";
1304 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajaxr1,
1305 RIMESTATS_GET(tx),RIMESTATS_GET(rx),RIMESTATS_GET(lltx)-RIMESTATS_GET(tx),RIMESTATS_GET(llrx)-RIMESTATS_GET(rx));
1308 #if ENERGEST_CONF_ON
1320 static rtimer_clock_t last_send;
1321 rtimer_clock_t delta_time;
1322 static unsigned long last_cpu, last_lpm, last_listen, last_transmit;
1325 if (RTIMER_CLOCK_LT(
RTIMER_NOW(),last_send)) delta_time+=RTIMER_ARCH_SECOND;
1327 static const char httpd_cgi_ajaxe1[] HTTPD_STRING_ATTR =
"p(%lu,%lu,%lu,%lu);";
1328 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajaxe1,
1329 (10000UL*(energest_total_time[ENERGEST_TYPE_CPU].current - last_cpu))/delta_time,
1330 (10000UL*(energest_total_time[ENERGEST_TYPE_LPM].current - last_lpm))/delta_time,
1331 (10000UL*(energest_total_time[ENERGEST_TYPE_TRANSMIT].current - last_transmit))/delta_time,
1332 (10000UL*(energest_total_time[ENERGEST_TYPE_LISTEN].current - last_listen))/delta_time);
1333 last_cpu = energest_total_time[ENERGEST_TYPE_CPU].current;
1334 last_lpm = energest_total_time[ENERGEST_TYPE_LPM].current;
1335 last_transmit = energest_total_time[ENERGEST_TYPE_TRANSMIT].current;
1336 last_listen = energest_total_time[ENERGEST_TYPE_LISTEN].current;
1340 uint16_t cpp,txp,rxp;
1344 sl=energest_total_time[ENERGEST_TYPE_CPU].current/RTIMER_ARCH_SECOND;
1345 cpp=(10000UL*sl)/clockseconds;
1347 sl=energest_total_time[ENERGEST_TYPE_TRANSMIT].current/RTIMER_ARCH_SECOND;
1348 txp=(10000UL*sl)/clockseconds;
1351 sl=energest_total_time[ENERGEST_TYPE_LISTEN].current/RTIMER_ARCH_SECOND;
1352 rxp=(10000UL*sl)/clockseconds;
1354 static const char httpd_cgi_ajaxe2[] HTTPD_STRING_ATTR =
"ener(%u,%u,%u);";
1355 numprinted += httpd_snprintf(buf+numprinted,
sizeof(buf)-numprinted,httpd_cgi_ajaxe2,cpp,txp,rxp);
1375 httpd_cgi_add(
struct httpd_cgi_call *c)
1377 struct httpd_cgi_call *l;
1383 for(l = calls; l->next !=
NULL; l = l->next);
1388 #if WEBSERVER_CONF_HEADER
1389 HTTPD_CGI_CALL( hdr, hdr_name, header );
1391 #if WEBSERVER_CONF_FILESTATS
1392 HTTPD_CGI_CALL( file, file_name, file_stats );
1394 #if WEBSERVER_CONF_TCPSTATS
1395 HTTPD_CGI_CALL( tcp, tcp_name, tcp_stats );
1397 #if WEBSERVER_CONF_PROCESSES
1398 HTTPD_CGI_CALL( proc, proc_name, processes );
1400 #if WEBSERVER_CONF_ADDRESSES
1401 HTTPD_CGI_CALL( adrs, adrs_name, addresses );
1403 #if WEBSERVER_CONF_NEIGHBORS
1404 HTTPD_CGI_CALL( nbrs, nbrs_name, neighbors );
1406 #if WEBSERVER_CONF_ROUTES
1407 HTTPD_CGI_CALL( rtes, rtes_name, routes );
1409 #if WEBSERVER_CONF_SENSORS
1410 HTTPD_CGI_CALL(sensors, sensor_name, sensor_readings);
1412 #if WEBSERVER_CONF_TICTACTOE
1413 HTTPD_CGI_CALL( tictac, tictac_name, tictactoe );
1415 #if WEBSERVER_CONF_AJAX
1416 HTTPD_CGI_CALL( ajax, ajax_name, ajax_call );
1420 httpd_cgi_init(
void)
1422 #if WEBSERVER_CONF_HEADER
1423 httpd_cgi_add( &hdr);
1425 #if WEBSERVER_CONF_FILESTATS
1426 httpd_cgi_add( &file);
1428 #if WEBSERVER_CONF_TCPSTATS
1429 httpd_cgi_add( &tcp);
1431 #if WEBSERVER_CONF_PROCESSES
1432 httpd_cgi_add( &proc);
1434 #if WEBSERVER_CONF_ADDRESSES
1435 httpd_cgi_add( &adrs);
1437 #if WEBSERVER_CONF_NEIGHBORS
1438 httpd_cgi_add( &nbrs);
1440 #if WEBSERVER_CONF_ROUTES
1441 httpd_cgi_add( &rtes);
1443 #if WEBSERVER_CONF_SENSORS
1444 httpd_cgi_add(&sensors);
1446 #if WEBSERVER_CONF_TICTACTOE
1447 httpd_cgi_add( &tictac);
1449 #if WEBSERVER_CONF_AJAX
1450 httpd_cgi_add( &ajax);
1455 #if WEBSERVER_CONF_PRINTADDR
1457 uint8_t httpd_cgi_sprint_ip6(uip_ip6addr_t addr,
char * result)
1459 unsigned char zerocnt = 0;
1460 unsigned char numprinted = 0;
1461 char * starting = result;
1462 unsigned char i = 0;
1463 while (numprinted < 8)
1467 if ((addr.u16[i] == 0) && (zerocnt == 0))
1471 while(addr.u16[zerocnt + i] == 0)
1484 numprinted += zerocnt;
1486 if (zerocnt > 7) {*result++ =
':';*result++ =
':';}
1491 result += sprintf(result,
"%x", (
unsigned int)(uip_ntohs(addr.u16[i])));
1497 if (numprinted != 8)
1501 return (result - starting);
#define UIP_CONNS
The maximum number of simultaneously open TCP connections.
An entry in the routing table.
radio_status_t radio_get_rssi_value(uint8_t *rssi)
This function returns the Received Signal Strength Indication.
struct sensors_sensor temperature_sensor
NOTE: For the temperature measurement, the ADC extended range mode is needed; but this is inaccurate ...
void timer_restart(struct timer *t)
Restart the timer from the current point in time.
#define PSOCK_BEGIN(psock)
Start the protosocket protothread in a function.
Representation of a uIP TCP connection.
void timer_set(struct timer *t, clock_time_t interval)
Set a timer.
uint8_t nrtx
The number of retransmissions for the last segment sent.
#define uip_mss()
Get the current maximum segment size that can be sent on the current connection.
uint16_t lport
The local TCP port, in network byte order.
#define NULL
The null pointer.
uint8_t timer
The retransmission timer.
#define NBR_INCOMPLETE
Possible states for the nbr cache entries.
struct compower_activity compower_idle_activity
The default idle communication activity.
Header file for the communication power accounting module
#define PT_THREAD(name_args)
Declaration of a protothread.
CCIF clock_time_t clock_time(void)
Get the current clock time.
#define PSOCK_WAIT_UNTIL(psock, condition)
Wait until a condition is true.
uint16_t rport
The local remote TCP port, in network byte order.
#define PSOCK_SEND_STR(psock, str)
Send a null-terminated string.
PETSCII/ASCII conversion functions.
#define PSOCK_GENERATOR_SEND(psock, generator, arg)
Generate data with a function and send it.
CCIF uint16_t uip_htons(uint16_t val)
Convert a 16-bit quantity from host byte order to network byte order.
#define PSOCK_END(psock)
Declare the end of a protosocket's protothread.
uint8_t tcpstateflags
TCP state and flags.
CCIF unsigned long clock_seconds(void)
Get the current value of the platform seconds.
#define RTIMER_NOW()
Get the current clock time.
Interface structure (contains all the interface variables)
#define uip_stopped(conn)
Find out if the current connection has been previously stopped with uip_stop().
Header file for Rime statistics
uip_ipaddr_t ripaddr
The IP address of the remote host.
void adc_init(void)
Initializes the ADC controller.
int timer_expired(struct timer *t)
Check if a timer has expired.
An entry in the default router list.
uip_appdata
Pointer to the application data in the packet buffer.
void timer_reset(struct timer *t)
Reset the timer with the same interval.
#define CLOCK_SECOND
A second, measured in system clock time.
An entry in the nbr cache.