]> pere.pagekite.me Git - homepage.git/blob - RoBIOS/wl-ping-1.2.c
Switched blog to hungry.com for now. Updated all links.
[homepage.git] / RoBIOS / wl-ping-1.2.c
1 /*
2 * Author: Petter Reinholdtsen <pere@td.org.uit.no>
3 * Date: 1999-10-22
4
5 * Broadcast "Ping <time> <sender>" every second, and reply to every
6 * broadcast with the same message, substituting "Ping" with "Resp".
7 * When reciveing a "Resp" package, make a note on the sender, the
8 * originator and the time differerence. Print statistics when done.
9
10 */
11
12 #include "eyebot.h"
13 #include <stdio.h>
14 #include <string.h>
15
16 const char *PREFIX = "Ping";
17 const char *RESPONSE ="Resp";
18
19 enum {
20 MSGSIZE = 30
21 };
22
23 void
24 empty_recive_buffer(void)
25 {
26 char msgbuffer[MSGSIZE];
27 char from;
28 int len;
29 while (RADIOCheck())
30 RADIORecv(&from, &len, &msgbuffer[0]);
31 }
32
33 int
34 main(int argc, char *argv[])
35 {
36 int delay = 200; /* 2 second */
37 int nexttime = 0;
38
39 int sumsent = 0, sumrecv = 0, sumtimeused = 0;
40 int sumsbad = 0, sumrbad = 0;
41 int mintimeused = 10000, maxtimeused = 0;
42
43 /* disable input/output buffer */
44 setvbuf (stdout,NULL,_IONBF,0);
45 setvbuf (stdin,NULL,_IONBF,0);
46 LCDClear();
47 LCDMode(SCROLLING|NOCURSOR);
48
49
50 LCDPutString("Wireless ping\n");
51 LCDPutString("----------------");
52 LCDPutString("RADIO init");
53 RADIOInit();
54 LCDPutString(" ok\n");
55
56 LCDMenu("", "", "", "END");
57
58 empty_recive_buffer();
59
60 while (KEY4 != KEYRead())
61 {
62 int now;
63 while (RADIOCheck())
64 { /* Received messages, reply at once */
65 char msgbuffer[MSGSIZE];
66 char from;
67 int len;
68 now = OSGetCount();
69 if (0 != RADIORecv(&from, &len, &msgbuffer[0]))
70 {
71 printf("Bad Recv\n");
72 }
73 else
74 {
75 msgbuffer[len] = 0; /* zero terminate string */
76
77 /* Ping broadcast ? */
78 if (0 == strncmp(PREFIX, msgbuffer, strlen(PREFIX)))
79 {
80 if (from == OSMachineID())
81 sumsbad++;
82 else
83 {
84 /* Make message a response, and send it back */
85 memmove(&msgbuffer[0], RESPONSE, strlen(RESPONSE));
86 if (0 != RADIOSend(from, len, &msgbuffer[0]))
87 printf("Bad send on resp\n");
88 }
89 /* Ping response ? */
90 } else
91 if (0 == strncmp(RESPONSE, msgbuffer, strlen(RESPONSE)))
92 {
93 int then, timeused, originator;
94 sscanf(&msgbuffer[0]+sizeof(RESPONSE), "%d %d",
95 &then, &originator);
96 timeused = now - then;
97
98 if (from != originator) {
99
100 sumrecv++;
101 sumtimeused += timeused;
102 mintimeused = mintimeused > timeused ? timeused : mintimeused;
103 maxtimeused = maxtimeused < timeused ? timeused : maxtimeused;
104
105 printf("Ping (%d:%d) %3d\n", from, originator, timeused);
106 }
107 else
108 sumrbad++;
109 }
110 }
111 }
112
113 now = OSGetCount();
114
115 if (now >= nexttime)
116 { /* Time to send new broadcast */
117 char msgbuffer[MSGSIZE+1];
118 static int firsttime = 1;
119
120 sprintf(msgbuffer, "%s %06d %02d", PREFIX, now, OSMachineID());
121 if (0 != RADIOSend(BROADCAST, strlen(msgbuffer), msgbuffer))
122 printf("Bad send on bc\n");
123
124 if (firsttime)
125 {
126 printf("Packet size %ld\n", strlen(msgbuffer));
127 firsttime = 0;
128 }
129
130 sumsent++;
131 nexttime = now + delay;
132 }
133 }
134
135 printf("----------------");
136 printf("P:S %2d R %2d", sumsent, sumrecv);
137 if (0 != sumsent)
138 printf(" %2d%%", sumrecv*100/sumsent);
139 printf("\n");
140 printf("B:S %2d R %2d\n", sumsbad, sumrbad);
141 if (0 != sumrecv)
142 printf("Time %d<%d<%d\n",
143 mintimeused, sumtimeused / sumrecv, maxtimeused);
144
145 RADIOTerm();
146
147 return 0;
148 }