10#ifndef M5_UNIT_COMPONENT_HPP
11#define M5_UNIT_COMPONENT_HPP
15#if defined(ESP_PLATFORM)
16#include <driver/uart.h>
17#include <driver/spi_master.h>
19#if defined(ESP_PLATFORM) && __has_include(<driver/i2c_master.h>)
20#include <driver/i2c_master.h>
21#elif defined(ESP_PLATFORM)
22#include <driver/i2c.h>
31#if defined(ARDUINO) || defined(DOXYGEN_PROCESS)
77 explicit Component(
const uint8_t addr = 0x00);
102 return _component_cfg;
110 _component_cfg = cfg;
128 virtual void update(
const bool force =
false)
142 return unit_device_name();
150 return unit_identifier();
158 return unit_attribute();
166 return unit_category();
190 return _manager !=
nullptr;
207 return _adapter.get();
217 typename std::remove_cv<typename std::remove_pointer<T>::type>::type*
219 using U =
typename std::remove_cv<typename std::remove_pointer<T>::type>::type;
220 static_assert(std::is_base_of<Adapter, U>::value,
"T must be derived from Adapter");
221 return (_adapter->type() == t) ?
static_cast<U*
>(_adapter.get()) :
nullptr;
231 typename std::remove_cv<typename std::remove_pointer<T>::type>::type*
233 using U =
typename std::remove_cv<typename std::remove_pointer<T>::type>::type;
234 static_assert(std::is_base_of<Adapter, U>::value,
"T must be derived from Adapter");
235 return (_adapter->type() == t) ?
static_cast<const U*
>(_adapter.get()) :
nullptr;
271 return in_periodic();
301#if defined(ARDUINO) || defined(DOXYGEN_PROCESS)
309#if defined(DOXYGEN_PROCESS) || (defined(ESP_PLATFORM) && __has_include(<driver/i2c_master.h>))
315 virtual bool assign(i2c_master_bus_handle_t bus);
317#if defined(DOXYGEN_PROCESS) || (defined(ESP_PLATFORM) && !__has_include(<driver/i2c_master.h>))
325 virtual bool assign(
const i2c_port_t port,
const gpio_num_t sda,
const gpio_num_t scl);
332 virtual bool assign(m5::I2C_Class& i2c);
335#if defined(ESP_PLATFORM) || defined(DOXYGEN_PROCESS)
345 virtual bool assign(
const int8_t rx_pin,
const int8_t tx_pin);
351#if defined(ARDUINO) || defined(DOXYGEN_PROCESS)
357 virtual bool assign(HardwareSerial& serial);
359#if defined(ESP_PLATFORM) || defined(DOXYGEN_PROCESS)
366 virtual bool assign(
const uart_port_t uart_num);
372#if defined(ARDUINO) || defined(DOXYGEN_PROCESS)
379 virtual bool assign(SPIClass& spi,
const SPISettings& settings);
381#if defined(ESP_PLATFORM) || defined(DOXYGEN_PROCESS)
389 virtual bool assign(spi_device_handle_t handle,
const gpio_num_t cs = GPIO_NUM_NC);
400 virtual bool assign(m5::hal::bus::Bus* bus);
412 return _parent !=
nullptr;
420 return (_prev !=
nullptr) || (_next !=
nullptr);
471 template <
typename T>
474 using iterator_category = std::forward_iterator_tag;
475 using difference_type = std::ptrdiff_t;
476 using value_type = T;
478 using reference = T&;
480 explicit iterator(
Component* c =
nullptr) : _ptr(c)
484 reference operator*()
const
488 pointer operator->()
const
492 iterator& operator++()
494 _ptr = _ptr ? _ptr->_next :
nullptr;
497 iterator operator++(
int)
503 friend bool operator==(
const iterator& a,
const iterator& b)
505 return a._ptr == b._ptr;
507 friend bool operator!=(
const iterator& a,
const iterator& b)
509 return a._ptr != b._ptr;
516 using child_iterator = iterator<Component>;
517 using const_child_iterator = iterator<const Component>;
518 inline child_iterator childBegin() noexcept
520 return child_iterator(_child);
522 inline child_iterator childEnd() noexcept
524 return child_iterator();
526 inline const_child_iterator childBegin() const noexcept
528 return const_child_iterator(_child);
530 inline const_child_iterator childEnd() const noexcept
532 return const_child_iterator();
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 readRegister(
const Reg reg, uint8_t* rbuf,
const size_t len,
const uint32_t delayMillis,
560 const bool stop =
true);
561 template <
typename Reg,
562 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
563 std::nullptr_t>::type =
nullptr>
564 bool readRegister8(
const Reg reg, uint8_t& result,
const uint32_t delayMillis,
const bool stop =
true);
566 template <
typename Reg,
567 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
568 std::nullptr_t>::type =
nullptr>
569 inline bool readRegister16BE(
const Reg reg, uint16_t& result,
const uint32_t delayMillis,
const bool stop =
true)
571 return read_register16E(reg, result, delayMillis, stop,
true);
574 template <
typename Reg,
575 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
576 std::nullptr_t>::type =
nullptr>
577 inline bool readRegister16LE(
const Reg reg, uint16_t& result,
const uint32_t delayMillis,
const bool stop =
true)
579 return read_register16E(reg, result, delayMillis, stop,
false);
582 template <
typename Reg,
583 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
584 std::nullptr_t>::type =
nullptr>
585 inline bool readRegister32BE(
const Reg reg, uint32_t& result,
const uint32_t delayMillis,
const bool stop =
true)
587 return read_register32E(reg, result, delayMillis, stop,
true);
590 template <
typename Reg,
591 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
592 std::nullptr_t>::type =
nullptr>
593 inline bool readRegister32LE(
const Reg reg, uint32_t& result,
const uint32_t delayMillis,
const bool stop =
true)
595 return read_register32E(reg, result, delayMillis, stop,
false);
598 m5::hal::error::error_t
writeWithTransaction(
const uint8_t* data,
const size_t len,
const uint32_t exparam = 1);
600 template <
typename Reg,
601 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
602 std::nullptr_t>::type =
nullptr>
603 m5::hal::error::error_t
writeWithTransaction(
const Reg reg,
const uint8_t* data,
const size_t len,
604 const bool stop =
true);
606 template <
typename Reg,
607 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
608 std::nullptr_t>::type =
nullptr>
609 bool writeRegister(
const Reg reg,
const uint8_t* buf =
nullptr,
const size_t len = 0U,
const bool stop =
true);
611 template <
typename Reg,
612 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
613 std::nullptr_t>::type =
nullptr>
614 bool writeRegister8(
const Reg reg,
const uint8_t value,
const bool stop =
true);
616 template <
typename Reg,
617 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
618 std::nullptr_t>::type =
nullptr>
619 inline bool writeRegister16BE(
const Reg reg,
const uint16_t value,
const bool stop =
true)
621 return write_register16E(reg, value, stop,
true);
624 template <
typename Reg,
625 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
626 std::nullptr_t>::type =
nullptr>
627 inline bool writeRegister16LE(
const Reg reg,
const uint16_t value,
const bool stop =
true)
629 return write_register16E(reg, value, stop,
false);
632 template <
typename Reg,
633 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
634 std::nullptr_t>::type =
nullptr>
635 inline bool writeRegister32BE(
const Reg reg,
const uint32_t value,
const bool stop =
true)
637 return write_register32E(reg, value, stop,
true);
640 template <
typename Reg,
641 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
642 std::nullptr_t>::type =
nullptr>
643 inline bool writeRegister32LE(
const Reg reg,
const uint32_t value,
const bool stop =
true)
645 return write_register32E(reg, value, stop,
false);
649#if defined(ESP_PLATFORM)
650 bool pinModeRX(
const gpio::Mode m);
651 bool writeDigitalRX(
const bool high);
652 bool readDigitalRX(
bool& high);
653 bool writeAnalogRX(
const uint16_t v);
654 bool readAnalogRX(uint16_t& v);
655 bool readAnalogMilliVoltsRX(uint32_t& mv);
656 bool pulseInRX(uint32_t& duration,
const int state,
const uint32_t timeout_us = 1000000);
658 bool pinModeTX(
const gpio::Mode m);
659 bool writeDigitalTX(
const bool high);
660 bool readDigitalTX(
bool& high);
661 bool writeAnalogTX(
const uint16_t v);
662 bool readAnalogTX(uint16_t& v);
663 bool readAnalogMilliVoltsTX(uint32_t& mv);
664 bool pulseInTX(uint32_t& duration,
const int state,
const uint32_t timeout_us = 1000000);
668#if defined(DOXYGEN_PROCESS)
676 template <
typename Reg>
677 bool readRegister(
const Reg reg, uint8_t* rbuf,
const size_t len,
const uint32_t delayMillis,
678 const bool stop =
true);
680 template <
typename Reg>
681 bool readRegister8(
const Reg reg, uint8_t& result,
const uint32_t delayMillis,
const bool stop =
true);
683 template <
typename Reg>
684 bool readRegister16BE(
const Reg reg, uint16_t& result,
const uint32_t delayMillis,
const bool stop =
true);
686 template <
typename Reg>
687 bool readRegister16LE(
const Reg reg, uint16_t& result,
const uint32_t delayMillis,
const bool stop =
true);
689 template <
typename Reg>
690 bool readRegister32BE(
const Reg reg, uint32_t& result,
const uint32_t delayMillis,
const bool stop =
true);
692 template <
typename Reg>
693 bool readRegister32LE(
const Reg reg, uint32_t& result,
const uint32_t delayMillis,
const bool stop =
true);
698 template <
typename Reg>
700 const bool stop =
true);
702 template <
typename Reg>
703 bool writeRegister(
const Reg reg,
const uint8_t* buf =
nullptr,
const size_t len = 0U,
const bool stop =
true);
705 template <
typename Reg>
708 template <
typename Reg>
711 template <
typename Reg>
714 template <
typename Reg>
717 template <
typename Reg>
724 virtual const char* unit_device_name()
const = 0;
729 return types::category_t::None;
731 inline virtual bool in_periodic()
const
736 inline virtual std::shared_ptr<Adapter> ensure_adapter(
const uint8_t )
742 inline virtual m5::hal::error::error_t select_channel(
const uint8_t)
744 return m5::hal::error::error_t::OK;
747 inline size_t stored_size()
const
749 return _component_cfg.stored_size;
752 bool add_child(Component* c);
755 bool changeAddress(
const uint8_t addr);
756 template <
typename Reg,
757 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
758 std::nullptr_t>::type =
nullptr>
759 bool read_register16E(
const Reg reg, uint16_t& result,
const uint32_t delayMillis,
const bool stop,
761 template <
typename Reg,
762 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
763 std::nullptr_t>::type =
nullptr>
764 bool write_register16E(
const Reg reg,
const uint16_t value,
const bool stop,
const bool endian);
765 template <
typename Reg,
766 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
767 std::nullptr_t>::type =
nullptr>
768 bool read_register32E(
const Reg reg, uint32_t& result,
const uint32_t delayMillis,
const bool stop,
770 template <
typename Reg,
771 typename std::enable_if<std::is_integral<Reg>::value && std::is_unsigned<Reg>::value &&
sizeof(Reg) <= 2,
772 std::nullptr_t>::type =
nullptr>
773 bool write_register32E(
const Reg reg,
const uint32_t value,
const bool stop,
const bool endian);
777 types::elapsed_time_t _latest{}, _interval{};
782 UnitUnified* _manager{};
783 std::shared_ptr<m5::unit::Adapter> _adapter{};
786 component_config_t _component_cfg{};
787 int16_t _channel{-1};
792 Component* _parent{};
797 friend class UnitUnified;
817template <
class Derived,
typename MD>
828 template <
typename... Args>
832 return static_cast<Derived*
>(
this)->start_periodic_measurement(std::forward<Args>(args)...);
840 template <
typename... Args>
844 return static_cast<Derived*
>(
this)->stop_periodic_measurement(std::forward<Args>(args)...);
853 return available_periodic_measurement_data();
858 return empty_periodic_measurement_data();
863 return full_periodic_measurement_data();
868 return static_cast<const Derived*
>(
this)->oldest_periodic_data();
873 return static_cast<const Derived*
>(
this)->latest_periodic_data();
878 discard_periodic_measurement_data();
883 flush_periodic_measurement_data();
891 virtual size_t available_periodic_measurement_data()
const = 0;
892 virtual bool empty_periodic_measurement_data()
const = 0;
893 virtual bool full_periodic_measurement_data()
const = 0;
894 virtual void discard_periodic_measurement_data() = 0;
895 virtual void flush_periodic_measurement_data() = 0;
904#define M5_UNIT_COMPONENT_HPP_BUILDER(cls, reg) \
906 constexpr static uint8_t DEFAULT_ADDRESS{(reg)}; \
907 static const types::uid_t uid; \
908 static const types::attr_t attr; \
909 static const char name[]; \
911 cls(const cls&) = delete; \
913 cls& operator=(const cls&) = delete; \
915 cls(cls&&) noexcept = default; \
917 cls& operator=(cls&&) noexcept = default; \
920 inline virtual const char* unit_device_name() const override \
924 inline virtual types::uid_t unit_identifier() const override \
928 inline virtual types::attr_t unit_attribute() const override \
934#define M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(cls, md) \
936 friend class PeriodicMeasurementAdapter<cls, md>; \
938 inline md oldest_periodic_data() const \
940 return !_data->empty() ? _data->front().value() : md{}; \
942 inline md latest_periodic_data() const \
944 return !_data->empty() ? _data->back().value() : md{}; \
946 inline virtual size_t available_periodic_measurement_data() const override \
948 return _data->size(); \
950 inline virtual bool empty_periodic_measurement_data() const override \
952 return _data->empty(); \
954 inline virtual bool full_periodic_measurement_data() const override \
956 return _data->full(); \
958 inline virtual void discard_periodic_measurement_data() override \
960 _data->pop_front(); \
962 inline virtual void flush_periodic_measurement_data() override \
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.
Type
Adapter type.
Definition adapter_base.hpp:28
Base class of unit component.
virtual void update(const bool force=false)
Update unit.
Definition M5UnitComponent.hpp:128
types::attr_t attribute() const
Gets the attributes.
Definition M5UnitComponent.hpp:156
bool existsChild(const uint8_t ch) const
Is there another unit connected to the specified channel?
Definition M5UnitComponent.cpp:44
bool canAccessI2C() const
Can the unit access via I2C?
Definition M5UnitComponent.cpp:52
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:108
bool readRegister8(const Reg reg, uint8_t &result, const uint32_t delayMillis, const bool stop=true)
Read byte with transaction from register.
virtual bool assign(const int8_t rx_pin, const int8_t tx_pin)
Assign GPIO pins as the communication bus.
static const types::uid_t uid
Unique identifier.
Definition M5UnitComponent.hpp:69
bool selectChannel(const uint8_t ch=8)
Select valid channel if exists.
Definition M5UnitComponent.cpp:268
Component * parent()
Gets the parent unit.
Definition M5UnitComponent.hpp:445
bool writeRegister8(const Reg reg, const uint8_t value, const bool stop=true)
Write byte with transaction to register.
virtual std::string debugInfo() const
Output information for debug.
bool writeRegister32BE(const Reg reg, const uint32_t value, const bool stop=true)
Write dword in big-endian order with transaction to register.
bool canAccessGPIO() const
Can the unit access via GPIO?
Definition M5UnitComponent.cpp:57
bool hasChildren() const
Are there other devices connected to me?
Definition M5UnitComponent.hpp:426
virtual bool assign(const i2c_port_t port, const gpio_num_t sda, const gpio_num_t scl)
Assign I2C (ESP-IDF legacy driver, pre-installed port)
bool isRegistered() const
Is the unit registered with the manager?
Definition M5UnitComponent.hpp:188
static const char name[]
Device name string.
Definition M5UnitComponent.hpp:71
bool writeRegister32LE(const Reg reg, const uint32_t value, const bool stop=true)
Write dword in little-endian order with transaction to register.
virtual bool assign(const uart_port_t uart_num)
Assign UART (ESP-IDF native driver, pre-installed port)
bool inPeriodic() const
In periodic measurement?
Definition M5UnitComponent.hpp:269
bool writeRegister16BE(const Reg reg, const uint16_t value, const bool stop=true)
Write word in big-endian order with transaction to register.
virtual bool assign(SPIClass &spi, const SPISettings &settings)
Assign SPIClass as the communication bus.
Adapter * adapter() const
Gets the access adapter.
Definition M5UnitComponent.hpp:205
bool canAccessUART() const
Can the unit access via UART?
Definition M5UnitComponent.cpp:62
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:410
bool hasSiblings() const
Are there any other devices connected to the same parent unit besides yourself?
Definition M5UnitComponent.hpp:418
size_t childrenSize() const
Number of units connected to me.
Definition M5UnitComponent.cpp:33
types::uid_t identifier() const
Gets the identifier.
Definition M5UnitComponent.hpp:148
const char * deviceName() const
Gets the device name.
Definition M5UnitComponent.hpp:140
bool updated() const
Periodic measurement data updated?
Definition M5UnitComponent.hpp:277
types::elapsed_time_t updatedMillis() const
Time elapsed since start-up when the measurement data was updated in update()
Definition M5UnitComponent.hpp:285
static const types::attr_t attr
Attributes.
Definition M5UnitComponent.hpp:70
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.
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.
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.
Component * child(const uint8_t channel) const
Gets the device connected to the specified channel.
Definition M5UnitComponent.cpp:129
auto asAdapter(const Adapter::Type t) const -> const typename std::remove_cv< typename std::remove_pointer< T >::type >::type *
Gets the access adapter cast to the specified type (const overload)
Definition M5UnitComponent.hpp:230
m5::hal::error::error_t readWithTransaction(uint8_t *data, const size_t len)
Read any data with transaction.
Definition M5UnitComponent.cpp:277
virtual bool assign(TwoWire &wire)
Assign TwoWire as the communication bus.
bool writeRegister16LE(const Reg reg, const uint16_t value, const bool stop=true)
Write word in little-endian order with transaction to register.
m5::hal::error::error_t writeWithTransaction(const uint8_t *data, const size_t len, const bool stop=true)
Write any data with transaction.
uint8_t address() const
Address used to I2C access the device.
Definition M5UnitComponent.hpp:196
virtual bool begin()
Begin unit.
Definition M5UnitComponent.hpp:120
int16_t channel() const
Gets the channel if connected to another unit.
Definition M5UnitComponent.hpp:180
types::elapsed_time_t interval() const
Gets the periodic measurement interval.
Definition M5UnitComponent.hpp:293
bool generalCall(const uint8_t *data, const size_t len)
General call for I2C.
virtual bool assign(i2c_master_bus_handle_t bus)
Assign I2C master bus (ESP-IDF native driver)
auto asAdapter(const Adapter::Type t) -> typename std::remove_cv< typename std::remove_pointer< T >::type >::type *
Gets the access adapter cast to the specified type.
Definition M5UnitComponent.hpp:216
bool add(Component &c, const int16_t channel)
Connect the unit to the specified channel.
Definition M5UnitComponent.cpp:72
virtual bool assign(spi_device_handle_t handle, const gpio_num_t cs=GPIO_NUM_NC)
Assign SPI device handle (ESP-IDF native driver, borrowed)
virtual bool assign(HardwareSerial &serial)
Assign HardwareSerial as the communication bus.
component_config_t component_config() const
Gets the common configurations in each unit.
Definition M5UnitComponent.hpp:100
bool canAccessSPI() const
Can the unit access via SPI?
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:172
types::category_t category() const
Gets the category.
Definition M5UnitComponent.hpp:164
Interface class for periodic measurement (CRTP)
Definition M5UnitComponent.hpp:818
MD oldest() const
Retrieve oldest stored data.
Definition M5UnitComponent.hpp:866
size_t available() const
Gets the number of stored data.
Definition M5UnitComponent.hpp:851
bool startPeriodicMeasurement(Args &&... args)
Start periodic measurement.
Definition M5UnitComponent.hpp:829
void discard()
Discard the oldest data accumulated.
Definition M5UnitComponent.hpp:876
MD latest() const
Retrieve latest stored data.
Definition M5UnitComponent.hpp:871
bool stopPeriodicMeasurement(Args &&... args)
Stop periodic measurement.
Definition M5UnitComponent.hpp:841
bool empty() const
Is empty stored data?
Definition M5UnitComponent.hpp:856
bool full() const
Is stored data full?
Definition M5UnitComponent.hpp:861
void flush()
Discard all data.
Definition M5UnitComponent.hpp:881
Top level namespace of M5Stack.
Definition test_helper.hpp:20
Component basic settings for begin.
Definition M5UnitComponent.hpp:55
uint32_t clock
Clock for communication (default as 100000)
Definition M5UnitComponent.hpp:57
uint32_t stored_size
Maximum number of periodic measurement data to be stored.
Definition M5UnitComponent.hpp:59
uint8_t max_children
Maximum number of units that can be connected (default as 0)
Definition M5UnitComponent.hpp:63
bool self_update
Does the user call Unit's update? (default as false)
Definition M5UnitComponent.hpp:61
Type and enumerator definitions.
unsigned long elapsed_time_t
Elapsed time unit (ms), same type as m5::utility::elapsed_time_t.
Definition types.hpp:44
uint32_t attr_t
Component attribute bits.
Definition types.hpp:43
uint32_t uid_t
Component unique identifier.
Definition types.hpp:42
category_t
Unit category (used for static class determination)
Definition types.hpp:37