⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radiosim.cc

📁 COPE the first practical network coding scheme which is developped on click
💻 CC
字号:
/* * radiosim.{cc,hh} -- simulate 802.11-like radio propagation. * Robert Morris * * Copyright (c) 1999-2000 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, subject to the conditions * listed in the Click LICENSE file. These conditions include: you must * preserve this copyright notice, and you cannot mention the copyright * holders in advertising related to the Software without their permission. * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This * notice is a summary of the Click LICENSE file; the license in that file is * legally binding. */#include <click/config.h>#include "radiosim.hh"#include <click/confparse.hh>#include <click/error.hh>#include <click/standard/scheduleinfo.hh>#include <math.h>#include "elements/grid/filterbyrange.hh"CLICK_DECLSRadioSim::RadioSim()  : _task(this), _use_xy(false){}RadioSim::~RadioSim(){}intRadioSim::configure(Vector<String> &conf, ErrorHandler *errh){  int i;  _nodes.clear();  for(i = 0; i < conf.size(); i++){    // check for keywords    String kw;    String rest;    if (cp_keyword(conf[i], &kw, &rest)) {      if (kw == "USE_XY") {	bool res = cp_bool(rest, &_use_xy);	if (!res)	  return errh->error("unable to parse boolean arg to USE_XY keyword");      continue;      }    }    // otherwise it's coordinates    Vector<String> words;    cp_spacevec(conf[i], words);    if(words.size() != 2)      return errh->error("argument %d doesn't have lat and lon", i);    int xlat, xlon;    if(!cp_real10(words[0], 5, &xlat) || !cp_real10(words[1], 5, &xlon))      return errh->error("could not parse lat or lon from arg %d", i);    Node n;    n._lat = ((double)xlat) / 100000.0;    n._lon = ((double)xlon) / 100000.0;    _nodes.push_back(n);  }  return 0;}voidRadioSim::notify_noutputs(int n){  set_noutputs(n);}voidRadioSim::notify_ninputs(int n){  set_ninputs(n);}intRadioSim::initialize(ErrorHandler *errh){  int n, i;    n = ninputs();  assert(n == noutputs());  for(i = _nodes.size(); i < n; i++){    Node no;    no._lat = 0;    no._lon = 0;    _nodes.push_back(no);  }  ScheduleInfo::join_scheduler(this, &_task, errh);  return 0;}boolRadioSim::run_task(){  int in, out;  for(in = 0; in < ninputs(); in++){    Packet *p = input(in).pull();    if(p){      for(out = 0; out < noutputs(); out++){	double r;	if (_use_xy) {	  double dx = _nodes[in]._lat - _nodes[out]._lat;	  double dy = _nodes[in]._lon - _nodes[out]._lon;	  r = sqrt(dx*dx + dy*dy);	}	else {	  grid_location g1 = grid_location(_nodes[in]._lat, _nodes[in]._lon);	  grid_location g2 = grid_location(_nodes[out]._lat, _nodes[out]._lon);	  r = grid_location::calc_range(g1, g2);	}        if (r < 250){          output(out).push(p->clone());        }      }      p->kill();    }  }  _task.fast_reschedule();  return true;}RadioSim::NodeRadioSim::get_node_loc(int i){  if(i >= 0 && i < _nodes.size())    return _nodes[i];  else     return Node(0, 0);}voidRadioSim::set_node_loc(int i, double lat, double lon){  if(i >= 0 && i < _nodes.size()){    _nodes[i]._lat = lat;    _nodes[i]._lon = lon;  }}// Expects a line that looks like// node-index latitude longitudeintRadioSim::rs_write_handler(const String &arg, Element *element,			   void *, ErrorHandler *errh){  RadioSim *l = (RadioSim *) element;  Vector<String> words;  cp_spacevec(arg, words);  int xi, xlat, xlon;  if(words.size() != 3 ||     !cp_integer(words[0], 10, &xi) ||     !cp_real10(words[1], 5, &xlat) ||     !cp_real10(words[2], 5, &xlon))    return errh->error("%s: expecting node-index lat lon", l->id().cc());  if(xi >= 0 && xi < l->nnodes()){    double lat = ((double)xlat) / 100000.0;    double lon = ((double)xlon) / 100000.0;    l->set_node_loc(xi, lat, lon);    return(0);  } else {    return errh->error("%s: illegal index %d", l->id().cc(), xi);  }}StringRadioSim::rs_read_handler(Element *f, void *){  RadioSim *l = (RadioSim *) f;  String s;  int i, n;  n = l->nnodes();  for(i = 0; i < n; i++){    Node n = l->get_node_loc(i);    const int BUFSZ = 255;    char buf[BUFSZ];    snprintf(buf, BUFSZ, "%d %f %f\n", i, n._lat, n._lon);    s += buf;  }  return s;}voidRadioSim::add_handlers(){  add_default_handlers(true);  add_write_handler("loc", rs_write_handler, (void *) 0);  add_read_handler("loc", rs_read_handler, (void *) 0);}ELEMENT_REQUIRES(FilterByRange)EXPORT_ELEMENT(RadioSim)#include <click/vector.cc>template class Vector<RadioSim::Node>;CLICK_ENDDECLS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -