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 }
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226