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);
58 explicit UnitPbHub(
const uint8_t addr = DEFAULT_ADDRESS);
63 virtual bool begin()
override;
86 return write_digital(ch, 0, high);
96 return write_digital(ch, 1, high);
106 return read_digital(ch, 0, high);
116 return read_digital(ch, 1, high);
131 return write_analog(ch, 0, val);
141 return write_analog(ch, 1, val);
165 inline bool writePWM0(
const uint8_t ch,
const uint8_t pwm)
167 return write_pwm(ch, 0, pwm);
175 inline bool writePWM1(
const uint8_t ch,
const uint8_t pwm)
177 return write_pwm(ch, 1, pwm);
185 inline bool readPWM0(uint8_t& pwm,
const uint8_t ch)
187 return read_pwm(ch, 0, pwm);
195 inline bool readPWM1(uint8_t& pwm,
const uint8_t ch)
197 return read_pwm(ch, 1, pwm);
219 bool writeLEDColor(
const uint8_t ch,
const uint16_t index,
const uint32_t rgb888);
228 bool fillLEDColor(
const uint8_t ch,
const uint32_t rgb888,
const uint16_t first = 0,
const uint16_t count = 0);
266 return write_servo_angle(ch, 0, angle);
276 return write_servo_angle(ch, 1, angle);
286 return write_servo_pulse(ch, 0, pulse);
296 return write_servo_pulse(ch, 1, pulse);
306 return read_servo_angle(ch, 0, angle);
316 return read_servo_angle(ch, 1, angle);
326 return read_servo_pulse(ch, 0, pulse);
336 return read_servo_pulse(ch, 1, pulse);
358 virtual std::shared_ptr<Adapter> ensure_adapter(
const uint8_t ch)
override;
360 bool write_digital(
const uint8_t ch,
const uint8_t index,
const bool high);
361 bool read_digital(
const uint8_t ch,
const uint8_t index,
bool& high);
362 bool write_analog(
const uint8_t ch,
const uint8_t index,
const uint8_t val);
363 bool write_pwm(
const uint8_t ch,
const uint8_t index,
const uint8_t val);
364 bool read_pwm(
const uint8_t ch,
const uint8_t index, uint8_t& val);
365 bool write_servo_angle(
const uint8_t ch,
const uint8_t index,
const uint8_t angle);
366 bool read_servo_angle(
const uint8_t ch,
const uint8_t index, uint8_t& angle);
367 bool write_servo_pulse(
const uint8_t ch,
const uint8_t index,
const uint16_t pulse);
368 bool read_servo_pulse(
const uint8_t ch,
const uint8_t index, uint16_t& pulse);
369 void wait_led_output(
const uint16_t num_leds)
const;
371 inline bool is_firmware_2_or_later()
const
373 return (_ver != 0xFF) && (_ver >= 2);
375 inline bool is_pbhub()
const
377 return (_ver != 0xFF) && (_ver == 0);
379 inline bool is_pbhub_v11()
const
381 return (_ver != 0xFF) && _ver;
385 std::array<uint16_t, +MAX_CHANNEL> _numLED{74, 74, 74, 74, 74, 74};
392constexpr uint8_t WRITE_DIGITAL_0_REG{0x00};
393constexpr uint8_t WRITE_DIGITAL_1_REG{0x01};
395constexpr uint8_t PWM_0_REG{0x02};
396constexpr uint8_t PWM_1_REG{0x03};
397constexpr uint8_t WRITE_ANALOG_0_REG{0x02};
398constexpr uint8_t WRITE_ANALOG_1_REG{0x03};
400constexpr uint8_t READ_DIGITAL_0_REG{0x04};
401constexpr uint8_t READ_DIGITAL_1_REG{0x05};
402constexpr uint8_t READ_ANALOG_0_REG{0x06};
404constexpr uint8_t LED_NUM_REG{0x08};
405constexpr uint8_t LED_COLOR_SINGLE_REG{0x09};
406constexpr uint8_t LED_COLOR_MORE_REG{0x0A};
407constexpr uint8_t LED_BRIGHTNESS_REG{0x0B};
409constexpr uint8_t SERVO_ANGLE_0_REG{0x0C};
410constexpr uint8_t SERVO_ANGLE_1_REG{0x0D};
411constexpr uint8_t SERVO_PULSE_0_REG{0x0E};
412constexpr uint8_t SERVO_PULSE_1_REG{0x0F};
414constexpr uint8_t LED_MODE_REG{0xFA};
415constexpr uint8_t FIRMWARE_VERSION_REG{0xFE};
416constexpr uint8_t I2C_ADDRESS_REG{0xFF};
bool readPWM0(uint8_t &pwm, const uint8_t ch)
Read PWM 0 from a specific channel.
Definition unit_PbHub.hpp:185
bool writeAnalog1(const uint8_t ch, const uint8_t val)
Write analog 1 to a specific channel.
Definition unit_PbHub.hpp:139
UnitPbHub(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_PbHub.cpp:473
bool readLEDMode(pbhub::LEDMode &m)
Read the LED control mode.
Definition unit_PbHub.cpp:612
bool readDigital1(bool &high, const uint8_t ch)
Read digital 1 from a specific channel.
Definition unit_PbHub.hpp:114
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:541
bool readServo0Pulse(uint16_t &pulse, const uint8_t ch)
Read servo 0 pulse from a specific channel.
Definition unit_PbHub.hpp:324
bool readDigital0(bool &high, const uint8_t ch)
Read digital 0 from a specific channel.
Definition unit_PbHub.hpp:104
bool writeDigital0(const uint8_t ch, const bool high)
Write digital 0 to a specific channel.
Definition unit_PbHub.hpp:84
virtual bool begin() override
Begin communication and detect hardware version.
Definition unit_PbHub.cpp:481
bool writeLEDCount(const uint8_t ch, const uint16_t num)
Write the number of the LED to a specific channel.
Definition unit_PbHub.cpp:523
bool readAnalog0(uint16_t &val, const uint8_t ch)
Read analog 0 from a specific channel.
Definition unit_PbHub.cpp:515
bool readFirmwareVersion(uint8_t &ver)
Read the firmware version.
Definition unit_PbHub.cpp:633
bool writeServo1Pulse(const uint8_t ch, const uint16_t pulse)
Write servo 1 pulse to a specific channel.
Definition unit_PbHub.hpp:294
uint8_t firmwareVersion() const
Get the firmware version.
Definition unit_PbHub.hpp:71
bool writeLEDBrightness(const uint8_t ch, const uint8_t value)
Write the LED brightness to a specific channel.
Definition unit_PbHub.cpp:597
bool writePWM0(const uint8_t ch, const uint8_t pwm)
Write PWM 0 to a specific channel.
Definition unit_PbHub.hpp:165
bool writePWM1(const uint8_t ch, const uint8_t pwm)
Write PWM 1 to a specific channel.
Definition unit_PbHub.hpp:175
bool readServo0Angle(uint8_t &angle, const uint8_t ch)
Read servo 0 angle from a specific channel.
Definition unit_PbHub.hpp:304
bool writeDigital1(const uint8_t ch, const bool high)
Write digital 1 to a specific channel.
Definition unit_PbHub.hpp:94
bool readPWM1(uint8_t &pwm, const uint8_t ch)
Read PWM 1 from a specific channel.
Definition unit_PbHub.hpp:195
bool readServo1Pulse(uint16_t &pulse, const uint8_t ch)
Read servo 1 pulse from a specific channel.
Definition unit_PbHub.hpp:334
bool writeLEDMode(const pbhub::LEDMode m)
Write the LED control mode.
Definition unit_PbHub.cpp:603
static constexpr uint8_t MAX_CHANNEL
Maximum number of channels.
Definition unit_PbHub.hpp:53
bool writeServo1Angle(const uint8_t ch, const uint8_t angle)
Write servo 1 angle to a specific channel.
Definition unit_PbHub.hpp:274
static constexpr uint8_t MAX_LED_COUNT
Maximum number of LEDs per channel.
Definition unit_PbHub.hpp:54
bool readServo1Angle(uint8_t &angle, const uint8_t ch)
Read servo 1 angle from a specific channel.
Definition unit_PbHub.hpp:314
bool writeAnalog0(const uint8_t ch, const uint8_t val)
Write analog 0 to a specific channel.
Definition unit_PbHub.hpp:129
bool writeServo0Angle(const uint8_t ch, const uint8_t angle)
Write servo 0 angle to a specific channel.
Definition unit_PbHub.hpp:264
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:567
bool changeI2CAddress(const uint8_t addr)
Change device I2C address.
Definition unit_PbHub.cpp:639
bool writeServo0Pulse(const uint8_t ch, const uint16_t pulse)
Write servo 0 pulse to a specific channel.
Definition unit_PbHub.hpp:284
Top level namespace of M5Stack.
LEDMode
LED control type.
Definition unit_PbHub.hpp:31
@ WS28xx
WS28xx, SK6812 (as default)