Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Examples  

timings.h

Go to the documentation of this file.
00001 
00002 //
00003 // YASA timing diagram window declarations
00004 //
00005 // Project: Yasa 2
00006 // Author : Jan Blumenthal
00007 // Start  : 2002/02/28
00008 // $Header: /sources/yasa/yasagui/timings.h,v 1.4 2003/01/24 15:47:43 bj Exp $
00009 //
00011 //
00012 // This program is free software; you can redistribute it and/or modify
00013 // it under the terms of the GNU General Public License as published by
00014 // the Free Software Foundation; either version 2 of the License, or
00015 // (at your option) any later version.
00016 //
00017 // This program is distributed in the hope that it will be useful,
00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020 // GNU General Public License for more details.
00021 //
00022 // You should have received a copy of the GNU General Public License
00023 // along with this program (See the included file COPYING);
00024 // if not, write to the Free Software Foundation, Inc.,
00025 // 675 Mass Ave, Cambridge, MA 02139, USA.
00026 //
00028 // This file contains all information about timing diagram frames
00030 #ifndef YASAGUI_TIMINGS_INCLUDE
00031 #define YASAGUI_TIMINGS_INCLUDE
00032 
00033 
00035 #include <yasagui/yasagui.h>
00036 #include "datatypes.h"
00037 #include "timingsettings.h"
00038 #include "timingparser.h"
00039 #include "environment.h"
00040 #include "project.h"
00041 
00043 class YPainter;
00044 class YLogAction;
00045 
00046 
00050 class YTimings
00051 {   int                 width;                              // width of timing diagram (only diagram)
00052     int                 height;                             // height -++-
00053     int                 namewidth;                          // width of name widget (left splitter window)
00054     int                 nameheight;                         // height -++-
00055     int                 timingheight;                       // height of one timing entry
00056     int                 timingsheight;                      // height of all timing entries ( timingheight*entries )
00057     int                 entries;                            // number of entries
00058     YASA_TIME           maxduration;                        // max duration of this diagram
00059     QString             title;                              // title of widget ("This is a timing diagram of project xx"
00060     QString             ordertitle;                         // order of widget ("Task" or "Mutex" for left splitter window)
00061     QStringList         entrynames;                         // list of entry names
00062     QFontMetrics        *fontmetrics;                       // font info of used font
00063     YTimingParser       *timingparser;
00064     int                 titlewidth;
00065 
00066     int                 GetEntries() const                                                  {   return entries;         }
00067     int                 CalculateHeight();
00068     int                 CalculateWidth(int zoomfactor);
00069     const QFontMetrics* GetFontMetrics() const                                              {   return fontmetrics;     }
00070     const QString &     GetTitle() const                                                    {   return title;           }
00071     const QString &     GetOrderTitle() const                                               {   return ordertitle;      }
00072     const QStringList & GetRowNames() const                                                 {   return entrynames;      }
00073     int                 GetTitleHeight() const
00074                         {
00075                             return YTIMING_SPACING_Y + fontmetrics->height() + YTIMING_SPACING_Y+2;
00076                         }
00077     int                 GetTimingsHeight() const                                            {   return timingsheight;   }
00078     int                 GetTitleWidth() const                                               {   return titlewidth;      }
00079 public:                 YTimings() :
00080                         width(0),
00081                         height(0),
00082                         namewidth(0),
00083                         nameheight(0),
00084                         timingheight(0),
00085                         timingsheight(0),
00086                         entries(0),
00087                         maxduration(0),
00088                         fontmetrics(0),
00089                         timingparser(0),
00090                         titlewidth(0)
00091                         { }
00092     virtual             ~YTimings()
00093                         {
00094                             if (fontmetrics)
00095                                 delete fontmetrics;
00096                         }
00097     virtual int         InitInstance(const QFont &font, YPainter *painter)
00098                         {   maxduration=CalculateMaxDuration();
00099                             entries=GetMaxEntries();
00100                             title=GetTimingTitle();
00101                             ordertitle=GetOrderName();
00102                             entrynames=CreateRowNames();
00103                             fontmetrics=new QFontMetrics(font);
00104                             timingparser=CreateTimingParser();
00105                             if ( fontmetrics && timingparser )
00106                             {
00107                                 timingparser->SetPainter(painter);
00108                                 timingparser->SetTimings(this);
00109                                 titlewidth=fontmetrics->width( GetTitle() );
00110                                 CalculateHeight();
00111                                 CalculateWidth(YTIMING_DEFAULT_ZOOMFACTOR);
00112                                 return 0;
00113                             }
00114                             else
00115                                 return YASAE_OUT_OF_MEMORY;
00116                         }
00117     virtual void        UpdateInstance(int zoomfactorx)
00118                         {   if ( fontmetrics->height() > YTIMING_TIMING_HEIGHT )
00119                                 timingheight=fontmetrics->height() + YTIMING_SPACING_Y;
00120                             else
00121                                 timingheight=YTIMING_TIMING_HEIGHT + YTIMING_SPACING_Y;
00122                             timingsheight=timingheight * GetEntries();
00123                             CalculateHeight( );
00124                             CalculateWidth( zoomfactorx );
00125                         }
00126     int                 GetTimingHeight() const                                     {   return timingheight;    }
00127     int                 GetHeight() const                                           {   return height;      }
00128     int                 GetWidth() const                                            {   return width;       }
00129     int                 GetNameHeight() const                                       {   return nameheight;  }
00130     int                 GetNameWidth() const                                        {   return namewidth;   }
00131     virtual void        DrawTimingContents(YPainter& p) const;
00132     virtual void        DrawNameContents(YPainter& p) const;
00133     YASA_TIME           GetMaxDuration() const                                      {   return maxduration; }
00136     virtual int         GetLogActionRow(const YLogAction *) const                   {   return 0;           }
00138     virtual bool        FilterLoggingAction(const YLogAction *) const               {   return true;        }
00139 protected:
00141     virtual unsigned int GetMaxEntries() const=0;
00143     virtual QStringList CreateRowNames() const=0;
00146     virtual QString     GetOrderName() const=0;
00147     virtual QString     GetTimingTitle() const=0;
00148     virtual YASA_TIME   CalculateMaxDuration() const=0;
00149     virtual YTimingParser * CreateTimingParser() const=0;
00151     int                 ConvertTimeToPosition(YPainter &p, YASA_TIME time) const    {   return time / p.GetZoomFactor();}
00152     YTimingParser *     GetTimingParser() const                                     {   return timingparser;            }
00153     virtual void        EvaluateTimings() const =0;
00155     virtual QString     GetDurationString(const YLogAction *) const                 {   return QString::null;           }
00156 };
00157 
00158 
00161 class YEnvironmentTimings : public YTimings
00162 {   protected:
00163     YEnvironmentLogFileSet &environmentlogfile;
00164 public:                 YEnvironmentTimings(YEnvironmentLogFileSet &e) : environmentlogfile(e)          { }
00165     virtual QString     GetTimingTitle() const
00166                         {
00167                             YEnvironment *environment=(YEnvironment*) environmentlogfile.GetParent();
00168                             return QString( MSGP_TI_TITLE_ENVIRONMENT )
00169                                             .arg( MSGP_TI_SUBTITLE_PROJECT )
00170                                             .arg( environment->GetProject()->GetName() )
00171                                             .arg( environment->GetName() )
00172                                             .arg( GetOrderName() );
00173                         }
00174     virtual void        EvaluateTimings() const             {   environmentlogfile.EvaluateLoggingActions( *GetTimingParser() );    }
00175     virtual YASA_TIME   CalculateMaxDuration() const        {   return environmentlogfile.GetMaxDuration();                         }
00178     virtual QString     GetDurationString(const YLogAction *action) const
00179     {
00180         if ( environmentlogfile.GetTaskSet().GetCount() )       // does this logfile have more than one task ?
00181         {
00182             YLogFileTask *thread=action->GetThread();
00183             if ( thread )
00184                 return thread->GetName();
00185         }
00186         return QString::null;
00187     }
00188 };
00189 
00190 
00198 class YTaskEnvironmentTimings : public YEnvironmentTimings
00199 {public:                YTaskEnvironmentTimings(YEnvironmentLogFileSet &e) : YEnvironmentTimings(e)     { }
00200     virtual QStringList CreateRowNames() const
00201                         {   QStringList list;
00202                             for ( unsigned int i=0; i<GetMaxEntries() ; i++ )
00203                                 list.append( environmentlogfile.GetTaskSet().At(i)->GetName() );
00204                             return list;
00205                         }
00206     virtual unsigned int GetMaxEntries() const              {   return environmentlogfile.GetTaskSet().GetCount();      }
00207     virtual QString     GetOrderName() const                {   return MSGP_TI_SUBTITLE_TASK;                           }
00208     virtual YTimingParser * CreateTimingParser() const      {   return new YTaskEnvironmentTimingParser();                          }
00210     virtual QString     GetDurationString(const YLogAction *) const
00211     {
00212         if ( environmentlogfile.GetCount() )            // does this logfile have more than one cpu ?
00213             return QString::number( GetTimingParser()->GetCPULogFile()->GetCPU() );
00214         return QString::null;
00215     }
00216 };
00217 
00218 
00226 class YMutexEnvironmentTimings : public YEnvironmentTimings
00227 {public:                YMutexEnvironmentTimings(YEnvironmentLogFileSet &e) : YEnvironmentTimings(e)                { }
00228     virtual QStringList CreateRowNames() const
00229                         {   QStringList list;
00230                             for ( unsigned int i=0; i<GetMaxEntries(); i++ )
00231                                 list.append( environmentlogfile.GetMutexSet().At(i)->GetName() );
00232                             return list;
00233                         }
00234     virtual unsigned int GetMaxEntries() const                      {   return environmentlogfile.GetMutexSet().GetCount();     }
00235     virtual QString     GetOrderName() const                        {   return MSGP_TI_SUBTITLE_MUTEX;              }
00236     virtual YTimingParser * CreateTimingParser() const              {   return new YMutexEnvironmentTimingParser();     }
00237 };
00238 
00239 
00247 class YCPUEnvironmentTimings : public YEnvironmentTimings
00248 {public:                YCPUEnvironmentTimings(YEnvironmentLogFileSet &e) : YEnvironmentTimings(e)                  { }
00249     virtual QStringList CreateRowNames() const
00250                         {   QStringList list;
00251                             for ( unsigned int i=0; i<GetMaxEntries(); i++ )
00252                                 list.append( environmentlogfile.At(i)->GetName() );
00253                             return list;
00254                         }
00255     virtual unsigned int GetMaxEntries() const                          {   return environmentlogfile.GetCount();   }
00256     virtual QString     GetOrderName() const                            {   return MSGP_TI_SUBTITLE_CPU;            }
00257     virtual YTimingParser * CreateTimingParser() const                  {   return new YCPUEnvironmentTimingParser();   }
00258 };
00259 
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273 
00274 
00275 
00276 
00277 
00280 class YProjectTimings : public YTimings
00281 {   protected:
00282     YProjectLogFile&    projectlogfile;
00283 public:                 YProjectTimings(YProjectLogFile &lfs) : projectlogfile(lfs)     { }
00284     virtual void        EvaluateTimings() const                     {   projectlogfile.EvaluateLoggingActions( *GetTimingParser() );}
00285     virtual QString     GetTimingTypeName() const=0;
00286     virtual YASA_TIME   CalculateMaxDuration() const                {   return projectlogfile.GetMaxDuration();     }
00287     virtual QStringList CreateRowNames() const                      {   return projectlogfile.GetEnvironmentNames();}
00288     virtual QString     GetOrderName() const                        {   return MSGP_TI_SUBTITLE_ENVIRONMENT;        }
00289     virtual unsigned int GetMaxEntries() const                      {   return projectlogfile.GetMaxEntries();      }
00290     virtual int         GetLogActionRow(const YLogAction *) const   {   return GetTimingParser()->GetEnvironmentLogFileNumber();        }
00291 };
00292 
00293 
00302 class YTaskProjectTimings : public YProjectTimings
00303 {   int                 taskid;
00304     QString             taskname;
00305 public:                 YTaskProjectTimings(const QString &tname, int id, YProjectLogFile &p) :
00306                         YProjectTimings(p), taskid(id), taskname(tname)                                             { }
00307     virtual YTimingParser * CreateTimingParser() const              {   return new YTaskProjectTimingParser();      }
00308     virtual QString     GetTimingTypeName() const                   {   return MSGP_TI_SUBTITLE_TASK;               }
00309     int                 GetTaskID() const                           {   return taskid;                              }
00310     virtual bool        FilterLoggingAction(const YLogAction *action) const
00311                                                                     {   return taskid == action->GetThread()->GetId();  }
00312     virtual QString     GetTimingTitle() const
00313                         {   return QString(MSGP_TI_TITLE_PROJECT)
00314                                             .arg( GetTimingTypeName() )
00315                                             .arg( taskname )
00316                                             .arg( GetOrderName() );
00317                         }
00318 };
00319 
00320 
00329 class YMutexProjectTimings : public YProjectTimings
00330 {   int                 mutexid;
00331     QString             mutexname;
00332 public:                 YMutexProjectTimings(const QString &mname, int id, YProjectLogFile &p) : YProjectTimings(p),
00333                         mutexid(id), mutexname(mname)                                                           { }
00334     virtual YTimingParser * CreateTimingParser() const              {   return new YMutexProjectTimingParser(); }
00335     virtual QString     GetTimingTypeName() const                   {   return MSGP_TI_SUBTITLE_MUTEX;          }
00336     int                 GetMutexID() const                          {   return mutexid;                         }
00337     virtual bool        FilterLoggingAction(const YLogAction *action) const
00338                                                                     {   return action->GetMutex() && action->GetMutex()->GetId()==mutexid;  }
00339     virtual QString     GetTimingTitle() const
00340                         {   return QString(MSGP_TI_TITLE_PROJECT)
00341                                             .arg( GetTimingTypeName() )
00342                                             .arg( mutexname )
00343                                             .arg( GetOrderName() );
00344                         }
00345 };
00346 
00347 
00356 class YCPUProjectTimings : public YProjectTimings
00357 {   unsigned int        cpu;
00358 public:                 YCPUProjectTimings(unsigned int c, YProjectLogFile &p) : YProjectTimings(p), cpu (c)                { }
00359     virtual YTimingParser * CreateTimingParser() const              {   return new YCPUProjectTimingParser();           }
00360     virtual QString     GetTimingTypeName() const                   {   return MSGP_TI_SUBTITLE_CPU;            }
00361     unsigned int        GetCPU() const                              {   return cpu;                             }
00362     //virtual bool      FilterLoggingAction(const YLogAction *action) const
00363     //                                                              {   return action->GetMutex() && action->GetMutex()->GetId()==mutexid;  }
00364     virtual QString     GetTimingTitle() const
00365                         {   return QString(MSGP_TI_TITLE_PROJECT)
00366                                             .arg( GetTimingTypeName() )
00367                                             .arg( cpu )
00368                                             .arg( GetOrderName() );
00369                         }
00370 };
00371 
00372 
00373 
00374 
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00388 #endif                                                                          // ifndef YASAGUI_TIMINGS_INCLUDE

Generated on Thu Feb 13 23:43:57 2003 for Yasa by doxygen1.3-rc3