00001 #include <cstdlib> // for std::abs on integers 00002 #include "robodyn_utilities/AbsSlewFilter.h" 00003 00004 AbsSlewFilter::AbsSlewFilter() 00005 { 00006 } 00007 00008 AbsSlewFilter::~AbsSlewFilter() 00009 { 00010 } 00011 00012 void AbsSlewFilter::setRates(double greaterRate, double lesserRate) 00013 { 00014 setGreaterRate(greaterRate); 00015 setLesserRate(lesserRate); 00016 } 00017 00018 void AbsSlewFilter::setGreaterRate(double rate) 00019 { 00020 greater.setRateLimit(rate); 00021 } 00022 00023 void AbsSlewFilter::setLesserRate(double rate) 00024 { 00025 lesser.setRateLimit(rate); 00026 } 00027 00028 double AbsSlewFilter::filter(double previous, double current) 00029 { 00030 double output = current; 00031 00033 if ((previous * current) < 0) 00034 { 00035 output = 0; 00036 } 00037 else 00038 { 00039 if (std::abs(current) > std::abs(previous)) 00040 { 00041 output = greater.getLimitedValue(current, previous); 00042 } 00043 else if (std::abs(current) < std::abs(previous)) 00044 { 00045 output = lesser.getLimitedValue(current, previous); 00046 } 00047 } 00048 00049 return output; 00050 } 00051 00052 int AbsSlewFilter::filter(int previous, int current) 00053 { 00054 int output = current; 00055 00057 if ((previous * current) < 0) 00058 { 00059 output = 0; 00060 } 00061 else 00062 { 00063 if (std::abs(current) > std::abs(previous)) 00064 { 00065 output = greater.getLimitedValue(current, previous); 00066 } 00067 else if (std::abs(current) < std::abs(previous)) 00068 { 00069 output = lesser.getLimitedValue(current, previous); 00070 } 00071 } 00072 00073 return output; 00074 }