Lodestar
An integrated real-time control package in C++
DifferentiatorBlock.hpp
1 //
2 // Created by Hamza El-Kebir on 2/24/22.
3 //
4 
5 #ifndef LODESTAR_DIFFERENTIATORBLOCK_HPP
6 #define LODESTAR_DIFFERENTIATORBLOCK_HPP
7 
8 
9 #include "Lodestar/blocks/Block.hpp"
10 #include "Lodestar/aux/ArrayStack.hpp"
11 #include "Lodestar/primitives/differentiators/AdaptiveBackwardDifference.hpp"
12 
13 namespace ls {
14  namespace blocks {
15  namespace std {
16  template<typename TInput, unsigned int NHorizon=1, typename TScalar = float>
18  : public Block<
19  ::std::tuple<TInput>,
20  ::std::tuple<TInput>,
21  ::std::tuple<TScalar>
22  > {
23  public:
24  using Base =
25  Block<
26  ::std::tuple<TInput>,
27  ::std::tuple<TInput>,
28  ::std::tuple<TScalar>
29  >;
30 
32  {
33  bindFunction();
34  }
35 
36  void clear(TInput value)
37  {
38  fifoStack_.fill(value);
39  this->template o<0>() = value;
40  fifoStack_.clear();
41  }
42 
43  void clear(TInput &value)
44  {
45  fifoStack_.fill(value);
46  this->template o<0>() = value;
47  fifoStack_.clear();
48  }
49 
50  TScalar &samplingPeriod()
51  {
52  return this->template p<0>();
53  }
54 
55  TScalar &samplingPeriod(const TScalar t)
56  {
57  this->template p<0>() = t;
58  return this->template p<0>();
59  }
60 
61  TScalar samplingPeriod() const
62  {
63  return this->template p<0>();
64  }
65 
66 
67  protected:
69 
70  void bindFunction()
71  {
72  this->equation = ::std::bind(
74  this,
75  ::std::placeholders::_1
76  );
77  }
78 
79  void triggerFunction(Base &b)
80  {
81  fifoStack_.push(b.template i<0>().object);
82  if (fifoStack_.size() > 1) {
83  b.template o<0>() = ls::primitives::AdaptiveBackwardDifference<TInput, 1, TScalar>::compute(samplingPeriod(), fifoStack_.array(), fifoStack_.size());
84  }
85  }
86  };
87  }
88 
89  template<typename TInput, unsigned int NDelay, typename TScalar>
91  public:
92  static constexpr const BlockType blockType = BlockType::DifferentiatorBlock;
93  enum {
94  directFeedthrough = (NDelay > 0)
95  };
96 
98  using Base = typename type::Base;
99 
100  enum {
101  kIns = Base::kIns,
102  kOuts = Base::kOuts,
103  kPars = Base::kPars
104  };
105 
106  static const ::std::array<::std::string, kIns> inTypes;
107  static const ::std::array<::std::string, kOuts> outTypes;
108  static const ::std::array<::std::string, kPars> parTypes;
109 
110  static const ::std::array<::std::string, 2> templateTypes;
111  };
112 
113  template<typename TInput, unsigned int NDelay, typename TScalar>
114  const ::std::array<::std::string, BlockTraits<std::DifferentiatorBlock<TInput, NDelay, TScalar>>::kIns> BlockTraits<std::DifferentiatorBlock<TInput, NDelay, TScalar>>::inTypes =
115  {demangle(typeid(TInput).name())};
116 
117  template<typename TInput, unsigned int NDelay, typename TScalar>
118  const ::std::array<::std::string, BlockTraits<std::DifferentiatorBlock<TInput, NDelay, TScalar>>::kOuts> BlockTraits<std::DifferentiatorBlock<TInput, NDelay, TScalar>>::outTypes =
119  {demangle(typeid(TInput).name())};
120 
121  template<typename TInput, unsigned int NDelay, typename TScalar>
122  const ::std::array<::std::string, BlockTraits<std::DifferentiatorBlock<TInput, NDelay, TScalar>>::kPars> BlockTraits<std::DifferentiatorBlock<TInput, NDelay, TScalar>>::parTypes =
123  {demangle(typeid(TScalar).name())};
124 
125  template<typename TInput, unsigned int NDelay, typename TScalar>
126  const ::std::array<::std::string, 2> BlockTraits<std::DifferentiatorBlock<TInput, NDelay, TScalar>>::templateTypes =
127  {demangle(typeid(TInput).name()), "unsigned int"};
128  }
129 }
130 
131 
132 #endif //LODESTAR_DIFFERENTIATORBLOCK_HPP
ls::blocks::BlockTraits
A traits object that exposes information about TBlock.
Definition: BlockTraits.hpp:37
ls::blocks::BlockType
BlockType
Block type information.
Definition: BlockType.hpp:25
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::aux::ArrayStack
A statically sized stack with full member access.
Definition: ArrayStack.hpp:21
ls::blocks::BlockType::DifferentiatorBlock
@ DifferentiatorBlock
Differentiator block.
ls::aux::ArrayStack::size
size_t size() const noexcept
Gives current stack size.
Definition: ArrayStack.hpp:47
ls::blocks::Block
Generic base template class for all tuple-based Block instances.
Definition: Block.hpp:45
ls::aux::ArrayStack::push
void push(const TType &value)
Pushes value to front of ArrayStack.
Definition: ArrayStack.hpp:144
ls::primitives::AdaptiveBackwardDifference
Definition: AdaptiveBackwardDifference.hpp:16
ls::blocks::std::DifferentiatorBlock
Definition: DifferentiatorBlock.hpp:17