Source code for simulator.selectors.DtnBundleCriticalitySelector
# -*- coding: utf-8 -*-
from simulator.selectors.DtnAbstractDuctSelector import DtnAbstractDuctSelector
[docs]class DtnBundleCriticalitySelector(DtnAbstractDuctSelector):
""" This outduct selector can be used for connections with 2 or 3 simultaneous
frequency bands. It behaves as follows:
1) If 2 frequency bands, they must be named 'X' and 'Ka'. All critical data
is sent over the X-band link and the rest over the Ka-band link.
2) If 3 frequency bands, they must be named 'X', 'Ka' and 'opt'. All critical
data is sent over the X-band link. Ka-band is used for non-critical data
except for "PAO HD Video", "Sci HD Video" and "Science", which are sent over
the optical link.
"""
def select_duct(self, neighbor, bundle):
# Get the outducts from the parent
ducts = self.get_ducts(neighbor)
# If only one band, just return it
if len(ducts) == 1: return next(iter(ducts.values()))
# If two bands, assume X and Ka
if len(ducts) == 2: return ducts[self.select_biband(bundle)]
# If three bands, assume X, Ka and optical
if len(ducts) == 3: return ducts[self.select_biband(bundle)]
# More than three bands is not supported by this class
# You need to define a new one
raise ValueError(f'Connections with more than 3 outducts concurrently are '
f'not supported. Check connection between {self.parent.nid} '
f'and {neighbor}.')
def select_biband(self, bundle):
return 'X' if bundle.critical else 'Ka'
def select_triband(self, bundle):
if bundle.critical == True:
return 'X'
if bundle.data_type.lower() not in ['pao hd video', 'sci hd video', 'science']:
return 'Ka'
return 'opt'
[docs]class DtnBandSelectorOld(DtnAbstractDuctSelector):
def select_band(self, bundle, orig, dest):
# Initialize variables
con_type = self._types[orig][dest]
# Assign band as a function of connection and data type
if con_type == 'UniBand': return 'SA'
elif con_type == 'BiBand': return self._assign_BiBand_band(bundle)
elif con_type == 'BiBandLTP': return self._assign_BiBand_band(bundle)
"""if con_type == 'UniDTE': return 'X'
elif con_type == 'BiDTE': return self._assign_BiDTE_band(bundle)
elif con_type == 'TriDTE': return self._assign_TriDTE_band(bundle)"""
# Just return the same connection type
return con_type
def _assign_BiBand_band(self, bundle):
#return 'X' if bundle.critical else 'Ka'
return 'X' if bundle.data_type.lower() == 'biomedical' else 'Ka' # FOR TESTING
"""def _assign_BiDTE_band(self, bundle):
return 'X' if bundle.critical else 'Ka'
def _assign_TriDTE_band(self, bundle):
if bundle.critical == True:
return 'X'
if bundle.data_type not in ['PAO HD Video', 'Sci HD Video', 'Science']:
return 'Ka'
return 'opt'"""