use field_offset::offset_of; use stm32l4xx_hal::prelude::{ _embedded_hal_blocking_i2c_Write, _embedded_hal_blocking_i2c_WriteRead, }; use tock_registers::{ interfaces::{ReadWriteable, Readable, Writeable}, register_bitfields, register_structs, registers::InMemoryRegister, }; const PCA9685_ADDR_1: u8 = 0x41; const PCA9685_ADDR_2: u8 = 0x42; const PCA9685_ADDR_3: u8 = 0x43; register_bitfields![ u8, MODE_1 [ ALLCALL 0, SUB3 1, SUB2 2, SUB1 3, SLEEP 4, AI 5, EXTCLK 6, RESTART 7, ], MODE_2 [ OUTNE OFFSET(0) NUMBITS(2) [], OUTDRV OFFSET(2) NUMBITS(1) [], OCH OFFSET(3) NUMBITS(1) [], INVRT OFFSET(4) NUMBITS(1) [], ], ]; register_bitfields![ u32, LED_CTRL [ On OFFSET(0) NUMBITS(12) [], On_Full OFFSET(12) NUMBITS(1) [], Off OFFSET(16) NUMBITS(12) [], Off_Full OFFSET(28) NUMBITS(1) [], ], ]; register_structs! { Pca9685Registers { (0x00 => mode1: InMemoryRegister), (0x01 => mode2: InMemoryRegister), (0x02 => subaddress1: InMemoryRegister), (0x03 => subaddress2: InMemoryRegister), (0x04 => subaddress3: InMemoryRegister), (0x05 => allcalladdr: InMemoryRegister), (0x06 => led: [InMemoryRegister; 16]), (0x46 => _reserved), (0xFA => all_led: InMemoryRegister), (0xFE => prescale: InMemoryRegister), (0xFF => testmode: InMemoryRegister), (0x100 => @END), } } impl Pca9685Registers { const fn default() -> Self { const ZERO_LED: InMemoryRegister = InMemoryRegister::new(0x00); Self { mode1: InMemoryRegister::new(0x00), mode2: InMemoryRegister::new(0x00), subaddress1: InMemoryRegister::new(0x00), subaddress2: InMemoryRegister::new(0x00), subaddress3: InMemoryRegister::new(0x00), allcalladdr: InMemoryRegister::new(0x00), led: [ZERO_LED; 16], _reserved: [0; 180], all_led: InMemoryRegister::new(0x00), prescale: InMemoryRegister::new(0x00), testmode: InMemoryRegister::new(0x00), } } } const MAP_ADDR: usize = 0; const MAP_PIN: usize = 1; static PCA9685_MAPPING: [[[u8; 2]; 10]; 4] = [ [ [PCA9685_ADDR_1, 8], // Tube 0 Digit 0 [PCA9685_ADDR_1, 9], // Tube 0 Digit 1 [PCA9685_ADDR_1, 10], // Tube 0 Digit 2 [PCA9685_ADDR_1, 12], // Tube 0 Digit 3 [PCA9685_ADDR_1, 15], // Tube 0 Digit 4 [PCA9685_ADDR_1, 14], // Tube 0 Digit 5 [PCA9685_ADDR_1, 11], // Tube 0 Digit 6 [PCA9685_ADDR_1, 0], // Tube 0 Digit 7 [PCA9685_ADDR_1, 1], // Tube 0 Digit 8 [PCA9685_ADDR_1, 13], // Tube 0 Digit 9 ], [ [PCA9685_ADDR_1, 5], // Tube 1 Digit 0 [PCA9685_ADDR_1, 6], // Tube 1 Digit 1 [PCA9685_ADDR_1, 7], // Tube 1 Digit 2 [PCA9685_ADDR_1, 2], // Tube 1 Digit 3 [PCA9685_ADDR_2, 4], // Tube 1 Digit 4 [PCA9685_ADDR_2, 1], // Tube 1 Digit 5 [PCA9685_ADDR_1, 4], // Tube 1 Digit 6 [PCA9685_ADDR_2, 2], // Tube 1 Digit 7 [PCA9685_ADDR_2, 3], // Tube 1 Digit 8 [PCA9685_ADDR_1, 3], // Tube 1 Digit 9 ], [ [PCA9685_ADDR_3, 8], // Tube 2 Digit 0 [PCA9685_ADDR_3, 9], // Tube 2 Digit 1 [PCA9685_ADDR_3, 10], // Tube 2 Digit 2 [PCA9685_ADDR_3, 12], // Tube 2 Digit 3 [PCA9685_ADDR_2, 12], // Tube 2 Digit 4 [PCA9685_ADDR_2, 13], // Tube 2 Digit 5 [PCA9685_ADDR_3, 11], // Tube 2 Digit 6 [PCA9685_ADDR_2, 14], // Tube 2 Digit 7 [PCA9685_ADDR_2, 11], // Tube 2 Digit 8 [PCA9685_ADDR_3, 13], // Tube 2 Digit 9 ], [ [PCA9685_ADDR_3, 5], // Tube 3 Digit 0 [PCA9685_ADDR_3, 6], // Tube 3 Digit 1 [PCA9685_ADDR_3, 7], // Tube 3 Digit 2 [PCA9685_ADDR_3, 2], // Tube 3 Digit 3 [PCA9685_ADDR_3, 14], // Tube 3 Digit 4 [PCA9685_ADDR_3, 15], // Tube 3 Digit 5 [PCA9685_ADDR_3, 4], // Tube 3 Digit 6 [PCA9685_ADDR_3, 1], // Tube 3 Digit 7 [PCA9685_ADDR_3, 0], // Tube 3 Digit 8 [PCA9685_ADDR_3, 3], // Tube 3 Digit 9 ], ]; pub fn init(i2c: &mut impl _embedded_hal_blocking_i2c_Write, ) { } pub fn set_voltage(percent: f32) { } pub fn set_digit(tube: u32, digit: u32, pwm_start: u32, pwm_end: u32) { } pub fn set_dot(pwm_start: u32, pwm_end: u32) { } pub fn enable_output(enabled: bool) { }