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