M5Unit-EXTIO 0.1.1 git rev:b9070c0
Loading...
Searching...
No Matches
unit_ExtIO2.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_EXTIO_UNIT_EXTIO2_HPP
11#define M5_UNIT_EXTIO_UNIT_EXTIO2_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <array>
16#include <algorithm>
17
18namespace m5 {
19namespace unit {
20
25namespace extio2 {
26
31enum class Mode : int8_t {
32 Invalid = -1,
35 ADCInput,
38 // PWMControl, //!< PWM Control (Firmware V3 or later)
39};
40static_assert(sizeof(Mode) == sizeof(uint8_t), "Mode and uint8_t size must match");
41
46enum AnalogMode : uint8_t {
49};
50
51} // namespace extio2
52
57class UnitExtIO2 : public Component {
58 M5_UNIT_COMPONENT_HPP_BUILDER(UnitExtIO2, 0x45);
59
60public:
61 static constexpr uint8_t NUMBER_OF_PINS{8};
62
65 static constexpr uint8_t MIN_ANALOG_8{0};
66 static constexpr uint8_t MAX_ANALOG_8{255};
67 static constexpr uint16_t MIN_ANALOG_12{0};
68 static constexpr uint16_t MAX_ANALOG_12{4095};
69 static constexpr uint8_t MIN_SERVO_ANGLE{0};
70 static constexpr uint8_t MAX_SERVO_ANGLE{180};
71 static constexpr uint16_t MIN_SERVO_PULSE{500};
72 static constexpr uint16_t MAX_SERVO_PULSE{2500};
74
79 struct config_t {
81 bool apply_mode{true};
83 extio2::Mode mode[NUMBER_OF_PINS] = {extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
84 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
85 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
86 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput};
87 };
88
91 explicit UnitExtIO2(const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
92 {
93 auto ccfg = component_config();
94 ccfg.clock = 100 * 1000U;
95 component_config(ccfg);
96 std::fill(_mode.begin(), _mode.end(), extio2::Mode::Invalid);
97 }
99 virtual ~UnitExtIO2()
100 {
101 }
102
104 virtual bool begin() override;
105
108
110 {
111 return _cfg;
112 }
114 inline void config(const config_t& cfg)
115 {
116 _cfg = cfg;
117 }
119
122
127 uint8_t firmwareVersion() const
128 {
129 return _fw_version;
130 }
136 bool readFirmwareVersion(uint8_t& version);
138
141
146 inline extio2::Mode mode(const uint8_t pin)
147 {
148 return (pin < NUMBER_OF_PINS) ? _mode[pin] : extio2::Mode::Invalid;
149 }
156 bool readMode(extio2::Mode& mode, const uint8_t pin);
169 bool writeMode(const uint8_t pin, const extio2::Mode mode);
176 bool writePinBitsMode(const uint8_t pin_bits, const extio2::Mode mode);
183 bool writeAllMode(const extio2::Mode mode);
192
195
202 bool readDigitalInput(bool& high, const uint8_t pin);
211 bool readPinBitsDigitalInput(uint8_t& high_bits, const uint8_t pin_bits);
218 bool readAllDigitalInput(uint8_t& high_bits);
220
223
230 bool writeDigitalOutput(const uint8_t pin, const bool high);
237 inline bool writeDigitalOutputHigh(const uint8_t pin)
238 {
239 return writeDigitalOutput(pin, true);
240 }
247 inline bool writeDigitalOutputLow(const uint8_t pin)
248 {
249 return writeDigitalOutput(pin, false);
250 }
258 template <typename T, typename std::enable_if<std::is_same<T, bool>::value, std::nullptr_t>::type = nullptr>
259 inline bool writePinBitsDigitalOutput(const uint8_t pin_bits, const T high)
260 {
261 return write_pin_bits_digital_output(pin_bits, high);
262 }
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>
273 inline bool writePinBitsDigitalOutput(const uint8_t pin_bits, const T high_bits)
274 {
275 return write_pin_bits_digital_output(pin_bits, static_cast<uint8_t>(high_bits));
276 }
283 inline bool writePinBitsDigitalOutputHigh(const uint8_t pin_bits)
284 {
285 return writePinBitsDigitalOutput(pin_bits, true);
286 }
293 inline bool writePinBitsDigitalOutputLow(const uint8_t pin_bits)
294 {
295 return writePinBitsDigitalOutput(pin_bits, false);
296 }
303 inline bool writeAllDigitalOutput(const bool high)
304 {
305 return writePinBitsDigitalOutput(0xFF, high);
306 }
313 {
314 return writeAllDigitalOutput(true);
315 }
322 {
323 return writeAllDigitalOutput(false);
324 }
326
331
339 bool readAnalogInput(uint16_t& value, const uint8_t pin, const extio2::AnalogMode amode);
347 inline bool readAnalogInput8(uint16_t& value, const uint8_t pin)
348 {
349 return readAnalogInput(value, pin, extio2::AnalogMode::Bits8);
350 }
358 inline bool readAnalogInput12(uint16_t& value, const uint8_t pin)
359 {
360 return readAnalogInput(value, pin, extio2::AnalogMode::Bits12);
361 }
371 bool readPinBitsAnalogInput(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits,
372 const extio2::AnalogMode amode);
381 inline bool readPinBitsAnalogInput8(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits)
382 {
383 return readPinBitsAnalogInput(values, pin_bits, extio2::AnalogMode::Bits8);
384 }
393 inline bool readPinBitsAnalogInput12(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits)
394 {
395 return readPinBitsAnalogInput(values, pin_bits, extio2::AnalogMode::Bits12);
396 }
404 inline bool readAllAnalogInput(uint16_t values[NUMBER_OF_PINS], const extio2::AnalogMode amode)
405 {
406 return readPinBitsAnalogInput(values, 0xFF, amode);
407 }
409 bool readAllAnalogInput8(uint16_t values[NUMBER_OF_PINS])
410 {
411 return readAllAnalogInput(values, extio2::AnalogMode::Bits8);
412 }
415 {
416 return readAllAnalogInput(values, extio2::AnalogMode::Bits12);
417 }
419
424
431 bool readServoAngle(uint8_t& degree, const uint8_t pin);
440 bool readPinBitsServoAngle(uint8_t degrees[NUMBER_OF_PINS], const uint8_t pin_bits);
447 inline bool readAllServoAngle(uint8_t degrees[NUMBER_OF_PINS])
448 {
449 return readPinBitsServoAngle(degrees, 0xFF);
450 }
458 bool writeServoAngle(const uint8_t pin, const uint8_t degree);
466 bool writePinBitsServoAngle(const uint8_t pin_bits, const uint8_t degree);
473 inline bool writeAllServoAngle(const uint8_t degree)
474 {
475 return writePinBitsServoAngle(0xFF, degree);
476 }
484 bool readServoPulse(uint16_t& pulse, const uint8_t pin);
493 bool readPinBitsServoPulse(uint16_t pulses[NUMBER_OF_PINS], const uint8_t pin_bits);
500 inline bool readAllServoPulse(uint16_t pulses[NUMBER_OF_PINS])
501 {
502 return readPinBitsServoPulse(pulses, 0xFF);
503 }
511 bool writeServoPulse(const uint8_t pin, const uint16_t pulse);
519 bool writePinBitsServoPulse(const uint8_t pin_bits, const uint16_t pulse);
526 inline bool writeAllServoPulse(const uint16_t pulse)
527 {
528 return writePinBitsServoPulse(0xFF, pulse);
529 }
531
534
541 bool readLEDColor(uint32_t& rgb888, const uint8_t pin);
550 bool readPinBitsLEDColor(uint32_t rgb888[NUMBER_OF_PINS], const uint8_t pin_bits);
557 inline bool readAllLEDColor(uint32_t rgb888[NUMBER_OF_PINS])
558 {
559 return readPinBitsLEDColor(rgb888, 0xFF);
560 }
568 inline bool writeLEDColor(const uint8_t pin, const uint32_t rgb888)
569 {
570 return writeLEDColor(pin, (rgb888 >> 16) & 0xFF, (rgb888 >> 8) & 0xFF, rgb888 & 0xFF);
571 }
581 bool writeLEDColor(const uint8_t pin, const uint8_t r, const uint8_t g, const uint8_t b);
589 inline bool writePinBitsLEDColor(const uint8_t pin_bits, const uint32_t rgb888)
590 {
591 return writePinBitsLEDColor(pin_bits, (rgb888 >> 16) & 0xFF, (rgb888 >> 8) & 0xFF, rgb888 & 0xFF);
592 }
602 bool writePinBitsLEDColor(const uint8_t pin_bits, const uint8_t r, const uint8_t g, const uint8_t b);
609 inline bool writeAllLEDColor(const uint32_t rgb888)
610 {
611 return writePinBitsLEDColor(0xFF, rgb888);
612 }
621 inline bool writeAllLEDColor(const uint8_t r, const uint8_t g, const uint8_t b)
622 {
623 return writePinBitsLEDColor(0xFF, r, g, b);
624 }
626
630
636 bool changeI2CAddress(const uint8_t i2c_address);
642 bool readI2CAddress(uint8_t& i2c_address);
644
645protected:
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);
648
649 static constexpr uint8_t FIRMWARE_VERSION_CAN_PWM_CONTROL{0x03};
650 inline bool canPWMControl() const
651 {
652 return _fw_version >= FIRMWARE_VERSION_CAN_PWM_CONTROL;
653 }
654
655private:
656 std::array<extio2::Mode, NUMBER_OF_PINS> _mode{};
657 config_t _cfg{};
658 uint8_t _fw_version{};
659};
660
662namespace extio2 {
663namespace command {
664constexpr uint8_t MODE_REG{0x00};
665constexpr uint8_t OUTPUT_CTL_REG{0x10};
666// constexpr uint8_t OUTPUTS_CTL_REG{0x18};
667constexpr uint8_t DIGITAL_INPUT_REG{0x20};
668// constexpr uint8_t DIGITAL_INPUTS_REG{0x28};
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}; // Firmware V3 or later
677constexpr uint8_t PWM_FREQ_REG{0xA0}; // Firmware V3 or later
678
679} // namespace command
680} // namespace extio2
682
683} // namespace unit
684} // namespace m5
685#endif
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 &degree, 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
For ExtIO2.
Top level namespace of M5Stack.
Unit-related namespace.
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.
@ LEDControl
LED control.
@ ServoControl
Servo control.
@ DigitalOutput
Digital output.