45#define POWER_PRECISION_THRESHOLD (1e-14)
46#define EPSILON_TIME 0.000000000001
52 : TclClass(
"Module/UW/INTERFERENCE")
76 , initial_interference_time(0)
90 hdr_MPhy *ph = HDR_MPHY(p);
91 hdr_mac *mach = HDR_MAC(p);
92 if (mach->ftype() == MF_CONTROL) {
96 Scheduler::instance().schedule(
102 Scheduler::instance().schedule(
111 std::list<ListNode>::iterator it;
113 if (it->time < NOW - maxinterval_) {
129 double power_temp =
power_list.back().sum_power;
133 ListNode pn(NOW, pw + power_temp, ctrl_temp + 1, data_temp);
136 ListNode pn(NOW, pw + power_temp, ctrl_temp, data_temp + 1);
142 std::cout << NOW <<
" uwinterference::addToInterference, power: " << pw
143 <<
" ,total power: " <<
power_list.back().sum_power
144 <<
" ,ctrl_packet: " <<
power_list.back().ctrl_cnt
145 <<
" ,data packets: " <<
power_list.back().data_cnt
154 std::list<ListNode>::iterator it;
157 if (it->time < NOW - maxinterval_) {
165 std::cerr <<
"uwinterference::removeFromInterference, "
166 <<
"some interference removed wrongly" << std::endl;
169 double power_temp =
power_list.back().sum_power;
192 std::cout << NOW <<
" uwinterference::removeFromInterference, "
194 <<
" ,total power: " <<
power_list.back().sum_power
195 <<
" ,ctrl_packet: " <<
power_list.back().ctrl_cnt
196 <<
" ,data packets: " <<
power_list.back().data_cnt
200 double power_temp =
power_list.back().sum_power;
201 if (power_temp < 0) {
204 <<
" Precision error, negative power: " << power_temp
215 hdr_MPhy *ph = HDR_MPHY(p);
218 std::cout << NOW <<
" uwinterference::getInterferencePower, "
219 <<
"percentage of overlap: " << a << std::endl;
226 double power,
double starttime,
double duration)
228 std::list<ListNode>::reverse_iterator rit;
231 double lasttime = NOW;
232 assert(starttime <= NOW);
233 assert(duration > 0);
236 if (starttime < rit->time) {
237 integral += rit->sum_power * (lasttime - rit->time);
238 lasttime = rit->time;
241 integral += rit->sum_power * (lasttime - starttime);
246 double interference = (integral / duration) - power;
250 std::cout <<
"getInterferencePower() WARNING:"
251 <<
" interference=" << interference
252 <<
" POWER_PRECISION_THRESHOLD="
254 <<
". Precision error, interference set to 0"
259 if (interference < 0) {
262 std::cout <<
"getInterferencePower() WARNING:"
263 <<
" cancellation errors, interference set to 0"
268 std::cout <<
"transmission from " << starttime <<
" to "
269 << starttime + duration <<
" power " << power
270 <<
" gets interference " << interference << std::endl;
288 hdr_MPhy *ph = HDR_MPHY(p);
295 std::list<ListNode>::reverse_iterator rit;
298 double lasttime = NOW;
299 assert(starttime <= NOW);
300 assert(duration > 0);
303 if (starttime < rit->time) {
305 if (rit->ctrl_cnt > 1 || rit->data_cnt > 1) {
306 overlap += (lasttime - rit->time);
308 lasttime = rit->time;
311 if (rit->ctrl_cnt > 1 || rit->data_cnt > 1) {
312 overlap += (lasttime - starttime);
318 return overlap / duration;
324 hdr_MPhy *ph = HDR_MPHY(p);
325 hdr_mac *mach = HDR_MAC(p);
327 if (mach->ftype() == MF_CONTROL) {
338 std::list<ListNode>::reverse_iterator rit;
343 assert(starttime <= NOW);
344 assert(duration > 0);
347 int last_ctrl_cnt = rit->ctrl_cnt;
348 int last_data_cnt = rit->data_cnt;
351 if (starttime < rit->time) {
352 if (last_ctrl_cnt - rit->ctrl_cnt >= 0) {
353 ctrl_pkts += last_ctrl_cnt - rit->ctrl_cnt;
355 if (last_data_cnt - rit->data_cnt >= 0) {
356 data_pkts += last_data_cnt - rit->data_cnt;
358 last_ctrl_cnt = rit->ctrl_cnt;
359 last_data_cnt = rit->data_cnt;
361 ctrl_pkts += rit->ctrl_cnt;
362 data_pkts += rit->data_cnt;
374 std::cout << NOW <<
" uwinterference::getCounters(), collisions"
375 <<
" with ctrl pkts: " << ctrl_pkts
376 <<
", collisions with data pkts: " << data_pkts << std::endl;
379 return counter(ctrl_pkts, data_pkts);
virtual void handle(Event *e)
uwinterference * interference
TclObject * create(int, const char *const *)
virtual counter getCounters(Packet *p)
Returns the counters of collisions.
virtual void addToInterference(Packet *p)
Add a packet to the interference calculation.
EndInterfTimer end_timer
Timer for schedules end of interference for a transmission.
virtual double getTimeOverlap(Packet *p)
Returns the percentage of overlap between current packet and interference packets.
virtual double getCurrentTotalPower()
double use_maxinterval_
set to 1 to use maxinterval_.
virtual double getInterferencePower(Packet *p)
Compute the average interference power for the given packet.
virtual void removeFromInterference(double pw, PKT_TYPE tp)
Remove a packet to the interference calculation.
std::list< ListNode > power_list
List with power and counters.
virtual ~uwinterference()
Destructor of the class uwinterference.
uwinterference()
Constructor of the class uwinterference.
#define POWER_PRECISION_THRESHOLD
Interf_Overlap_Class class_interf_overlap
Implementation of uwinterference class.
std::pair< int, int > counter
counter of collisions