M5UnitUnified 0.4.4 git rev:306ddd5
Loading...
Searching...
No Matches
M5UnitComponent.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_COMPONENT_HPP
11#define M5_UNIT_COMPONENT_HPP
12
15#include <cstdint>
16#include <vector>
17#include <algorithm>
18#include <iterator>
19#include <type_traits>
20#include <memory>
21
22class TwoWire;
23class HardwareSerial;
24class SPIClass;
25struct SPISettings;
26
27namespace m5 {
28class I2C_Class;
29namespace unit {
30
31class UnitUnified;
32class Adapter;
33
38class Component {
39public:
46 uint32_t clock{100000};
48 uint32_t stored_size{1};
50 bool self_update{false};
52 uint8_t max_children{0};
53 };
54
58 static const types::uid_t uid;
59 static const types::attr_t attr;
60 static const char name[];
62
66 explicit Component(const uint8_t addr = 0x00); // I2C address
67
68 Component(const Component&) = delete;
69
70 Component(Component&&) noexcept = default;
72
76 Component& operator=(const Component&) = delete;
77
78 Component& operator=(Component&&) noexcept = default;
80
81 virtual ~Component() = default;
82
85
87 {
88 return _component_cfg;
89 }
91 inline void component_config(const component_config_t& cfg)
92 {
93 _component_cfg = cfg;
94 }
96
99
103 virtual bool begin()
104 {
105 return true;
106 }
111 virtual void update(const bool force = false)
112 {
113 (void)force;
114 }
116
119
120 inline const char* deviceName() const
121 {
122 return unit_device_name();
123 }
126 {
127 return unit_identifier();
128 }
131 {
132 return unit_attribute();
133 }
136 {
137 return unit_category();
138 }
140 inline uint32_t order() const
141 {
142 return _order;
143 }
145 inline int16_t channel() const
146 {
147 return _channel;
148 }
150 inline bool isRegistered() const
151 {
152 return _manager != nullptr;
153 }
155 inline uint8_t address() const
156 {
157 return _addr;
158 }
163 inline Adapter* adapter() const
164 {
165 return _adapter.get();
166 }
168 template <class T>
169 inline auto asAdapter(const Adapter::Type t) ->
170 typename std::remove_cv<typename std::remove_pointer<T>::type>::type*
171 {
172 using U = typename std::remove_cv<typename std::remove_pointer<T>::type>::type;
173 static_assert(std::is_base_of<Adapter, U>::value, "T must be derived from Adapter");
174 return (_adapter->type() == t) ? static_cast<U*>(_adapter.get()) : nullptr;
175 }
176 template <class T>
177 inline auto asAdapter(const Adapter::Type t) const -> const
178 typename std::remove_cv<typename std::remove_pointer<T>::type>::type*
179 {
180 using U = typename std::remove_cv<typename std::remove_pointer<T>::type>::type;
181 static_assert(std::is_base_of<Adapter, U>::value, "T must be derived from Adapter");
182 return (_adapter->type() == t) ? static_cast<const U*>(_adapter.get()) : nullptr;
183 }
185
188 bool canAccessI2C() const;
189 bool canAccessGPIO() const;
190 bool canAccessUART() const;
191 bool canAccessSPI() const;
193
196
197 inline bool inPeriodic() const
198 {
199 return in_periodic();
200 }
202 inline bool updated() const
203 {
204 return _updated;
205 }
211 {
212 return _latest;
213 }
219 {
220 return _interval;
221 }
223
226
227 virtual bool assign(m5::hal::bus::Bus* bus);
229 virtual bool assign(TwoWire& wire);
231 virtual bool assign(m5::I2C_Class& i2c);
233 virtual bool assign(const int8_t rx_pin, const int8_t tx_pin);
235 virtual bool assign(HardwareSerial& serial);
237 virtual bool assign(SPIClass& spi, const SPISettings& settings);
239
243
244 inline bool hasParent() const
245 {
246 return _parent != nullptr;
247 }
249 inline bool hasSiblings() const
250 {
251 return (_prev != nullptr) || (_next != nullptr);
252 }
254 inline bool hasChildren() const
255 {
256 return _child;
257 }
259 size_t childrenSize() const;
261 bool existsChild(const uint8_t ch) const;
264 {
265 return _parent;
266 }
268 Component* child(const uint8_t chhanle) const;
270 bool add(Component& c, const int16_t channel);
272 bool selectChannel(const uint8_t ch = 8);
274
276 template <typename T>
277 class iterator {
278 public:
279 using iterator_category = std::forward_iterator_tag;
280 using difference_type = std::ptrdiff_t;
281 using value_type = T;
282 using pointer = T*;
283 using reference = T&;
284
285 explicit iterator(Component* c = nullptr) : _ptr(c)
286 {
287 }
288
289 reference operator*() const
290 {
291 return *_ptr;
292 }
293 pointer operator->() const
294 {
295 return _ptr;
296 }
297 iterator& operator++()
298 {
299 _ptr = _ptr ? _ptr->_next : nullptr;
300 return *this;
301 }
302 iterator operator++(int)
303 {
304 auto tmp = *this;
305 ++(*this);
306 return tmp;
307 }
308 friend bool operator==(const iterator& a, const iterator& b)
309 {
310 return a._ptr == b._ptr;
311 }
312 friend bool operator!=(const iterator& a, const iterator& b)
313 {
314 return a._ptr != b._ptr;
315 }
316
317 private:
318 Component* _ptr;
319 };
320
321 using child_iterator = iterator<Component>;
322 using const_child_iterator = iterator<const Component>;
323 inline child_iterator childBegin() noexcept
324 {
325 return child_iterator(_child);
326 }
327 inline child_iterator childEnd() noexcept
328 {
329 return child_iterator();
330 }
331 inline const_child_iterator childBegin() const noexcept
332 {
333 return const_child_iterator(_child);
334 }
335 inline const_child_iterator childEnd() const noexcept
336 {
337 return const_child_iterator();
338 }
340
342 bool generalCall(const uint8_t* data, const size_t len);
343
345 virtual std::string debugInfo() const;
346
348
349 // I2C R/W
351 m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len);
352
353 template <typename Reg,
354 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
355 std::nullptr_t>::type = nullptr>
356 bool readRegister(const Reg reg, uint8_t* rbuf, const size_t len, const uint32_t delayMillis,
357 const bool stop = true);
358 template <typename Reg,
359 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
360 std::nullptr_t>::type = nullptr>
361 bool readRegister8(const Reg reg, uint8_t& result, const uint32_t delayMillis, const bool stop = true);
362
363 template <typename Reg,
364 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
365 std::nullptr_t>::type = nullptr>
366 inline bool readRegister16BE(const Reg reg, uint16_t& result, const uint32_t delayMillis, const bool stop = true)
367 {
368 return read_register16E(reg, result, delayMillis, stop, true);
369 }
370
371 template <typename Reg,
372 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
373 std::nullptr_t>::type = nullptr>
374 inline bool readRegister16LE(const Reg reg, uint16_t& result, const uint32_t delayMillis, const bool stop = true)
375 {
376 return read_register16E(reg, result, delayMillis, stop, false);
377 }
378
379 template <typename Reg,
380 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
381 std::nullptr_t>::type = nullptr>
382 inline bool readRegister32BE(const Reg reg, uint32_t& result, const uint32_t delayMillis, const bool stop = true)
383 {
384 return read_register32E(reg, result, delayMillis, stop, true);
385 }
386
387 template <typename Reg,
388 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
389 std::nullptr_t>::type = nullptr>
390 inline bool readRegister32LE(const Reg reg, uint32_t& result, const uint32_t delayMillis, const bool stop = true)
391 {
392 return read_register32E(reg, result, delayMillis, stop, false);
393 }
394
395 m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len, const uint32_t exparam = 1);
396
397 template <typename Reg,
398 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
399 std::nullptr_t>::type = nullptr>
400 m5::hal::error::error_t writeWithTransaction(const Reg reg, const uint8_t* data, const size_t len,
401 const bool stop = true);
402
403 template <typename Reg,
404 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
405 std::nullptr_t>::type = nullptr>
406 bool writeRegister(const Reg reg, const uint8_t* buf = nullptr, const size_t len = 0U, const bool stop = true);
407
408 template <typename Reg,
409 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
410 std::nullptr_t>::type = nullptr>
411 bool writeRegister8(const Reg reg, const uint8_t value, const bool stop = true);
412
413 template <typename Reg,
414 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
415 std::nullptr_t>::type = nullptr>
416 inline bool writeRegister16BE(const Reg reg, const uint16_t value, const bool stop = true)
417 {
418 return write_register16E(reg, value, stop, true);
419 }
420
421 template <typename Reg,
422 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
423 std::nullptr_t>::type = nullptr>
424 inline bool writeRegister16LE(const Reg reg, const uint16_t value, const bool stop = true)
425 {
426 return write_register16E(reg, value, stop, false);
427 }
428
429 template <typename Reg,
430 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
431 std::nullptr_t>::type = nullptr>
432 inline bool writeRegister32BE(const Reg reg, const uint32_t value, const bool stop = true)
433 {
434 return write_register32E(reg, value, stop, true);
435 }
436
437 template <typename Reg,
438 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
439 std::nullptr_t>::type = nullptr>
440 inline bool writeRegister32LE(const Reg reg, const uint32_t value, const bool stop = true)
441 {
442 return write_register32E(reg, value, stop, false);
443 }
444
445 // GPIO
446 bool pinModeRX(const gpio::Mode m);
447 bool writeDigitalRX(const bool high);
448 bool readDigitalRX(bool& high);
449 bool writeAnalogRX(const uint16_t v);
450 bool readAnalogRX(uint16_t& v);
451 bool readAnalogMilliVoltsRX(uint32_t& mv);
452 bool pulseInRX(uint32_t& duration, const int state, const uint32_t timeout_us = 1000000);
453
454 bool pinModeTX(const gpio::Mode m);
455 bool writeDigitalTX(const bool high);
456 bool readDigitalTX(bool& high);
457 bool writeAnalogTX(const uint16_t v);
458 bool readAnalogTX(uint16_t& v);
459 bool readAnalogMilliVoltsTX(uint32_t& mv);
460 bool pulseInTX(uint32_t& duration, const int state, const uint32_t timeout_us = 1000000);
462
463#if defined(DOXYGEN_PROCESS)
464 // There is a problem with the Doxygen output of templates containing std::enable_if,
465 // so we need a section for Dxygen output
469 m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len);
471 template <typename Reg>
472 bool readRegister(const Reg reg, uint8_t* rbuf, const size_t len, const uint32_t delayMillis,
473 const bool stop = true);
475 template <typename Reg>
476 bool readRegister8(const Reg reg, uint8_t& result, const uint32_t delayMillis, const bool stop = true);
478 template <typename Reg>
479 bool readRegister16BE(const Reg reg, uint16_t& result, const uint32_t delayMillis, const bool stop = true);
481 template <typename Reg>
482 bool readRegister16LE(const Reg reg, uint16_t& result, const uint32_t delayMillis, const bool stop = true);
484 template <typename Reg>
485 bool readRegister32BE(const Reg reg, uint32_t& result, const uint32_t delayMillis, const bool stop = true);
487 template <typename Reg>
488 bool readRegister32LE(const Reg reg, uint32_t& result, const uint32_t delayMillis, const bool stop = true);
489
491 m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len, const bool stop = true);
493 template <typename Reg>
494 m5::hal::error::error_t writeWithTransaction(const Reg reg, const uint8_t* data, const size_t len,
495 const bool stop = true);
497 template <typename Reg>
498 bool writeRegister(const Reg reg, const uint8_t* buf = nullptr, const size_t len = 0U, const bool stop = true);
500 template <typename Reg>
501 bool writeRegister8(const Reg reg, const uint8_t value, const bool stop = true);
503 template <typename Reg>
504 bool writeRegister16BE(const Reg reg, const uint16_t value, const bool stop = true);
506 template <typename Reg>
507 bool writeRegister16LE(const Reg reg, const uint16_t value, const bool stop = true);
509 template <typename Reg>
510 bool writeRegister32BE(const Reg reg, const uint32_t value, const bool stop = true);
512 template <typename Reg>
513 bool writeRegister32LE(const Reg reg, const uint32_t value, const bool stop = true);
515#endif
516
517protected:
518 // Proper implementation in derived classes is required
519 virtual const char* unit_device_name() const = 0;
520 virtual types::uid_t unit_identifier() const = 0;
521 virtual types::attr_t unit_attribute() const = 0;
522 inline virtual types::category_t unit_category() const
523 {
524 return types::category_t::None;
525 }
526 inline virtual bool in_periodic() const
527 {
528 return _periodic;
529 }
530
531 inline virtual std::shared_ptr<Adapter> ensure_adapter(const uint8_t /*ch*/)
532 {
533 return _adapter; // By default, offer my adapter for sharing
534 }
535
536 // Select valid channel if exists(PaHub etc...)
537 inline virtual m5::hal::error::error_t select_channel(const uint8_t)
538 {
539 return m5::hal::error::error_t::OK;
540 }
541
542 inline size_t stored_size() const
543 {
544 return _component_cfg.stored_size;
545 }
546
547 bool add_child(Component* c);
548
549 // I2C
550 bool changeAddress(const uint8_t addr); // Functions for dynamically addressable devices
551 template <typename Reg,
552 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
553 std::nullptr_t>::type = nullptr>
554 bool read_register16E(const Reg reg, uint16_t& result, const uint32_t delayMillis, const bool stop,
555 const bool endian);
556 template <typename Reg,
557 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
558 std::nullptr_t>::type = nullptr>
559 bool write_register16E(const Reg reg, const uint16_t value, const bool stop, const bool endifan);
560 template <typename Reg,
561 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
562 std::nullptr_t>::type = nullptr>
563 bool read_register32E(const Reg reg, uint32_t& result, const uint32_t delayMillis, const bool stop,
564 const bool endian);
565 template <typename Reg,
566 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value && sizeof(Reg) <= 2,
567 std::nullptr_t>::type = nullptr>
568 bool write_register32E(const Reg reg, const uint32_t value, const bool stop, const bool endifan);
569
570protected:
571 // For periodic measurement
572 types::elapsed_time_t _latest{}, _interval{};
573 bool _periodic{}; // During periodic measurement?
574 bool _updated{};
575
576private:
577 UnitUnified* _manager{};
578 std::shared_ptr<m5::unit::Adapter> _adapter{};
579
580 uint32_t _order{};
581 component_config_t _component_cfg{};
582 int16_t _channel{-1}; // valid [0...]
583 uint8_t _addr{};
584 bool _begun{};
585
586 // for chain
587 Component* _parent{};
588 Component* _next{};
589 Component* _prev{};
590 Component* _child{};
591
592 friend class UnitUnified;
593};
594
612template <class Derived, typename MD>
614public:
617
623 template <typename... Args>
624 inline bool startPeriodicMeasurement(Args&&... args)
625 {
626 // Prepare for future common initiation preprocessing needs
627 return static_cast<Derived*>(this)->start_periodic_measurement(std::forward<Args>(args)...);
628 }
635 template <typename... Args>
636 inline bool stopPeriodicMeasurement(Args&&... args)
637 {
638 // Prepare for future common stopping preprocessing needs
639 return static_cast<Derived*>(this)->stop_periodic_measurement(std::forward<Args>(args)...);
640 }
642
646 inline size_t available() const
647 {
648 return available_periodic_measurement_data();
649 }
651 inline bool empty() const
652 {
653 return empty_periodic_measurement_data();
654 }
656 inline bool full() const
657 {
658 return full_periodic_measurement_data();
659 }
661 inline MD oldest() const
662 {
663 return static_cast<const Derived*>(this)->oldest_periodic_data();
664 }
666 inline MD latest() const
667 {
668 return static_cast<const Derived*>(this)->latest_periodic_data();
669 }
671 inline void discard()
672 {
673 discard_periodic_measurement_data();
674 }
676 inline void flush()
677 {
678 flush_periodic_measurement_data();
679 }
681
682protected:
686 virtual size_t available_periodic_measurement_data() const = 0;
687 virtual bool empty_periodic_measurement_data() const = 0;
688 virtual bool full_periodic_measurement_data() const = 0;
689 virtual void discard_periodic_measurement_data() = 0;
690 virtual void flush_periodic_measurement_data() = 0;
692};
693
694} // namespace unit
695} // namespace m5
696
697// Helper for creating derived classes from Component
699#define M5_UNIT_COMPONENT_HPP_BUILDER(cls, reg) \
700public: \
701 constexpr static uint8_t DEFAULT_ADDRESS{(reg)}; \
702 static const types::uid_t uid; \
703 static const types::attr_t attr; \
704 static const char name[]; \
705 \
706 cls(const cls&) = delete; \
707 \
708 cls& operator=(const cls&) = delete; \
709 \
710 cls(cls&&) noexcept = default; \
711 \
712 cls& operator=(cls&&) noexcept = default; \
713 \
714protected: \
715 inline virtual const char* unit_device_name() const override \
716 { \
717 return name; \
718 } \
719 inline virtual types::uid_t unit_identifier() const override \
720 { \
721 return uid; \
722 } \
723 inline virtual types::attr_t unit_attribute() const override \
724 { \
725 return attr; \
726 }
727
728// Helper for creating derived class from PeriodicMeasurementAdapter
729#define M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(cls, md) \
730protected: \
731 friend class PeriodicMeasurementAdapter<cls, md>; \
732 \
733 inline md oldest_periodic_data() const \
734 { \
735 return !_data->empty() ? _data->front().value() : md{}; \
736 } \
737 inline md latest_periodic_data() const \
738 { \
739 return !_data->empty() ? _data->back().value() : md{}; \
740 } \
741 inline virtual size_t available_periodic_measurement_data() const override \
742 { \
743 return _data->size(); \
744 } \
745 inline virtual bool empty_periodic_measurement_data() const override \
746 { \
747 return _data->empty(); \
748 } \
749 inline virtual bool full_periodic_measurement_data() const override \
750 { \
751 return _data->full(); \
752 } \
753 inline virtual void discard_periodic_measurement_data() override \
754 { \
755 _data->pop_front(); \
756 } \
757 inline virtual void flush_periodic_measurement_data() override \
758 { \
759 _data->clear(); \
760 }
761
763#endif
Adapters to treat M5HAL and any connection in the same way.
Adapter base class to treat M5HAL and TwoWire,GPIO,Serial,SPI... in the same way.
Base class of unit component.
virtual void update(const bool force=false)
Update unit.
Definition M5UnitComponent.hpp:111
types::attr_t attribute() const
Gets the attributes.
Definition M5UnitComponent.hpp:130
bool writeRegister8(const Reg reg, const uint8_t value, const bool stop=true)
Write byte with transaction to register.
bool existsChild(const uint8_t ch) const
Is there an other unit connected to the specified channel?
Definition M5UnitComponent.cpp:39
bool readRegister8(const Reg reg, uint8_t &result, const uint32_t delayMillis, const bool stop=true)
Read byte with transaction from register.
bool readRegister16BE(const Reg reg, uint16_t &result, const uint32_t delayMillis, const bool stop=true)
Read word in big-endian order with transaction from register.
void component_config(const component_config_t &cfg)
Set the common configurations in each unit.
Definition M5UnitComponent.hpp:91
bool writeRegister(const Reg reg, const uint8_t *buf=nullptr, const size_t len=0U, const bool stop=true)
Write any data with transaction to register.
static const types::uid_t uid
Unique identifier.
Definition M5UnitComponent.hpp:58
bool selectChannel(const uint8_t ch=8)
Select valid channel if exists.
Definition M5UnitComponent.cpp:189
Component * parent()
Gets the parent unit.
Definition M5UnitComponent.hpp:263
component_config_t component_config()
Gets the common configurations in each unit.
Definition M5UnitComponent.hpp:86
bool writeRegister32BE(const Reg reg, const uint32_t value, const bool stop=true)
Write dword in big-endian order with transaction from register.
bool hasChildren() const
Are there other devices connected to me?
Definition M5UnitComponent.hpp:254
bool isRegistered() const
Is the unit registered with the manager?
Definition M5UnitComponent.hpp:150
virtual std::string debugInfo() const
Output information for debug.
Definition M5UnitComponent.cpp:404
static const char name[]
Device name string.
Definition M5UnitComponent.hpp:60
bool writeRegister32LE(const Reg reg, const uint32_t value, const bool stop=true)
Write dword in little-endian order with transaction from register.
bool inPeriodic() const
In periodic measurement?
Definition M5UnitComponent.hpp:197
bool writeRegister16BE(const Reg reg, const uint16_t value, const bool stop=true)
Write word in big-endian order with transaction from register.
Component * child(const uint8_t chhanle) const
Gets the device connected to the specified channel.
Definition M5UnitComponent.cpp:124
Adapter * adapter() const
Gets the access adapter.
Definition M5UnitComponent.hpp:163
m5::hal::error::error_t writeWithTransaction(const Reg reg, const uint8_t *data, const size_t len, const bool stop=true)
Write any data with transaction to register.
bool hasParent() const
Has parent unit?
Definition M5UnitComponent.hpp:244
bool hasSiblings() const
Are there any other devices connected to the same parent unit besides yourself?
Definition M5UnitComponent.hpp:249
size_t childrenSize() const
Number of units connected to me.
Definition M5UnitComponent.cpp:28
types::uid_t identifier() const
Gets the identifier.
Definition M5UnitComponent.hpp:125
const char * deviceName() const
Gets the device name.
Definition M5UnitComponent.hpp:120
virtual bool assign(m5::hal::bus::Bus *bus)
Assgin m5::hal::bus.
Definition M5UnitComponent.cpp:136
bool updated() const
Periodic measurement data updated?
Definition M5UnitComponent.hpp:202
types::elapsed_time_t updatedMillis() const
Time elapsed since start-up when the measurement data was updated in update()
Definition M5UnitComponent.hpp:210
static const types::attr_t attr
Attributes.
Definition M5UnitComponent.hpp:59
bool readRegister16LE(const Reg reg, uint16_t &result, const uint32_t delayMillis, const bool stop=true)
Read word in little-endian order with transaction from register.
bool readRegister32BE(const Reg reg, uint32_t &result, const uint32_t delayMillis, const bool stop=true)
Read dword in big-endian order with transaction from register.
auto asAdapter(const Adapter::Type t) const -> const typename std::remove_cv< typename std::remove_pointer< T >::type >::type *
Gets the device name.
Definition M5UnitComponent.hpp:177
m5::hal::error::error_t readWithTransaction(uint8_t *data, const size_t len)
Read any data with transaction.
Definition M5UnitComponent.cpp:198
bool writeRegister16LE(const Reg reg, const uint16_t value, const bool stop=true)
Write word in little-endian order with transaction from register.
m5::hal::error::error_t writeWithTransaction(const uint8_t *data, const size_t len, const bool stop=true)
Write any data with transaction.
bool readRegister(const Reg reg, uint8_t *rbuf, const size_t len, const uint32_t delayMillis, const bool stop=true)
Read any data with transaction from register.
uint8_t address() const
Address used to I2C access the device.
Definition M5UnitComponent.hpp:155
virtual bool begin()
Begin unit.
Definition M5UnitComponent.hpp:103
int16_t channel() const
Gets the channel if connected to another unit.
Definition M5UnitComponent.hpp:145
types::elapsed_time_t interval() const
Gets the periodic measurement interval.
Definition M5UnitComponent.hpp:218
bool generalCall(const uint8_t *data, const size_t len)
General call for I2C.
auto asAdapter(const Adapter::Type t) -> typename std::remove_cv< typename std::remove_pointer< T >::type >::type *
Gets the access adapter.
Definition M5UnitComponent.hpp:169
bool add(Component &c, const int16_t channel)
Connect the unit to the specified channel.
Definition M5UnitComponent.cpp:67
bool readRegister32LE(const Reg reg, uint32_t &result, const uint32_t delayMillis, const bool stop=true)
Read dword in little-endian order with transaction from register.
uint32_t order() const
Gets the registered order (== 0 means not yet)
Definition M5UnitComponent.hpp:140
types::category_t category() const
Gets the category.
Definition M5UnitComponent.hpp:135
Interface class for periodic measurement (CRTP)
Definition M5UnitComponent.hpp:613
MD oldest() const
Retrieve oldest stored data.
Definition M5UnitComponent.hpp:661
size_t available() const
Gets the number of stored data.
Definition M5UnitComponent.hpp:646
bool startPeriodicMeasurement(Args &&... args)
Start periodic measurement.
Definition M5UnitComponent.hpp:624
void discard()
Discard the oldest data accumulated.
Definition M5UnitComponent.hpp:671
MD latest() const
Retrieve latest stored data.
Definition M5UnitComponent.hpp:666
bool stopPeriodicMeasurement(Args &&... args)
Stop periodic measurement.
Definition M5UnitComponent.hpp:636
bool empty() const
Is empty stored data?
Definition M5UnitComponent.hpp:651
bool full() const
Is stored data full?
Definition M5UnitComponent.hpp:656
void flush()
Discard all data.
Definition M5UnitComponent.hpp:676
Top level namespace of M5stack.
Definition test_helper.hpp:20
Unit-related namespace.
Component basic settings for begin.
Definition M5UnitComponent.hpp:44
uint32_t clock
Clock for communication (default as 100000)
Definition M5UnitComponent.hpp:46
uint32_t stored_size
Maximum number of periodic measurement data to be stored.
Definition M5UnitComponent.hpp:48
uint8_t max_children
Maximum number of units that can be connected (default as 0)
Definition M5UnitComponent.hpp:52
bool self_update
Does the user call Unit's update? (default as false)
Definition M5UnitComponent.hpp:50
Type and enumerator definitions.
unsigned long elapsed_time_t
Elapsed time unit (ms)
Definition types.hpp:42
uint32_t attr_t
Component attribute bits.
Definition types.hpp:41
uint32_t uid_t
Component unique identifier.
Definition types.hpp:40
category_t
Unit category (used for static class determination)
Definition types.hpp:35