Skip to main content

part

Function part 

Source
pub fn part(address: u8) -> I2cPart
Expand description

A PCA9685 at an address, as it powers up: asleep at 200 Hz with every output off.

§Arguments

§Returns

The part, keeping RULES.

§Examples

use pamoja_actuators::pca9685::{
    channel_register, mode1, register, sim, Pwm, DEFAULT_I2C_ADDRESS, PRE_SCALE_RESET,
};
use pamoja_hal::i2c::I2c;

const PART: u8 = DEFAULT_I2C_ADDRESS;
let mut part = sim::part(PART);
assert_eq!(part.register(register::PRE_SCALE), PRE_SCALE_RESET, "200 Hz");

// Awake, the part keeps its prescale whatever is written to it.
part.write(PART, &[register::MODE1, 0]).unwrap();
part.write(PART, &[register::PRE_SCALE, 121]).unwrap();
assert_eq!(part.register(register::PRE_SCALE), PRE_SCALE_RESET);

// With auto-increment on, one write to the ALL_LED registers loads every channel.
let half = Pwm::duty(2048);
let [on_l, on_h, off_l, off_h] = half.bytes();
part.write(PART, &[register::MODE1, mode1::AUTO_INCREMENT]).unwrap();
part.write(PART, &[register::ALL_LED_ON_L, on_l, on_h, off_l, off_h]).unwrap();
for channel in [0, 15] {
    let mut held = [0u8; 4];
    part.write_read(PART, &[channel_register(channel)], &mut held).unwrap();
    assert_eq!(Pwm::from_bytes(&held), half, "channel {channel}");
}