21 #include "ns3/rv-battery-model.h"
22 #include "ns3/wifi-radio-energy-model.h"
23 #include "ns3/rv-battery-model-helper.h"
24 #include "ns3/wifi-radio-energy-model-helper.h"
25 #include "ns3/energy-source-container.h"
26 #include "ns3/device-energy-model-container.h"
29 #include "ns3/simulator.h"
30 #include "ns3/double.h"
31 #include "ns3/config.h"
32 #include "ns3/command-line.h"
33 #include "ns3/string.h"
34 #include "ns3/yans-wifi-helper.h"
64 void CreateLoadProfiles (
void);
74 bool ConstantLoadTest (
double load,
Time expLifetime);
85 bool VariableLoadTest (std::vector<double> loads,
86 std::vector<Time> timeStamps,
119 std::vector<double> loads;
120 std::vector<Time> timeStamps;
123 loads.push_back (0.628);
125 loads.push_back (0.628);
127 timeStamps.push_back (
Seconds (0));
128 timeStamps.push_back (
Seconds (19.5 * 60));
129 timeStamps.push_back (
Seconds (26.0 * 60));
131 profile.
loads = loads;
136 m_loadProfiles.push_back (profile);
142 loads.push_back (0.4947);
144 loads.push_back (0.4947);
146 timeStamps.push_back (
Seconds (0));
147 timeStamps.push_back (
Seconds (31.0 * 60));
148 timeStamps.push_back (
Seconds (41.3 * 60));
150 profile.
loads = loads;
155 m_loadProfiles.push_back (profile);
161 loads.push_back (0.4256);
163 loads.push_back (0.4256);
165 timeStamps.push_back (
Seconds (0));
166 timeStamps.push_back (
Seconds (41.0 * 60));
167 timeStamps.push_back (
Seconds (54.6 * 60));
169 profile.
loads = loads;
174 m_loadProfiles.push_back (profile);
180 loads.push_back (0.2923);
182 loads.push_back (0.2923);
184 timeStamps.push_back (
Seconds (0));
185 timeStamps.push_back (
Seconds (74.6 * 60));
186 timeStamps.push_back (
Seconds (99.5 * 60));
188 profile.
loads = loads;
193 m_loadProfiles.push_back (profile);
199 loads.push_back (0.2227);
201 loads.push_back (0.2227);
203 timeStamps.push_back (
Seconds (0));
204 timeStamps.push_back (
Seconds (105.7 * 60));
205 timeStamps.push_back (
Seconds (140.9 * 60));
207 profile.
loads = loads;
212 m_loadProfiles.push_back (profile);
218 loads.push_back (0.628);
220 loads.push_back (0.628);
222 timeStamps.push_back (
Seconds (0));
223 timeStamps.push_back (
Seconds (19.5 * 60));
224 timeStamps.push_back (
Seconds (29.9 * 60));
226 profile.
loads = loads;
231 m_loadProfiles.push_back (profile);
237 loads.push_back (0.628);
239 loads.push_back (0.628);
241 timeStamps.push_back (
Seconds (0));
242 timeStamps.push_back (
Seconds (19.5 * 60));
243 timeStamps.push_back (
Seconds (22.1 * 60));
245 profile.
loads = loads;
250 m_loadProfiles.push_back (profile);
256 loads.push_back (0.628);
258 loads.push_back (0.628);
260 timeStamps.push_back (
Seconds (0));
261 timeStamps.push_back (
Seconds (23.4 * 60));
262 timeStamps.push_back (
Seconds (29.9 * 60));
264 profile.
loads = loads;
269 m_loadProfiles.push_back (profile);
275 loads.push_back (0.628);
277 loads.push_back (0.628);
279 timeStamps.push_back (
Seconds (0));
280 timeStamps.push_back (
Seconds (15.6 * 60));
281 timeStamps.push_back (
Seconds (22.1 * 60));
283 profile.
loads = loads;
288 m_loadProfiles.push_back (profile);
294 loads.push_back (0.300);
295 loads.push_back (0.628);
296 loads.push_back (0.4947);
297 loads.push_back (0.2523);
298 loads.push_back (0.2341);
299 loads.push_back (0.1379);
300 loads.push_back (0.1139);
301 loads.push_back (0.2656);
303 timeStamps.push_back (
Seconds (0));
304 timeStamps.push_back (
Seconds (0.5 * 60));
305 timeStamps.push_back (
Seconds (5.5 * 60));
306 timeStamps.push_back (
Seconds (10.5 * 60));
307 timeStamps.push_back (
Seconds (35.5 * 60));
308 timeStamps.push_back (
Seconds (60.5 * 60));
309 timeStamps.push_back (
Seconds (85.5 * 60));
310 timeStamps.push_back (
Seconds (110.5 * 60));
312 profile.
loads = loads;
317 m_loadProfiles.push_back (profile);
323 loads.push_back (0.300);
324 loads.push_back (0.1139);
325 loads.push_back (0.1379);
326 loads.push_back (0.2341);
327 loads.push_back (0.2523);
328 loads.push_back (0.4947);
329 loads.push_back (0.628);
330 loads.push_back (0.2656);
332 timeStamps.push_back (
Seconds (0));
333 timeStamps.push_back (
Seconds (0.5 * 60));
334 timeStamps.push_back (
Seconds (25.5 * 60));
335 timeStamps.push_back (
Seconds (50.5 * 60));
336 timeStamps.push_back (
Seconds (75.5 * 60));
337 timeStamps.push_back (
Seconds (100.5 * 60));
338 timeStamps.push_back (
Seconds (105.5 * 60));
339 timeStamps.push_back (
Seconds (110.5 * 60));
341 profile.
loads = loads;
346 m_loadProfiles.push_back (profile);
352 loads.push_back (0.300);
353 loads.push_back (0.1139);
354 loads.push_back (0.1379);
355 loads.push_back (0.2341);
356 loads.push_back (0.2523);
357 loads.push_back (0.4947);
358 loads.push_back (0.0);
359 loads.push_back (0.300);
360 loads.push_back (0.628);
361 loads.push_back (0.2656);
363 timeStamps.push_back (
Seconds (0));
364 timeStamps.push_back (
Seconds (0.5 * 60));
365 timeStamps.push_back (
Seconds (25.5 * 60));
366 timeStamps.push_back (
Seconds (50.5 * 60));
367 timeStamps.push_back (
Seconds (75.5 * 60));
368 timeStamps.push_back (
Seconds (100.5 * 60));
369 timeStamps.push_back (
Seconds (105.5 * 60));
370 timeStamps.push_back (
Seconds (130.5 * 60));
371 timeStamps.push_back (
Seconds (131.0 * 60));
372 timeStamps.push_back (
Seconds (136.0 * 60));
374 profile.
loads = loads;
379 m_loadProfiles.push_back (profile);
385 loads.push_back (0.300);
386 timeStamps.push_back (
Seconds (0));
388 for (
int i = 0; i < 5; i++)
390 loads.push_back (0.628);
391 loads.push_back (0.4947);
392 loads.push_back (0.2523);
393 loads.push_back (0.2341);
394 loads.push_back (0.1379);
395 loads.push_back (0.1139);
397 timeStamps.push_back (
Seconds ((0.5 + i * 22.5) * 60));
398 timeStamps.push_back (
Seconds ((1.5 + i * 22.5) * 60));
399 timeStamps.push_back (
Seconds ((2.5 + i * 22.5) * 60));
400 timeStamps.push_back (
Seconds ((7.5 + i * 22.5) * 60));
401 timeStamps.push_back (
Seconds ((12.5 + i * 22.5) * 60));
402 timeStamps.push_back (
Seconds ((17.5 + i * 22.5) * 60));
405 loads.push_back (0.2656);
406 timeStamps.push_back (
Seconds (110.5 * 60));
408 profile.
loads = loads;
413 m_loadProfiles.push_back (profile);
419 loads.push_back (0.300);
420 timeStamps.push_back (
Seconds (0));
422 for (
int i = 0; i < 5; i++)
424 loads.push_back (0.1139);
425 loads.push_back (0.1379);
426 loads.push_back (0.2341);
427 loads.push_back (0.2523);
428 loads.push_back (0.4947);
429 loads.push_back (0.628);
431 timeStamps.push_back (
Seconds ((0.5 + i * 22.5) * 60));
432 timeStamps.push_back (
Seconds ((5.5 + i * 22.5) * 60));
433 timeStamps.push_back (
Seconds ((10.5 + i * 22.5) * 60));
434 timeStamps.push_back (
Seconds ((15.5 + i * 22.5) * 60));
435 timeStamps.push_back (
Seconds ((20.5 + i * 22.5) * 60));
436 timeStamps.push_back (
Seconds ((21.5 + i * 22.5) * 60));
439 loads.push_back (0.2656);
440 timeStamps.push_back (
Seconds (112.5 * 60));
442 profile.
loads = loads;
447 m_loadProfiles.push_back (profile);
453 loads.push_back (0.2227);
454 loads.push_back (0.2045);
455 loads.push_back (0.1083);
456 loads.push_back (0.0843);
457 loads.push_back (0.2227);
459 timeStamps.push_back (
Seconds (0));
460 timeStamps.push_back (
Seconds (50.0 * 60));
461 timeStamps.push_back (
Seconds (100.0 * 60));
462 timeStamps.push_back (
Seconds (150.0 * 60));
463 timeStamps.push_back (
Seconds (200.0 * 60));
465 profile.
loads = loads;
470 m_loadProfiles.push_back (profile);
476 loads.push_back (0.0843);
477 loads.push_back (0.1083);
478 loads.push_back (0.2045);
479 loads.push_back (0.2227);
480 loads.push_back (0.2227);
482 timeStamps.push_back (
Seconds (0));
483 timeStamps.push_back (
Seconds (50.0 * 60));
484 timeStamps.push_back (
Seconds (100.0 * 60));
485 timeStamps.push_back (
Seconds (150.0 * 60));
486 timeStamps.push_back (
Seconds (200.0 * 60));
488 profile.
loads = loads;
493 m_loadProfiles.push_back (profile);
499 loads.push_back (0.0843);
500 loads.push_back (0.1083);
501 loads.push_back (0.2045);
502 loads.push_back (0.0);
503 loads.push_back (0.2227);
504 loads.push_back (0.2227);
506 timeStamps.push_back (
Seconds (0));
507 timeStamps.push_back (
Seconds (50.0 * 60));
508 timeStamps.push_back (
Seconds (100.0 * 60));
509 timeStamps.push_back (
Seconds (150.0 * 60));
510 timeStamps.push_back (
Seconds (200.0 * 60));
511 timeStamps.push_back (
Seconds (250.0 * 60));
513 profile.
loads = loads;
518 m_loadProfiles.push_back (profile);
524 for (
int i = 0; i < 10; i++)
526 loads.push_back (0.0843);
527 loads.push_back (0.1083);
528 loads.push_back (0.2045);
529 loads.push_back (0.2227);
531 timeStamps.push_back (
Seconds ((0.0 + i * 20.0) * 60));
532 timeStamps.push_back (
Seconds ((5.0 + i * 20.0) * 60));
533 timeStamps.push_back (
Seconds ((10.0 + i * 20.0) * 60));
534 timeStamps.push_back (
Seconds ((15.0 + i * 20.0) * 60));
537 loads.push_back (0.2227);
538 timeStamps.push_back (
Seconds (200.0));
540 profile.
loads = loads;
545 m_loadProfiles.push_back (profile);
551 for (
int i = 0; i < 10; i++)
553 loads.push_back (0.0755);
554 loads.push_back (0.0949);
555 loads.push_back (0.2045);
556 loads.push_back (0.2227);
558 timeStamps.push_back (
Seconds ((0.0 + i * 20.0) * 60));
559 timeStamps.push_back (
Seconds ((5.0 + i * 20.0) * 60));
560 timeStamps.push_back (
Seconds ((10.0 + i * 20.0) * 60));
561 timeStamps.push_back (
Seconds ((15.0 + i * 20.0) * 60));
564 loads.push_back (0.2227);
565 timeStamps.push_back (
Seconds (200.0));
567 profile.
loads = loads;
572 m_loadProfiles.push_back (profile);
578 for (
int i = 0; i < 50; i++)
580 loads.push_back (0.4947);
581 loads.push_back (0.628);
583 timeStamps.push_back (
Seconds ((0.0 + i * 2.0) * 60));
584 timeStamps.push_back (
Seconds ((1.0 + i * 2.0) * 60));
587 profile.
loads = loads;
592 m_loadProfiles.push_back (profile);
598 for (
int i = 0; i < 50; i++)
600 loads.push_back (0.4947);
601 loads.push_back (0.628);
602 loads.push_back (0.0576);
604 timeStamps.push_back (
Seconds ((0.0 + i * 3.0) * 60));
605 timeStamps.push_back (
Seconds ((1.0 + i * 3.0) * 60));
606 timeStamps.push_back (
Seconds ((2.0 + i * 3.0) * 60));
609 profile.
loads = loads;
614 m_loadProfiles.push_back (profile);
620 for (
int i = 0; i < 150; i++)
622 loads.push_back (0.005 + 0.005 * i);
623 timeStamps.push_back (
Seconds ((0.0 + i * 1.0) * 60));
626 profile.
loads = loads;
631 m_loadProfiles.push_back (profile);
638 main (
int argc,
char **argv)
641 cmd.Parse (argc, argv);
648 if (test.ConstantLoadTest (0.640,
Seconds (2844.0)))
651 std::cerr <<
"Problems with constant load test (640mA)." << std::endl;
653 if (test.ConstantLoadTest (0.320,
Seconds (6146.0)))
656 std::cerr <<
"Problems with constant load test (320mA)." << std::endl;
658 if (test.ConstantLoadTest (0.128,
Seconds (16052.0)))
661 std::cerr <<
"Problems with constant load test (128mA)." << std::endl;
663 if (test.ConstantLoadTest (0.064,
Seconds (32561.0)))
666 std::cerr <<
"Problems with constant load test (64mA)." << std::endl;
668 if (test.ConstantLoadTest (0.032,
Seconds (65580.0)))
671 std::cerr <<
"Problems with constant load test (32mA)." << std::endl;
675 test.CreateLoadProfiles ();
679 test.m_alpha = 35220;
681 for (uint32_t i = 0; i < test.m_loadProfiles.size (); i++)
685 if (test.VariableLoadTest (test.m_loadProfiles[i].loads,
686 test.m_loadProfiles[i].timeStamps,
687 test.m_loadProfiles[i].itsyLifetime))
690 std::cerr <<
"Problems with variable load test (Itsy)." << std::endl;
696 test.m_alpha = 40027;
698 for (uint32_t i = 0; i < test.m_loadProfiles.size (); i++)
702 if (test.VariableLoadTest (test.m_loadProfiles[i].loads,
703 test.m_loadProfiles[i].timeStamps,
704 test.m_loadProfiles[i].dualFoilLifeTime))
707 std::cerr <<
"Problems with variable load test (DUALFOIL)." << std::endl;
721 std::string phyMode (
"DsssRate1Mbps");
752 wifi.SetRemoteStationManager (
"ns3::ConstantRateWifiManager",
756 wifiMac.
SetType (
"ns3::AdhocWifiMac");
763 rvModelHelper.
Set (
"RvBatteryModelAlphaValue",
DoubleValue (m_alpha));
764 rvModelHelper.
Set (
"RvBatteryModelBetaValue",
DoubleValue (m_beta));
765 rvModelHelper.
Set (
"RvBatteryModelLowBatteryThreshold",
DoubleValue (0.0));
788 if (actualLifetime != expLifetime)
790 std::cerr <<
"ConstantLoadTest: Incorrect lifetime for load " << load << std::endl;
799 std::vector<Time> timeStamps,
802 NS_ASSERT (loads.size () == timeStamps.size ());
808 std::string phyMode (
"DsssRate1Mbps");
839 wifi.SetRemoteStationManager (
"ns3::ConstantRateWifiManager",
843 wifiMac.
SetType (
"ns3::AdhocWifiMac");
850 rvModelHelper.
Set (
"RvBatteryModelAlphaValue",
DoubleValue (m_alpha));
851 rvModelHelper.
Set (
"RvBatteryModelBetaValue",
DoubleValue (m_beta));
852 rvModelHelper.
Set (
"RvBatteryModelLowBatteryThreshold",
DoubleValue (0.0));
865 for (uint32_t i = 1; i < loads.size (); i++)
868 wifiDevicePtr, loads[i]);
886 if (
Abs (actualLifetime - expLifetime) >
Seconds (120))
888 std::cerr <<
"VariableLoadTest: Incorrect lifetime." << std::endl;