Project

General

Profile

Revision 179

Analyzation program now works.

View differences:

analysis.c
6 6
// all times in milliseconds
7 7
typedef struct RobotDef
8 8
{
9
	int alive;
10

  
9 11
	//times when we last sent a packet
10 12
	int join_time;
11 13
	int bom_on_time;
14
	// passed to us
15
	int token_passed_time;
16
	// passed from us
12 17
	int token_pass_time;
13 18

  
14 19
	//time we have spent in a given state
15 20
	int total_join_time;
16 21
	int total_token_held_time;
17 22
	int total_token_waiting_time;
23
	// delay between sent to us and our BOM on packet
24
	int total_token_delay_time;
18 25
	// times each state has occurred
19 26
	int join_count;
20 27
	int bom_on_count;
21 28
	int token_pass_count;
29
	int token_passed_count;
30
	int death_count;
22 31
} Robot;
23 32

  
24 33
Robot robots[MAX_ROBOTS];
......
36 45
		printf("Failed to open %s.\n", argv[1]);
37 46
		return 0;
38 47
	}
48

  
49
	int i;
50
	for (i = 0; i < MAX_ROBOTS; i++)
51
	{
52
		robots[i].alive = 0;
53
		robots[i].join_time = -1;
54
		robots[i].bom_on_time = -1;
55
		robots[i].token_passed_time = -1;
56
		robots[i].token_pass_time = -1;
57
		robots[i].total_join_time = 0;
58
		robots[i].total_token_delay_time = 0;
59
		robots[i].total_token_held_time = 0;
60
		robots[i].total_token_waiting_time = 0;
61
		robots[i].join_count = 0;
62
		robots[i].bom_on_count = 0;
63
		robots[i].token_pass_count = 0;
64
		robots[i].token_passed_count = 0;
65
		robots[i].death_count = 0;
66
	}
67

  
68
	int time;
69

  
70
	while (!feof(f))
71
	{
72
		int minutes, seconds, millis, robot;
73
		int ret = fscanf(f, "%d:%d.%d: Robot %d ", &minutes, &seconds, &millis, &robot);
74
		if (ret != 4)
75
		{
76
			printf("Error reading times in file.\n");
77
			exit(0);
78
		}
79
		time = (60 * minutes + seconds) * 1000 + millis;
80

  
81
		char c = fgetc(f);
82
		//token passed
83
		if (c == 'p')
84
		{
85
			int nextRobot;
86
			ret = fscanf(f, "assed the token to robot %d. Sensor mat", &nextRobot);
87
			if (ret != 1)
88
			{
89
				printf("Error readings token passed.\n");
90
				exit(0);
91
			}
92

  
93
			int oldalive[MAX_ROBOTS];
94
			for (i = 0; i < MAX_ROBOTS; i++)
95
			{
96
				oldalive[i] = robots[i].alive;
97
				robots[i].alive = 0;
98
			}
99

  
100
			c = fgetc(f);
101
			while (c != '\n') c = fgetc(f);
102
			
103
			do
104
			{
105
				int r, reading;
106
				ret = fscanf(f, "(%d %d)", &r, &reading);
107
				if (ret != 2)
108
				{
109
					break;
110
				}
111
				
112
				robots[r].alive = 1;
113
			} while(1);
114
			robots[robot].alive = 1;
115

  
116
			for (i = 0; i < MAX_ROBOTS; i++)
117
				if (!robots[i].alive && oldalive[i])
118
					robots[i].death_count++;
119
			
120
			robots[robot].token_pass_time = time;
121
			if (robots[robot].bom_on_time != -1)
122
			{
123
				robots[robot].token_pass_count++;
124
				robots[robot].total_token_held_time += time - robots[robot].bom_on_time;
125
				robots[robot].bom_on_time = -1;
126
			}
127

  
128
			if (robots[robot].join_time != -1)
129
			{
130
				robots[robot].total_join_time += time - robots[robot].join_time;
131
				robots[robot].join_time = -1;
132
			}
133

  
134
			robots[nextRobot].token_passed_time = time;
135
			robots[nextRobot].token_passed_count++;
136
			if (robots[nextRobot].token_pass_time != -1)
137
			{
138
				robots[nextRobot].total_token_waiting_time += time - robots[nextRobot].token_pass_time;
139
				robots[nextRobot].token_pass_time = -1;
140
			}
141
		}
142
		else
143
		{
144
			ret = fscanf(f, "as ");
145
			if (ret != 0)
146
			{
147
				printf("Error reading line, unexpected value.\n");
148
				exit(0);
149
			}
150

  
151
			char c = fgetc(f);
152
			// bom on
153
			if (c == 't')
154
			{
155
				ret = fscanf(f, "urned its BOM on.\n");
156
				if (ret != 0)
157
				{
158
					printf("Expected BOM on.\n");
159
					exit(0);
160
				}
161

  
162
				robots[robot].bom_on_time = time;
163
				if (robots[robot].token_passed_time != -1)
164
				{
165
					robots[robot].bom_on_count++;
166
					robots[robot].total_token_delay_time += time - robots[robot].token_passed_time;
167
				}
168
			}
169
			// join request
170
			else if (c == 'r')
171
			{
172
				ret = fscanf(f, "equested to join the token ring.\n");
173
				if (ret != 0)
174
				{
175
					printf("Expected join request.\n");
176
					exit(0);
177
				}
178

  
179
				robots[robot].join_time = time;
180
				robots[robot].join_count++;
181
			}
182
			else
183
			{
184
				printf("Unexpected line.\n");
185
				exit(0);
186
			}
187

  
188
		}
189

  
190
	}
