Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Tools/Debugging/DebugKeyTable.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file DebugKeyTable.cpp
00003 * Implementation of class DebugKey and DebugKeyTable
00004 *
00005 * @author <a href=mailto:brunn@sim.informatik.tu-darmstadt.de>Ronnie Brunn</a>
00006 * @author <a href=mailto:martin@martin-loetzsch.de>Martin Lötzsch</a>
00007 * @author <a href=mailto:risler@sim.informatik.tu-darmstadt.de>Max Risler</a>
00008 */
00009 
00010 #include "Platform/SystemCall.h"
00011 #include "DebugKeyTable.h"
00012 
00013 
00014 DebugKey::DebugKey(modes mode, unsigned int n) 
00015 : mode(mode), n(n), last(0), active(false) 
00016 {}
00017 
00018 void DebugKey::set(modes mode, unsigned int n)
00019 {
00020   this->mode = mode;
00021   this->n = n;
00022   last = 0;
00023   active = false;
00024 }
00025 
00026 DebugKeyTable::DebugKeyTable()
00027 {
00028   reset();
00029 }
00030 
00031 void DebugKeyTable::set(debugKeyID id, DebugKey::modes mode, int n) 
00032 {
00033   debugKeys[id].set(mode, n);
00034 }
00035 
00036 void DebugKeyTable::setMode(debugKeyID id, DebugKey::modes mode)
00037 {
00038   debugKeys[id].set(mode,debugKeys[id].n);
00039 }
00040 
00041 void DebugKeyTable::setN(debugKeyID id, unsigned int n)
00042 {
00043   debugKeys[id].set(debugKeys[id].mode,n);
00044 }
00045 
00046 DebugKey::modes DebugKeyTable::getMode(debugKeyID id) const
00047 { 
00048   return debugKeys[id].mode;
00049 }
00050 
00051 unsigned int DebugKeyTable::getN(debugKeyID id) const
00052 { 
00053   return debugKeys[id].n;
00054 }
00055 
00056 bool DebugKeyTable::isActive(debugKeyID id) const
00057 {
00058   return debugKeys[id].active;
00059 }
00060 
00061 
00062 void DebugKeyTable::reset()
00063 {
00064   for (int key=0;key<DebugKeyTable::numOfDebugKeys;key++)
00065   {
00066     set((debugKeyID) key, DebugKey::disabled, 0);
00067   }
00068 }
00069 
00070 void DebugKeyTable::activate()
00071 {
00072   for (int key=0;key<DebugKeyTable::numOfDebugKeys;key++)
00073   {
00074     switch (debugKeys[key].mode)
00075     {
00076       case DebugKey::disabled:
00077         debugKeys[key].active = false;
00078         break;
00079       case DebugKey::always:
00080         debugKeys[key].active = true;
00081         break;
00082       case DebugKey::n_times:
00083         if (debugKeys[key].last < debugKeys[key].n) 
00084         {
00085           debugKeys[key].last++;
00086           debugKeys[key].active = true;
00087         }
00088         else
00089         { 
00090           debugKeys[key].active = false;
00091         }    
00092         break;
00093       case DebugKey::every_n_times:
00094         if(debugKeys[key].n == 0) debugKeys[key].n = 1;
00095         debugKeys[key].last++;
00096         debugKeys[key].active = (debugKeys[key].last % debugKeys[key].n == 0);
00097         break;
00098       case DebugKey::every_n_ms:
00099         {
00100           unsigned long currentTime = SystemCall::getCurrentSystemTime();
00101           if (currentTime >= debugKeys[key].last + debugKeys[key].n) 
00102           {
00103             debugKeys[key].last = currentTime;
00104             debugKeys[key].active = true;
00105           }
00106           else
00107           {
00108             debugKeys[key].active = false;
00109           }
00110         }
00111         break;
00112       default:
00113         debugKeys[key].active = false;
00114     }
00115   }
00116 }
00117 
00118 bool DebugKeyTable::operator == (const DebugKeyTable& other)
00119 {
00120   for (int key=0;key<DebugKeyTable::numOfDebugKeys;key++)
00121   {
00122     if (debugKeys[key].mode != other.debugKeys[key].mode
00123       || debugKeys[key].n != other.debugKeys[key].n)
00124       return false;
00125   }    
00126   return true;
00127 }
00128 
00129 In& operator>>(In& stream,DebugKeyTable& debugKeyTable)
00130 {
00131   //old versions of a debugKeyTable might have less entries than numOfDebugKeys.
00132   char numberOfDebugKeysInStream;
00133   stream >> numberOfDebugKeysInStream;
00134 
00135   for (int i = 0;i < numberOfDebugKeysInStream; i++)
00136   {
00137     if(i < DebugKeyTable::numOfDebugKeys)
00138     {
00139       int mode;
00140       unsigned int n;
00141       stream >> mode >> n;
00142       debugKeyTable.set((DebugKeyTable::debugKeyID)i, (DebugKey::modes)mode, n);
00143     }
00144   }
00145   return stream;
00146 }
00147 
00148 Out& operator<<(Out& stream, DebugKeyTable& debugKeyTable)
00149 {
00150   stream << (char)DebugKeyTable::numOfDebugKeys;
00151 
00152   for (int i=0;i<DebugKeyTable::numOfDebugKeys;i++)
00153   {
00154     stream << (int)debugKeyTable.getMode((DebugKeyTable::debugKeyID)i)
00155       << debugKeyTable.getN((DebugKeyTable::debugKeyID)i);
00156   }
00157   return stream;
00158 }

Generated on Mon Mar 20 22:00:05 2006 for GT2005 by doxygen 1.3.6