M5Unit-EXTIO 0.0.1 git rev:3b9c5bf
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#if 0
56enum class PWM : uint8_t {
57 Frequency2000Hz,
58 Frequency1000Hz,
59 Frequency500Hz,
60 Frequency250Hz,
61 Frequency125Hz,
62};
63#endif
64
65} // namespace extio2
66
71class UnitExtIO2 : public Component {
72 M5_UNIT_COMPONENT_HPP_BUILDER(UnitExtIO2, 0x45);
73
74public:
75 static constexpr uint8_t NUMBER_OF_PINS{8};
76
79 static constexpr uint8_t MIN_ANALOG_8{0};
80 static constexpr uint8_t MAX_ANALOG_8{255};
81 static constexpr uint16_t MIN_ANALOG_12{0};
82 static constexpr uint16_t MAX_ANALOG_12{4095};
83 static constexpr uint8_t MIN_SERVO_ANGLE{0};
84 static constexpr uint8_t MAX_SERVO_ANGLE{180};
85 static constexpr uint16_t MIN_SERVO_PULSE{500};
86 static constexpr uint16_t MAX_SERVO_PULSE{2500};
88
93 struct config_t {
95 bool apply_mode{true};
97 extio2::Mode mode[NUMBER_OF_PINS] = {extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
98 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
99 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput,
100 extio2::Mode::DigitalInput, extio2::Mode::DigitalInput};
101 };
102
103 explicit UnitExtIO2(const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
104 {
105 auto ccfg = component_config();
106 ccfg.clock = 100 * 1000U;
107 component_config(ccfg);
108 std::fill(_mode.begin(), _mode.end(), extio2::Mode::Invalid);
109 }
110 virtual ~UnitExtIO2()
111 {
112 }
113
114 virtual bool begin() override;
115
118
120 {
121 return _cfg;
122 }
124 inline void config(const config_t& cfg)
125 {
126 _cfg = cfg;
127 }
129
132
137 uint8_t firmwareVersion() const
138 {
139 return _fw_version;
140 }
146 bool readFirmwareVersion(uint8_t& version);
148
151
156 inline extio2::Mode mode(const uint8_t pin)
157 {
158 return (pin < NUMBER_OF_PINS) ? _mode[pin] : extio2::Mode::Invalid;
159 }
166 bool readMode(extio2::Mode& mode, const uint8_t pin);
180 bool writeMode(const uint8_t pin, const extio2::Mode mode);
187 bool writePinBitsMode(const uint8_t pin_bits, const extio2::Mode mode);
194 bool writeAllMode(const extio2::Mode mode);
203
206
213 bool readDigitalInput(bool& high, const uint8_t pin);
222 bool readPinBitsDigitalInput(uint8_t& high_bits, const uint8_t pin_bits);
229 bool readAllDigitalInput(uint8_t& high_bits);
231
234
241 bool writeDigitalOutput(const uint8_t pin, const bool high);
248 inline bool writeDigitalOutputHigh(const uint8_t pin)
249 {
250 return writeDigitalOutput(pin, true);
251 }
258 inline bool writeDigitalOutputLow(const uint8_t pin)
259 {
260 return writeDigitalOutput(pin, false);
261 }
269 template <typename T, typename std::enable_if<std::is_same<T, bool>::value, std::nullptr_t>::type = nullptr>
270 inline bool writePinBitsDigitalOutput(const uint8_t pin_bits, const T high)
271 {
272 return write_pin_bits_digital_output(pin_bits, high);
273 }
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>
284 inline bool writePinBitsDigitalOutput(const uint8_t pin_bits, const T high_bits)
285 {
286 return write_pin_bits_digital_output(pin_bits, (uint8_t)high_bits);
287 }
294 inline bool writePinBitsDigitalOutputHigh(const uint8_t pin_bits)
295 {
296 return writePinBitsDigitalOutput(pin_bits, true);
297 }
304 inline bool writePinBitsDigitalOutputLow(const uint8_t pin_bits)
305 {
306 return writePinBitsDigitalOutput(pin_bits, false);
307 }
314 inline bool writeAllDigitalOutput(const bool high)
315 {
316 return writePinBitsDigitalOutput(0xFF, high);
317 }
325 {
326 return writeAllDigitalOutput(true);
327 }
335 {
336 return writeAllDigitalOutput(false);
337 }
339
344
352 bool readAnalogInput(uint16_t& value, const uint8_t pin, const extio2::AnalogMode amode);
354 inline bool readAnalogInput8(uint16_t& value, const uint8_t pin)
355 {
356 return readAnalogInput(value, pin, extio2::AnalogMode::Bits8);
357 }
359 inline bool readAnalogInput12(uint16_t& value, const uint8_t pin)
360 {
361 return readAnalogInput(value, pin, extio2::AnalogMode::Bits12);
362 }
372 bool readPinBitsAnalogInput(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits,
373 const extio2::AnalogMode amode);
375 inline bool readPinBitsAnalogInput8(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits)
376 {
377 return readPinBitsAnalogInput(values, pin_bits, extio2::AnalogMode::Bits8);
378 }
380 inline bool readPinBitsAnalogInput12(uint16_t values[NUMBER_OF_PINS], const uint8_t pin_bits)
381 {
382 return readPinBitsAnalogInput(values, pin_bits, extio2::AnalogMode::Bits12);
383 }
391 inline bool readAllAnalogInput(uint16_t values[NUMBER_OF_PINS], const extio2::AnalogMode amode)
392 {
393 return readPinBitsAnalogInput(values, 0xFF, amode);
394 }
396 bool readAllAnalogInput8(uint16_t values[NUMBER_OF_PINS])
397 {
398 return readAllAnalogInput(values, extio2::AnalogMode::Bits8);
399 }
402 {
403 return readAllAnalogInput(values, extio2::AnalogMode::Bits12);
404 }
406
410
411
418 bool readServoAngle(uint8_t& degree, const uint8_t pin);
427 bool readPinBitsServoAngle(uint8_t degrees[NUMBER_OF_PINS], const uint8_t pin_bits);
435 inline bool readAllServoAngle(uint8_t degrees[NUMBER_OF_PINS])
436 {
437 return readPinBitsServoAngle(degrees, 0xFF);
438 }
446 bool writeServoAngle(const uint8_t pin, const uint8_t degree);
454 bool writePinBitsServoAngle(const uint8_t pin_bits, const uint8_t degree);
461 inline bool writeAllServoAngle(const uint8_t degree)
462 {
463 return writePinBitsServoAngle(0xFF, degree);
464 }
472 bool readServoPulse(uint16_t& pulse, const uint8_t pin);
481 bool readPinBitsServoPulse(uint16_t pulses[NUMBER_OF_PINS], const uint8_t pin_bits);
488 inline bool readAllServoPulse(uint16_t pulses[NUMBER_OF_PINS])
489 {
490 return readPinBitsServoPulse(pulses, 0xFF);
491 }
499 bool writeServoPulse(const uint8_t pin, const uint16_t pulse);
507 bool writePinBitsServoPulse(const uint8_t pin_bits, const uint16_t pulse);
514 inline bool writeAllServoPulse(const uint16_t pulse)
515 {
516 return writePinBitsServoPulse(0xFF, pulse);
517 }
519
522
529 bool readLEDColor(uint32_t& rgb888, const uint8_t pin);
538 bool readPinBitsLEDColor(uint32_t rgb888[NUMBER_OF_PINS], const uint8_t pin_bits);
545 inline bool readAllLEDColor(uint32_t rgb888[NUMBER_OF_PINS])
546 {
547 return readPinBitsLEDColor(rgb888, 0xFF);
548 }
556 inline bool writeLEDColor(const uint8_t pin, const uint32_t rgb888)
557 {
558 return writeLEDColor(pin, rgb888 >> 16, rgb888 > 8, rgb888 & 0xFF);
559 }
569 bool writeLEDColor(const uint8_t pin, const uint8_t r, const uint8_t g, const uint8_t b);
577 inline bool writePinBitsLEDColor(const uint8_t pin_bits, const uint32_t rgb888)
578 {
579 return writePinBitsLEDColor(pin_bits, rgb888 >> 16, rgb888 >> 8, rgb888 & 0xFF);
580 }
590 bool writePinBitsLEDColor(const uint8_t pin_bits, const uint8_t r, const uint8_t g, const uint8_t b);
597 inline bool writeAllLEDColor(const uint32_t rgb888)
598 {
599 return writePinBitsLEDColor(0xFF, rgb888);
600 }
609 inline bool writeAllLEDColor(const uint8_t r, const uint8_t g, const uint8_t b)
610 {
611 return writePinBitsLEDColor(0xFF, r, g, b);
612 }
614
615#if 0
619
627 bool readPWMDutyCycle(uint8_t& cycle, const uint8_t pin);
636 bool readPinBitsPWMDutyCycle(uint8_t cycles[NUMBER_OF_PINS], const uint8_t pin_bits);
644 inline bool readAllPWMDutyCycle(uint8_t cycles[NUMBER_OF_PINS])
645 {
646 return readPinBitsPWMDutyCycle(cycles[NUMBER_OF_PINS], 0xFF);
647 }
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)
651 {
652 return writePinBitsPWMDutyCycle(0xFF, cycle);
653 }
654 bool readPWMFrequency(extio2::PWM& freq);
655 bool writePWMFrequency(const extio2::PWM freq);
657#endif
658
663
669 bool changeI2CAddress(const uint8_t i2c_address);
675 bool readI2CAddress(uint8_t& i2c_address);
677
678protected:
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);
681
682 static constexpr uint8_t FIRMWARE_VERSION_CAN_PWM_CONTROL{0x03};
683 inline bool canPWMControl() const
684 {
685 return _fw_version >= FIRMWARE_VERSION_CAN_PWM_CONTROL;
686 }
687
688private:
689 std::array<extio2::Mode, NUMBER_OF_PINS> _mode{};
690 config_t _cfg{};
691 uint8_t _fw_version{};
692};
693
695namespace extio2 {
696namespace command {
697constexpr uint8_t MODE_REG{0x00};
698constexpr uint8_t OUTPUT_CTL_REG{0x10};
699// constexpr uint8_t OUTPUTS_CTL_REG{0x18};
700constexpr uint8_t DIGITAL_INPUT_REG{0x20};
701// constexpr uint8_t DIGITAL_INPUTS_REG{0x28};
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}; // Firmware V3 or later
710constexpr uint8_t PWM_FREQ_REG{0xA0}; // Firmware V3 or later
711
712} // namespace command
713} // namespace extio2
715
716} // namespace unit
717} // namespace m5
718#endif
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 &degree, 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
For ExtIO2.
Top level namespace of M5stack.
Unit-related namespace.
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.
@ LEDControl
LED control.
@ ServoControl
Servo control.
@ DigitalOutput
Digital output.