NS2之移动节点能量模型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分类:NS22011-12-10 19:59 1024人阅读评论(0) 收藏举报tclrandomdelaylistfloatclass
移动节点能量函数分析代码:
[cpp]view plaincopy
1.#include
2.#include
3.
4.#include "random.h"
5.#include "energy-model.h"
6.#include "mobilenode.h"
7.#include "god.h"
8.
9.static class EnergyModelClass : public TclClass
10.{
11.public:
12. EnergyModelClass ():TclClass ("EnergyModel") {}
13. TclObject *create (int argc, const char *const *argv) {
14.if (argc == 8) {
15. MobileNode *n=(MobileNode*)TclObject::lookup(argv[4]);
16.return (new EnergyModel(n, atof(argv[5]),
17. atof(argv[6]), atof(argv[7])));
18. } else {
19. Tcl::instance().add_error("Wrong arguments to ErrorModel");
20.return 0;
21. }
22. }
23.} class_energy_model;
24.
25.void EnergyModel::DecrTxEnergy(double txtime, double P_tx)
26.{
27.double dEng = P_tx * txtime;
28.if (energy_ <= dEng)
29. energy_ = 0.0;
30.else
31. energy_ = energy_ - dEng;
32.if (energy_ <= 0.0)
33. God::instance()->ComputeRoute();
34.}
35.
36.
37.void EnergyModel::DecrRcvEnergy(double rcvtime, double P_rcv)
38.{
39.double dEng = P_rcv * rcvtime;
40.if (energy_ <= dEng)
41. energy_ = 0.0;
42.else
43. energy_ = energy_ - dEng;
44.if (energy_ <= 0.0)
45. God::instance()->ComputeRoute();
46.}
47.
48.void EnergyModel::DecrIdleEnergy(double idletime, double P_idle)
49.{
50.double dEng = P_idle * idletime;
51.if (energy_ <= dEng)
52. energy_ = 0.0;
53.else
54. energy_ = energy_ - dEng;
55.if (energy_ <= 0.0)
56. God::instance()->ComputeRoute();
57.}
58.
59.// XXX Moved from . These wireless stuff should NOT stay in the
60.// base node.
61.void EnergyModel::start_powersaving()
62.{
63. snh_ = new SoftNeighborHandler(this);
64. snh_->start();
65.
66. afe_ = new AdaptiveFidelityEntity(this);
67. afe_->start();
68.
69. state_ = EnergyModel::POWERSAVING;
70. state_start_time_ = Scheduler::instance().clock();
71.}
72.
73.void EnergyModel::set_node_sleep(int status)
74.{
75. Tcl& tcl=Tcl::instance();
76.//static float last_time_gosleep;
77.// status = 1 to set node into sleep mode
78.// status = 0 to put node back to idle mode.
79.// time in the sleep mode should be used as credit to idle
80.// time energy consumption
81.if (status) {
82. last_time_gosleep = Scheduler::instance().clock();
83.//printf("id=%d : put node into sleep at %f\n",
84.// address_,last_time_gosleep);
85. sleep_mode_ = status;
86.if (node_->exist_namchan())
87. tcl.evalf("%s add-mark m1 blue hexagon",node_->name());
88. } else {
89. sleep_mode_ = status;
90.if (node_->exist_namchan())
91. tcl.evalf("%s delete-mark m1", node_->name());
92.//printf("id= %d last_time_sleep = %f\n",
93.// address_, last_time_gosleep);
94.if (last_time_gosleep) {
95. total_sleeptime_ += Scheduler::instance().clock() -
96. last_time_gosleep;
97. last_time_gosleep = 0;
98. }
99. }
100.}
101.
102.void EnergyModel::set_node_state(int state)
103.{
104.switch (state_) {
105.case POWERSAVING:
106.case WAITING:
107. state_ = state;
108. state_start_time_ = Scheduler::instance().clock();
109.break;
110.case INROUTE:
111.if (state == POWERSAVING) {