191

  
192
	int end_time = time;
193

  
194
	// analyze information
195
	int join_time = 0, token_held_time = 0, token_waiting_time = 0, token_delay_time = 0;
196
	int token_passed_count = 0, death_count = 0, join_count = 0;
197

  
198
	int num_robots = 0;;
199
	
200
	for (i = 0; i < MAX_ROBOTS; i++)
201
	{
202
		if (robots[i].token_pass_count != 0)
203
			num_robots++;
204
		join_time += robots[i].total_join_time;
205
		token_held_time += robots[i].total_token_held_time;
206
		token_waiting_time += robots[i].total_token_waiting_time;
207
		token_delay_time += robots[i].total_token_delay_time;
208
		token_passed_count += robots[i].token_passed_count;
209
		death_count += robots[i].death_count;
210
		join_count += robots[i].join_count;
211
	}
212

  
213
	int join_average = join_time / join_count;
214
	int token_held_average = token_held_time / token_passed_count;
215
	int token_waiting_average = token_waiting_time / token_passed_count;
216
	int token_delay_average = token_delay_time / token_passed_count;
217

  
218
	// display information
219
	printf("Robots:\t\t\t\t\t\t%d\n", num_robots);
220
	printf("Time (seconds):\t\t\t\t\t%d\n", end_time / 1000 + 1);
221
	printf("Deaths:\t\t\t\t\t\t%d\n", death_count);
222
	printf("\n");
223
	printf("Deaths per Minute:\t\t\t\t%.2g\n", (double)death_count / end_time * 1000 * 60);
224
	printf("Rejoin Time (seconds):\t\t\t\t%.3g\n", (double)join_average / 1000);
225
	printf("Seconds Between BOM Flash and Token Sent:\t%.3g\n",(double)token_held_average / 1000);
226
	printf("Seconds Between Token Sent and Token Returned:\t%.3g\n", (double)token_waiting_average / 1000);
227
	printf("Seconds Between Token Sent and BOM Flash:\t%.3g\n", (double)token_delay_average / 1000);
228
	printf("\n");
229
	printf("Token Passes per Second:\t\t\t%.3g\n", (double)token_passed_count / end_time * 1000);
230
	printf("\n");
231
	printf("Deaths per Robot per Minute:\t\t\t%.2g\n", (double)death_count / end_time * 1000 * 60 / num_robots);
232
	printf("Token Passes per Robot per Second:\t\t%.2g\n", (double)token_passed_count / end_time * 1000 / num_robots);
39 233
}
40 234

  

Also available in: Unified diff