00001
00002
00003
00004
00005
00006
00007
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
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 }