rllib  1
rlplc.cpp
Go to the documentation of this file.
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 }