|
rllib
1
|
00001 /*************************************************************************** 00002 rlplc.cpp - description 00003 ------------------- 00004 begin : Tue Dec 11 2008 00005 copyright : (C) 2008 by Rainer Lehrig 00006 email : lehrig@t-online.de 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This library is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as * 00013 * published by the Free Software Foundation * 00014 * * 00015 ***************************************************************************/ 00016 #include <string.h> 00017 #include "rlplc.h" 00018 00019 rlPlcState::rlPlcState(int numInt, int numFloat, int numDouble) 00020 { 00021 max_int = numInt; 00022 if(max_int <= 0) max_int = 1; 00023 max_float = numFloat; 00024 if(max_float <= 0) max_float = 1; 00025 max_double = numDouble; 00026 if(max_double <= 0) max_double = 1; 00027 i = new int[max_int]; 00028 i_old = new int[max_int]; 00029 f = new float[max_float]; 00030 f_old = new float[max_float]; 00031 d = new double[max_double]; 00032 d_old = new double[max_double]; 00033 memset(i ,0,sizeof(int)*max_int); 00034 memset(i_old,0,sizeof(int)*max_int); 00035 memset(f ,0,sizeof(float)*max_float); 00036 memset(f_old,0,sizeof(float)*max_float); 00037 memset(d ,0,sizeof(double)*max_double); 00038 memset(d_old,0,sizeof(double)*max_double); 00039 } 00040 00041 rlPlcState::~rlPlcState() 00042 { 00043 delete [] i; 00044 delete [] i_old; 00045 delete [] f; 00046 delete [] f_old; 00047 delete [] d; 00048 delete [] d_old; 00049 } 00050 00051 void rlPlcState::rememberState() 00052 { 00053 memcpy(i_old,i,sizeof(int)*max_int); 00054 memcpy(f_old,f,sizeof(float)*max_float); 00055 memcpy(d_old,d,sizeof(double)*max_double); 00056 } 00057 00058 int rlPlcState::intChanged(int index) 00059 { 00060 if(index<0 || index >= max_int) return 0; 00061 if(i[index] == i_old[index]) return 0; 00062 else return 1; 00063 } 00064 00065 int rlPlcState::floatChanged(int index) 00066 { 00067 if(index<0 || index >= max_float) return 0; 00068 if(f[index] == f_old[index]) return 0; 00069 else return 1; 00070 } 00071 00072 int rlPlcState::doubleChanged(int index) 00073 { 00074 if(index<0 || index >= max_double) return 0; 00075 if(d[index] == d_old[index]) return 0; 00076 else return 1; 00077 } 00078 00079 int rlPlcState::intHasIncreased(int index) 00080 { 00081 if(index<0 || index >= max_int) return 0; 00082 if(i[index] > i_old[index]) return 1; 00083 else return 0; 00084 } 00085 00086 int rlPlcState::floatHasIncreased(int index) 00087 { 00088 if(index<0 || index >= max_float) return 0; 00089 if(f[index] > f_old[index]) return 1; 00090 else return 0; 00091 } 00092 00093 int rlPlcState::doubleHasIncreased(int index) 00094 { 00095 if(index<0 || index >= max_double) return 0; 00096 if(d[index] > d_old[index]) return 1; 00097 else return 0; 00098 } 00099 00100 int rlPlcState::intHasDecreased(int index) 00101 { 00102 if(index<0 || index >= max_int) return 0; 00103 if(i[index] < i_old[index]) return 1; 00104 else return 0; 00105 } 00106 00107 int rlPlcState::floatHasDecreased(int index) 00108 { 00109 if(index<0 || index >= max_float) return 0; 00110 if(f[index] < f_old[index]) return 1; 00111 else return 0; 00112 } 00113 00114 int rlPlcState::doubleHasDecreased(int index) 00115 { 00116 if(index<0 || index >= max_double) return 0; 00117 if(d[index] < d_old[index]) return 1; 00118 else return 0; 00119 } 00120 00121 int rlPlcState::deltaInt(int index) 00122 { 00123 if(index<0 || index >= max_int) return 0; 00124 return i[index] - i_old[index]; 00125 } 00126 00127 float rlPlcState::deltaFloat(int index) 00128 { 00129 if(index<0 || index >= max_float) return 0; 00130 return f[index] - f_old[index]; 00131 } 00132 00133 double rlPlcState::deltaDouble(int index) 00134 { 00135 if(index<0 || index >= max_double) return 0; 00136 return d[index] - d_old[index]; 00137 } 00138 00139 void rlPlcState::set(int index, int bit) 00140 { 00141 if(index<0 || index >= max_int) return; 00142 i[index] = i[index] | bit; 00143 } 00144 00145 void rlPlcState::clear(int index, int bit) 00146 { 00147 if(index<0 || index >= max_int) return; 00148 i[index] = i[index] & ~bit; 00149 } 00150 00151 int rlPlcState::isSet(int index, int bit) 00152 { 00153 if(index<0 || index >= max_int) return 0; 00154 if(i[index] & bit) return 1; 00155 else return 0; 00156 } 00157 00158 int rlPlcState::isClear(int index, int bit) 00159 { 00160 if(index<0 || index >= max_int) return 0; 00161 if(i[index] & bit) return 0; 00162 else return 1; 00163 } 00164 00165 int rlPlcState::hasBeenSet(int index, int bit) 00166 { 00167 if(index<0 || index >= max_int) return 0; 00168 if(i[index] & bit) // is bit set ? 00169 { 00170 if(i_old[index] & bit) return 0; // both are set 00171 else return 1; // old one was not set 00172 } 00173 return 0; 00174 } 00175 00176 int rlPlcState::hasBeenCleared(int index, int bit) 00177 { 00178 if(index<0 || index >= max_int) return 0; 00179 if((i[index] & bit) == 0) // is bit clear ? 00180 { 00181 if((i_old[index] & bit) == 0) return 0; // both are clear 00182 else return 1; // old one was set 00183 } 00184 return 0; 00185 } 00186 00187 int rlPlcState::maxInt() 00188 { 00189 return max_int - 1; 00190 } 00191 00192 int rlPlcState::maxFloat() 00193 { 00194 return max_float - 1; 00195 } 00196 00197 int rlPlcState::maxDouble() 00198 { 00199 return max_float - 1; 00200 } 00201 00202 //################################################### 00203 00204 rlPlcMem::rlPlcMem() 00205 { 00206 i = 0; 00207 i_old = 0; 00208 f = 0.0f; 00209 f_old = 0.0f; 00210 d = 0.0; 00211 d_old = 0.0; 00212 } 00213 00214 rlPlcMem::~rlPlcMem() 00215 { 00216 } 00217 00218 void rlPlcMem::rememberState() 00219 { 00220 i_old = i; 00221 f_old = f; 00222 d_old = d; 00223 } 00224 00225 int rlPlcMem::intChanged() 00226 { 00227 if(i == i_old) return 0; 00228 else return 1; 00229 } 00230 00231 int rlPlcMem::floatChanged() 00232 { 00233 if(f == f_old) return 0; 00234 else return 1; 00235 } 00236 00237 int rlPlcMem::doubleChanged() 00238 { 00239 if(d == d_old) return 0; 00240 else return 1; 00241 } 00242 00243 int rlPlcMem::intHasIncreased() 00244 { 00245 if(i > i_old) return 1; 00246 else return 0; 00247 } 00248 00249 int rlPlcMem::floatHasIncreased() 00250 { 00251 if(f > f_old) return 1; 00252 else return 0; 00253 } 00254 00255 int rlPlcMem::doubleHasIncreased() 00256 { 00257 if(d > d_old) return 1; 00258 else return 0; 00259 } 00260 00261 int rlPlcMem::intHasDecreased() 00262 { 00263 if(i < i_old) return 1; 00264 else return 0; 00265 } 00266 00267 int rlPlcMem::floatHasDecreased() 00268 { 00269 if(f < f_old) return 1; 00270 else return 0; 00271 } 00272 00273 int rlPlcMem::doubleHasDecreased() 00274 { 00275 if(d < d_old) return 1; 00276 else return 0; 00277 } 00278 00279 int rlPlcMem::deltaInt() 00280 { 00281 return i - i_old; 00282 } 00283 00284 float rlPlcMem::deltaFloat() 00285 { 00286 return f - f_old; 00287 } 00288 00289 double rlPlcMem::deltaDouble() 00290 { 00291 return d - d_old; 00292 } 00293 00294 void rlPlcMem::set(int bit) 00295 { 00296 i = i | bit; 00297 } 00298 00299 void rlPlcMem::clear(int bit) 00300 { 00301 i = i & ~bit; 00302 } 00303 00304 int rlPlcMem::isSet(int bit) 00305 { 00306 if(i & bit) return 1; 00307 else return 0; 00308 } 00309 00310 int rlPlcMem::isClear(int bit) 00311 { 00312 if(i & bit) return 0; 00313 else return 1; 00314 } 00315 00316 int rlPlcMem::hasBeenSet(int bit) 00317 { 00318 if(i & bit) // is bit set ? 00319 { 00320 if(i_old & bit) return 0; // both are set 00321 else return 1; // old one was not set 00322 } 00323 return 0; 00324 } 00325 00326 int rlPlcMem::hasBeenCleared(int bit) 00327 { 00328 if((i & bit) == 0) // is bit clear ? 00329 { 00330 if((i_old & bit) == 0) return 0; // both are clear 00331 else return 1; // old one was set 00332 } 00333 return 0; 00334 }
1.7.5.1