NXPCUP-libary
Library for car's control board on NXPCUP competition based on the Mbed framework.
value.h
Go to the documentation of this file.
1 #pragma once
2 
3 // This file is part of 'Atoms' library - https://github.com/yaqwsx/atoms
4 // Author: Jan 'yaqwsx' Mrázek
5 
6 #ifdef ATOMS_NO_STDLIB
7  #include "../stdlib/algorithm.h"
8 #else
9  #include <algorithm>
10 #endif
11 
12 namespace atoms {
13 
14 // Internal implementation of Value
15 template <class ValType, template <class> class... Modifiers>
16 class ValueMod {
17 protected:
18  ValType initial(const ValType& v) {
19  return v;
20  }
21 
22  ValType set(const ValType& value) {
23  return value;
24  }
25 
26  template <class Time>
27  ValType set(const ValType& value, const Time&) {
28  return value;
29  }
30 };
31 
32 // Internal implementation of Value
33 template <class ValType, template <class> class T, template <class> class... Modifiers>
34 class ValueMod<ValType, T, Modifiers...> : ValueMod<ValType, Modifiers...> {
35 public:
36  ValueMod(T<ValType> modifier, Modifiers<ValType>... modifiers)
37  : ValueMod<ValType, Modifiers...>(modifiers...), modifier(modifier) {}
38 protected:
39  ValType initial(const ValType& value) {
40  auto new_val = modifier.process(value);
42  }
43 
44  ValType set(const ValType& value) {
45  auto new_value = modifier.process(value);
46  return ValueMod<ValType, Modifiers...>::set(new_value);
47  }
48 
49  template <class Time>
50  ValType set(const ValType& value, const Time& t) {
51  auto new_value = modifier.process(value, t);
52  return ValueMod<ValType, Modifiers...>::set(new_value, t);
53  }
54 
55 private:
56  T<ValType> modifier;
57 };
58 
59 // Value - represents a value that can be read or stored. When store,
60 // given modifiers are applied.
61 template <class ValType, template <class> class... Modifiers>
62 class Value : ValueMod<ValType, Modifiers...> {
63 public:
64  Value(ValType val, Modifiers<ValType>... modifiers)
65  : ValueMod<ValType, Modifiers...>(modifiers...)
66  {
68  }
69 
70  void set(const ValType& new_value) {
71  value = ValueMod<ValType, Modifiers...>::set(new_value);
72  }
73 
74  template <class Time>
75  void set(const ValType& new_value, const Time& t) {
76  value = ValueMod<ValType, Modifiers...>::set(new_value, t);
77  }
78 
79  operator ValType() const {
80  return value;
81  }
82 
83  ValType get() const {
84  return value;
85  }
86 
87  Value& operator=(const Value&) = default;
88 
89  Value& operator=(const ValType& new_value) {
90  set(new_value);
91  return *this;
92  }
93 
94  void reset(const ValType& val) {
96  }
97 
98 private:
99  ValType value;
100 };
101 
102 // Accelerated modifier - the value cannot rise or fall faster than specified
103 template <class T>
104 struct Accelerated {
105  T acceleration, decceleration;
106  T value;
107 
108  T initial(T initial_value) {
109  value = initial_value;
110  return value;
111  }
112 
113  T process(const T& new_value) {
114  if (new_value > value)
115  value = std::min(new_value, value + acceleration);
116  else
117  value = std::max(new_value, value - decceleration);
118  return value;
119  }
120 
121  template <class S>
122  T process(const T& new_value, const S& step) {
123  if (new_value > value)
124  value = std::min(new_value, T(value + acceleration * step));
125  else
126  value = std::max(new_value, T(value - decceleration * step));
127  return value;
128  }
129 };
130 
131 // Modifier for Value - keeps value withing defind range
132 template <class T>
133 struct Clamped {
134  T bottom, top;
135 
136  T initial(T initial_value) {
137  return process(initial_value);
138  }
139 
140  T process(const T& new_value) {
141  if (new_value > top)
142  return top;
143  if (new_value < bottom)
144  return bottom;
145  return new_value;
146  }
147 
148  template <class S>
149  T process(const T& new_value, const S&) {
150  return process(new_value);
151  }
152 };
153 
154 }
Value(ValType val, Modifiers< ValType >...modifiers)
Definition: value.h:64
ValType initial(const ValType &value)
Definition: value.h:39
T initial(T initial_value)
Definition: value.h:136
T top
Definition: value.h:134
ValueMod(T< ValType > modifier, Modifiers< ValType >...modifiers)
Definition: value.h:36
T process(const T &new_value)
Definition: value.h:113
T initial(T initial_value)
Definition: value.h:108
ValType initial(const ValType &v)
Definition: value.h:18
Definition: value.h:133
Definition: value.h:16
T process(const T &new_value, const S &)
Definition: value.h:149
Definition: value.h:62
Definition: value.h:104
T value
Definition: value.h:106
Value & operator=(const ValType &new_value)
Definition: value.h:89
T process(const T &new_value)
Definition: value.h:140
Definition: pid.h:8
T process(const T &new_value, const S &step)
Definition: value.h:122
void reset(const ValType &val)
Definition: value.h:94
ValType set(const ValType &value)
Definition: value.h:22
T decceleration
Definition: value.h:105