FrameTimerGenerator.cc

00001 #include "FrameTimerGenerator.h"
00002 #include "FrameTimer.h"
00003 
00004 #include <assert.h>
00005 
00006 
00007 void FrameTimerGenerator::init(FrameTimer *parent)
00008 {
00009   Enter_Method_Silent();
00010   char * lookupname;
00011   ft = parent;
00012   if (parent->owner->hasPar("GlobalTime"))
00013     lookupname = strdup(parent->owner->par("GlobalTime"));
00014   else
00015     lookupname = strdup("GlobalTime");
00016   gt = dynamic_cast<GlobalTime*>(parent->owner->getNode()->getSubmodule(lookupname));
00017   if (gt == NULL)
00018     gt = dynamic_cast<GlobalTime*>(cModuleType::get(lookupname)->createScheduleInit(lookupname,parent->owner->getNode()));
00019   free(lookupname); 
00020 
00021   frames = new std::map<unsigned int,double>;
00022   timers = new std::map<unsigned int, cMessage*>;
00023 }
00024 
00025 
00026 void FrameTimerGenerator::nextFrame(unsigned int index)
00027 {
00028   simtime_t now = gt->currentGlobalTime();
00029   if ((*frames)[index] == 0)
00030     return;
00031   assert(frames->find(index)!=frames->end());
00032   simtime_t count = floor(now/(*frames)[index]);
00033   ev <<"scheduling at "<<count<<"," <<((count+1)*(*frames)[index])<<endl;
00034   scheduleAt((count+1)*(*frames)[index],(*timers)[index]);
00035 }
00036 
00037 unsigned int FrameTimerGenerator::setFrameTimer(double period)
00038 {
00039   unsigned int key = timers->size();
00040   while (timers->find(key)!=timers->end())
00041     key++;
00042   setFrameTimer(key,period);
00043   return key;
00044 }
00045 
00046 void FrameTimerGenerator::setFrameTimer(unsigned int index, double period)
00047 {
00048   Enter_Method_Silent();
00049   cMessage *timer;
00050   assert(period>0);
00051   if (timers->find(index)==timers->end())
00052   {
00053     char buffer[255];
00054     sprintf(buffer,"frame timer %d",index);
00055     timer = new cMessage();
00056     timer->setKind(index);
00057     timer->setName(buffer);
00058     (*timers)[index] = timer;
00059   }
00060   else
00061   {
00062     timer = (*timers)[index];
00063     cancelFrameTimer(index);
00064   }
00065   (*frames)[index] = period;
00066   nextFrame(index);
00067 }
00068 
00069 void FrameTimerGenerator::cancelFrameTimer(unsigned int index)
00070 {
00071   assert(frames->find(index)!=frames->end());
00072   if ((*timers)[index]->isScheduled())
00073     cancelEvent((*timers)[index]);
00074   (*frames)[index] = 0;
00075 }
00076 
00077 void FrameTimerGenerator::handleMessage(cMessage* msg)
00078 {
00079   ft->handleFrameTimer(msg->getKind());
00080   nextFrame(msg->getKind());
00081 }
00082 
00083 FrameTimerGenerator::~FrameTimerGenerator()
00084 {
00085   for (std::map<unsigned int,cMessage*>::const_iterator p=timers->begin();p!=timers->end();p++)
00086   {
00087     cancelFrameTimer(p->second->getKind());
00088     delete p->second;
00089   }
00090   delete timers;
00091   delete  frames;
00092 }
00093