/** * Jeff Rupp * Master's Thesis * 2005 * */ package jdr.mobisim; import org.apache.log4j.*; public abstract class PropagationIF { private static Logger m_logger = Logger.getLogger(PropagationIF.class); private static PropagationIF s_instance = null; private static String s_instanceClassName = ""; protected int m_dataRateBps = 1000000; // this string is a system property that will set a flag, the goal is to // make the propagation layer a packet sniffing router, so that messages are relayed // only to nodes they are intended for. // This should greatly decrease the scheduling overhead, and speed the simlations public static final String s_PERFORM_PACKET_ROUTING = "perform_packet_routing_in_propagation_IF"; protected static boolean s_performPacketRouting = false; public PropagationIF() { } public abstract boolean TransmitData(long xmitTime, int lengthInBits, PacketIF packet, jdr.utils.FloatPoint source, double powerLevel); public abstract boolean TransmitData(long xmitTime, int lengthInBits, PacketIF packet, jdr.utils.FloatPoint source, double powerLevel, boolean doLogs); /** * @return true if another carrier is detected */ public abstract boolean CarrierDetect(long xmitTime, jdr.utils.FloatPoint source); public abstract double GetReceiveSignalStrengthDbm(jdr.utils.FloatPoint source, jdr.utils.FloatPoint dest, double transmitPwrDbm); public abstract void DrawTransmitHistory(int historyCount, java.awt.Graphics2D graphics, java.awt.Rectangle bounds, double xScale, double yScale); public abstract void DrawTransmitsAtTime(java.awt.Graphics2D graphics, java.awt.Rectangle bounds, double xScale, double yScale, long simTime); public void SetDataRateBps(int dataRateBps) { m_dataRateBps = dataRateBps; } public int GetDataRateBps() { return m_dataRateBps; } public double GetTransmitDistance(double powerIndBm) { return powerIndBm; } public static PropagationIF getInstance() { if((s_instance == null) || (!s_instanceClassName.equals(s_instance.getClass().getName()))) { if(s_instanceClassName.length() > 0) { try { Class inst = Class.forName(s_instanceClassName); s_instance = (PropagationIF)inst.newInstance(); } catch(Exception ex) { m_logger.error("Could not create instance of class: "+s_instanceClassName, ex); } } else { m_logger.error("Class name not set"); } s_performPacketRouting = System.getProperty(s_PERFORM_PACKET_ROUTING, "false").equals("true"); } return s_instance; } public static void setInstanceClassName(String className) { s_instanceClassName = className; m_logger.debug("PropagationIF class name set to: "+ className); } }