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
00040 #include <phymac-clmsg.h>
00041 #include "mmac.h"
00042 #include "mmac-clmsg.h"
00043 #include "clmsg-phy-on-off-switch.h"
00044
00045 static int mmac_addr_counter = 0;
00046
00047
00048 MMac::MMac()
00049 : mac2phy_delay_(1e-9),
00050 addr(mmac_addr_counter++)
00051 {
00052
00053 }
00054
00055 MMac::~MMac()
00056 {
00057 }
00058
00059
00060 int MMac::command(int argc, const char*const* argv)
00061 {
00062 Tcl& tcl = Tcl::instance();
00063 if (argc == 2)
00064 {
00065 if (strcasecmp(argv[1], "addr") == 0)
00066 {
00067 tcl.resultf("%d", addr);
00068 return TCL_OK;
00069 }
00070 }
00071 return Module::command(argc, argv);
00072 }
00073
00074
00075 int MMac::recvSyncClMsg(ClMessage* m)
00076 {
00077 if (m->type() == CLMSG_PHY2MAC_ENDTX)
00078 {
00079 Phy2MacEndTx(((ClMsgPhy2MacEndTx*)m)->pkt);
00080 return 0;
00081 }
00082 else if (m->type() == CLMSG_PHY2MAC_STARTRX)
00083 {
00084 Phy2MacStartRx(((ClMsgPhy2MacEndTx*)m)->pkt);
00085 return 0;
00086 }
00087 else if (m->type() == CLMSG_PHY2MAC_CCA)
00088 {
00089 Phy2MacCCA(((ClMsgPhy2MacCCA*)m)->CCA);
00090 return 0;
00091 }
00092 else if (m->type() == MAC_CLMSG_GET_ADDR)
00093 {
00094 ((MacClMsgGetAddr *)m)->setAddr(addr);
00095 return 0;
00096 }
00097 else return Module::recvSyncClMsg(m);
00098 }
00099
00100
00101 void MMac::recv(Packet* p)
00102 {
00103 hdr_cmn *ch = HDR_CMN(p);
00104 if(ch->direction() == hdr_cmn::UP)
00105 {
00106 Phy2MacEndRx(p);
00107 }
00108 else
00109 {
00110
00111 recvFromUpperLayers(p);
00112 }
00113 }
00114
00115
00116 void MMac::Mac2PhyStartTx(Packet* p)
00117 {
00118 sendDown(p, mac2phy_delay_);
00119 }
00120
00121 void MMac::Mac2PhyStartTx(int moduleId, Packet* p)
00122 {
00123 sendDown(moduleId, p, mac2phy_delay_);
00124 }
00125
00126
00127 void MMac::Phy2MacEndTx(const Packet* p)
00128 {
00129 }
00130
00131 void MMac::Phy2MacStartRx(const Packet* p)
00132 {
00133 }
00134
00135 void MMac::Phy2MacEndRx(Packet* p)
00136 {
00137 }
00138
00139 void MMac::recvFromUpperLayers(Packet* p)
00140 {
00141 }
00142
00143 void MMac::Phy2MacCCA(bool cca)
00144 {
00145 }
00146
00147 double MMac::Mac2PhyTxDuration(Packet* pkt)
00148 {
00149 ClMsgMac2PhyGetTxDuration m(pkt);
00150 sendSyncClMsgDown(&m);
00151 return(m.getDuration());
00152 }
00153
00154 double MMac::Mac2PhyTxDuration(int moduleId, Packet* pkt)
00155 {
00156 ClMsgMac2PhyGetTxDuration m(moduleId, pkt);
00157 sendSyncClMsgDown(&m);
00158 return(m.getDuration());
00159 }
00160
00161 void MMac::Mac2PhyTurnOn()
00162 {
00163 ClMsgPhyOnOffSwitch m;
00164 m.setOn();
00165 sendSyncClMsgDown(&m);
00166 }
00167
00168 void MMac::Mac2PhyTurnOn(int moduleId)
00169 {
00170 ClMsgPhyOnOffSwitch m(moduleId);
00171 m.setOn();
00172 sendSyncClMsgDown(&m);
00173 }
00174
00175 void MMac::Mac2PhyTurnOff()
00176 {
00177 ClMsgPhyOnOffSwitch m;
00178 m.setOff();
00179 sendSyncClMsgDown(&m);
00180 }
00181
00182 void MMac::Mac2PhyTurnOff(int moduleId)
00183 {
00184 ClMsgPhyOnOffSwitch m(moduleId);
00185 m.setOff();
00186 sendSyncClMsgDown(&m);
00187 }
00188
00189 bool MMac::Mac2PhyOnOffSwitchStatus()
00190 {
00191 ClMsgPhyOnOffSwitchStatus m;
00192 sendSyncClMsgDown(&m);
00193 return(m.getStatus());
00194 }
00195
00196 bool MMac::Mac2PhyOnOffSwitchStatus(int moduleId)
00197 {
00198 ClMsgPhyOnOffSwitchStatus m(moduleId);
00199 sendSyncClMsgDown(&m);
00200 return(m.getStatus());
00201 }
00202
00203