pca9685.rs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. use field_offset::offset_of;
  2. use stm32l4xx_hal::prelude::{
  3. _embedded_hal_blocking_i2c_Write, _embedded_hal_blocking_i2c_WriteRead,
  4. };
  5. use tock_registers::{
  6. interfaces::{ReadWriteable, Readable, Writeable},
  7. register_bitfields, register_structs,
  8. registers::InMemoryRegister,
  9. };
  10. const PCA9685_ADDR_1: u8 = 0x41;
  11. const PCA9685_ADDR_2: u8 = 0x42;
  12. const PCA9685_ADDR_3: u8 = 0x43;
  13. register_bitfields![
  14. u8,
  15. MODE_1 [
  16. ALLCALL 0,
  17. SUB3 1,
  18. SUB2 2,
  19. SUB1 3,
  20. SLEEP 4,
  21. AI 5,
  22. EXTCLK 6,
  23. RESTART 7,
  24. ],
  25. MODE_2 [
  26. OUTNE OFFSET(0) NUMBITS(2) [],
  27. OUTDRV OFFSET(2) NUMBITS(1) [],
  28. OCH OFFSET(3) NUMBITS(1) [],
  29. INVRT OFFSET(4) NUMBITS(1) [],
  30. ],
  31. ];
  32. register_bitfields![
  33. u32,
  34. LED_CTRL [
  35. On OFFSET(0) NUMBITS(12) [],
  36. On_Full OFFSET(12) NUMBITS(1) [],
  37. Off OFFSET(16) NUMBITS(12) [],
  38. Off_Full OFFSET(28) NUMBITS(1) [],
  39. ],
  40. ];
  41. register_structs! {
  42. Pca9685Registers {
  43. (0x00 => mode1: InMemoryRegister<u8, MODE_1::Register>),
  44. (0x01 => mode2: InMemoryRegister<u8, MODE_2::Register>),
  45. (0x02 => subaddress1: InMemoryRegister<u8>),
  46. (0x03 => subaddress2: InMemoryRegister<u8>),
  47. (0x04 => subaddress3: InMemoryRegister<u8>),
  48. (0x05 => allcalladdr: InMemoryRegister<u8>),
  49. (0x06 => led: [InMemoryRegister<u32, LED_CTRL::Register>; 16]),
  50. (0x46 => _reserved),
  51. (0xFA => all_led: InMemoryRegister<u32, LED_CTRL::Register>),
  52. (0xFE => prescale: InMemoryRegister<u8>),
  53. (0xFF => testmode: InMemoryRegister<u8>),
  54. (0x100 => @END),
  55. }
  56. }
  57. impl Pca9685Registers {
  58. const fn default() -> Self {
  59. const ZERO_LED: InMemoryRegister<u32, LED_CTRL::Register> = InMemoryRegister::new(0x00);
  60. Self {
  61. mode1: InMemoryRegister::new(0x00),
  62. mode2: InMemoryRegister::new(0x00),
  63. subaddress1: InMemoryRegister::new(0x00),
  64. subaddress2: InMemoryRegister::new(0x00),
  65. subaddress3: InMemoryRegister::new(0x00),
  66. allcalladdr: InMemoryRegister::new(0x00),
  67. led: [ZERO_LED; 16],
  68. _reserved: [0; 180],
  69. all_led: InMemoryRegister::new(0x00),
  70. prescale: InMemoryRegister::new(0x00),
  71. testmode: InMemoryRegister::new(0x00),
  72. }
  73. }
  74. }
  75. const MAP_ADDR: usize = 0;
  76. const MAP_PIN: usize = 1;
  77. static PCA9685_MAPPING: [[[u8; 2]; 10]; 4] = [
  78. [
  79. [PCA9685_ADDR_1, 8], // Tube 0 Digit 0
  80. [PCA9685_ADDR_1, 9], // Tube 0 Digit 1
  81. [PCA9685_ADDR_1, 10], // Tube 0 Digit 2
  82. [PCA9685_ADDR_1, 12], // Tube 0 Digit 3
  83. [PCA9685_ADDR_1, 15], // Tube 0 Digit 4
  84. [PCA9685_ADDR_1, 14], // Tube 0 Digit 5
  85. [PCA9685_ADDR_1, 11], // Tube 0 Digit 6
  86. [PCA9685_ADDR_1, 0], // Tube 0 Digit 7
  87. [PCA9685_ADDR_1, 1], // Tube 0 Digit 8
  88. [PCA9685_ADDR_1, 13], // Tube 0 Digit 9
  89. ],
  90. [
  91. [PCA9685_ADDR_1, 5], // Tube 1 Digit 0
  92. [PCA9685_ADDR_1, 6], // Tube 1 Digit 1
  93. [PCA9685_ADDR_1, 7], // Tube 1 Digit 2
  94. [PCA9685_ADDR_1, 2], // Tube 1 Digit 3
  95. [PCA9685_ADDR_2, 4], // Tube 1 Digit 4
  96. [PCA9685_ADDR_2, 1], // Tube 1 Digit 5
  97. [PCA9685_ADDR_1, 4], // Tube 1 Digit 6
  98. [PCA9685_ADDR_2, 2], // Tube 1 Digit 7
  99. [PCA9685_ADDR_2, 3], // Tube 1 Digit 8
  100. [PCA9685_ADDR_1, 3], // Tube 1 Digit 9
  101. ],
  102. [
  103. [PCA9685_ADDR_3, 8], // Tube 2 Digit 0
  104. [PCA9685_ADDR_3, 9], // Tube 2 Digit 1
  105. [PCA9685_ADDR_3, 10], // Tube 2 Digit 2
  106. [PCA9685_ADDR_3, 12], // Tube 2 Digit 3
  107. [PCA9685_ADDR_2, 12], // Tube 2 Digit 4
  108. [PCA9685_ADDR_2, 13], // Tube 2 Digit 5
  109. [PCA9685_ADDR_3, 11], // Tube 2 Digit 6
  110. [PCA9685_ADDR_2, 14], // Tube 2 Digit 7
  111. [PCA9685_ADDR_2, 11], // Tube 2 Digit 8
  112. [PCA9685_ADDR_3, 13], // Tube 2 Digit 9
  113. ],
  114. [
  115. [PCA9685_ADDR_3, 5], // Tube 3 Digit 0
  116. [PCA9685_ADDR_3, 6], // Tube 3 Digit 1
  117. [PCA9685_ADDR_3, 7], // Tube 3 Digit 2
  118. [PCA9685_ADDR_3, 2], // Tube 3 Digit 3
  119. [PCA9685_ADDR_3, 14], // Tube 3 Digit 4
  120. [PCA9685_ADDR_3, 15], // Tube 3 Digit 5
  121. [PCA9685_ADDR_3, 4], // Tube 3 Digit 6
  122. [PCA9685_ADDR_3, 1], // Tube 3 Digit 7
  123. [PCA9685_ADDR_3, 0], // Tube 3 Digit 8
  124. [PCA9685_ADDR_3, 3], // Tube 3 Digit 9
  125. ],
  126. ];
  127. pub fn init(i2c: &mut impl _embedded_hal_blocking_i2c_Write, ) {
  128. }
  129. pub fn set_voltage(percent: f32) {
  130. }
  131. pub fn set_digit(tube: u32, digit: u32, pwm_start: u32, pwm_end: u32) {
  132. }
  133. pub fn set_dot(pwm_start: u32, pwm_end: u32) {
  134. }
  135. pub fn enable_output(enabled: bool) {
  136. }