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 #include "umts-wirelessch.h"
00032 #include "umts-headers.h"
00033 #include "umts-phy.h"
00034
00035 static class UmtsWirelessChModuleClass : public TclClass {
00036 public:
00037 UmtsWirelessChModuleClass() : TclClass("Module/UmtsWirelessCh") {}
00038 TclObject* create(int, const char*const*) {
00039 return (new UmtsWirelessChModule());
00040
00041 }
00042 } class_umtswirelesschmodule;
00043
00044 UmtsWirelessChModule::UmtsWirelessChModule() :
00045 ChannelModule(),
00046 BSchsap_(NULL)
00047 {
00048
00049 }
00050
00051 UmtsWirelessChModule::~UmtsWirelessChModule()
00052 {
00053 }
00054
00055
00056
00057 int UmtsWirelessChModule::command(int argc, const char*const* argv)
00058 {
00059 Tcl& tcl = Tcl::instance();
00060 if (argc==3)
00061 {
00062 if (strcasecmp(argv[1],"BSphymoduleId")==0)
00063 {
00064 int id = atoi(argv[2]);
00065 if (id<0)
00066 return TCL_ERROR;
00067
00068 return TCL_OK;
00069 ChSAP *c;
00070 BSchsap_ = NULL;
00071 for (int i=0; i < getChSAPnum(); i++)
00072 {
00073 c = (ChSAP*)getChSAP(i);
00074 if (c->getModuleUpId()==id)
00075 {
00076 BSchsap_ = c;
00077 break;
00078 }
00079 }
00080 if (BSchsap_==NULL)
00081 {
00082 fprintf(stderr,"Error UmtsWirelessChModule::command(%s), does not find the BS phy module, is yet attached?\n", argv[2]);
00083 return TCL_ERROR;
00084 }
00085 }
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 return ChannelModule::command(argc, argv);
00104 }
00105
00106
00107
00108
00109 double UmtsWirelessChModule::getPropDelay(Position *source, Position* dest)
00110 {
00111 return (sqrt( ((source->getX()-dest->getX())*(source->getX()-dest->getX())) +
00112 ((source->getY()-dest->getY())*(source->getY()-dest->getY())) )
00113 / SPEED_OF_LIGHT);
00114 }
00115
00116 void UmtsWirelessChModule::sendUpPhy(Packet *p,ChSAP *chsap)
00117 {
00118
00119
00120 Scheduler &s = Scheduler::instance();
00121 struct hdr_cmn *hdr = HDR_CMN(p);
00122 hdr_umtsphy* uh = HDR_UMTSPHY(p);
00123
00124 hdr->direction() = hdr_cmn::UP;
00125 Position *sourcePos = chsap->getPosition();
00126
00127 if ((BSchsap_!=NULL)&&(uh->direction == DIRECTION_UPLINK))
00128 {
00129
00130 s.schedule(BSchsap_ ,p->copy(), getPropDelay(sourcePos, BSchsap_->getPosition()));
00131 }
00132 else
00133 {
00134
00135
00136
00137 ChSAP *dest;
00138
00139
00140 for (int i=0; i < getChSAPnum(); i++) {
00141
00142 dest = (ChSAP*)getChSAP(i);
00143 if (chsap == dest)
00144 continue;
00145
00146 s.schedule(dest,
00147 p->copy(),
00148 getPropDelay(sourcePos, dest->getPosition()));
00149 }
00150 }
00151 Packet::free(p);
00152 }
00153
00154 void UmtsWirelessChModule::recv(Packet *p, ChSAP* chsap)
00155 {
00156 sendUpPhy(p, chsap);
00157 }