26#include "NetSim_utility.h"
41static void add_mobility_info(NETSIM_ID d,
49 mobilityInfo = calloc(NETWORK->nDeviceCount,
sizeof * mobilityInfo);
50 lastInfo = calloc(NETWORK->nDeviceCount,
sizeof * lastInfo);
52 ptrINFO info = mobilityInfo[d - 1];
54 ptrINFO t = calloc(1,
sizeof * t);
62 lastInfo[d - 1]->next = t;
67 mobilityInfo[d - 1] = t;
70 fprintf(stderr,
"%lf,%d,%lf,%lf,%lf\n",
71 time / SECOND, d, x, y, z);
74static void add_mobility_event()
79 for (d = 0; d < NETWORK->nDeviceCount; d++)
83 NetSim_MOBILITY* mob = DEVICE_MOBILITY(d + 1);
84 mob->pstruCurrentPosition = calloc(1,
sizeof * mob->pstruCurrentPosition);
85 mob->pstruNextPosition = calloc(1,
sizeof * mob->pstruNextPosition);
86 ptrINFO i = mobilityInfo[d];
87 pstruEventDetails->dEventTime = i->time;
88 pstruEventDetails->dPacketSize = 0;
89 pstruEventDetails->nApplicationId = 0;
90 pstruEventDetails->nDeviceId = d + 1;
91 pstruEventDetails->nDeviceType = NETWORK->ppstruDeviceList[d]->nDeviceType;
92 pstruEventDetails->nEventType = TIMER_EVENT;
93 pstruEventDetails->nInterfaceId = 0;
94 pstruEventDetails->nPacketId = 0;
95 pstruEventDetails->nProtocolId = PROTOCOL_MOBILITY;
96 pstruEventDetails->nSubEventType = 0;
97 pstruEventDetails->pPacket = NULL;
98 fnpAddEvent(pstruEventDetails);
102void process_filebased_mobility_event()
106 NETSIM_ID d = pstruEventDetails->nDeviceId;
107 ptrINFO i = mobilityInfo[d - 1];
110 NetSim_MOBILITY* mob = DEVICE_MOBILITY(d);
111 NetSim_COORDINATES* c = mob->pstruCurrentPosition;
112 NetSim_COORDINATES* n = mob->pstruNextPosition;
113 NetSim_COORDINATES* dc = DEVICE(d)->pstruDevicePosition;
126 mobilityInfo[d - 1] = i->next;
128 mobility_pass_position_to_animation(pstruEventDetails->nDeviceId,
129 pstruEventDetails->dEventTime,
130 DEVICE_POSITION(pstruEventDetails->nDeviceId));
131 if (mobilityInfo[d - 1])
133 pstruEventDetails->dEventTime = mobilityInfo[d - 1]->time;
134 fnpAddEvent(pstruEventDetails);
139int FileBasedMobilityPointersFree()
144 for (d = 0; d < NETWORK->nDeviceCount; d++)
146 ptrINFO i = mobilityInfo[d];
149 mobilityInfo[d] = i->next;
160int FileBasedMobilityReadingFile()
163 double time, x, y, z;
171 fprintf(stderr,
"Reading File Based Mobility Input:\n");
172 sprintf(str,
"%s/%s", pszIOPath, mobilityfile);
173 fp = fopen(str,
"r");
179 sprintf(str,
"%s/%s", pszIOPath,
"mobility.txt");
180 fp = fopen(str,
"r");
183 fnSystemError(
"Unable to open mobility.csv/mobility.txt file.\n", str);
195 bool fileEmpty =
true;
197 while (fgets(data, BUFSIZ, fp))
205 char* header = data + 1;
206 const char* delimiters =
", \t\n";
207 char* token = strtok(header, delimiters);
210 if (!_stricmp(token,
"X(KM)"))
215 token = strtok(NULL, delimiters);
227 fprintf(stderr,
"In mobility.txt, invalid data at line no %d\n", lineno);
230 if (*(data + 1) ==
'n')
232 if (*(data + 1) !=
't')
234 fprintf(stderr,
"In mobility.txt, invalid data at line no %d\n", lineno);
238 if (sscanf(data,
"$time %lf \"$node_(%d) %lf %lf %lf\"",
239 &time, &d, &x, &y, &z) == 5)
241 d = fn_NetSim_GetDeviceIdByConfigId(d + 1);
242 if (d > 0 && DEVICE_MOBILITY(d)->nMobilityType == MobilityModel_FILEBASEDMOBILITY)
243 add_mobility_info(d, time * SECOND, x, y, z);
245 fprintf(stderr,
"In mobility.txt, either the device id is invalid or file based mobility not enabled, at line no %d\n", lineno);
250 fprintf(stderr,
"In mobility.txt, invalid data at line no %d\n", lineno);
256 if (sscanf(data,
"%lf,%d,%lf,%lf,%lf\"",
257 &time, &d, &x, &y, &z) == 5)
265 d = fn_NetSim_GetDeviceIdByConfigId(d);
266 if (d > 0 && DEVICE_MOBILITY(d)->nMobilityType == MobilityModel_FILEBASEDMOBILITY)
267 add_mobility_info(d, time * SECOND, x, y, z);
269 fprintf(stderr,
"In mobility.csv, either the device id is invalid or file based mobility not enabled, at line no %d\n", lineno);
274 fprintf(stderr,
"In mobility.csv, invalid data at line no %d\n", lineno);
282 fnSystemError(
"Empty mobility input file detected\n");
284 add_mobility_event();