core-extra/daemon/core/emane/universal.py

132 lines
5.4 KiB
Python

"""
universal.py: EMANE Universal PHY model for CORE. Enumerates configuration items
used for the Universal PHY.
"""
from core import emane
from core.emane.emanemodel import EmaneModel
from core.enumerations import ConfigDataTypes
class EmaneUniversalModel(EmaneModel):
"""
This Univeral PHY model is meant to be imported by other models,
not instantiated.
"""
def __init__(self, session, object_id=None):
raise NotImplemented("Cannot use this class directly")
name = "emane_universal"
_xmlname = "universalphy"
_xmllibrary = "universalphylayer"
# universal PHY parameters
_confmatrix_base = [
("bandwidth", ConfigDataTypes.UINT64.value, "1M",
"", "rf bandwidth (hz)"),
("frequency", ConfigDataTypes.UINT64.value, "2.347G",
"", "frequency (Hz)"),
("frequencyofinterest", ConfigDataTypes.UINT64.value, "2.347G",
"", "frequency of interest (Hz)"),
("subid", ConfigDataTypes.UINT16.value, "1",
"", "subid"),
("systemnoisefigure", ConfigDataTypes.FLOAT.value, "4.0",
"", "system noise figure (dB)"),
("txpower", ConfigDataTypes.FLOAT.value, "0.0",
"", "transmit power (dBm)"),
]
_confmatrix_081 = [
("antennagain", ConfigDataTypes.FLOAT.value, "0.0",
"", "antenna gain (dBi)"),
("antennaazimuth", ConfigDataTypes.FLOAT.value, "0.0",
"", "antenna azimuth (deg)"),
("antennaelevation", ConfigDataTypes.FLOAT.value, "0.0",
"", "antenna elevation (deg)"),
("antennaprofileid", ConfigDataTypes.STRING.value, "1",
"", "antenna profile ID"),
("antennaprofilemanifesturi", ConfigDataTypes.STRING.value, "",
"", "antenna profile manifest URI"),
("antennaprofileenable", ConfigDataTypes.BOOL.value, "0",
"On,Off", "antenna profile mode"),
("defaultconnectivitymode", ConfigDataTypes.BOOL.value, "1",
"On,Off", "default connectivity"),
("frequencyofinterestfilterenable", ConfigDataTypes.BOOL.value, "1",
"On,Off", "frequency of interest filter enable"),
("noiseprocessingmode", ConfigDataTypes.BOOL.value, "0",
"On,Off", "enable noise processing"),
("pathlossmode", ConfigDataTypes.STRING.value, "2ray",
"pathloss,2ray,freespace", "path loss mode"),
]
_confmatrix_091 = [
("fixedantennagain", ConfigDataTypes.FLOAT.value, "0.0",
"", "antenna gain (dBi)"),
("fixedantennagainenable", ConfigDataTypes.BOOL.value, "1",
"On,Off", "enable fixed antenna gain"),
("noisemode", ConfigDataTypes.STRING.value, "none",
"none,all,outofband", "noise processing mode"),
("noisebinsize", ConfigDataTypes.UINT64.value, "20",
"", "noise bin size in microseconds"),
("propagationmodel", ConfigDataTypes.STRING.value, "2ray",
"precomputed,2ray,freespace", "path loss mode"),
]
if emane.VERSION >= emane.EMANE091:
config_matrix = _confmatrix_base + _confmatrix_091
else:
config_matrix = _confmatrix_base + _confmatrix_081
# old parameters
_confmatrix_ver074 = [
("antennaazimuthbeamwidth", ConfigDataTypes.FLOAT.value, "360.0",
"", "azimith beam width (deg)"),
("antennaelevationbeamwidth", ConfigDataTypes.FLOAT.value, "180.0",
"", "elevation beam width (deg)"),
("antennatype", ConfigDataTypes.STRING.value, "omnidirectional",
"omnidirectional,unidirectional", "antenna type"),
]
# parameters that require unit conversion for 0.7.4
_update_ver074 = ("bandwidth", "frequency", "frequencyofinterest")
# parameters that should be removed for 0.7.4
_remove_ver074 = ("antennaprofileenable", "antennaprofileid",
"antennaprofilemanifesturi",
"frequencyofinterestfilterenable")
@classmethod
def getphydoc(cls, e, mac, values, phynames):
phydoc = e.xmldoc("phy")
phy = phydoc.getElementsByTagName("phy").pop()
phy.setAttribute("name", cls._xmlname)
if emane.VERSION < emane.EMANE091:
phy.setAttribute("library", cls._xmllibrary)
# EMANE 0.7.4 suppport - to be removed when 0.7.4 support is deprecated
if emane.VERSION == emane.EMANE074:
names = mac.getnames()
values = list(values)
phynames = list(phynames)
# update units for some parameters
for p in cls._update_ver074:
i = names.index(p)
# these all happen to be KHz, so 1000 is used
values[i] = cls.emane074_fixup(values[i], 1000)
# remove new incompatible options
for p in cls._remove_ver074:
phynames.remove(p)
# insert old options with their default values
for old in cls._confmatrix_ver074:
phy.appendChild(e.xmlparam(phydoc, old[0], old[2]))
frequencies = None
if emane.VERSION >= emane.EMANE091:
name = "frequencyofinterest"
value = mac.valueof(name, values)
frequencies = cls.valuestrtoparamlist(phydoc, name, value)
if frequencies:
phynames = list(phynames)
phynames.remove("frequencyofinterest")
# append all PHY options to phydoc
map(lambda n: phy.appendChild(e.xmlparam(phydoc, n, mac.valueof(n, values))), phynames)
if frequencies:
phy.appendChild(frequencies)
return phydoc