00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "wirelessch-module.h"
00031
00032 static class WirelessChModuleClass : public TclClass {
00033 public:
00034 WirelessChModuleClass() : TclClass("Module/WirelessCh") {}
00035 TclObject* create(int, const char*const*) {
00036 return (new WirelessChModule());
00037
00038 }
00039 } class_wirelesschmodule;
00040
00041 WirelessChModule::WirelessChModule() : ChannelModule(), sorted_(0)
00042 {
00043 bind("CSThresh_", &CSThresh_);
00044 bind("freq_", &freq_);
00045 bind("L_", &L_);
00046 lambda_ = SPEED_OF_LIGHT / freq_;
00047
00048 }
00049
00050 WirelessChModule::~WirelessChModule()
00051 {
00052 }
00053
00054
00055
00056 int WirelessChModule::command(int argc, const char*const* argv)
00057 {
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 return ChannelModule::command(argc, argv);
00076 }
00077
00078
00079 void WirelessChModule::sortChSAPList()
00080 {
00081 if (!getChSAPnum())
00082 return;
00083
00084 sorted_ = true;
00085
00086 int n = getChSAPnum();
00087
00088 for (int i = 0; i < n - 1; i++) {
00089 for (int j = 0; j < (n - 1 - i); j++)
00090 {
00091 if ( ( ((ChSAP *)getChSAP(j+1))->getPosition())->getX() < (((ChSAP *)getChSAP(j))->getPosition())->getX() )
00092 {
00093
00094 swapChSAP(j+1,j);
00095 }
00096 }
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 }
00109
00110
00111
00112 int* WirelessChModule::getInfluencedNodes(Position *p, double radius, int *numInfluencedNodes)
00113 {
00114 double xmin, xmax, ymin, ymax;
00115 int n = 0;
00116
00117 int nodesNum = getChSAPnum();
00118
00119 if (!nodesNum) {
00120 *numInfluencedNodes=-1;
00121 fprintf(stderr, "WirelessChModule::getInfluencedNodes, no ChSAP installed when trying to send!!!\n");
00122 return NULL;
00123 }
00124
00125 xmin = p->getX() - radius;
00126 xmax = p->getX() + radius;
00127 ymin = p->getY() - radius;
00128 ymax = p->getY() + radius;
00129
00130 double xpos,ypos;
00131 double yprec, xprec = 0;
00132
00133
00134 int* tmpList = new int[nodesNum];
00135
00136 for(int i = 0; i < nodesNum; i++)
00137 {
00138 xpos = ( ((ChSAP *)getChSAP(i))->getPosition() )->getX();
00139 ypos = ( ((ChSAP *)getChSAP(i))->getPosition() )->getY();
00140
00141
00142 if (xpos < xprec)
00143 {
00144 delete [] tmpList;
00145
00146 sortChSAPList();
00147 return (getInfluencedNodes(p, radius, numInfluencedNodes));
00148 }
00149
00150 if ( (xpos >= xmin) && (xpos <= xmax) )
00151 {
00152 if (( ypos >= ymin) && ( ypos <= ymax) )
00153 {
00154 tmpList[n++] = i;
00155 }
00156 }
00157 if (xpos > xmax)
00158 break;
00159
00160 xprec = xpos;
00161 yprec = xpos;
00162 }
00163
00164
00165 int* list = new int[n];
00166 memcpy(list, tmpList, n * sizeof(int));
00167 delete [] tmpList;
00168 *numInfluencedNodes = n;
00169 return list;
00170 }
00171
00172
00173 double WirelessChModule::getPropDelay(Position *source, Position* dest)
00174 {
00175 return (sqrt( ((source->getX()-dest->getX())*(source->getX()-dest->getX())) +
00176 ((source->getY()-dest->getY())*(source->getY()-dest->getY())) ) / SPEED_OF_LIGHT);
00177 }
00178
00179 void WirelessChModule::sendUpPhy(Packet *p,ChSAP *chsap)
00180 {
00181
00182
00183 Scheduler &s = Scheduler::instance();
00184 struct hdr_cmn *hdr = HDR_CMN(p);
00185
00186 hdr->direction() = hdr_cmn::UP;
00187
00188 double Pt = p->txinfo_.getTxPr();
00189
00190 double radius = sqrt(( Pt * lambda_ * lambda_) / (L_ * CSThresh_)) / (4 * PI);
00191
00192 if(!sorted_){
00193 sortChSAPList();
00194 }
00195
00196 Position *sourcePos = chsap->getPosition();
00197 ChSAP *dest;
00198
00199 int *affectedNodes;
00200 int numInfluencedNodes = -1, i;
00201 affectedNodes = getInfluencedNodes(chsap->getPosition(), radius + 5, &numInfluencedNodes);
00202
00203 for (i=0; i < numInfluencedNodes; i++) {
00204
00205 dest = (ChSAP*)getChSAP(affectedNodes[i]);
00206 if (chsap == dest)
00207 continue;
00208
00209 s.schedule(dest, p->copy(), getPropDelay(sourcePos, dest->getPosition()));
00210 }
00211
00212 delete [] affectedNodes;
00213
00214 Packet::free(p);
00215 }
00216
00217 void WirelessChModule::recv(Packet *p, ChSAP* chsap)
00218 {
00219 sendUpPhy(p, chsap);
00220 }