|
@@ -0,0 +1,153 @@
|
|
|
|
+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<u8, MODE_1::Register>),
|
|
|
|
+ (0x01 => mode2: InMemoryRegister<u8, MODE_2::Register>),
|
|
|
|
+ (0x02 => subaddress1: InMemoryRegister<u8>),
|
|
|
|
+ (0x03 => subaddress2: InMemoryRegister<u8>),
|
|
|
|
+ (0x04 => subaddress3: InMemoryRegister<u8>),
|
|
|
|
+ (0x05 => allcalladdr: InMemoryRegister<u8>),
|
|
|
|
+ (0x06 => led: [InMemoryRegister<u32, LED_CTRL::Register>; 16]),
|
|
|
|
+ (0x46 => _reserved),
|
|
|
|
+ (0xFA => all_led: InMemoryRegister<u32, LED_CTRL::Register>),
|
|
|
|
+ (0xFE => prescale: InMemoryRegister<u8>),
|
|
|
|
+ (0xFF => testmode: InMemoryRegister<u8>),
|
|
|
|
+ (0x100 => @END),
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+impl Pca9685Registers {
|
|
|
|
+ const fn default() -> Self {
|
|
|
|
+ const ZERO_LED: InMemoryRegister<u32, LED_CTRL::Register> = 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 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) {
|
|
|
|
+
|
|
|
|
+}
|