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");
56enum class PWM : uint8_t {
72 M5_UNIT_COMPONENT_HPP_BUILDER(
UnitExtIO2, 0x45);
98 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
99 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
100 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput};
103 explicit UnitExtIO2(
const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
105 auto ccfg = component_config();
106 ccfg.clock = 100 * 1000U;
107 component_config(ccfg);
108 std::fill(_mode.begin(), _mode.end(), extio2::Mode::Invalid);
110 virtual ~UnitExtIO2()
114 virtual bool begin()
override;
158 return (pin <
NUMBER_OF_PINS) ? _mode[pin] : extio2::Mode::Invalid;
269 template <typename T, typename std::enable_if<std::is_same<T, bool>::value, std::nullptr_t>::type =
nullptr>
272 return write_pin_bits_digital_output(pin_bits, high);
282 template <typename T, typename std::enable_if<!std::is_same<T, bool>::value && std::is_integral<T>::value,
283 std::nullptr_t>::type =
nullptr>
286 return write_pin_bits_digital_output(pin_bits, (uint8_t)high_bits);
558 return writeLEDColor(pin, rgb888 >> 16, rgb888 > 8, rgb888 & 0xFF);
569 bool writeLEDColor(
const uint8_t pin,
const uint8_t r,
const uint8_t g,
const uint8_t b);
590 bool writePinBitsLEDColor(
const uint8_t pin_bits,
const uint8_t r,
const uint8_t g,
const uint8_t b);
627 bool readPWMDutyCycle(uint8_t& cycle,
const uint8_t pin);
636 bool readPinBitsPWMDutyCycle(uint8_t cycles[
NUMBER_OF_PINS],
const uint8_t pin_bits);
648 bool writePWMDutyCycle(
const uint8_t pin,
const uint8_t cycle);
649 bool writePinBitsPWMDutyCycle(
const uint8_t pin_bits,
const uint8_t cycle);
650 inline bool writeAllPWMDutyCycle(uint8_t cycle)
652 return writePinBitsPWMDutyCycle(0xFF, cycle);
654 bool readPWMFrequency(extio2::PWM& freq);
655 bool writePWMFrequency(
const extio2::PWM freq);
679 bool write_pin_bits_digital_output(
const uint8_t pin_bits,
const bool high);
680 bool write_pin_bits_digital_output(
const uint8_t pin_bits,
const uint8_t high_bits);
682 static constexpr uint8_t FIRMWARE_VERSION_CAN_PWM_CONTROL{0x03};
683 inline bool canPWMControl()
const
685 return _fw_version >= FIRMWARE_VERSION_CAN_PWM_CONTROL;
689 std::array<extio2::Mode, NUMBER_OF_PINS> _mode{};
691 uint8_t _fw_version{};
697constexpr uint8_t MODE_REG{0x00};
698constexpr uint8_t OUTPUT_CTL_REG{0x10};
700constexpr uint8_t DIGITAL_INPUT_REG{0x20};
702constexpr uint8_t ANALOG_INPUT_8BITS_REG{0x30};
703constexpr uint8_t ANALOG_INPUT_12BITS_REG{0x40};
704constexpr uint8_t SERVO_ANGLE_8BITS_REG{0x50};
705constexpr uint8_t SERVO_PULSE_16BITS_REG{0x60};
706constexpr uint8_t RGB_24BITS_REG{0x70};
707constexpr uint8_t FW_VERSION_REG{0xFE};
708constexpr uint8_t ADDRESS_REG{0xFF};
709constexpr uint8_t PWM_DUTY_REG{0x90};
710constexpr uint8_t PWM_FREQ_REG{0xA0};
Extend I/O Unit2.
Definition unit_ExtIO2.hpp:71
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:380
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:514
bool readAllAnalogInput8(uint16_t values[NUMBER_OF_PINS])
Read the analog input 8 bits from all pins.
Definition unit_ExtIO2.hpp:396
bool readAllServoAngle(uint8_t degrees[NUMBER_OF_PINS])
Read the servo angle from all pins.
Definition unit_ExtIO2.hpp:435
bool readPinBitsLEDColor(uint32_t rgb888[NUMBER_OF_PINS], const uint8_t pin_bits)
Read the LED RGB888 from the specified pin.
Definition unit_ExtIO2.cpp:404
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:83
static constexpr uint16_t MAX_SERVO_PULSE
Maximum servo pulse.
Definition unit_ExtIO2.hpp:86
static constexpr uint8_t MIN_ANALOG_8
Minimum input of analog 8 bits mode.
Definition unit_ExtIO2.hpp:79
bool writeDigitalOutputHigh(const uint8_t pin)
Write the digital output HIGH to the specified pin.
Definition unit_ExtIO2.hpp:248
bool writeServoPulse(const uint8_t pin, const uint16_t pulse)
Write the servo pulse to the specified pin.
Definition unit_ExtIO2.cpp:366
bool readServoPulse(uint16_t &pulse, const uint8_t pin)
Read the servo pulse from the specified pin.
Definition unit_ExtIO2.cpp:338
bool writeAllDigitalOutputHigh()
Write the digital output HIGH to all pins.
Definition unit_ExtIO2.hpp:324
bool readAnalogInput8(uint16_t &value, const uint8_t pin)
Read the analog input 8 bits from the specified pin.
Definition unit_ExtIO2.hpp:354
static constexpr uint8_t NUMBER_OF_PINS
The number of pins.
Definition unit_ExtIO2.hpp:75
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:375
bool readAllAnalogInput(uint16_t values[NUMBER_OF_PINS], const extio2::AnalogMode amode)
Read the analog input from all pins.
Definition unit_ExtIO2.hpp:391
static constexpr uint8_t MAX_SERVO_ANGLE
Maximum servo angle (degree)
Definition unit_ExtIO2.hpp:84
bool writeAllDigitalOutput(const bool high)
Write the digital output to all pins.
Definition unit_ExtIO2.hpp:314
bool readI2CAddress(uint8_t &i2c_address)
Read device I2C address.
Definition unit_ExtIO2.cpp:447
static constexpr uint16_t MIN_ANALOG_12
Minimum input of analog 12 bits mode.
Definition unit_ExtIO2.hpp:81
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:334
bool writePinBitsDigitalOutputLow(const uint8_t pin_bits)
Write the digital output LOW to the specified pin bits.
Definition unit_ExtIO2.hpp:304
bool readAllServoPulse(uint16_t pulses[NUMBER_OF_PINS])
Read the servo pulse from all pins.
Definition unit_ExtIO2.hpp:488
bool readAllAnalogInput12(uint16_t values[NUMBER_OF_PINS])
Read the analog input 12 bits from all pins.
Definition unit_ExtIO2.hpp:401
bool writePinBitsDigitalOutput(const uint8_t pin_bits, const T high)
Write the digital output to the specified pin bits.
Definition unit_ExtIO2.hpp:270
bool changeI2CAddress(const uint8_t i2c_address)
Change device I2C address.
Definition unit_ExtIO2.cpp:453
static constexpr uint16_t MAX_ANALOG_12
Maximum input of analog 12 bits mode.
Definition unit_ExtIO2.hpp:82
extio2::Mode mode(const uint8_t pin)
Gets the inner mode.
Definition unit_ExtIO2.hpp:156
static constexpr uint16_t MIN_SERVO_PULSE
Minimum servo pulse.
Definition unit_ExtIO2.hpp:85
bool writePinBitsDigitalOutputHigh(const uint8_t pin_bits)
Write the digital output HIGH to the specified pin bits.
Definition unit_ExtIO2.hpp:294
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:393
bool writeDigitalOutputLow(const uint8_t pin)
Write the digital output LOW to the specified pin.
Definition unit_ExtIO2.hpp:258
bool readAnalogInput12(uint16_t &value, const uint8_t pin)
Read the analog input 12 bits from the specified pin.
Definition unit_ExtIO2.hpp:359
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 configration.
Definition unit_ExtIO2.hpp:124
bool writePinBitsDigitalOutput(const uint8_t pin_bits, const T high_bits)
Write the digital output to the specified pin bits.
Definition unit_ExtIO2.hpp:284
static constexpr uint8_t MAX_ANALOG_8
Maximum input of analog 8 bits mode.
Definition unit_ExtIO2.hpp:80
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 configration.
Definition unit_ExtIO2.hpp:119
bool readPinBitsServoPulse(uint16_t pulses[NUMBER_OF_PINS], const uint8_t pin_bits)
Read the servo pulse from the specified pin.
Definition unit_ExtIO2.cpp:344
bool readServoAngle(uint8_t °ree, const uint8_t pin)
Read the servo angle from the specified pin.
Definition unit_ExtIO2.cpp:281
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:375
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:609
bool writeLEDColor(const uint8_t pin, const uint32_t rgb888)
Write the LED RGB888 to the specified pin.
Definition unit_ExtIO2.hpp:556
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:257
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:240
bool writeServoAngle(const uint8_t pin, const uint8_t degree)
Write the servo angle to the specified pin.
Definition unit_ExtIO2.cpp:309
bool readPinBitsServoAngle(uint8_t degrees[NUMBER_OF_PINS], const uint8_t pin_bits)
Read the servo angle from the specified pin.
Definition unit_ExtIO2.cpp:287
bool writePinBitsServoAngle(const uint8_t pin_bits, const uint8_t degree)
Write the servo angle to the specified pin bits.
Definition unit_ExtIO2.cpp:321
bool writeAllLEDColor(const uint32_t rgb888)
Write the LED RGB888 to all pins.
Definition unit_ExtIO2.hpp:597
uint8_t firmwareVersion() const
Gets the inner firmware version.
Definition unit_ExtIO2.hpp:137
bool writeAllServoAngle(const uint8_t degree)
Write the servo angle to all pins.
Definition unit_ExtIO2.hpp:461
bool readAllLEDColor(uint32_t rgb888[NUMBER_OF_PINS])
Read the LED RGB888 from all pins.
Definition unit_ExtIO2.hpp:545
bool writePinBitsLEDColor(const uint8_t pin_bits, const uint32_t rgb888)
Write the LED RGB888 to the specified pin bits.
Definition unit_ExtIO2.hpp:577
Top level namespace of M5stack.
Settings for begin.
Definition unit_ExtIO2.hpp:93
extio2::Mode mode[NUMBER_OF_PINS]
Set mode to all pins on begin if apply_mode is true.
Definition unit_ExtIO2.hpp:97
bool apply_mode
Set mode on begin if true.
Definition unit_ExtIO2.hpp:95
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.