pub const DS3231_ADDR: u8 = 0x68; pub const TUSB322_ADDR: u8 = 0x47; pub const PCA9685_ADDR_1: u8 = 0x41; pub const PCA9685_ADDR_2: u8 = 0x42; pub const PCA9685_ADDR_3: u8 = 0x43; pub const PCA9685_ALL_CALL: u8 = 0x70; // Default enabled pub const PCA9685_SUB_CALL_1: u8 = 0x71; // Default disabled pub const PCA9685_SUB_CALL_2: u8 = 0x72; // Default disabled pub const PCA9685_SUB_CALL_3: u8 = 0x73; // Default disabled const MAP_DOT_ADDR: u8 = PCA9685_ADDR_2; const MAP_DOT_PIN: u8 = 15; const MAP_ADDR: usize = 0; const MAP_PIN: usize = 1; struct DigitToPin { address: u8, pin: usize, } struct PwmDriver { digit: [DigitToPin; 10], } struct PwmOutputMap { driver: [PwmDriver; 4], dot_address: u8, dot_pin: usize, } static TUBE_MAPPING: PwmOutputMap = { PwmOutputMap { driver: [ PwmDriver { digit: [ DigitToPin { address: PCA9685_ADDR_1, pin: 8, }, // Tube 0 Digit 0 DigitToPin { address: PCA9685_ADDR_1, pin: 9, }, // Tube 0 Digit 1 DigitToPin { address: PCA9685_ADDR_1, pin: 10, }, // Tube 0 Digit 2 DigitToPin { address: PCA9685_ADDR_1, pin: 12, }, // Tube 0 Digit 3 DigitToPin { address: PCA9685_ADDR_1, pin: 15, }, // Tube 0 Digit 4 DigitToPin { address: PCA9685_ADDR_1, pin: 14, }, // Tube 0 Digit 5 DigitToPin { address: PCA9685_ADDR_1, pin: 11, }, // Tube 0 Digit 6 DigitToPin { address: PCA9685_ADDR_1, pin: 0, }, // Tube 0 Digit 7 DigitToPin { address: PCA9685_ADDR_1, pin: 1, }, // Tube 0 Digit 8 DigitToPin { address: PCA9685_ADDR_1, pin: 13, }, // Tube 0 Digit 9 ], }, PwmDriver { digit: [ DigitToPin { address: PCA9685_ADDR_1, pin: 5, }, // Tube 1 Digit 0 DigitToPin { address: PCA9685_ADDR_1, pin: 6, }, // Tube 1 Digit 1 DigitToPin { address: PCA9685_ADDR_1, pin: 7, }, // Tube 1 Digit 2 DigitToPin { address: PCA9685_ADDR_1, pin: 2, }, // Tube 1 Digit 3 DigitToPin { address: PCA9685_ADDR_2, pin: 4, }, // Tube 1 Digit 4 DigitToPin { address: PCA9685_ADDR_2, pin: 1, }, // Tube 1 Digit 5 DigitToPin { address: PCA9685_ADDR_1, pin: 4, }, // Tube 1 Digit 6 DigitToPin { address: PCA9685_ADDR_2, pin: 2, }, // Tube 1 Digit 7 DigitToPin { address: PCA9685_ADDR_2, pin: 3, }, // Tube 1 Digit 8 DigitToPin { address: PCA9685_ADDR_1, pin: 3, }, // Tube 1 Digit 9 ], }, PwmDriver { digit: [ DigitToPin { address: PCA9685_ADDR_3, pin: 8, }, // Tube 2 Digit 0 DigitToPin { address: PCA9685_ADDR_3, pin: 9, }, // Tube 2 Digit 1 DigitToPin { address: PCA9685_ADDR_3, pin: 10, }, // Tube 2 Digit 2 DigitToPin { address: PCA9685_ADDR_3, pin: 12, }, // Tube 2 Digit 3 DigitToPin { address: PCA9685_ADDR_2, pin: 12, }, // Tube 2 Digit 4 DigitToPin { address: PCA9685_ADDR_2, pin: 13, }, // Tube 2 Digit 5 DigitToPin { address: PCA9685_ADDR_3, pin: 11, }, // Tube 2 Digit 6 DigitToPin { address: PCA9685_ADDR_2, pin: 14, }, // Tube 2 Digit 7 DigitToPin { address: PCA9685_ADDR_2, pin: 11, }, // Tube 2 Digit 8 DigitToPin { address: PCA9685_ADDR_3, pin: 13, }, // Tube 2 Digit 9 ], }, PwmDriver { digit: [ DigitToPin { address: PCA9685_ADDR_3, pin: 5, }, // Tube 3 Digit 0 DigitToPin { address: PCA9685_ADDR_3, pin: 6, }, // Tube 3 Digit 1 DigitToPin { address: PCA9685_ADDR_3, pin: 7, }, // Tube 3 Digit 2 DigitToPin { address: PCA9685_ADDR_3, pin: 2, }, // Tube 3 Digit 3 DigitToPin { address: PCA9685_ADDR_3, pin: 14, }, // Tube 3 Digit 4 DigitToPin { address: PCA9685_ADDR_3, pin: 15, }, // Tube 3 Digit 5 DigitToPin { address: PCA9685_ADDR_3, pin: 4, }, // Tube 3 Digit 6 DigitToPin { address: PCA9685_ADDR_3, pin: 1, }, // Tube 3 Digit 7 DigitToPin { address: PCA9685_ADDR_3, pin: 0, }, // Tube 3 Digit 8 DigitToPin { address: PCA9685_ADDR_3, pin: 3, }, // Tube 3 Digit 9 ], }, ], dot_address: PCA9685_ADDR_2, dot_pin: 15, } }; enum DigitState { Decrementing, Incrementing } struct Digit { current_state: DigitState, value: u32, pwm_start: u32, pwm_end: u32, updated: bool, } struct Tube { digits: [Digit; 10], last_active: usize, refresh_last: usize, active: bool, fade_duration: u32, } struct Clock { tubes: [Tube; 4], }