-
Notifications
You must be signed in to change notification settings - Fork 2
/
pitC.nc
287 lines (263 loc) · 7.18 KB
/
pitC.nc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
/**
* the module implements the pitInfo interface,and completes the operation
* when the the pit table receive a interest packet or a Data packet
* @author ptrdu
* @date 2014-12-23
*/
#define PITSIZE 20
#define PITTIME 5000000
module pitC{
provides{
interface pitInfo;
}
uses{
interface AMSend as pitSend;//send the matched packet
interface Timer<TMilli> as pitFreshTimer;
interface Packet;
interface AMPacket;
}
}
implementation{
message_t * in;
message_t * da;
pit_it pitTable[PITSIZE];
uint8_t pitNum = 0;
In* Inrec;
message_t InBuffer;
uint16_t come_id;
bool sendBusy = FALSE;
uint8_t flag;
uint8_t delFlag;
message_t packet;
Da* send;
Da* Darec;
message_t DaBuffer;
uint16_t go_id;
point msgPoint;
uint8_t type;
uint32_t time;
uint16_t data;
/**
* the task add a interest message into the pit table if no matched item in the pit table
*/
task void addPit();
/**
* the task refresh the pit table,delete the unused item in a periodic
*/
task void fresh();
/**
* the task deal with the received data packet, transmit the data packet if find the matched
* item in the table,if no ,discard the data packet.
*/
task void dealDa();
/**
* the task has the same function in the other modules,send the message.
*/
task void sendMsg();
/**
* the task signal the event pitInfo.InDone after complete the operations when receive
* a interest packet,and set the value in the event as SUCCESS
*/
task void IN_SUCCESS();
/**
* the task signal the event pitInfo.InDone after complete the operations when receive
* a interest packet,and set the value in the event as FAIL
*/
task void IN_FAIL();
/**
* the task signal the event pitInfo.DaDone after complete the operations when receive
* a DATA packet
*/
task void DAdone();
/**
* the function judge whether the received interest packet has already exists in the
* pit item.
* @param item : the item in the pit table
* @param rec : the received interest packet
* @return TRUE: if rec matched the item,else return FALSE
*/
bool equal(pit_it item,In* rec);
/**
* the same function in the others modules......
* @param temp : the area
* @param pos : the point
*/
bool locateIn(area temp,point pos);
command uint8_t pitInfo.pitSize(){
// TODO Auto-generated method stub
return PITSIZE;
}
command bool pitInfo.In_queryPit(message_t *msg){
// TODO Auto-generated method stub
uint8_t i;
in = msg;
memset(&InBuffer,0,sizeof(message_t));
memcpy(&InBuffer,msg,sizeof(message_t));
Inrec = (In*)(call Packet.getPayload(&InBuffer, sizeof(In)));
come_id = call AMPacket.source(&InBuffer);
dbg("PIT","The pit module deal with the received Interest packet!\n");
for(i=0;i<pitNum;i++){
if(equal(pitTable[i],Inrec)){
post IN_SUCCESS();
return TRUE;
}
}
post addPit();
post IN_FAIL();
return FALSE;
}
task void IN_SUCCESS(){
signal pitInfo.InDone(SUCCESS);
}
task void IN_FAIL(){
signal pitInfo.InDone(FAIL);
}
command void pitInfo.init(){
pitNum = 0;
memset(pitTable,0,sizeof(pit_it)*PITSIZE);
call pitFreshTimer.startPeriodic(PITTIME);
}
command bool pitInfo.Da_queryPit(message_t *msg){
// TODO Auto-generated method stub
da = msg;
Darec = (Da*)(call Packet.getPayload(msg, sizeof(Da)));
flag = 0;
dbg("PIT","The pit module deal with the recieved data packet!\n");
post dealDa();
return FALSE;
}
command pit_it * pitInfo.getAll(){
// TODO Auto-generated method stub
return pitTable;
}
command uint8_t pitInfo.getNum(){
// TODO Auto-generated method stub
return pitNum;
}
command void pitInfo.fresh(){
// TODO Auto-generated method stub
post fresh();
}
event void pitSend.sendDone(message_t *msg, error_t error){
// TODO Auto-generated method stub
if(error == SUCCESS){
sendBusy = FALSE;
flag++;
post dealDa();
}
}
event void pitFreshTimer.fired(){
// TODO Auto-generated method stub
post fresh();
}
task void addPit(){
if(pitNum == PITSIZE) return;
pitTable[pitNum].range = Inrec->range;
pitTable[pitNum].start = Inrec->start;
pitTable[pitNum].end = Inrec->end;
pitTable[pitNum].dataType = Inrec->dataType;
pitTable[pitNum].come_id = come_id;
pitTable[pitNum].touched = TRUE;
dbg("PIT","\n\nAdd a new pit item form %d:\n",come_id);
dbg("PIT","****************************************\n");
dbg("PIT","Wanted data's range: %d,%d/%d,%d\n",
pitTable[pitNum].range.downLeft.Lon,pitTable[pitNum].range.downLeft.Lat,
pitTable[pitNum].range.upRight.Lon,pitTable[pitNum].range.upRight.Lat
);
dbg("PIT","Wanted data's collected time: %d--%d\n",
pitTable[pitNum].start,pitTable[pitNum].end);
dbg("PIT","Wanted data's type: %d\n",pitTable[pitNum].dataType);
dbg("PIT","The export node of this pit item %d:\n",pitTable[pitNum].come_id);
dbg("CS","****************************************\n\n");
pitNum++;
dbg("PIT","The number of item in the pit table:%d!\n",pitNum);
}
task void fresh(){
uint8_t i;
uint8_t j;
for(i=0;i<pitNum;i++){
if(!pitTable[i].touched){
for(j=i;j<pitNum-1;j++){
memcpy(&pitTable[j],&pitTable[j+1],sizeof(pit_it));
}
memset(&pitTable[j+1],0,sizeof(pit_it));
pitNum--;
}
}
for(i=0;i<pitNum;i++) pitTable[i].touched = FALSE;
//dbg("PIT","Refresh the pit table!\n");
}
task void dealDa(){
msgPoint = Darec->location;
type = Darec->dataType;
time = Darec->time;
data = Darec->data;
while(flag<pitNum){
if(locateIn(pitTable[flag].range,msgPoint)){
if(pitTable[flag].start<=time && pitTable[flag].end>=time){
if(type == pitTable[flag].dataType){
pitTable[flag].touched = TRUE;
go_id = pitTable[flag].come_id;
post sendMsg();
return;
}
}
}
flag++;
}
post DAdone();
return;
}
task void DAdone(){
signal pitInfo.DaDone(SUCCESS);
}
task void sendMsg(){
send = (Da*)(call Packet.getPayload(&packet, sizeof(Da)));
send->location = msgPoint;
send->dataType = type;
send->type = DATA;
send->data = data;
send->time = time;
if(!sendBusy){
if(call pitSend.send(go_id, &packet, sizeof(Da)) == SUCCESS){
dbg("PIT","\n\nTransmit the data packet to %d:\n",go_id);
dbg("PIT","****************************************\n");
dbg("PIT","point's position: %d,%d\n",
send->location.Lon,send->location.Lat
);
dbg("PIT","The data's type: %d\n",send->dataType);
dbg("PIT","The data's value: %d\n",send->data);
dbg("CS","****************************************\n\n");
sendBusy = TRUE;
}
}
}
bool locateIn(area temp,point pos){
if(temp.downLeft.Lon <= pos.Lon && temp.downLeft.Lat<= pos.Lat){
if(temp.upRight.Lon >= pos.Lon && temp.upRight.Lat >= pos.Lat){
return TRUE;
}
}
return FALSE;
}
bool samePoint(point a,point b){
if(a.Lon==b.Lon && a.Lat==b.Lat) return TRUE;
return FALSE;
}
bool sameRange(area A , area B){
if(samePoint(A.downLeft,B.downLeft) && samePoint(A.upRight,B.upRight)) return TRUE;
return FALSE;
}
bool equal(pit_it item,In* rec){
if(sameRange(item.range,rec->range)){
if(item.start == rec->start){
if(item.end == rec->end){
if(item.dataType == rec->dataType){
return TRUE;
}
}
}
}
return FALSE;
}
}