iCub-main
Loading...
Searching...
No Matches
debugFunctions.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2012 iCub Facility, Istituto Italiano di Tecnologia
3 * Authors: Alberto Cardellino
4 * CopyPolicy: Released under the terms of the LGPLv2.1 or later, see LGPL.TXT
5 *
6 */
7
8
9#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
10#include "StdAfx.h"
11#endif
12#include "debugFunctions.h"
13//#include <sys/socket.h>
14//#include <netinet/in.h>
15//#include <arpa/inet.h>
16//#include <netdb.h>
17//#include <unistd.h>
18
19//typedef struct
20//{
21// uint32_t size;
22// uint32_t progNum;
23// struct timeval time;
24//} DeepDebugData;
25//
26//DeepDebugData DDData[MAX_ACQUISITION] = {0};
27//uint32_t errors[MAX_ACQUISITION] = {0};
28
29
30uint32_t missErr[BOARD_NUM] = {0};
31uint32_t lateErr[BOARD_NUM] = {0};
32uint32_t sizeErr[BOARD_NUM] = {0};
33
34static uint32_t idx[BOARD_NUM] = {0};
35
36struct timeval recvTime[BOARD_NUM];
37struct timeval prevTime[BOARD_NUM];
38struct timeval diffTime[BOARD_NUM];
39
40FILE *outFile = stdout;
41
42size_t maxBytes2Read = 1500;
43
44
45
46
47
48uint8_t board;
49uint32_t prevNum[BOARD_NUM] = {0};
50uint32_t progNum[BOARD_NUM] = {0};
51
52//eOabstime_t txtime;
53ACE_UINT64 txtime;
54ACE_UINT16 size_ini[BOARD_NUM] = {0};
55//EOropframe *ropFrame = NULL;
56
57bool error = false;
58int n = 0;
59
60bool check_received_pkt(ACE_INET_Addr *sender_addr, void * pkt, ACE_UINT16 pkt_size)
61{
62 char str[64];
63
64 // detect board
65 if( *sender_addr == eb1)
66 {
67 board = 1;
68 }
69 else if( *sender_addr == eb2)
70 {
71 board = 2;
72 }
73 else if( *sender_addr == eb3)
74 {
75 board = 3;
76 }
77 else if( *sender_addr == eb4)
78 {
79 board = 4;
80 }
81 else if( *sender_addr == eb5)
82 {
83 board = 5;
84 }
85 else if( *sender_addr == eb6)
86 {
87 board = 6;
88 }
89 else
90 {
91 sender_addr->addr_to_string(str, 64, 1);
92 printf(" no board %s\n", str);
93 board = 1;
94 return false;
95 }
96 return do_real_check(board, pkt, pkt_size);
97}
98
99
100bool check_received_pkt(sockaddr *sender_addr, void * pkt, ACE_UINT16 pkt_size)
101{
102 char str[64];
103
104 sockaddr_in *p = (sockaddr_in *) sender_addr;
105 sockaddr_in a;
106 a.sin_addr.s_addr = eb2_addr;
107
108 // detect board
109 if( p->sin_addr.s_addr == a.sin_addr.s_addr )
110 {
111 board = 2;
112 }
113 else
114 {
115 //a.sin_addr.s_addr = eb4_addr;
116 if( p->sin_addr.s_addr == eb4_addr )
117 {
118 board = 4;
119 }
120 else
121 {
122 //sender_addr->addr_to_string(str, 64, 1);
123 printf(" no board %04X\n", p->sin_addr.s_addr);
124 board = 1;
125 return false;
126 }
127 }
128
129 return do_real_check(board, pkt, pkt_size);
130}
131
132
133bool do_real_check(int board, void * pkt, ACE_UINT16 pkt_size)
134{
135 error = false;
136 // // init ropframe
137 // if(NULL == ropFrame)
138 // {
139 // printf("|\n|\tStarting check on eth packets...\n|\n");
140 // ropFrame = eo_ropframe_New();
141 // }
142 //
143 // // Get data from the packet
144 // if( eores_OK != eo_ropframe_Load(ropFrame, (uint8_t*) pkt, pkt_size, maxBytes2Read))
145 // {
146 // printf("Error in the ropFrame!!");
147 // return false;
148 // }
149 //
150 // txtime = eo_ropframe_age_Get(ropFrame);
151
152 char *tmp = ((char*) pkt);
153 memcpy(&txtime, (&tmp[8]), 8);
154
155 if(idx[board] == 0)
156 {
157 printf("received packet size %d\n", pkt_size);
158
159 size_ini[board] = pkt_size;
160 prevNum[board] = (txtime >> 32);
161 gettimeofday(&prevTime[board],NULL);
162 idx[board]++;
163 //AfxMessageBox("Fisrt packet received");
164 printf("Fisrt packet from board=%d\n", board);
165 progNum[board] = (txtime >> 32);
166 }
167
168 else //if(idx[board] < max_idx)
169 {
170 if(size_ini[board] != pkt_size)
171 {
172 // fprintf(outFile, "size of packet %d differs from %d\n", size_ini[board], pkt_size);
173 sizeErr[board]++;
174 }
175
176 progNum[board] = (txtime >> 32);
177
178 if( (progNum[board] - prevNum[board]) != 1)
179 {
180 fprintf(outFile,"missing packet: old = %d, new = %d(0x%04X) - board [%d] \n", prevNum[board], progNum[board], progNum[board], board);
181 missErr[board]++;
182 }
183
184 gettimeofday(&recvTime[board],NULL);
185 timeval_subtract(&diffTime[board], &recvTime[board], &prevTime[board]);
186 if(diffTime[board].tv_usec >= SOGLIA)
187 {
188 // fprintf(outFile, "time between packets %06d.%06d - board [%d] - pkt %d\n", diffTime[board].tv_sec, diffTime[board].tv_usec, board, progNum[board]);
189 lateErr[board]++;
190 }
191
192 // if (error)
193 // {
194 // nErr[board]++;
196 // }
197
198
199 if( (0 == (progNum[board] % 100000)) && (progNum[board] != 0) )
200 {
201 printf(">periodic check:\n\tpkt_size = %d\n" \
202 "\tprogNum[%d] = %d\n", pkt_size, board, progNum[board]);
203 printf("\ttime between packets %06d.%06d - board [%d] - pkt %d\n\n", diffTime[board].tv_sec, diffTime[board].tv_usec, board, progNum[board]);
204 print_data();
205 }
206
209 idx[board]++;
210 }
211 return true;
212}
213
214void print_data(void)
215{
216 char output[2048], tmp[64];
217 sprintf(output,"Printing data...\n");
218 for(board = 0; board <BOARD_NUM; board++)
219 {
220 sprintf(tmp,"errors board[%d] \n",board);
221 strcat(output, tmp);
222 sprintf(tmp,"missing = %d over %d\n", missErr[board], idx[board]);
223 strcat(output, tmp);
224 sprintf(tmp,"late = %d over %d\n", lateErr[board], idx[board]);
225 strcat(output, tmp);
226 sprintf(tmp,"size = %d over %d\n", sizeErr[board], idx[board]);
227 strcat(output, tmp);
228 }
229#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
230 AfxMessageBox(output);
231#else
232 printf(output);
233#endif
234}
235
236
237#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
238// Definition of a gettimeofday function
239
240int gettimeofday(struct timeval *tv, struct timezone *tz)
241{
242 // Define a structure to receive the current Windows filetime
243 FILETIME ft;
244
245 // Initialize the present time to 0 and the timezone to UTC
246 unsigned __int64 tmpres = 0;
247 static int tzflag = 0;
248
249 if (NULL != tv)
250 {
251 GetSystemTimeAsFileTime(&ft);
252
253 // The GetSystemTimeAsFileTime returns the number of 100 nanosecond
254 // intervals since Jan 1, 1601 in a structure. Copy the high bits to
255 // the 64 bit tmpres, shift it left by 32 then or in the low 32 bits.
256 tmpres |= ft.dwHighDateTime;
257 tmpres <<= 32;
258 tmpres |= ft.dwLowDateTime;
259
260 // Convert to microseconds by dividing by 10
261 tmpres /= 10;
262
263 // The Unix epoch starts on Jan 1 1970. Need to subtract the difference
264 // in seconds from Jan 1 1601.
265 tmpres -= DELTA_EPOCH_IN_MICROSECS;
266
267 // Finally change microseconds to seconds and place in the seconds value.
268 // The modulus picks up the microseconds.
269 tv->tv_sec = (long)(tmpres / 1000000UL);
270 tv->tv_usec = (long)(tmpres % 1000000UL);
271 }
272
273 if (NULL != tz)
274 {
275 if (!tzflag)
276 {
277 _tzset();
278 tzflag++;
279 }
280
281 // Adjust for the timezone west of Greenwich
282 tz->tz_minuteswest = _timezone / 60;
283 tz->tz_dsttime = _daylight;
284 }
285
286 return 0;
287}
288#endif
struct timeval recvTime[BOARD_NUM]
size_t maxBytes2Read
void print_data(void)
ACE_UINT64 txtime
uint32_t lateErr[BOARD_NUM]
bool do_real_check(int board, void *pkt, ACE_UINT16 pkt_size)
uint32_t progNum[BOARD_NUM]
uint8_t board
FILE * outFile
struct timeval diffTime[BOARD_NUM]
uint32_t sizeErr[BOARD_NUM]
int n
bool error
struct timeval prevTime[BOARD_NUM]
ACE_UINT16 size_ini[BOARD_NUM]
bool check_received_pkt(ACE_INET_Addr *sender_addr, void *pkt, ACE_UINT16 pkt_size)
uint32_t prevNum[BOARD_NUM]
static uint32_t idx[BOARD_NUM]
uint32_t missErr[BOARD_NUM]
fprintf(fid,'\n')