#include <ScenarioManager.h>
Public Member Functions | |
| ScenarioManager () | |
Protected Member Functions | |
| const char * | getRequiredAttribute (cXMLElement *node, const char *attr) |
| virtual cModule * | getRequiredModule (cXMLElement *node, const char *attr) |
| virtual cGate * | getRequiredGate (cXMLElement *node, const char *modattr, const char *gateattr) |
| virtual void | processCommand (cXMLElement *node) |
| virtual void | processAtCommand (cXMLElement *node) |
| virtual void | processSetParamCommand (cXMLElement *node) |
| virtual void | processSetChannelAttrCommand (cXMLElement *node) |
| virtual void | processCreateModuleCommand (cXMLElement *node) |
| virtual void | processDeleteModuleCommand (cXMLElement *node) |
| virtual void | processConnectCommand (cXMLElement *node) |
| virtual void | processDisconnectCommand (cXMLElement *node) |
| virtual void | processModuleSpecificCommand (cXMLElement *node) |
| virtual void | initialize () |
| virtual void | handleMessage (cMessage *msg) |
| virtual void | updateDisplayString () |
Protected Attributes | |
| int | numChanges |
| int | numDone |
Scenario Manager (experimental) which executes a script specified in XML. ScenarioManager has a few built-in commands such as <set-param>, <set-channel-attr>, etc, and can pass commands to modules that implement the IScriptable interface. The <at> built-in command can be used to group commands to be carried out at the same simulation time.
See NED file for details.
Definition at line 38 of file ScenarioManager.h.
| ScenarioManager::ScenarioManager | ( | ) | [inline] |
Definition at line 65 of file ScenarioManager.h.
{}
| const char * ScenarioManager::getRequiredAttribute | ( | cXMLElement * | node, | |
| const char * | attr | |||
| ) | [protected] |
Definition at line 99 of file ScenarioManager.cc.
Referenced by getRequiredGate(), getRequiredModule(), processSetChannelAttrCommand(), and processSetParamCommand().
{
const char *s = node->getAttribute(attr);
if (!s)
error("required attribute %s of <%s> missing at %s",
attr, node->getTagName(), node->getSourceLocation());
return s;
}
| cGate * ScenarioManager::getRequiredGate | ( | cXMLElement * | node, | |
| const char * | modattr, | |||
| const char * | gateattr | |||
| ) | [protected, virtual] |
Definition at line 117 of file ScenarioManager.cc.
Referenced by processSetChannelAttrCommand().
{
cModule *mod = getRequiredModule(node, modAttr);
const char *gateStr = getRequiredAttribute(node, gateAttr);
std::string gname;
int gindex;
cGate *g = parseIndexedName(gateStr, gname, gindex) ? mod->gate(gname.c_str(), gindex) : mod->gate(gname.c_str());
if (!g)
error("module '%s' has no gate '%s' at %s", mod->getFullPath().c_str(), gateStr, node->getSourceLocation());
return g;
}
| cModule * ScenarioManager::getRequiredModule | ( | cXMLElement * | node, | |
| const char * | attr | |||
| ) | [protected, virtual] |
Definition at line 108 of file ScenarioManager.cc.
Referenced by getRequiredGate(), processModuleSpecificCommand(), and processSetParamCommand().
{
const char *moduleAttr = getRequiredAttribute(node, attr);
cModule *mod = simulation.getModuleByPath(moduleAttr);
if (!mod)
error("module '%s' not found at %s", moduleAttr, node->getSourceLocation());
return mod;
}
| void ScenarioManager::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
Definition at line 51 of file ScenarioManager.cc.
{
cXMLElement *node = (cXMLElement *) msg->getContextPointer();
delete msg;
processCommand(node);
numDone++;
updateDisplayString();
}
| void ScenarioManager::initialize | ( | ) | [protected, virtual] |
Definition at line 23 of file ScenarioManager.cc.
{
cXMLElement *script = par("script");
numChanges = numDone = 0;
WATCH(numChanges);
WATCH(numDone);
for (cXMLElement *node=script->getFirstChild(); node; node = node->getNextSibling())
{
// check attr t is present
const char *tAttr = node->getAttribute("t");
if (!tAttr)
error("attribute 't' missing at %s", node->getSourceLocation());
// schedule self-message
simtime_t t = STR_SIMTIME(tAttr);
cMessage *msg = new cMessage("scenario-event");
msg->setContextPointer(node);
scheduleAt(t, msg);
// count it
numChanges++;
}
updateDisplayString();
}
| void ScenarioManager::processAtCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 129 of file ScenarioManager.cc.
Referenced by processCommand().
{
for (cXMLElement *child=node->getFirstChild(); child; child=child->getNextSibling())
processCommand(child);
}
| void ScenarioManager::processCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 62 of file ScenarioManager.cc.
Referenced by handleMessage(), and processAtCommand().
{
const char *tag = node->getTagName();
EV << "processing <" << tag << "> command...\n";
if (!strcmp(tag,"at"))
processAtCommand(node);
else if (!strcmp(tag,"set-param"))
processSetParamCommand(node);
else if (!strcmp(tag,"set-channel-attr"))
processSetChannelAttrCommand(node);
// else if (!strcmp(tag,"create-module"))
// processCreateModuleCommand(node);
// else if (!strcmp(tag,"connect"))
// processConnectCommand(node);
else
processModuleSpecificCommand(node);
}
| void ScenarioManager::processConnectCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 203 of file ScenarioManager.cc.
{
// FIXME finish and test
}
| void ScenarioManager::processCreateModuleCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 193 of file ScenarioManager.cc.
{
// FIXME finish and test
}
| void ScenarioManager::processDeleteModuleCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 198 of file ScenarioManager.cc.
{
// FIXME finish and test
}
| void ScenarioManager::processDisconnectCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 208 of file ScenarioManager.cc.
{
// FIXME finish and test
}
| void ScenarioManager::processModuleSpecificCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 135 of file ScenarioManager.cc.
Referenced by processCommand().
{
// find which module we'll need to invoke
cModule *mod = getRequiredModule(node, "module");
// see if it supports the IScriptable interface
IScriptable *scriptable = dynamic_cast<IScriptable *>(mod);
if (!scriptable)
error("<%s> not understood: it is not a built-in command of %s, and module class %s "
"is not scriptable (does not subclass from IScriptable) at %s",
node->getTagName(), getClassName(), mod->getClassName(), node->getSourceLocation());
// ok, trust it to process this command
scriptable->processCommand(*node);
}
| void ScenarioManager::processSetChannelAttrCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 166 of file ScenarioManager.cc.
Referenced by processCommand().
{
// process <set-channel-attr> command
cGate *g = getRequiredGate(node, "src-module", "src-gate");
const char *attrAttr = getRequiredAttribute(node, "attr");
const char *valueAttr = getRequiredAttribute(node, "value");
EV << "Setting channel attribute: " << attrAttr << " = " << valueAttr
<< " of gate " << g->getFullPath() << "\n";
bubble((std::string("setting channel attr: ")+attrAttr+" = "+valueAttr).c_str());
// make sure gate is connected at all
if (!g->getNextGate())
error("gate '%s' is not connected at %s", g->getFullPath().c_str(), node->getSourceLocation());
// find channel (or add one?)
cChannel *chan = g->getChannel();
if (!chan)
error("connection starting at gate '%s' has no attributes at %s", g->getFullPath().c_str(), node->getSourceLocation());
// set the parameter to the given value
if (!chan->hasPar(attrAttr))
; //FIXME remove this "if"
cPar& param = chan->par(attrAttr);
param.parse(valueAttr);
}
| void ScenarioManager::processSetParamCommand | ( | cXMLElement * | node | ) | [protected, virtual] |
Definition at line 151 of file ScenarioManager.cc.
Referenced by processCommand().
{
// process <set-param> command
cModule *mod = getRequiredModule(node, "module");
const char *parAttr = getRequiredAttribute(node, "par");
const char *valueAttr = getRequiredAttribute(node, "value");
EV << "Setting " << mod->getFullPath() << "." << parAttr << " = " << valueAttr << "\n";
bubble((std::string("setting: ")+mod->getFullPath()+"."+parAttr+" = "+valueAttr).c_str());
// set the parameter to the given value
cPar& param = mod->par(parAttr);
param.parse(valueAttr);
}
| void ScenarioManager::updateDisplayString | ( | ) | [protected, virtual] |
Definition at line 213 of file ScenarioManager.cc.
Referenced by handleMessage(), and initialize().
{
char buf[80];
sprintf(buf, "total %d changes, %d left", numChanges, numChanges-numDone);
getDisplayString().setTagArg("t", 0, buf);
}
int ScenarioManager::numChanges [protected] |
Definition at line 42 of file ScenarioManager.h.
Referenced by initialize(), and updateDisplayString().
int ScenarioManager::numDone [protected] |
Definition at line 43 of file ScenarioManager.h.
Referenced by handleMessage(), initialize(), and updateDisplayString().
1.7.1