Parameter.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. /*
  2. * TI Voxel Lib component.
  3. *
  4. * Copyright (c) 2014 Texas Instruments Inc.
  5. */
  6. #ifndef VOXEL_PARAMETER_H
  7. #define VOXEL_PARAMETER_H
  8. #include <stdint.h>
  9. #include "Common.h"
  10. #include "RegisterProgrammer.h"
  11. #include "Logger.h"
  12. #include <type_traits>
  13. namespace Voxel
  14. {
  15. /**
  16. * \defgroup Param Parameter related classes
  17. * @{
  18. */
  19. class ParameterDMLParser;
  20. class VOXEL_EXPORT Parameter
  21. {
  22. public:
  23. enum IOType
  24. {
  25. IO_READ_ONLY = 0,
  26. IO_READ_WRITE,
  27. IO_WRITE_ONLY
  28. };
  29. protected:
  30. uint32_t _address, _mask;
  31. uint8_t _msb, _lsb, _registerLength;
  32. // This is to do @_address <- (@_address & _mask) | (_value << _lsb)
  33. IOType _ioType;
  34. String _name;
  35. String _displayName;
  36. String _description;
  37. Vector<String> _dependencies; // Parameter values on which this parameter depends on
  38. RegisterProgrammer &_programmer;
  39. void _computeMask();
  40. public:
  41. Parameter(RegisterProgrammer &programmer, const String &name, uint32_t address, uint8_t registerLength, uint8_t msb, uint8_t lsb,
  42. const String &displayName, const String &description, IOType ioType = IO_READ_WRITE, const Vector<String> &dependencies = {})
  43. : _programmer(programmer), _name(name), _displayName(displayName), _description(description),
  44. _address(address), _msb(msb), _registerLength(registerLength), _lsb(lsb), _ioType(ioType), _dependencies(dependencies)
  45. {
  46. _computeMask();
  47. }
  48. inline const String &name() const { return _name; }
  49. inline const String &displayName() const { return _displayName; }
  50. inline const String &description() const { return _description; }
  51. inline uint32_t address() const { return _address; }
  52. inline uint8_t msb() const { return _msb; }
  53. inline uint32_t mask() const { return _mask; }
  54. inline uint8_t lsb() const { return _lsb; }
  55. inline IOType ioType() const { return _ioType; }
  56. inline void setName(const String &n) { _name = n; }
  57. inline void setAddress(uint32_t a) { _address = a; }
  58. virtual bool refresh() = 0;
  59. virtual ~Parameter() {}
  60. friend class ParameterDMLParser;
  61. };
  62. typedef Ptr<Parameter> ParameterPtr;
  63. // NOTE: _value is initialized to defaultValue and not read from H/W. It needs to be manually done from outside via set() or get(true)
  64. template <typename T>
  65. class ParameterTemplate: public Parameter
  66. {
  67. protected:
  68. T _value;
  69. virtual uint32_t _toRawValue(T value) const
  70. {
  71. return (uint32_t)value;
  72. }
  73. virtual T _fromRawValue(uint32_t value) const
  74. {
  75. return (T)(value);
  76. }
  77. public:
  78. ParameterTemplate(RegisterProgrammer &programmer, const String &name, uint32_t address, uint8_t registerLength, uint8_t msb, uint8_t lsb,
  79. const T &defaultValue,
  80. const String &displayName, const String &description, Parameter::IOType ioType = Parameter::IO_READ_WRITE, const Vector<String> &dependencies = {}):
  81. Parameter(programmer, name, address, registerLength, msb, lsb, displayName, description, ioType, dependencies), _value(defaultValue)
  82. {
  83. }
  84. static Ptr<ParameterTemplate<T>> typeCast(const ParameterPtr &other)
  85. {
  86. return std::dynamic_pointer_cast<ParameterTemplate<T>>(other);
  87. }
  88. virtual bool set(const T &value)
  89. {
  90. if(_ioType == IO_READ_ONLY || !validate(value))
  91. {
  92. return false;
  93. }
  94. if(_programmer.setValue(*this, _toRawValue(value), _ioType == IO_WRITE_ONLY))
  95. {
  96. _value = value;
  97. return true;
  98. }
  99. else
  100. return false;
  101. }
  102. virtual bool validate(const T &value) const = 0;
  103. virtual bool refresh()
  104. {
  105. T v;
  106. return get(v, true);
  107. }
  108. virtual bool get(T &value, bool refresh = false)
  109. {
  110. if(!refresh || _ioType == IO_WRITE_ONLY)
  111. {
  112. value = _value;
  113. return true;
  114. }
  115. uint32_t v;
  116. T val;
  117. if(_address == 0 && _registerLength == 0) // dummy register?
  118. {
  119. value == _value;
  120. return true;
  121. }
  122. else if(!_programmer.getValue(*this, v))
  123. {
  124. value = _value;
  125. return false;
  126. }
  127. else
  128. {
  129. val = _fromRawValue(v);
  130. if(validate(val))
  131. {
  132. value = val;
  133. _value = val;
  134. return true;
  135. }
  136. else
  137. {
  138. value = _value;
  139. return false;
  140. }
  141. }
  142. }
  143. virtual ~ParameterTemplate() {}
  144. };
  145. typedef ParameterTemplate<bool> BoolParameterTemplate;
  146. typedef ParameterTemplate<int> IntegerParameterTemplate;
  147. typedef ParameterTemplate<uint> UnsignedIntegerParameterTemplate;
  148. typedef ParameterTemplate<float> FloatParameterTemplate;
  149. #ifdef SWIG
  150. %template(BoolParameterTemplate) ParameterTemplate<bool>;
  151. %template(IntegerParameterTemplate) ParameterTemplate<int>;
  152. %template(UnsignedIntegerParameterTemplate) ParameterTemplate<uint>;
  153. %template(FloatParameterTemplate) ParameterTemplate<float>;
  154. #endif
  155. template <typename T>
  156. class EnumParameterTemplate: public ParameterTemplate<T>
  157. {
  158. protected:
  159. Vector<String> _valueMeaning;
  160. Vector<String> _valueDescription;
  161. public:
  162. EnumParameterTemplate(RegisterProgrammer &programmer, const String &name, uint32_t address, uint8_t registerLength, uint8_t msb, uint8_t lsb,
  163. const Vector<String> &valueDescription, const Vector<String> &valueMeaning, const T &defaultValue,
  164. const String &displayName, const String &description, Parameter::IOType ioType = Parameter::IO_READ_WRITE, const Vector<String> &dependencies = {}):
  165. ParameterTemplate<T>(programmer, name, address, registerLength, msb, lsb, defaultValue, displayName, description, ioType, dependencies), _valueDescription(valueDescription), _valueMeaning(valueMeaning)
  166. {
  167. }
  168. static Ptr<EnumParameterTemplate<T>> typeCast(const ParameterPtr &other)
  169. {
  170. return std::dynamic_pointer_cast<EnumParameterTemplate<T>>(other);
  171. }
  172. inline const Vector<String> &valueDescription() const { return _valueDescription; }
  173. inline const Vector<String> &valueMeaning() const { return _valueMeaning; }
  174. virtual ~EnumParameterTemplate() {}
  175. };
  176. typedef EnumParameterTemplate<bool> BoolEnumParameterTemplate;
  177. typedef EnumParameterTemplate<int> IntegerEnumParameterTemplate;
  178. #ifdef SWIG
  179. %template(BoolEnumParameterTemplate) EnumParameterTemplate<bool>;
  180. %template(IntegerEnumParameterTemplate) EnumParameterTemplate<int>;
  181. #endif
  182. class VOXEL_EXPORT BoolParameter : public EnumParameterTemplate<bool>
  183. {
  184. virtual bool _fromRawValue(uint32_t value) const
  185. {
  186. return (value?true:false);
  187. }
  188. virtual uint32_t _toRawValue(bool value) const
  189. {
  190. return (uint32_t)value?1:0;
  191. }
  192. public:
  193. BoolParameter(RegisterProgrammer &programmer, const String &name, uint32_t address, uint8_t registerLength, uint8_t lsb,
  194. const Vector<String> &valueDescription, const Vector<String> &valueMeaning, const bool &defaultValue,
  195. const String &displayName, const String &description, Parameter::IOType ioType = Parameter::IO_READ_WRITE, const Vector<String> &dependencies = {}):
  196. EnumParameterTemplate<bool>(programmer, name, address, registerLength, lsb, lsb, valueDescription, valueMeaning, defaultValue, displayName, description, ioType, dependencies)
  197. {
  198. }
  199. static Ptr<BoolParameter> typeCast(const ParameterPtr &other)
  200. {
  201. return std::dynamic_pointer_cast<BoolParameter>(other);
  202. }
  203. virtual bool validate(const bool &value) const
  204. {
  205. return true;
  206. }
  207. virtual ~BoolParameter() {}
  208. };
  209. class VOXEL_EXPORT StrobeBoolParameter : public BoolParameter
  210. {
  211. public:
  212. StrobeBoolParameter(RegisterProgrammer &programmer, const String &name, uint32_t address, uint8_t registerLength, uint8_t lsb,
  213. const Vector<String> &valueDescription, const Vector<String> &valueMeaning, const bool &defaultValue,
  214. const String &displayName, const String &description, Parameter::IOType ioType = Parameter::IO_READ_WRITE, const Vector<String> &dependencies = {}):
  215. BoolParameter(programmer, name, address, registerLength, lsb, valueDescription, valueMeaning, defaultValue, displayName, description, ioType, dependencies)
  216. {
  217. }
  218. static Ptr<StrobeBoolParameter> typeCast(const ParameterPtr &other)
  219. {
  220. return std::dynamic_pointer_cast<StrobeBoolParameter>(other);
  221. }
  222. virtual bool get(bool &value, bool refresh = true)
  223. {
  224. return BoolParameter::get(value, true); // ignore the refresh set by user and force it to true
  225. }
  226. virtual ~StrobeBoolParameter() {}
  227. };
  228. class VOXEL_EXPORT EnumParameter : public EnumParameterTemplate<int>
  229. {
  230. protected:
  231. Vector<int> _allowedValues;
  232. public:
  233. EnumParameter(RegisterProgrammer &programmer, const String &name, uint32_t address, uint8_t registerLength, uint8_t msb, uint8_t lsb,
  234. const Vector<int> &allowedValues, const Vector<String> valueDescription, const Vector<String> &valueMeaning, const int &defaultValue,
  235. const String &displayName, const String &description, Parameter::IOType ioType = Parameter::IO_READ_WRITE, const Vector<String> &dependencies = {}):
  236. EnumParameterTemplate<int>(programmer, name, address, registerLength, msb, lsb, valueDescription, valueMeaning, defaultValue, displayName, description, ioType, dependencies),
  237. _allowedValues(allowedValues)
  238. {
  239. }
  240. static Ptr<EnumParameter> typeCast(const ParameterPtr &other)
  241. {
  242. return std::dynamic_pointer_cast<EnumParameter>(other);
  243. }
  244. inline const Vector<int> &allowedValues() const { return _allowedValues; }
  245. virtual bool validate(const int &value) const
  246. {
  247. bool allowed = false;
  248. for(auto a : _allowedValues)
  249. if(value == a)
  250. {
  251. allowed = true;
  252. break;
  253. }
  254. return allowed;
  255. }
  256. virtual ~EnumParameter() {}
  257. };
  258. template<typename T>
  259. class RangeParameterTemplate : public ParameterTemplate<T>
  260. {
  261. protected:
  262. T _lowerLimit, _upperLimit;
  263. String _unit;
  264. public:
  265. RangeParameterTemplate(RegisterProgrammer &programmer, const String &name, const String &unit, uint32_t address, uint8_t registerLength, uint8_t msb, uint8_t lsb,
  266. const T &lowerLimit, const T &upperLimit, const T &defaultValue,
  267. const String &displayName, const String &description, Parameter::IOType ioType = Parameter::IO_READ_WRITE, const Vector<String> &dependencies = {}):
  268. ParameterTemplate<T>(programmer, name, address, registerLength, msb, lsb, defaultValue, displayName, description, ioType, dependencies),
  269. _lowerLimit(lowerLimit), _upperLimit(upperLimit), _unit(unit)
  270. {
  271. }
  272. static Ptr<RangeParameterTemplate<T>> typeCast(const ParameterPtr &other)
  273. {
  274. return std::dynamic_pointer_cast<RangeParameterTemplate<T>>(other);
  275. }
  276. const String &unit() const { return _unit; }
  277. virtual const T lowerLimit() const { return _lowerLimit; }
  278. virtual const T upperLimit() const { return _upperLimit; }
  279. virtual void setLowerLimit(T lowerLimit) { _lowerLimit = lowerLimit; }
  280. virtual void setUpperLimit(T upperLimit) { _upperLimit = upperLimit; }
  281. virtual bool validate(const T &value) const
  282. {
  283. return !(value < _lowerLimit || value > _upperLimit);
  284. }
  285. virtual ~RangeParameterTemplate() {}
  286. };
  287. typedef RangeParameterTemplate<int> IntegerRangeParameterTemplate;
  288. typedef RangeParameterTemplate<float> FloatRangeParameterTemplate;
  289. #ifdef SWIG
  290. %template(IntegerRangeParameterTemplate) RangeParameterTemplate<int>;
  291. %template(UnsignedIntegerParameter) RangeParameterTemplate<uint>;
  292. %template(FloatRangeParameterTemplate) RangeParameterTemplate<float>;
  293. #endif
  294. class VOXEL_EXPORT IntegerParameter : public RangeParameterTemplate<int>
  295. {
  296. protected:
  297. virtual uint32_t _toRawValue(int value) const
  298. {
  299. if(value < 0) // negative?
  300. {
  301. return ((uint32_t)value & ((1 << (_msb - _lsb + 1)) - 1)); // remove sign extension
  302. }
  303. else
  304. return (uint32_t)value;
  305. }
  306. virtual int _fromRawValue(uint32_t value) const
  307. {
  308. if(value & (1 << (_msb - _lsb))) // negative?
  309. return (value | ((uint32_t)(-1) - ((1 << (_msb - _lsb + 1)) - 1))); // extend sign
  310. else
  311. return (int)value;
  312. }
  313. public:
  314. IntegerParameter(RegisterProgrammer &programmer, const String &name, const String &unit, uint32_t address, uint8_t registerLength, uint8_t msb, uint8_t lsb,
  315. int lowerLimit, int upperLimit, const int &defaultValue,
  316. const String &displayName, const String &description, Parameter::IOType ioType = Parameter::IO_READ_WRITE, const Vector<String> &dependencies = {}):
  317. RangeParameterTemplate<int>(programmer, name, unit, address, registerLength, msb, lsb, lowerLimit, upperLimit, defaultValue, displayName, description, ioType, dependencies)
  318. {
  319. }
  320. static Ptr<IntegerParameter> typeCast(const ParameterPtr &other)
  321. {
  322. return std::dynamic_pointer_cast<IntegerParameter>(other);
  323. }
  324. virtual ~IntegerParameter() {}
  325. };
  326. typedef RangeParameterTemplate<uint> UnsignedIntegerParameter;
  327. class VOXEL_EXPORT FloatParameter : public RangeParameterTemplate<float>
  328. {
  329. protected:
  330. virtual float _fromRawValue(uint32_t value) const
  331. {
  332. float v;
  333. v = (float)value/(1 << (msb() - lsb() + 1)); // normalized value
  334. if(v > 1.0f) v = 1.0f;
  335. if(v < 0.0f) v = 0.0f;
  336. return v;
  337. }
  338. virtual uint32_t _toRawValue(float value) const
  339. {
  340. uint32_t maxValue = (1 << (msb() - lsb() + 1));
  341. uint32_t v = (uint32_t)value*maxValue; // normalized value
  342. if(v > maxValue) v = maxValue;
  343. if(v < 0) v = 0;
  344. return v;
  345. }
  346. public:
  347. FloatParameter(RegisterProgrammer &programmer, const String &name, const String &unit, uint32_t address, uint8_t registerLength, uint8_t msb, uint8_t lsb,
  348. float lowerLimit, float upperLimit, const float &defaultValue,
  349. const String &displayName, const String &description, Parameter::IOType ioType = Parameter::IO_READ_WRITE, const Vector<String> &dependencies = {}):
  350. RangeParameterTemplate<float>(programmer, name, unit, address, registerLength, msb, lsb, lowerLimit, upperLimit, defaultValue, displayName, description, ioType, dependencies)
  351. {
  352. }
  353. static Ptr<FloatParameter> typeCast(const ParameterPtr &other)
  354. {
  355. return std::dynamic_pointer_cast<FloatParameter>(other);
  356. }
  357. virtual ~FloatParameter() {}
  358. };
  359. /**
  360. * @}
  361. */
  362. }
  363. #endif // PARAMETER_H