Я использую эту иерархию модулей:
Node: {udpApp[0]<->udp<->networkLayer->wlan[0]} and wlan[0]: {CNPCBeacon<->mac<->radio}
С некоторым параметром ini для udpApp как: я дал некоторый начальный параметр в файле ini для udpApp как:
**.host*.numUdpApps = 2
**.host*.udpApp[0].typename = "UDPBasicApp"
**.host*.udpApp[0].destAddresses = "gw1"
**.host*.udpApp[0].startTime = 1.32s
**.host*.udpApp[0].stopTime = 1.48s
Но во время выполнения я хочу изменить startTime и stopTime для udpAPP[0] через модуль CNPCBeacon.
Поэтому я изменил CNPCBeacon.cc как: -
cModule* parentmod = getParentModule();
cModule* grantParentmod = parentmod->getParentModule();
cModule* udpmod = grantParentmod->getSubmodule("udpApp",0);
double varHoldingStartTime = udpmod->par("startTime").doubleValue();
double varGoldingStopTime = udpmod->par("stopTime").doubleValue();
varHoldingStartTime = SIMTIME_DBL(4.2);
varGoldingStopTime = SIMTIME_DBL(4.5);
udpmod->par("startTime").setDoubleValue(varHoldingStartTime);
udpmod->par("stopTime").setDoubleValue(varGoldingStopTime);
EV<<"New start and stop time is "<<udpmod->par("startTime").str()<<"\t"<<udpmod->par("stopTime").str()<<endl;`
Которые успешно меняют параметры. Однако он не инициирует модуль udpApp[0]
снова. Поэтому я пытаюсь использовать динамическое литье этого модуля как:
UDPBasicApp* udpBasicMod = dynamic_cast<UDPBasicApp*>(udpmod);
sendTimer = new cMessage("sendTimer");
scheduleAt(iniSchduleTime, sendTimer);
и это привело к следующей ошибке: -
ошибка в модуле (CNPCBeacon) BSoneNode.gw1.wlan[0].CNPCBeacon (id=23) в событии #1496, t=4: scheduleAt() модуля (UDPBasicApp)BSoneNode.gw1.udpApp[0] вызывается в контексте модуля (CNPCBeacon)BSoneNode.gw1.wlan[0].CNPCBeacon: в методе, вызванном из последнего модуля, отсутствует Enter_Method() или Enter_Method_Silent()?.
Есть ли другой способ создать экземпляр модуля через другой подмодуль.
Спасибо за эту помощь.