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 }