10#ifndef M5_UNIT_HUB_UNIT_PBHUB_HPP
11#define M5_UNIT_HUB_UNIT_PBHUB_HPP
13#include <M5UnitComponent.hpp>
49class UnitPbHub :
public Component {
50 M5_UNIT_COMPONENT_HPP_BUILDER(UnitPbHub, 0x61);
53 constexpr static uint8_t MAX_CHANNEL{6};
54 constexpr static uint8_t MAX_LED_COUNT{74};
56 explicit UnitPbHub(
const uint8_t addr = DEFAULT_ADDRESS);
57 virtual ~UnitPbHub() =
default;
59 virtual bool begin()
override;
82 return write_digital(ch, 0, high);
92 return write_digital(ch, 1, high);
102 return read_digital(ch, 0, high);
112 return read_digital(ch, 1, high);
127 return write_analog(ch, 0, val);
137 return write_analog(ch, 0, val);
161 inline bool writePWM0(
const uint8_t ch,
const uint8_t pwm)
163 return write_pwm(ch, 0, pwm);
171 inline bool writePWM1(
const uint8_t ch,
const uint8_t pwm)
173 return write_pwm(ch, 1, pwm);
181 inline bool readPWM0(uint8_t& pwm,
const uint8_t ch)
183 return read_pwm(ch, 0, pwm);
191 inline bool readPWM1(uint8_t& pwm,
const uint8_t ch)
193 return read_pwm(ch, 1, pwm);
215 bool writeLEDColor(
const uint8_t ch,
const uint16_t index,
const uint32_t rgb888);
224 bool fillLEDColor(
const uint8_t ch,
const uint32_t rgb888,
const uint16_t first = 0,
const uint16_t count = 0);
262 return write_servo_angle(ch, 0, angle);
272 return write_servo_angle(ch, 1, angle);
282 return write_servo_pulse(ch, 0, pulse);
292 return write_servo_pulse(ch, 1, pulse);
302 return read_servo_angle(ch, 0, angle);
312 return read_servo_angle(ch, 1, angle);
322 return read_servo_pulse(ch, 0, pulse);
332 return read_servo_pulse(ch, 1, pulse);
354 virtual std::shared_ptr<Adapter> ensure_adapter(
const uint8_t ch)
override;
356 bool write_digital(
const uint8_t ch,
const uint8_t index,
const bool high);
357 bool read_digital(
const uint8_t ch,
const uint8_t index,
bool& high);
358 bool write_analog(
const uint8_t ch,
const uint8_t index,
const uint8_t val);
359 bool write_pwm(
const uint8_t ch,
const uint8_t index,
const uint8_t val);
360 bool read_pwm(
const uint8_t ch,
const uint8_t index, uint8_t& val);
361 bool write_servo_angle(
const uint8_t ch,
const uint8_t index,
const uint8_t angle);
362 bool read_servo_angle(
const uint8_t ch,
const uint8_t index, uint8_t& angle);
363 bool write_servo_pulse(
const uint8_t ch,
const uint8_t index,
const uint16_t angle);
364 bool read_servo_pulse(
const uint8_t ch,
const uint8_t index, uint16_t& angle);
366 inline bool is_firmware_2_or_later()
const
368 return (_ver != 0xFF) && (_ver >= 2);
370 inline bool is_pbhub()
const
372 return (_ver != 0xFF) && (_ver == 0);
374 inline bool is_pbhub_v11()
const
376 return (_ver != 0xFF) && _ver;
380 std::array<uint16_t, +MAX_CHANNEL> _numLED{74, 74, 74, 74, 74, 74};
387constexpr uint8_t WRITE_DIGITAL_0_REG{0x00};
388constexpr uint8_t WRITE_DIGITAL_1_REG{0x01};
390constexpr uint8_t PWM_0_REG{0x02};
391constexpr uint8_t PWM_1_REG{0x03};
392constexpr uint8_t WRITE_ANALOG_0_REG{0x02};
393constexpr uint8_t WRITE_ANALOG_1_REG{0x03};
395constexpr uint8_t READ_DIGITAL_0_REG{0x04};
396constexpr uint8_t READ_DIGITAL_1_REG{0x05};
397constexpr uint8_t READ_ANALOG_0_REG{0x06};
399constexpr uint8_t LED_NUM_REG{0x08};
400constexpr uint8_t LED_COLOR_SINGLE_REG{0x09};
401constexpr uint8_t LED_COLOR_MORE_REG{0x0A};
402constexpr uint8_t LED_BRIGHTNESS_REG{0x0B};
404constexpr uint8_t SERVO_ANGLE_0_REG{0x0C};
405constexpr uint8_t SERVO_ANGLE_1_REG{0x0D};
406constexpr uint8_t SERVO_PULSE_0_REG{0x0E};
407constexpr uint8_t SERVO_PULSE_1_REG{0x0F};
409constexpr uint8_t LED_MODE_REG{0x0FA};
410constexpr uint8_t FIRMWARE_VERSION_REG{0xFE};
411constexpr uint8_t I2C_ADDRESS_REG{0xFF};
bool readPWM0(uint8_t &pwm, const uint8_t ch)
Read PWN 0 from a specific channel.
Definition unit_PbHub.hpp:181
bool writeAnalog1(const uint8_t ch, const uint8_t val)
Write analog 1 to a specific channel.
Definition unit_PbHub.hpp:135
bool readLEDMode(pbhub::LEDMode &m)
Read the LED control mode.
Definition unit_PbHub.cpp:320
bool readDigital1(bool &high, const uint8_t ch)
Read digital 0 from a specific channel.
Definition unit_PbHub.hpp:110
bool writeLEDColor(const uint8_t ch, const uint16_t index, const uint32_t rgb888)
Write the LED color to a specific channel.
Definition unit_PbHub.cpp:264
bool readServo0Pulse(uint16_t &pulse, const uint8_t ch)
Read servo 0 pulse from a specific channel.
Definition unit_PbHub.hpp:320
bool readDigital0(bool &high, const uint8_t ch)
Read digital 0 from a specific channel.
Definition unit_PbHub.hpp:100
bool writeDigital0(const uint8_t ch, const bool high)
Write digital 0 to a specific channel.
Definition unit_PbHub.hpp:80
bool writeLEDCount(const uint8_t ch, const uint16_t num)
Write the number of the LED to a specific channel.
Definition unit_PbHub.cpp:249
bool readAnalog0(uint16_t &val, const uint8_t ch)
Read analog 0 from a specific channel.
Definition unit_PbHub.cpp:241
bool readFirmwareVersion(uint8_t &ver)
Read the firmware version.
Definition unit_PbHub.cpp:337
bool writeServo1Pulse(const uint8_t ch, const uint16_t pulse)
Write servo 1 pulse to a specific channel.
Definition unit_PbHub.hpp:290
uint8_t firmwareVersion() const
Get the firmware version.
Definition unit_PbHub.hpp:67
bool writeLEDBrightness(const uint8_t ch, const uint8_t value)
Write the LED brightness to a specific channel.
Definition unit_PbHub.cpp:305
bool writePWM0(const uint8_t ch, const uint8_t pwm)
Write PWN 0 to a specific channel.
Definition unit_PbHub.hpp:161
bool writePWM1(const uint8_t ch, const uint8_t pwm)
Write PWN 1 to a specific channel.
Definition unit_PbHub.hpp:171
bool readServo0Angle(uint8_t &angle, const uint8_t ch)
Read servo 0 angle from a specific channel.
Definition unit_PbHub.hpp:300
bool writeDigital1(const uint8_t ch, const bool high)
Write digital 1 to a specific channel.
Definition unit_PbHub.hpp:90
bool readPWM1(uint8_t &pwm, const uint8_t ch)
Read PWN 0 from a specific channel.
Definition unit_PbHub.hpp:191
bool readServo1Pulse(uint16_t &pulse, const uint8_t ch)
Read servo 1 pulse from a specific channel.
Definition unit_PbHub.hpp:330
bool writeLEDMode(const pbhub::LEDMode m)
Write the LED control mode.
Definition unit_PbHub.cpp:311
bool writeServo1Angle(const uint8_t ch, const uint8_t angle)
Write servo 1 angle to a specific channel.
Definition unit_PbHub.hpp:270
bool readServo1Angle(uint8_t &angle, const uint8_t ch)
Read servo 1 angle from a specific channel.
Definition unit_PbHub.hpp:310
bool writeAnalog0(const uint8_t ch, const uint8_t val)
Write analog 0 to a specific channel.
Definition unit_PbHub.hpp:125
bool writeServo0Angle(const uint8_t ch, const uint8_t angle)
Write servo 0 angle to a specific channel.
Definition unit_PbHub.hpp:260
bool fillLEDColor(const uint8_t ch, const uint32_t rgb888, const uint16_t first=0, const uint16_t count=0)
Fill the LED color to a specific channel.
Definition unit_PbHub.cpp:283
bool changeI2CAddress(const uint8_t addr)
Change device I2C address.
Definition unit_PbHub.cpp:343
bool writeServo0Pulse(const uint8_t ch, const uint16_t pulse)
Write servo 0 pulse to a specific channel.
Definition unit_PbHub.hpp:280
Top level namespace of M5stack.
LEDMode
LED contol type.
Definition unit_PbHub.hpp:31
@ WS28xx
WS28xx, SK6812 (as default)