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
00031
00032
00033
00034
00035
00036
00037
00038 #include <stdio.h>
00039
00040 #include <topography.h>
00041 #include <propagation.h>
00042 #include <wireless-phy.h>
00043
00044 class PacketStamp;
00045 int
00046 Propagation::command(int argc, const char*const* argv)
00047 {
00048 TclObject *obj;
00049
00050 if(argc == 3)
00051 {
00052 if( (obj = TclObject::lookup(argv[2])) == 0)
00053 {
00054 fprintf(stderr, "Propagation: %s lookup of %s failed\n", argv[1],
00055 argv[2]);
00056 return TCL_ERROR;
00057 }
00058
00059 if (strcasecmp(argv[1], "topography") == 0)
00060 {
00061 topo = (Topography*) obj;
00062 return TCL_OK;
00063 }
00064 }
00065 return TclObject::command(argc,argv);
00066 }
00067
00068
00069
00070
00071 double
00072 Propagation::Pr(PacketStamp *, PacketStamp *, Phy *)
00073 {
00074 fprintf(stderr,"Propagation model %s not implemented for generic NetIF\n",
00075 name);
00076 abort();
00077 return 0;
00078 }
00079
00080
00081 double
00082 Propagation::Pr(PacketStamp *, PacketStamp *, WirelessPhy *)
00083 {
00084 fprintf(stderr,
00085 "Propagation model %s not implemented for SharedMedia interface\n",
00086 name);
00087 abort();
00088 return 0;
00089 }
00090
00091 double
00092 Propagation::getDist(double Pr, double Pt, double Gt, double Gr, double hr,
00093 double ht, double L, double lambda)
00094 {
00095 fprintf(stderr,
00096 "Propagtion model %s not implemented for generic use\n", name);
00097 abort();
00098 return 0;
00099 }
00100
00101 double
00102 Propagation::Friis(double Pt, double Gt, double Gr, double lambda, double L, double d)
00103 {
00104
00105
00106
00107
00108
00109
00110
00111 if (d == 0.0)
00112 return Pt;
00113 double M = lambda / (4 * PI * d);
00114 return (Pt * Gt * Gr * (M * M)) / L;
00115 }
00116
00117
00118
00119 static class FreeSpaceClass: public TclClass {
00120 public:
00121 FreeSpaceClass() : TclClass("Propagation/FreeSpace") {}
00122 TclObject* create(int, const char*const*) {
00123 return (new FreeSpace);
00124 }
00125 } class_freespace;
00126
00127
00128 double FreeSpace::Pr(PacketStamp *t, PacketStamp *r, WirelessPhy *ifp)
00129 {
00130 double L = ifp->getL();
00131 double lambda = ifp->getLambda();
00132
00133 double Xt, Yt, Zt;
00134 double Xr, Yr, Zr;
00135
00136 t->getNode()->getLoc(&Xt, &Yt, &Zt);
00137 r->getNode()->getLoc(&Xr, &Yr, &Zr);
00138
00139
00140 Xr += r->getAntenna()->getX();
00141 Yr += r->getAntenna()->getY();
00142 Zr += r->getAntenna()->getZ();
00143 Xt += t->getAntenna()->getX();
00144 Yt += t->getAntenna()->getY();
00145 Zt += t->getAntenna()->getZ();
00146
00147 double dX = Xr - Xt;
00148 double dY = Yr - Yt;
00149 double dZ = Zr - Zt;
00150 double d = sqrt(dX * dX + dY * dY + dZ * dZ);
00151
00152
00153 double Gt = t->getAntenna()->getTxGain(dX, dY, dZ, lambda);
00154 double Gr = r->getAntenna()->getRxGain(dX, dY, dZ, lambda);
00155
00156
00157 double Pr = Friis(t->getTxPr(), Gt, Gr, lambda, L, d);
00158 printf("%lf: d: %lf, Pr: %e\n", Scheduler::instance().clock(), d, Pr);
00159
00160 return Pr;
00161 }
00162
00163 double
00164 FreeSpace::getDist(double Pr, double Pt, double Gt, double Gr, double hr, double ht, double L, double lambda)
00165 {
00166 return sqrt((Pt * Gt * Gr * lambda * lambda) / (L * Pr)) /
00167 (4 * PI);
00168 }
00169