nixie.rs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. pub const DS3231_ADDR: u8 = 0x68;
  2. pub const TUSB322_ADDR: u8 = 0x47;
  3. pub const PCA9685_ADDR_1: u8 = 0x41;
  4. pub const PCA9685_ADDR_2: u8 = 0x42;
  5. pub const PCA9685_ADDR_3: u8 = 0x43;
  6. pub const PCA9685_ALL_CALL: u8 = 0x70; // Default enabled
  7. pub const PCA9685_SUB_CALL_1: u8 = 0x71; // Default disabled
  8. pub const PCA9685_SUB_CALL_2: u8 = 0x72; // Default disabled
  9. pub const PCA9685_SUB_CALL_3: u8 = 0x73; // Default disabled
  10. const MAP_DOT_ADDR: u8 = PCA9685_ADDR_2;
  11. const MAP_DOT_PIN: u8 = 15;
  12. const MAP_ADDR: usize = 0;
  13. const MAP_PIN: usize = 1;
  14. struct DigitToPin {
  15. address: u8,
  16. pin: usize,
  17. }
  18. struct PwmDriver {
  19. digit: [DigitToPin; 10],
  20. }
  21. struct PwmOutputMap {
  22. driver: [PwmDriver; 4],
  23. dot_address: u8,
  24. dot_pin: usize,
  25. }
  26. static TUBE_MAPPING: PwmOutputMap = {
  27. PwmOutputMap {
  28. driver: [
  29. PwmDriver {
  30. digit: [
  31. DigitToPin {
  32. address: PCA9685_ADDR_1,
  33. pin: 8,
  34. }, // Tube 0 Digit 0
  35. DigitToPin {
  36. address: PCA9685_ADDR_1,
  37. pin: 9,
  38. }, // Tube 0 Digit 1
  39. DigitToPin {
  40. address: PCA9685_ADDR_1,
  41. pin: 10,
  42. }, // Tube 0 Digit 2
  43. DigitToPin {
  44. address: PCA9685_ADDR_1,
  45. pin: 12,
  46. }, // Tube 0 Digit 3
  47. DigitToPin {
  48. address: PCA9685_ADDR_1,
  49. pin: 15,
  50. }, // Tube 0 Digit 4
  51. DigitToPin {
  52. address: PCA9685_ADDR_1,
  53. pin: 14,
  54. }, // Tube 0 Digit 5
  55. DigitToPin {
  56. address: PCA9685_ADDR_1,
  57. pin: 11,
  58. }, // Tube 0 Digit 6
  59. DigitToPin {
  60. address: PCA9685_ADDR_1,
  61. pin: 0,
  62. }, // Tube 0 Digit 7
  63. DigitToPin {
  64. address: PCA9685_ADDR_1,
  65. pin: 1,
  66. }, // Tube 0 Digit 8
  67. DigitToPin {
  68. address: PCA9685_ADDR_1,
  69. pin: 13,
  70. }, // Tube 0 Digit 9
  71. ],
  72. },
  73. PwmDriver {
  74. digit: [
  75. DigitToPin {
  76. address: PCA9685_ADDR_1,
  77. pin: 5,
  78. }, // Tube 1 Digit 0
  79. DigitToPin {
  80. address: PCA9685_ADDR_1,
  81. pin: 6,
  82. }, // Tube 1 Digit 1
  83. DigitToPin {
  84. address: PCA9685_ADDR_1,
  85. pin: 7,
  86. }, // Tube 1 Digit 2
  87. DigitToPin {
  88. address: PCA9685_ADDR_1,
  89. pin: 2,
  90. }, // Tube 1 Digit 3
  91. DigitToPin {
  92. address: PCA9685_ADDR_2,
  93. pin: 4,
  94. }, // Tube 1 Digit 4
  95. DigitToPin {
  96. address: PCA9685_ADDR_2,
  97. pin: 1,
  98. }, // Tube 1 Digit 5
  99. DigitToPin {
  100. address: PCA9685_ADDR_1,
  101. pin: 4,
  102. }, // Tube 1 Digit 6
  103. DigitToPin {
  104. address: PCA9685_ADDR_2,
  105. pin: 2,
  106. }, // Tube 1 Digit 7
  107. DigitToPin {
  108. address: PCA9685_ADDR_2,
  109. pin: 3,
  110. }, // Tube 1 Digit 8
  111. DigitToPin {
  112. address: PCA9685_ADDR_1,
  113. pin: 3,
  114. }, // Tube 1 Digit 9
  115. ],
  116. },
  117. PwmDriver {
  118. digit: [
  119. DigitToPin {
  120. address: PCA9685_ADDR_3,
  121. pin: 8,
  122. }, // Tube 2 Digit 0
  123. DigitToPin {
  124. address: PCA9685_ADDR_3,
  125. pin: 9,
  126. }, // Tube 2 Digit 1
  127. DigitToPin {
  128. address: PCA9685_ADDR_3,
  129. pin: 10,
  130. }, // Tube 2 Digit 2
  131. DigitToPin {
  132. address: PCA9685_ADDR_3,
  133. pin: 12,
  134. }, // Tube 2 Digit 3
  135. DigitToPin {
  136. address: PCA9685_ADDR_2,
  137. pin: 12,
  138. }, // Tube 2 Digit 4
  139. DigitToPin {
  140. address: PCA9685_ADDR_2,
  141. pin: 13,
  142. }, // Tube 2 Digit 5
  143. DigitToPin {
  144. address: PCA9685_ADDR_3,
  145. pin: 11,
  146. }, // Tube 2 Digit 6
  147. DigitToPin {
  148. address: PCA9685_ADDR_2,
  149. pin: 14,
  150. }, // Tube 2 Digit 7
  151. DigitToPin {
  152. address: PCA9685_ADDR_2,
  153. pin: 11,
  154. }, // Tube 2 Digit 8
  155. DigitToPin {
  156. address: PCA9685_ADDR_3,
  157. pin: 13,
  158. }, // Tube 2 Digit 9
  159. ],
  160. },
  161. PwmDriver {
  162. digit: [
  163. DigitToPin {
  164. address: PCA9685_ADDR_3,
  165. pin: 5,
  166. }, // Tube 3 Digit 0
  167. DigitToPin {
  168. address: PCA9685_ADDR_3,
  169. pin: 6,
  170. }, // Tube 3 Digit 1
  171. DigitToPin {
  172. address: PCA9685_ADDR_3,
  173. pin: 7,
  174. }, // Tube 3 Digit 2
  175. DigitToPin {
  176. address: PCA9685_ADDR_3,
  177. pin: 2,
  178. }, // Tube 3 Digit 3
  179. DigitToPin {
  180. address: PCA9685_ADDR_3,
  181. pin: 14,
  182. }, // Tube 3 Digit 4
  183. DigitToPin {
  184. address: PCA9685_ADDR_3,
  185. pin: 15,
  186. }, // Tube 3 Digit 5
  187. DigitToPin {
  188. address: PCA9685_ADDR_3,
  189. pin: 4,
  190. }, // Tube 3 Digit 6
  191. DigitToPin {
  192. address: PCA9685_ADDR_3,
  193. pin: 1,
  194. }, // Tube 3 Digit 7
  195. DigitToPin {
  196. address: PCA9685_ADDR_3,
  197. pin: 0,
  198. }, // Tube 3 Digit 8
  199. DigitToPin {
  200. address: PCA9685_ADDR_3,
  201. pin: 3,
  202. }, // Tube 3 Digit 9
  203. ],
  204. },
  205. ],
  206. dot_address: PCA9685_ADDR_2,
  207. dot_pin: 15,
  208. }
  209. };
  210. enum DigitState {
  211. Decrementing,
  212. Incrementing
  213. }
  214. struct Digit {
  215. current_state: DigitState,
  216. value: u32,
  217. pwm_start: u32,
  218. pwm_end: u32,
  219. updated: bool,
  220. }
  221. struct Tube {
  222. digits: [Digit; 10],
  223. last_active: usize,
  224. refresh_last: usize,
  225. active: bool,
  226. fade_duration: u32,
  227. }
  228. struct Clock {
  229. tubes: [Tube; 4],
  230. }