10#ifndef M5_UNIT_EXTIO_UNIT_EXTIO2_HPP
11#define M5_UNIT_EXTIO_UNIT_EXTIO2_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
40static_assert(
sizeof(Mode) ==
sizeof(uint8_t),
"Mode and uint8_t size must match");
58 M5_UNIT_COMPONENT_HPP_BUILDER(
UnitExtIO2, 0x45);
84 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
85 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
86 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput};
91 explicit UnitExtIO2(
const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
93 auto ccfg = component_config();
94 ccfg.clock = 100 * 1000U;
95 component_config(ccfg);
96 std::fill(_mode.begin(), _mode.end(), extio2::Mode::Invalid);
104 virtual bool begin()
override;
148 return (pin <
NUMBER_OF_PINS) ? _mode[pin] : extio2::Mode::Invalid;
258 template <typename T, typename std::enable_if<std::is_same<T, bool>::value, std::nullptr_t>::type =
nullptr>
261 return write_pin_bits_digital_output(pin_bits, high);
271 template <typename T, typename std::enable_if<!std::is_same<T, bool>::value && std::is_integral<T>::value,
272 std::nullptr_t>::type =
nullptr>
275 return write_pin_bits_digital_output(pin_bits,
static_cast<uint8_t
>(high_bits));
570 return writeLEDColor(pin, (rgb888 >> 16) & 0xFF, (rgb888 >> 8) & 0xFF, rgb888 & 0xFF);
581 bool writeLEDColor(
const uint8_t pin,
const uint8_t r,
const uint8_t g,
const uint8_t b);
591 return writePinBitsLEDColor(pin_bits, (rgb888 >> 16) & 0xFF, (rgb888 >> 8) & 0xFF, rgb888 & 0xFF);
602 bool writePinBitsLEDColor(
const uint8_t pin_bits,
const uint8_t r,
const uint8_t g,
const uint8_t b);
646 bool write_pin_bits_digital_output(
const uint8_t pin_bits,
const bool high);
647 bool write_pin_bits_digital_output(
const uint8_t pin_bits,
const uint8_t high_bits);
649 static constexpr uint8_t FIRMWARE_VERSION_CAN_PWM_CONTROL{0x03};
650 inline bool canPWMControl()
const
652 return _fw_version >= FIRMWARE_VERSION_CAN_PWM_CONTROL;
656 std::array<extio2::Mode, NUMBER_OF_PINS> _mode{};
658 uint8_t _fw_version{};
664constexpr uint8_t MODE_REG{0x00};
665constexpr uint8_t OUTPUT_CTL_REG{0x10};
667constexpr uint8_t DIGITAL_INPUT_REG{0x20};
669constexpr uint8_t ANALOG_INPUT_8BITS_REG{0x30};
670constexpr uint8_t ANALOG_INPUT_12BITS_REG{0x40};
671constexpr uint8_t SERVO_ANGLE_8BITS_REG{0x50};
672constexpr uint8_t SERVO_PULSE_16BITS_REG{0x60};
673constexpr uint8_t RGB_24BITS_REG{0x70};
674constexpr uint8_t FW_VERSION_REG{0xFE};
675constexpr uint8_t ADDRESS_REG{0xFF};
676constexpr uint8_t PWM_DUTY_REG{0x90};
677constexpr uint8_t PWM_FREQ_REG{0xA0};
Extend I/O Unit2.
Definition unit_ExtIO2.hpp:57
bool readPinBitsAnalogInput12(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits)
Read the analog input 12 bits from the specified pin bits.
Definition unit_ExtIO2.hpp:393
virtual bool begin() override
Begin the unit.
Definition unit_ExtIO2.cpp:40
bool writeMode(const uint8_t pin, const extio2::Mode mode)
Write the mode of the specified pin.
Definition unit_ExtIO2.cpp:96
bool writeAllServoPulse(const uint16_t pulse)
Write the servo pulse to all pins.
Definition unit_ExtIO2.hpp:526
bool readAllAnalogInput8(uint16_t values[NUMBER_OF_PINS])
Read the analog input 8 bits from all pins.
Definition unit_ExtIO2.hpp:409
bool readAllServoAngle(uint8_t degrees[NUMBER_OF_PINS])
Read the servo angle from all pins.
Definition unit_ExtIO2.hpp:447
bool readPinBitsLEDColor(uint32_t rgb888[NUMBER_OF_PINS], const uint8_t pin_bits)
Read the LED RGB888 from the specified pin bits.
Definition unit_ExtIO2.cpp:395
bool readFirmwareVersion(uint8_t &version)
Read the firmware version.
Definition unit_ExtIO2.cpp:60
static constexpr uint8_t MIN_SERVO_ANGLE
Minimum servo angle (degree)
Definition unit_ExtIO2.hpp:69
static constexpr uint16_t MAX_SERVO_PULSE
Maximum servo pulse.
Definition unit_ExtIO2.hpp:72
static constexpr uint8_t MIN_ANALOG_8
Minimum input of analog 8 bits mode.
Definition unit_ExtIO2.hpp:65
bool writeDigitalOutputHigh(const uint8_t pin)
Write the digital output HIGH to the specified pin.
Definition unit_ExtIO2.hpp:237
bool writeServoPulse(const uint8_t pin, const uint16_t pulse)
Write the servo pulse to the specified pin.
Definition unit_ExtIO2.cpp:356
bool readServoPulse(uint16_t &pulse, const uint8_t pin)
Read the servo pulse from the specified pin.
Definition unit_ExtIO2.cpp:327
bool writeAllDigitalOutputHigh()
Write the digital output HIGH to all pins.
Definition unit_ExtIO2.hpp:312
bool readAnalogInput8(uint16_t &value, const uint8_t pin)
Read the analog input 8 bits from the specified pin.
Definition unit_ExtIO2.hpp:347
UnitExtIO2(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_ExtIO2.hpp:91
static constexpr uint8_t NUMBER_OF_PINS
The number of pins.
Definition unit_ExtIO2.hpp:61
bool readDigitalInput(bool &high, const uint8_t pin)
Read the digital input from the specified pin.
Definition unit_ExtIO2.cpp:153
bool writeDigitalOutput(const uint8_t pin, const bool high)
Write the digital output to the specified pin.
Definition unit_ExtIO2.cpp:191
bool writePinBitsServoPulse(const uint8_t pin_bits, const uint16_t pulse)
Write the servo pulse to the specified pin bits.
Definition unit_ExtIO2.cpp:366
bool readAllAnalogInput(uint16_t values[NUMBER_OF_PINS], const extio2::AnalogMode amode)
Read the analog input from all pins.
Definition unit_ExtIO2.hpp:404
static constexpr uint8_t MAX_SERVO_ANGLE
Maximum servo angle (degree)
Definition unit_ExtIO2.hpp:70
bool writeAllDigitalOutput(const bool high)
Write the digital output to all pins.
Definition unit_ExtIO2.hpp:303
bool readI2CAddress(uint8_t &i2c_address)
Read device I2C address.
Definition unit_ExtIO2.cpp:438
static constexpr uint16_t MIN_ANALOG_12
Minimum input of analog 12 bits mode.
Definition unit_ExtIO2.hpp:67
bool readMode(extio2::Mode &mode, const uint8_t pin)
Read the mode of the specified pin.
Definition unit_ExtIO2.cpp:65
bool writeAllDigitalOutputLow()
Write the digital output LOW to all pins.
Definition unit_ExtIO2.hpp:321
bool writePinBitsDigitalOutputLow(const uint8_t pin_bits)
Write the digital output LOW to the specified pin bits.
Definition unit_ExtIO2.hpp:293
bool readAllServoPulse(uint16_t pulses[NUMBER_OF_PINS])
Read the servo pulse from all pins.
Definition unit_ExtIO2.hpp:500
bool readAllAnalogInput12(uint16_t values[NUMBER_OF_PINS])
Read the analog input 12 bits from all pins.
Definition unit_ExtIO2.hpp:414
bool writePinBitsDigitalOutput(const uint8_t pin_bits, const T high)
Write the digital output to the specified pin bits.
Definition unit_ExtIO2.hpp:259
bool changeI2CAddress(const uint8_t i2c_address)
Change device I2C address.
Definition unit_ExtIO2.cpp:444
static constexpr uint16_t MAX_ANALOG_12
Maximum input of analog 12 bits mode.
Definition unit_ExtIO2.hpp:68
extio2::Mode mode(const uint8_t pin)
Gets the cached mode.
Definition unit_ExtIO2.hpp:146
static constexpr uint16_t MIN_SERVO_PULSE
Minimum servo pulse.
Definition unit_ExtIO2.hpp:71
bool writePinBitsDigitalOutputHigh(const uint8_t pin_bits)
Write the digital output HIGH to the specified pin bits.
Definition unit_ExtIO2.hpp:283
bool readPinBitsDigitalInput(uint8_t &high_bits, const uint8_t pin_bits)
Read the digital input from the specified pin bits.
Definition unit_ExtIO2.cpp:164
bool readLEDColor(uint32_t &rgb888, const uint8_t pin)
Read the LED RGB888 from the specified pin.
Definition unit_ExtIO2.cpp:384
bool writeDigitalOutputLow(const uint8_t pin)
Write the digital output LOW to the specified pin.
Definition unit_ExtIO2.hpp:247
bool readAnalogInput12(uint16_t &value, const uint8_t pin)
Read the analog input 12 bits from the specified pin.
Definition unit_ExtIO2.hpp:358
bool writePinBitsMode(const uint8_t pin_bits, const extio2::Mode mode)
Write the mode of the specified pin bits.
Definition unit_ExtIO2.cpp:109
void config(const config_t &cfg)
Set the configuration.
Definition unit_ExtIO2.hpp:114
bool writePinBitsDigitalOutput(const uint8_t pin_bits, const T high_bits)
Write the digital output to the specified pin bits.
Definition unit_ExtIO2.hpp:273
static constexpr uint8_t MAX_ANALOG_8
Maximum input of analog 8 bits mode.
Definition unit_ExtIO2.hpp:66
bool writeAllMode(const extio2::Mode mode)
Write the mode of all pins.
Definition unit_ExtIO2.cpp:130
bool readAllDigitalInput(uint8_t &high_bits)
Read the digital input from all pins.
Definition unit_ExtIO2.cpp:184
bool readAllMode(extio2::Mode mode[NUMBER_OF_PINS])
Read the mode of all pins.
Definition unit_ExtIO2.cpp:80
config_t config()
Gets the configuration.
Definition unit_ExtIO2.hpp:109
bool readPinBitsServoPulse(uint16_t pulses[NUMBER_OF_PINS], const uint8_t pin_bits)
Read the servo pulse from the specified pin bits.
Definition unit_ExtIO2.cpp:334
virtual ~UnitExtIO2()
Destructor.
Definition unit_ExtIO2.hpp:99
bool readServoAngle(uint8_t °ree, const uint8_t pin)
Read the servo angle from the specified pin.
Definition unit_ExtIO2.cpp:269
bool readPinBitsAnalogInput8(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits)
Read the analog input 8 bits from the specified pin bits.
Definition unit_ExtIO2.hpp:381
bool writeAllLEDColor(const uint8_t r, const uint8_t g, const uint8_t b)
Write the LED RGB888 to all pins.
Definition unit_ExtIO2.hpp:621
bool writeLEDColor(const uint8_t pin, const uint32_t rgb888)
Write the LED RGB888 to the specified pin.
Definition unit_ExtIO2.hpp:568
bool readPinBitsAnalogInput(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits, const extio2::AnalogMode amode)
Read the analog input from the specified pin bits.
Definition unit_ExtIO2.cpp:245
bool readAnalogInput(uint16_t &value, const uint8_t pin, const extio2::AnalogMode amode)
Read the analog input from the specified pin.
Definition unit_ExtIO2.cpp:231
bool writeServoAngle(const uint8_t pin, const uint8_t degree)
Write the servo angle to the specified pin.
Definition unit_ExtIO2.cpp:298
bool readPinBitsServoAngle(uint8_t degrees[NUMBER_OF_PINS], const uint8_t pin_bits)
Read the servo angle from the specified pin bits.
Definition unit_ExtIO2.cpp:276
bool writePinBitsServoAngle(const uint8_t pin_bits, const uint8_t degree)
Write the servo angle to the specified pin bits.
Definition unit_ExtIO2.cpp:310
bool writeAllLEDColor(const uint32_t rgb888)
Write the LED RGB888 to all pins.
Definition unit_ExtIO2.hpp:609
uint8_t firmwareVersion() const
Gets the cached firmware version.
Definition unit_ExtIO2.hpp:127
bool writeAllServoAngle(const uint8_t degree)
Write the servo angle to all pins.
Definition unit_ExtIO2.hpp:473
bool readAllLEDColor(uint32_t rgb888[NUMBER_OF_PINS])
Read the LED RGB888 from all pins.
Definition unit_ExtIO2.hpp:557
bool writePinBitsLEDColor(const uint8_t pin_bits, const uint32_t rgb888)
Write the LED RGB888 to the specified pin bits.
Definition unit_ExtIO2.hpp:589
Top level namespace of M5Stack.
Settings for begin.
Definition unit_ExtIO2.hpp:79
extio2::Mode mode[NUMBER_OF_PINS]
Set mode to all pins on begin if apply_mode is true.
Definition unit_ExtIO2.hpp:83
bool apply_mode
Set mode on begin if true.
Definition unit_ExtIO2.hpp:81
AnalogMode
Data width at analog input acquisition.
Definition unit_ExtIO2.hpp:46
@ Bits8
8 bits (0 - 255)
Definition unit_ExtIO2.hpp:47
@ Bits12
12 bits (0 - 4095)
Definition unit_ExtIO2.hpp:48
Mode
Operating mode.
Definition unit_ExtIO2.hpp:31
@ DigitalInput
Digital input.
@ ServoControl
Servo control.
@ DigitalOutput
Digital output.