""" tdma.py: EMANE TDMA model bindings for CORE """ import logging from pathlib import Path from typing import Set from core import constants, utils from core.config import Configuration from core.emane import emanemodel from core.emane.nodes import EmaneNet from core.emulator.enumerations import ConfigDataTypes from core.nodes.interface import CoreInterface logger = logging.getLogger(__name__) class EmaneTdmaModel(emanemodel.EmaneModel): # model name name: str = "emane_tdma" # mac configuration mac_library: str = "tdmaeventschedulerradiomodel" mac_xml: str = "tdmaeventschedulerradiomodel.xml" # add custom schedule options and ignore it when writing emane xml schedule_name: str = "schedule" default_schedule: Path = ( constants.CORE_DATA_DIR / "examples" / "tdma" / "schedule.xml" ) config_ignore: Set[str] = {schedule_name} @classmethod def load(cls, emane_prefix: Path) -> None: cls.mac_defaults["pcrcurveuri"] = str( emane_prefix / "share/emane/xml/models/mac/tdmaeventscheduler/tdmabasemodelpcr.xml" ) super().load(emane_prefix) config_item = Configuration( id=cls.schedule_name, type=ConfigDataTypes.STRING, default=str(cls.default_schedule), label="TDMA schedule file (core)", ) cls.mac_config.insert(0, config_item) def post_startup(self, iface: CoreInterface) -> None: # get configured schedule emane_net = self.session.get_node(self.id, EmaneNet) config = self.session.emane.get_iface_config(emane_net, iface) schedule = Path(config[self.schedule_name]) if not schedule.is_file(): logger.error("ignoring invalid tdma schedule: %s", schedule) return # initiate tdma schedule nem_id = self.session.emane.get_nem_id(iface) if not nem_id: logger.error("could not find nem for interface") return service = self.session.emane.nem_service.get(nem_id) if service: device = service.device logger.info( "setting up tdma schedule: schedule(%s) device(%s)", schedule, device ) utils.cmd(f"emaneevent-tdmaschedule -i {device} {schedule}")