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