📄 wireless-phy.cc
字号:
// Send the packet channel_->recv(p, this);}int WirelessPhy::sendUp(Packet *p){ /* * Sanity Check */ assert(initialized()); PacketStamp s; double Pr; int pkt_recvd = 0; Pr = p->txinfo_.getTxPr(); // if the node is in sleeping mode, drop the packet simply if (em()) { if (Is_node_on()!= true){ pkt_recvd = 0; goto DONE; } if (Is_sleeping()==true && (Is_node_on() == true)) { pkt_recvd = 0; goto DONE; } } // if the energy goes to ZERO, drop the packet simply if (em()) { if (em()->energy() <= 0) { pkt_recvd = 0; goto DONE; } } if(propagation_) { s.stamp((MobileNode*)node(), ant_, 0, lambda_); Pr = propagation_->Pr(&p->txinfo_, &s, this); if (Pr < CSThresh_) { pkt_recvd = 0; goto DONE; } if (Pr < RXThresh_) { /* * We can detect, but not successfully receive * this packet. */ hdr_cmn *hdr = HDR_CMN(p); hdr->error() = 1;#if DEBUG > 3 printf("SM %f.9 _%d_ drop pkt from %d low POWER %e/%e\n", Scheduler::instance().clock(), node()->index(), p->txinfo_.getNode()->index(), Pr,RXThresh);#endif } } if(modulation_) { hdr_cmn *hdr = HDR_CMN(p); hdr->error() = modulation_->BitError(Pr,hdr->size()); // RPI FSO Extension // hdr->error() = modulation_->BitError(Pr); } /* * The MAC layer must be notified of the packet reception * now - ie; when the first bit has been detected - so that * it can properly do Collision Avoidance / Detection. */ pkt_recvd = 1;DONE: p->txinfo_.getAntenna()->release(); /* WILD HACK: The following two variables are a wild hack. They will go away in the next release... They're used by the mac-802_11 object to determine capture. This will be moved into the net-if family of objects in the future. */ p->txinfo_.RxPr = Pr; p->txinfo_.CPThresh = CPThresh_; /* * Decrease energy if packet successfully received */ if(pkt_recvd && em()) { double rcvtime = hdr_cmn::access(p)->txtime(); // no way to reach here if the energy level < 0 double start_time = MAX(channel_idle_time_, NOW); double end_time = MAX(channel_idle_time_, NOW+rcvtime); double actual_rcvtime = end_time-start_time; if (start_time > update_energy_time_) { em()->DecrIdleEnergy(start_time-update_energy_time_, P_idle_); update_energy_time_ = start_time; } em()->DecrRcvEnergy(actual_rcvtime,Pr_consume_);/* if (end_time > channel_idle_time_) { status_ = RECV; }*/ channel_idle_time_ = end_time; update_energy_time_ = end_time; status_ = IDLE; /* hdr_diff *dfh = HDR_DIFF(p); printf("Node %d receives (%d, %d, %d) energy %lf.\n", node()->address(), dfh->sender_id.addr_, dfh->sender_id.port_, dfh->pk_num, node()->energy()); */ // log node energy if (em()->energy() > 0) { ((MobileNode *)node_)->log_energy(1); } if (em()->energy() <= 0) { // saying node died em()->setenergy(0); ((MobileNode*)node())->log_energy(0); } } return pkt_recvd;}voidWirelessPhy::node_on(){ node_on_= TRUE; status_ = IDLE; if (em() == NULL) return; if (NOW > update_energy_time_) { update_energy_time_ = NOW; }}void WirelessPhy::node_off(){ node_on_= FALSE; status_ = SLEEP; if (em() == NULL) return; if (NOW > update_energy_time_) { em()->DecrIdleEnergy(NOW-update_energy_time_, P_idle_); update_energy_time_ = NOW; }}void WirelessPhy::node_wakeup(){ if (status_== IDLE) return; if (em() == NULL) return; if ( NOW > update_energy_time_ && (status_== SLEEP) ) { //the power consumption when radio goes from SLEEP mode to IDLE mode em()->DecrTransitionEnergy(T_transition_,P_transition_); em()->DecrSleepEnergy(NOW-update_energy_time_, P_sleep_); status_ = IDLE; update_energy_time_ = NOW; // log node energy if (em()->energy() > 0) { ((MobileNode *)node_)->log_energy(1); } else { ((MobileNode *)node_)->log_energy(0); } }}void WirelessPhy::node_sleep(){//// node_on_= FALSE;// if (status_== SLEEP) return; if (em() == NULL) return; if ( NOW > update_energy_time_ && (status_== IDLE) ) { //the power consumption when radio goes from IDLE mode to SLEEP mode em()->DecrTransitionEnergy(T_transition_,P_transition_); em()->DecrIdleEnergy(NOW-update_energy_time_, P_idle_); status_ = SLEEP; update_energy_time_ = NOW; // log node energy if (em()->energy() > 0) { ((MobileNode *)node_)->log_energy(1); } else { ((MobileNode *)node_)->log_energy(0); } }}//voidWirelessPhy::dump(void) const{ Phy::dump(); fprintf(stdout, "\tPt: %f, Gt: %f, Gr: %f, lambda: %f, L: %f\n", Pt_, ant_->getTxGain(0,0,0,lambda_), ant_->getRxGain(0,0,0,lambda_), lambda_, L_); //fprintf(stdout, "\tbandwidth: %f\n", bandwidth_); fprintf(stdout, "--------------------------------------------------\n");}void WirelessPhy::UpdateIdleEnergy(){ if (em() == NULL) { return; } if (NOW > update_energy_time_ && (Is_node_on()==TRUE && status_ == IDLE ) ) { em()-> DecrIdleEnergy(NOW-update_energy_time_, P_idle_); update_energy_time_ = NOW; } // log node energy if (em()->energy() > 0) { ((MobileNode *)node_)->log_energy(1); } else { ((MobileNode *)node_)->log_energy(0); }// idle_timer_.resched(10.0);}double WirelessPhy::getDist(double Pr, double Pt, double Gt, double Gr, double hr, double ht, double L, double lambda){ if (propagation_) { return propagation_->getDist(Pr, Pt, Gt, Gr, hr, ht, L, lambda); } return 0;}//void WirelessPhy::UpdateSleepEnergy(){ if (em() == NULL) { return; } if (NOW > update_energy_time_ && ( Is_node_on()==TRUE && Is_sleeping() == true) ) { em()-> DecrSleepEnergy(NOW-update_energy_time_, P_sleep_); update_energy_time_ = NOW; // log node energy if (em()->energy() > 0) { ((MobileNode *)node_)->log_energy(1); } else { ((MobileNode *)node_)->log_energy(0); } } //A hack to make states consistent with those of in Energy Model for AF int static s=em()->sleep(); if(em()->sleep()!=s){ s=em()->sleep(); if(s==1) node_sleep(); else node_wakeup(); printf("\n AF hack %d\n",em()->sleep()); } sleep_timer_.resched(10.0);}// begin RPI FSO ExtensionWirelessPhy::~WirelessPhy(){}// end RPI FSO Extension
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -