--- a/src/uan/model/uan-net-device.cc Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-net-device.cc Tue Aug 16 20:22:40 2011 +0200
@@ -389,5 +389,11 @@
m_mac->SetAddress (UanAddress::ConvertFrom (address));
}
+void
+UanNetDevice::SetSleepMode (bool sleep)
+{
+ m_phy->SetSleepMode (sleep);
+}
+
} // namespace ns3
--- a/src/uan/model/uan-net-device.h Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-net-device.h Tue Aug 16 20:22:40 2011 +0200
@@ -101,6 +101,8 @@
*/
void Clear (void);
+ void SetSleepMode (bool sleep);
+
// Purely virtual functions from base class
virtual void SetIfIndex (const uint32_t index);
virtual uint32_t GetIfIndex (void) const;
--- a/src/uan/model/uan-phy-dual.h Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-phy-dual.h Tue Aug 16 20:22:40 2011 +0200
@@ -248,6 +248,11 @@
*/
void SetSinrModelPhy2 (Ptr<UanPhyCalcSinr> calcSinr);
+ virtual void SetSleepMode (bool sleep)
+ {
+ //TODO This method has to be implemented
+ }
+
/**
* \returns Packet currently being received on Phy1 (Null Ptr if none)
*/
--- a/src/uan/model/uan-phy-gen.cc Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-phy-gen.cc Tue Aug 16 20:22:40 2011 +0200
@@ -522,6 +522,11 @@
NS_LOG_DEBUG ("PHY requested to TX while already Transmitting. Dropping packet.");
return;
}
+ else if (m_state == SLEEP)
+ {
+ NS_LOG_DEBUG ("PHY requested to TX while sleeping. Dropping packet.");
+ return;
+ }
UanTxMode txMode = GetMode (modeNum);
@@ -544,6 +549,12 @@
void
UanPhyGen::TxEndEvent ()
{
+ if (m_state == SLEEP || m_disabled == true)
+ {
+ NS_LOG_DEBUG ("Transmission ended but node sleeping or dead");
+ return;
+ }
+
NS_ASSERT (m_state == TX);
if (GetInterferenceDb ( (Ptr<Packet>) 0) > m_ccaThreshDb)
{
@@ -626,7 +637,7 @@
}
break;
case SLEEP:
- NS_FATAL_ERROR ("SLEEP state handling not yet implemented!");
+ NS_LOG_DEBUG ("Sleep mode. Dropping packet.");
break;
}
@@ -646,6 +657,13 @@
return;
}
+ if (m_disabled || m_state == SLEEP)
+ {
+ NS_LOG_DEBUG ("Sleep mode or dead. Dropping packet");
+ m_pktRx = 0;
+ return;
+ }
+
if (GetInterferenceDb ( (Ptr<Packet>) 0) > m_ccaThreshDb)
{
m_state = CCABUSY;
@@ -811,6 +829,26 @@
m_transducer->AddPhy (this);
}
+void
+UanPhyGen::SetSleepMode (bool sleep)
+{
+ if (sleep)
+ {
+ m_state = SLEEP;
+ if (!m_energyCallback.IsNull ())
+ {
+ m_energyCallback (SLEEP);
+ }
+ }
+ else
+ {
+ m_state = IDLE;
+ if (!m_energyCallback.IsNull ())
+ {
+ m_energyCallback (IDLE);
+ }
+ }
+}
void
UanPhyGen::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
--- a/src/uan/model/uan-phy-gen.h Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-phy-gen.h Tue Aug 16 20:22:40 2011 +0200
@@ -203,6 +203,8 @@
virtual Ptr<Packet> GetPacketRx (void) const;
virtual void Clear (void);
+ virtual void SetSleepMode (bool sleep);
+
private:
typedef std::list<UanPhyListener *> ListenerList;
--- a/src/uan/model/uan-phy.h Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-phy.h Tue Aug 16 20:22:40 2011 +0200
@@ -374,6 +374,8 @@
* Clears all pointer references
*/
virtual void Clear (void) = 0;
+
+ virtual void SetSleepMode (bool sleep) = 0;
};
}