00001 #ifndef _PID_BUFFERED_NUMBER_H 00002 #define _PID_BUFFERED_NUMBER_H 00003 00004 #include "DifferentiableNumber.h" 00005 #include "IntegrableNumber.h" 00006 00007 namespace luma 00008 { 00009 namespace numbers 00010 { 00011 00031 template<class T, unsigned int dn, unsigned int in, unsigned int im> 00032 class PIDBufferedNumber : public UpdateableNumber<T> 00033 { 00034 private: 00036 T mValue; 00037 00039 DifferentiableNumber<T, dn> mDifferentiableValue; 00040 00042 IntegrableNumber<T, im, in> mIntegrableValue; 00043 00045 T mValueFactor; 00046 00048 T mDifferentiableValueFactors[dn]; 00049 00051 T mIntegrableValueFactors[in]; 00052 00053 public: 00054 00072 PIDBufferedNumber(T initialValue, T valueFactor, 00073 T differentiableValueFactors[dn], T integrableValueFactors[in]); 00074 00078 void setValue(T x, float elapsedTime = 1.0f); 00079 00083 void forceValue(T x, float elapsedTime = 1.0f); 00084 00090 T getValue() const; 00091 00092 T getSample(int i) const; 00093 00099 }; 00100 00101 template<class T, unsigned int dn, unsigned int in, unsigned int im> 00102 PIDBufferedNumber<T, dn, in, im>::PIDBufferedNumber( 00103 T initialValue, 00104 T valueFactor, 00105 T differentiableValueFactors[dn], 00106 T integrableValueFactors[in]): 00107 mDifferentiableValue(initialValue), 00108 mIntegrableValue(initialValue), 00109 mValue(initialValue), 00110 mValueFactor(valueFactor) 00111 { 00112 for(int i = 0; i < dn; i++) 00113 { 00114 mDifferentiableValueFactors[i] = differentiableValueFactors[i]; 00115 } 00116 00117 for(int i = 0; i < in; i++) 00118 { 00119 mIntegrableValueFactors[i] = integrableValueFactors[i]; 00120 } 00121 } 00122 00123 template<class T, unsigned int dn, unsigned int in, unsigned int im> 00124 void PIDBufferedNumber<T, dn, in, im>::setValue(T x, float elapsedTime) 00125 { 00126 mValue = x; 00127 mDifferentiableValue.setValue(x, elapsedTime); 00128 mIntegrableValue.setValue(x, elapsedTime); 00129 } 00130 00131 template<class T, unsigned int dn, unsigned int in, unsigned int im> 00132 void PIDBufferedNumber<T, dn, in, im>::forceValue(T x, float elapsedTime) 00133 { 00134 mValue = x; 00135 mDifferentiableValue.forceValue(x); 00136 mIntegrableValue.forceValue(x, elapsedTime); 00137 } 00138 00139 template<class T, unsigned int dn, unsigned int in, unsigned int im> 00140 T PIDBufferedNumber<T, dn, in, im>::getValue() const 00141 { 00142 T sum = mValue * mValueFactor; 00143 00144 for(int i = 0; i < dn; i++) 00145 { 00146 sum += mDifferentiableValueFactors[i] * mDifferentiableValue.getValue(i + 1); 00147 } 00148 00149 for(int i = 0; i < in; i++) 00150 { 00151 sum += mIntegrableValueFactors[i] * mIntegrableValue.getValue(i + 1); 00152 } 00153 00154 return sum; 00155 } 00156 00157 template<class T, unsigned int dn, unsigned int in, unsigned int im> 00158 T PIDBufferedNumber<T, dn, in, im>::getSample(int i) const 00159 { 00160 return mIntegrableValue.getSample(i); 00161 } 00162 00163 }} 00164 00165 #endif //_PID_BUFFERED_NUMBER_H