denko 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build_atmega_avr.yml +2 -1
  3. data/.github/workflows/build_atmega_megaavr.yml +2 -1
  4. data/.github/workflows/build_atsam3x.yml +1 -0
  5. data/.github/workflows/build_atsamd21.yml +2 -1
  6. data/.github/workflows/build_esp32.yml +4 -2
  7. data/.github/workflows/build_esp32c3.yml +4 -3
  8. data/.github/workflows/build_esp32c6.yml +4 -2
  9. data/.github/workflows/build_esp32h2.yml +4 -2
  10. data/.github/workflows/build_esp32s2.yml +4 -2
  11. data/.github/workflows/build_esp32s3.yml +4 -2
  12. data/.github/workflows/build_esp8266.yml +2 -1
  13. data/.github/workflows/build_ra4m1.yml +1 -0
  14. data/.github/workflows/build_rp2040.yml +4 -3
  15. data/.github/workflows/ruby.yml +1 -1
  16. data/CHANGELOG.md +203 -0
  17. data/DEPS_CLI.md +16 -16
  18. data/DEPS_IDE.md +31 -30
  19. data/MICROCONTROLLERS.md +103 -0
  20. data/PERIPHERALS.md +178 -0
  21. data/README.md +28 -21
  22. data/denko.gemspec +6 -1
  23. data/lib/denko/analog_io/ads1118.rb +5 -5
  24. data/lib/denko/analog_io/ads111x.rb +23 -19
  25. data/lib/denko/analog_io/joystick.rb +87 -0
  26. data/lib/denko/analog_io/potentiometer.rb +1 -5
  27. data/lib/denko/analog_io.rb +22 -8
  28. data/lib/denko/behaviors/bus_controller.rb +2 -1
  29. data/lib/denko/behaviors/bus_peripheral.rb +1 -1
  30. data/lib/denko/behaviors/callbacks.rb +18 -16
  31. data/lib/denko/behaviors/component.rb +0 -4
  32. data/lib/denko/behaviors/lifecycle.rb +1 -1
  33. data/lib/denko/behaviors/listener.rb +9 -3
  34. data/lib/denko/behaviors/multi_pin.rb +4 -6
  35. data/lib/denko/behaviors/poller.rb +11 -2
  36. data/lib/denko/behaviors/reader.rb +109 -21
  37. data/lib/denko/behaviors/single_pin.rb +2 -4
  38. data/lib/denko/behaviors/state.rb +18 -13
  39. data/lib/denko/behaviors/threaded.rb +19 -8
  40. data/lib/denko/behaviors.rb +36 -23
  41. data/lib/denko/board/eeprom.rb +1 -1
  42. data/lib/denko/board/i2c.rb +1 -1
  43. data/lib/denko/board/i2c_bit_bang.rb +9 -5
  44. data/lib/denko/board/map.rb +6 -2
  45. data/lib/denko/board/one_wire.rb +3 -3
  46. data/lib/denko/board/spi.rb +30 -30
  47. data/lib/denko/board/spi_bit_bang.rb +8 -11
  48. data/lib/denko/board.rb +6 -3
  49. data/lib/denko/connection/flow_control.rb +1 -1
  50. data/lib/denko/connection/serial.rb +5 -5
  51. data/lib/denko/digital_io/output.rb +12 -4
  52. data/lib/denko/digital_io/pcf8574.rb +114 -0
  53. data/lib/denko/digital_io/rotary_encoder.rb +10 -6
  54. data/lib/denko/digital_io.rb +24 -6
  55. data/lib/denko/display/canvas.rb +350 -157
  56. data/lib/denko/display/font/bmp_5x7.rb +142 -0
  57. data/lib/denko/display/font/bmp_6x8.rb +142 -0
  58. data/lib/denko/display/font/bmp_8x16.rb +141 -0
  59. data/lib/denko/display/font.rb +22 -0
  60. data/lib/denko/display/hd44780.rb +24 -20
  61. data/lib/denko/display/il0373.rb +186 -0
  62. data/lib/denko/display/mono_oled.rb +193 -0
  63. data/lib/denko/display/pcd8544.rb +154 -0
  64. data/lib/denko/display/pixel_common.rb +83 -0
  65. data/lib/denko/display/sh1106.rb +17 -21
  66. data/lib/denko/display/sh1107.rb +10 -0
  67. data/lib/denko/display/spi_common.rb +35 -0
  68. data/lib/denko/display/spi_epaper_common.rb +30 -0
  69. data/lib/denko/display/ssd1306.rb +6 -228
  70. data/lib/denko/display/ssd1680.rb +14 -0
  71. data/lib/denko/display/ssd1681.rb +8 -0
  72. data/lib/denko/display/ssd168x.rb +227 -0
  73. data/lib/denko/display/st7302.rb +207 -0
  74. data/lib/denko/display/st7565.rb +166 -0
  75. data/lib/denko/display.rb +40 -4
  76. data/lib/denko/eeprom/at24c.rb +67 -0
  77. data/lib/denko/eeprom/board.rb +69 -0
  78. data/lib/denko/eeprom.rb +15 -1
  79. data/lib/denko/helpers/engine_check.rb +13 -0
  80. data/lib/denko/{mutex_stub.rb → helpers/mutex_stub.rb} +6 -0
  81. data/lib/denko/helpers.rb +6 -0
  82. data/lib/denko/i2c/bit_bang.rb +1 -0
  83. data/lib/denko/i2c/bus_common.rb +9 -4
  84. data/lib/denko/i2c/peripheral.rb +5 -1
  85. data/lib/denko/i2c.rb +17 -4
  86. data/lib/denko/led/apa102.rb +1 -3
  87. data/lib/denko/led/base.rb +5 -0
  88. data/lib/denko/led/rgb.rb +16 -10
  89. data/lib/denko/led/seven_segment.rb +1 -1
  90. data/lib/denko/led.rb +17 -8
  91. data/lib/denko/motor/{stepper.rb → a3967.rb} +1 -1
  92. data/lib/denko/motor/servo.rb +16 -6
  93. data/lib/denko/motor.rb +16 -3
  94. data/lib/denko/one_wire/bus.rb +20 -16
  95. data/lib/denko/one_wire/bus_enumerator.rb +25 -14
  96. data/lib/denko/one_wire/helper.rb +4 -2
  97. data/lib/denko/one_wire.rb +18 -5
  98. data/lib/denko/pulse_io/buzzer.rb +2 -6
  99. data/lib/denko/pulse_io/ir_output.rb +1 -5
  100. data/lib/denko/pulse_io/pwm_output.rb +56 -31
  101. data/lib/denko/pulse_io.rb +17 -3
  102. data/lib/denko/rtc/ds3231.rb +4 -3
  103. data/lib/denko/rtc.rb +14 -1
  104. data/lib/denko/sensor/aht.rb +16 -20
  105. data/lib/denko/sensor/bme280.rb +23 -36
  106. data/lib/denko/sensor/bmp180.rb +8 -13
  107. data/lib/denko/sensor/dht.rb +17 -7
  108. data/lib/denko/sensor/ds18b20.rb +5 -4
  109. data/lib/denko/sensor/hdc1080.rb +174 -0
  110. data/lib/denko/sensor/htu21d.rb +17 -6
  111. data/lib/denko/sensor/htu31d.rb +6 -5
  112. data/lib/denko/sensor/jsnsr04t.rb +49 -0
  113. data/lib/denko/sensor/qmp6988.rb +14 -30
  114. data/lib/denko/sensor/rcwl9620.rb +1 -0
  115. data/lib/denko/sensor/sht3x.rb +6 -5
  116. data/lib/denko/sensor/sht4x.rb +125 -0
  117. data/lib/denko/sensor/vl53l0x.rb +58 -0
  118. data/lib/denko/sensor.rb +33 -15
  119. data/lib/denko/spi/base_register.rb +11 -7
  120. data/lib/denko/spi/bus_common.rb +12 -15
  121. data/lib/denko/spi/input_register.rb +6 -6
  122. data/lib/denko/spi/output_register.rb +13 -4
  123. data/lib/denko/spi/peripheral.rb +82 -84
  124. data/lib/denko/spi.rb +20 -10
  125. data/lib/denko/uart/bit_bang.rb +2 -27
  126. data/lib/denko/uart/common.rb +33 -0
  127. data/lib/denko/uart/hardware.rb +1 -26
  128. data/lib/denko/uart.rb +16 -2
  129. data/lib/denko/version.rb +1 -1
  130. data/lib/denko.rb +22 -25
  131. data/lib/denko_cli/targets.rb +7 -7
  132. data/lib/denko_cli/targets.txt +19 -20
  133. data/src/lib/Denko.cpp +26 -13
  134. data/src/lib/Denko.h +4 -4
  135. data/src/lib/DenkoDefines.h +7 -26
  136. data/src/lib/DenkoLEDArray.cpp +1 -8
  137. data/src/lib/DenkoSPI.cpp +31 -29
  138. data/src/lib/DenkoSPIBB.cpp +12 -14
  139. data/test/analog_io/input_test.rb +1 -1
  140. data/test/analog_io/potentiometer_test.rb +2 -2
  141. data/test/behaviors/bus_peripheral_test.rb +4 -4
  142. data/test/behaviors/callbacks_test.rb +20 -10
  143. data/test/behaviors/component_test.rb +18 -8
  144. data/test/board/board_test.rb +9 -9
  145. data/test/board/one_wire_test.rb +25 -14
  146. data/test/board/spi_test.rb +31 -15
  147. data/test/digital_io/input_test.rb +2 -2
  148. data/test/display/canvas_test.rb +306 -0
  149. data/test/display/hd44780_test.rb +34 -7
  150. data/test/eeprom/board_test.rb +45 -0
  151. data/test/helpers/mruby_minitest.rb +95 -0
  152. data/test/helpers/mruby_runner.rb +13 -0
  153. data/test/i2c/bus_test.rb +93 -30
  154. data/test/i2c/peripheral_test.rb +2 -2
  155. data/test/led/apa102_test.rb +24 -0
  156. data/test/led/rgb_test.rb +4 -4
  157. data/test/motor/{stepper_test.rb → a3967_test.rb} +2 -2
  158. data/test/one_wire/bus_enumerator_test.rb +1 -1
  159. data/test/one_wire/bus_test.rb +42 -35
  160. data/test/one_wire/peripheral_test.rb +5 -17
  161. data/test/pulse_io/ir_output_test.rb +5 -0
  162. data/test/pulse_io/pwm_output_test.rb +10 -10
  163. data/test/rtc/ds3231_test.rb +3 -2
  164. data/test/sensor/dht_test.rb +11 -11
  165. data/test/spi/bitbang_test.rb +27 -0
  166. data/test/spi/bus_test.rb +19 -29
  167. data/test/spi/input_register_test.rb +2 -2
  168. data/test/spi/{peripheral_multi_pin_test.rb → peripheral_test.rb} +25 -5
  169. data/test/test_helper.rb +44 -124
  170. data/vendor/board-maps/BoardMap.h +264 -0
  171. data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
  172. data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
  173. data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
  174. data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
  175. data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
  176. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +0 -1
  177. data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
  178. data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
  179. data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
  180. data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
  181. data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
  182. data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
  183. data/vendor/board-maps/yaml/ESP32C6_DEV.yml +3 -4
  184. data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +0 -1
  185. data/vendor/board-maps/yaml/ESP32H2_DEV.yml +0 -1
  186. data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +0 -1
  187. data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
  188. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -1
  189. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO.yml +0 -1
  190. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +0 -1
  191. data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
  192. data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
  193. data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
  194. data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +0 -1
  195. data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
  196. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
  197. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
  198. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
  199. data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
  200. data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
  201. data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
  202. data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
  203. data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
  204. data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
  205. data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
  206. data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
  207. data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +1 -2
  208. data/vendor/board-maps/yaml/LoPy.yml +0 -1
  209. data/vendor/board-maps/yaml/LoPy4.yml +0 -1
  210. data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
  211. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -1
  212. data/vendor/board-maps/yaml/OMGS3.yml +25 -0
  213. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
  214. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
  215. data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
  216. data/vendor/board-maps/yaml/PYCOM_GPY.yml +0 -1
  217. data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +1 -1
  218. data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
  219. data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
  220. data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
  221. data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
  222. data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
  223. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +0 -1
  224. data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
  225. data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
  226. data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
  227. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
  228. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
  229. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
  230. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
  231. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
  232. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
  233. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
  234. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
  235. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
  236. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
  237. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
  238. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
  239. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
  240. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
  241. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
  242. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
  243. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
  244. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
  245. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
  246. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
  247. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
  248. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
  249. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
  250. data/vendor/board-maps/yaml/WIPY3.yml +0 -1
  251. data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
  252. data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
  253. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
  254. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
  255. data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
  256. data/vendor/board-maps/yaml/mercury.yml +20 -0
  257. metadata +116 -101
  258. data/.vscode/settings.json +0 -5
  259. data/.vscode/tasks.json +0 -20
  260. data/HARDWARE.md +0 -263
  261. data/benchmarks/analog_listen.rb +0 -49
  262. data/benchmarks/digital_write.rb +0 -28
  263. data/benchmarks/i2c_ssd1306_refresh.rb +0 -91
  264. data/examples/advanced/m5_env3.rb +0 -46
  265. data/examples/advanced/rotary_encoder_mac_volume.rb +0 -53
  266. data/examples/advanced/ssd1306_time_temp_rh.rb +0 -43
  267. data/examples/analog_io/ads1100.rb +0 -48
  268. data/examples/analog_io/ads1115.rb +0 -57
  269. data/examples/analog_io/ads1118.rb +0 -65
  270. data/examples/analog_io/dac_loopback.rb +0 -34
  271. data/examples/analog_io/input.rb +0 -56
  272. data/examples/analog_io/input_smoothing.rb +0 -27
  273. data/examples/analog_io/potentiometer.rb +0 -31
  274. data/examples/connection/binary_echo.rb +0 -34
  275. data/examples/connection/tcp.rb +0 -19
  276. data/examples/digital_io/button.rb +0 -17
  277. data/examples/digital_io/relay.rb +0 -17
  278. data/examples/digital_io/rotary_encoder.rb +0 -36
  279. data/examples/display/hd44780.png +0 -0
  280. data/examples/display/hd44780.rb +0 -47
  281. data/examples/display/ssd1306.rb +0 -43
  282. data/examples/display/ssd1306_s2_pico.rb +0 -29
  283. data/examples/eeprom/built_in.rb +0 -32
  284. data/examples/i2c/search.rb +0 -39
  285. data/examples/led/apa102_bounce.rb +0 -32
  286. data/examples/led/apa102_fade.rb +0 -44
  287. data/examples/led/builtin_blink.rb +0 -14
  288. data/examples/led/builtin_fade.rb +0 -19
  289. data/examples/led/rgb_led.rb +0 -31
  290. data/examples/led/seven_segment_char_echo.rb +0 -17
  291. data/examples/led/ws2812_bounce.rb +0 -30
  292. data/examples/led/ws2812_builtin_blink.rb +0 -22
  293. data/examples/led/ws2812_fade.rb +0 -43
  294. data/examples/motor/l298.rb +0 -45
  295. data/examples/motor/servo.rb +0 -17
  296. data/examples/motor/stepper.png +0 -0
  297. data/examples/motor/stepper.rb +0 -43
  298. data/examples/one_wire/search.rb +0 -32
  299. data/examples/pulse_io/buzzer.rb +0 -35
  300. data/examples/pulse_io/ir_output.rb +0 -51
  301. data/examples/pulse_io/pwm_output.rb +0 -30
  302. data/examples/rtc/ds3231.rb +0 -31
  303. data/examples/sensor/aht10.rb +0 -17
  304. data/examples/sensor/aht20.rb +0 -17
  305. data/examples/sensor/bme280.rb +0 -38
  306. data/examples/sensor/bmp180.rb +0 -26
  307. data/examples/sensor/dht.rb +0 -29
  308. data/examples/sensor/ds18b20.rb +0 -57
  309. data/examples/sensor/generic_pir.rb +0 -27
  310. data/examples/sensor/hcsr04.rb +0 -17
  311. data/examples/sensor/htu21d.rb +0 -43
  312. data/examples/sensor/htu31d.rb +0 -33
  313. data/examples/sensor/neat_tph_readings.rb +0 -32
  314. data/examples/sensor/qmp6988.rb +0 -51
  315. data/examples/sensor/rcwl9620.rb +0 -15
  316. data/examples/sensor/sht3x.rb +0 -32
  317. data/examples/spi/bitbang_loopback.rb +0 -46
  318. data/examples/spi/input_register.rb +0 -40
  319. data/examples/spi/output_register.rb +0 -41
  320. data/examples/spi/ssd_through_registers.rb +0 -28
  321. data/examples/spi/two_registers.rb +0 -40
  322. data/examples/uart/bit_bang_demo.rb +0 -25
  323. data/examples/uart/board_passthrough.rb +0 -40
  324. data/examples/uart/hardware_loopback.rb +0 -16
  325. data/lib/denko/eeprom/built_in.rb +0 -72
  326. data/lib/denko/fonts.rb +0 -106
  327. data/test/eeprom/built_in_test.rb +0 -61
  328. data/test/spi/peripheral_single_pin_test.rb +0 -48
  329. data/tutorial/01-led/led.fzz +0 -0
  330. data/tutorial/01-led/led.pdf +0 -0
  331. data/tutorial/01-led/led.rb +0 -73
  332. data/tutorial/02-button/button.fzz +0 -0
  333. data/tutorial/02-button/button.pdf +0 -0
  334. data/tutorial/02-button/button.rb +0 -65
  335. data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
  336. data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
  337. data/tutorial/03-potentiometer/potentiometer.rb +0 -66
  338. data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
  339. data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
  340. data/tutorial/04-pwm_led/pwm_led.rb +0 -64
  341. data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
  342. data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
  343. data/tutorial/05-rgb_led/rgb_led.rb +0 -58
  344. data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
@@ -32,7 +32,7 @@ module Denko
32
32
  end
33
33
 
34
34
  def state
35
- state_mutex.synchronize { @state ||= { temperature: nil, humidity: nil } }
35
+ @state ||= { temperature: nil, humidity: nil }
36
36
  end
37
37
 
38
38
  def reading
@@ -72,10 +72,11 @@ module Denko
72
72
  end
73
73
 
74
74
  def update_state(reading)
75
- state_mutex.synchronize do
76
- @state[:temperature] = reading[:temperature]
77
- @state[:humidity] = reading[:humidity]
78
- end
75
+ @state_mutex.lock
76
+ @state[:temperature] = reading[:temperature]
77
+ @state[:humidity] = reading[:humidity]
78
+ @state_mutex.unlock
79
+ @state
79
80
  end
80
81
 
81
82
  def reset
@@ -0,0 +1,125 @@
1
+ module Denko
2
+ module Sensor
3
+ class SHT4X
4
+ include I2C::Peripheral
5
+ include Behaviors::Poller
6
+ include Behaviors::Lifecycle
7
+ include TemperatureHelper
8
+ include HumidityHelper
9
+
10
+ I2C_ADDRESS = 0x44
11
+
12
+ RESET = 0x94
13
+ RESET_TIME = 0.001
14
+ READ_SERIAL_NUMBER = 0x89
15
+
16
+ REPEATABILITIES = {
17
+ high: {command: 0xFD, time: 0.010},
18
+ medium: {command: 0xF6, time: 0.005},
19
+ low: {command: 0xE0, time: 0.003},
20
+ }
21
+
22
+ after_initialize do
23
+ reset
24
+ self.repeatability = :high
25
+ end
26
+
27
+ def state
28
+ @state ||= { temperature: nil, humidity: nil }
29
+ end
30
+
31
+ def reading
32
+ @reading ||= { temperature: nil, humidity: nil }
33
+ end
34
+
35
+ def repeatability=(key)
36
+ raise ArgumentError, "invalid repeatability setting: #{key}" unless REPEATABILITIES.keys.include? key
37
+ @measurement_command = REPEATABILITIES[key][:command]
38
+ @measurement_time = REPEATABILITIES[key][:time]
39
+ end
40
+
41
+ def _read
42
+ i2c_write [@measurement_command]
43
+ sleep(@measurement_time)
44
+ i2c_read(6)
45
+ end
46
+
47
+ def pre_callback_filter(bytes)
48
+ # Temperature is bytes 0 to 2: MSB, LSB, CRC
49
+ if calculate_crc(bytes[0..2]) == bytes[2]
50
+ t_raw = (bytes[0] << 8) | bytes[1]
51
+ reading[:temperature] = (175 * t_raw / 65535.0) - 45
52
+ else
53
+ reading[:temperature] = nil
54
+ end
55
+
56
+ # Humidity is bytes 3 to 5: MSB, LSB, CRC
57
+ if calculate_crc(bytes[3..5]) == bytes[5]
58
+ h_raw = (bytes[3] << 8) | bytes[4]
59
+ reading[:humidity] = 100 * h_raw / 65535.0
60
+ else
61
+ reading[:humidity] = nil
62
+ end
63
+
64
+ reading
65
+ end
66
+
67
+ def update_state(reading)
68
+ @state_mutex.lock
69
+ @state[:temperature] = reading[:temperature]
70
+ @state[:humidity] = reading[:humidity]
71
+ @state_mutex.unlock
72
+ @state
73
+ end
74
+
75
+ def reset
76
+ i2c_write [RESET]
77
+ sleep RESET_TIME
78
+ end
79
+
80
+ def serial
81
+ @serial ||= read_serial
82
+ end
83
+
84
+ def read_serial
85
+ i2c_write [READ_SERIAL_NUMBER]
86
+ sleep RESET_TIME
87
+ bytes = i2c_read_raw(6)
88
+ parse_serial(bytes)
89
+ end
90
+
91
+ def parse_serial(bytes)
92
+ # Serial bytes are laid out as [b0, b1, crc0+1, b2, b3, crc2+3]
93
+ if calculate_crc(bytes[0..2]) == bytes[2] && calculate_crc(bytes[3..5]) == bytes[5]
94
+ @serial = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[3] << 8) | bytes[4]
95
+ else
96
+ @serial = nil
97
+ end
98
+ end
99
+
100
+ # CRC is same as AHT20 sensor. Copied from that file.
101
+ CRC_INITIAL_VALUE = 0xFF
102
+ CRC_POLYNOMIAL = 0x31
103
+ MSBIT_MASK = 0x80
104
+
105
+ def calculate_crc(bytes)
106
+ crc = CRC_INITIAL_VALUE
107
+
108
+ # Ignore last byte. That's the CRC value to compare with.
109
+ bytes.take(bytes.length - 1).each do |byte|
110
+ crc = crc ^ byte
111
+ 8.times do
112
+ if (crc & MSBIT_MASK) > 0
113
+ crc = (crc << 1) ^ CRC_POLYNOMIAL
114
+ else
115
+ crc = crc << 1
116
+ end
117
+ end
118
+ end
119
+
120
+ # Limit CRC size to 8 bits.
121
+ crc = crc & 0xFF
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,58 @@
1
+ module Denko
2
+ module Sensor
3
+ class VL53L0X
4
+ include I2C::Peripheral
5
+ include Behaviors::Poller
6
+ include Behaviors::Lifecycle
7
+ include Denko::AnalogIO::InputHelper
8
+
9
+ I2C_ADDRESS = 0x29
10
+
11
+ REFERENCE_REGISTER_START = 0xC0
12
+ REFERENCE_VALUES = [0xEE, 0xAA, 0x10]
13
+
14
+ SYSRANGE_START = 0x00
15
+ POWER_MANAGEMENT_GO1_POWER_FORCE = 0x80
16
+ INTERNAL_TUNING_1 = 0x91
17
+ INTERNAL_TUNING_2 = 0xFF
18
+ RESULT_RANGE_STATUS = 0x14
19
+
20
+ attr_reader :stop_variable
21
+ attr_accessor :correction_offset
22
+
23
+ after_initialize do
24
+ # Verify reference registerrs
25
+ reference_regs = i2c_read_raw(REFERENCE_VALUES.length, register: REFERENCE_REGISTER_START)
26
+ raise "reference registers do not match. May not be VL53L0X" unless reference_regs == REFERENCE_VALUES
27
+
28
+ # Initialization sequence
29
+ @stop_variable = i2c_read_raw(1, register: INTERNAL_TUNING_1)[0]
30
+ i2c_write [POWER_MANAGEMENT_GO1_POWER_FORCE, 0x01]
31
+ i2c_write [INTERNAL_TUNING_2, 0x01]
32
+ i2c_write [SYSRANGE_START, 0x00]
33
+ i2c_write [INTERNAL_TUNING_1, stop_variable]
34
+ i2c_write [SYSRANGE_START, 0x01]
35
+ i2c_write [INTERNAL_TUNING_2, 0x00]
36
+ i2c_write [POWER_MANAGEMENT_GO1_POWER_FORCE, 0x00]
37
+
38
+ # Wait for initialization to complete.
39
+ sleep 0.010 while (i2c_read_raw(1, register: SYSRANGE_START)[0] & 0b01 > 0)
40
+
41
+ # Go into continuous mode.
42
+ i2c_write [SYSRANGE_START, 0x02]
43
+ end
44
+
45
+ def _read
46
+ i2c_read(2, register: RESULT_RANGE_STATUS + 10)
47
+ end
48
+
49
+ def pre_callback_filter(bytes)
50
+ # Distance is 2 bytes, big-endian.
51
+ mm = (bytes[0] << 8) | bytes[1]
52
+ mm = mm + correction_offset if correction_offset
53
+ # super handles smoothing if enabled.
54
+ return (mm > 0) ? super(mm) : nil
55
+ end
56
+ end
57
+ end
58
+ end
data/lib/denko/sensor.rb CHANGED
@@ -1,19 +1,37 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ SENSOR_FILES = [
4
+ [nil, "helper"],
5
+ [:DHT, "dht"],
6
+ [:DS18B20, "ds18b20"],
7
+ [:BMP180, "bmp180"],
8
+ [:BME280, "bme280"],
9
+ [:BMP280, "bme280"],
10
+ [:HDC1080, "hdc1080"],
11
+ [:HTU21D, "htu21d"],
12
+ [:HTU31D, "htu31d"],
13
+ [:AHT1X, "aht"],
14
+ [:AHT2X, "aht"],
15
+ [:AHT3X, "aht"],
16
+ [:SHT3X, "sht3x"],
17
+ [:SHT4X, "sht4x"],
18
+ [:QMP6988, "qmp6988"],
19
+ [:RCWL9620, "rcwl9620"],
20
+ [:HCSR04, "hcsr04"],
21
+ [:JSNSR04T, "jsnsr04t"],
22
+ [:GenericPIR, "generic_pir"],
23
+ [:VL53L0X, "vl53l0x"],
24
+ ]
25
+
1
26
  module Denko
2
27
  module Sensor
3
- require "#{__dir__}/sensor/helper"
4
- autoload :DHT, "#{__dir__}/sensor/dht"
5
- autoload :DS18B20, "#{__dir__}/sensor/ds18b20"
6
- autoload :BMP180, "#{__dir__}/sensor/bmp180"
7
- autoload :BME280, "#{__dir__}/sensor/bme280"
8
- autoload :BMP280, "#{__dir__}/sensor/bme280"
9
- autoload :HTU21D, "#{__dir__}/sensor/htu21d"
10
- autoload :HTU31D, "#{__dir__}/sensor/htu31d"
11
- autoload :AHT10, "#{__dir__}/sensor/aht"
12
- autoload :AHT20, "#{__dir__}/sensor/aht"
13
- autoload :SHT3X, "#{__dir__}/sensor/sht3x"
14
- autoload :QMP6988, "#{__dir__}/sensor/qmp6988"
15
- autoload :RCWL9620, "#{__dir__}/sensor/rcwl9620"
16
- autoload :HCSR04, "#{__dir__}/sensor/hcsr04"
17
- autoload :GenericPIR, "#{__dir__}/sensor/generic_pir"
28
+ SENSOR_FILES.each do |file|
29
+ file_path = "#{__dir__}/sensor/#{file[1]}"
30
+ if file[0]
31
+ autoload file[0], file_path
32
+ else
33
+ require file_path
34
+ end
35
+ end
18
36
  end
19
37
  end
@@ -1,7 +1,7 @@
1
1
  module Denko
2
2
  module SPI
3
3
  class BaseRegister
4
- include SPI::Peripheral::SinglePin
4
+ include SPI::Peripheral
5
5
  include Behaviors::Lifecycle
6
6
  #
7
7
  # Registers can be a BoardProxy for components needing digital pins.
@@ -9,17 +9,21 @@ module Denko
9
9
  #
10
10
  include Behaviors::BoardProxy
11
11
 
12
+ def platform
13
+ :spi_register
14
+ end
15
+
16
+ def is_a_register?
17
+ true
18
+ end
19
+
12
20
  # Default registers to 1 byte, or 8 pins when used as Board Proxy.
13
21
  # Can be ignored if reading / writing the register directly.
14
22
  def bytes
15
- @bytes ||= 1
23
+ @bytes = params[:bytes] || 1
16
24
  end
17
25
  attr_writer :bytes
18
26
 
19
- before_initialize do
20
- self.bytes = params[:bytes] if params[:bytes]
21
- end
22
-
23
27
  # Select pin is active-low. Disable.
24
28
  after_initialize do
25
29
  self.high
@@ -30,7 +34,7 @@ module Denko
30
34
  # pin as a 0 or 1 in an array that is (@bytes * 8) long.
31
35
  #
32
36
  def state
33
- state_mutex.synchronize { @state ||= Array.new(bytes*8) { 0 } }
37
+ @state ||= Array.new(bytes*8) { 0 }
34
38
  end
35
39
  end
36
40
  end
@@ -3,34 +3,31 @@ module Denko
3
3
  module BusCommon
4
4
  include Behaviors::BusController
5
5
  include Behaviors::Reader
6
- extend Forwardable
7
6
 
8
7
  # Add peripheral to self and the board. It gets callbacks directly from the board.
9
8
  def add_component(component)
10
- # Ignore components with no select pin. Mostly for APA102.
11
- return unless component.pin
12
-
13
- pins = components.map { |c| c.pin }
14
- if pins.include? component.pin
15
- raise ArgumentError, "duplicate select pin for #{component}"
16
- end
17
-
9
+ # Don't check for select pin uniqueness. Board handles that.
18
10
  components << component
19
- board.add_component(component)
20
11
  end
21
12
 
22
13
  # Remove peripheral from self and the board.
23
14
  def remove_component(component)
24
15
  components.delete(component)
25
- board.remove_component(component)
26
16
  end
27
17
 
28
- # Forward pin control methods to the board, for select pin setup.
29
- def_delegator :board, :convert_pin
30
- def_delegator :board, :set_pin_mode
18
+ # Pass through to the real board for converting select/other pins.
19
+ def convert_pin(*args, **kwargs)
20
+ board.convert_pin(*args, **kwargs)
21
+ end
22
+
23
+ def set_pin_mode(*args, **kwargs)
24
+ board.set_pin_mode(*args, **kwargs)
25
+ end
31
26
 
32
27
  # If a component calls #stop, that's just a call to Board#spi_stop giving its select pin.
33
- def_delegator :board, :spi_stop, :stop
28
+ def stop(*args, **kwargs)
29
+ board.spi_stop(*args, **kwargs)
30
+ end
34
31
  end
35
32
  end
36
33
  end
@@ -84,10 +84,8 @@ module Denko
84
84
 
85
85
  bits = byte_array_to_bit_array(byte_array)
86
86
 
87
- callback_mutex.synchronize {
88
- break unless @callbacks
89
- break if @callbacks.empty?
90
-
87
+ @callback_mutex.lock
88
+ if @callbacks && !@callbacks.empty?
91
89
  # Arduino doesn't de-duplicate state. Do it, but honor :force_update callbacks.
92
90
  if (bits != state) || @callbacks[:force_update]
93
91
  @callbacks.each_value do |array|
@@ -98,7 +96,9 @@ module Denko
98
96
  # Remove both :read and :force update while inside the lock.
99
97
  @callbacks.delete(:read)
100
98
  @callbacks.delete(:force_update)
101
- }
99
+ end
100
+ @callback_mutex.unlock
101
+
102
102
  self.state = bits
103
103
  end
104
104
 
@@ -107,7 +107,7 @@ module Denko
107
107
  if listening_pins[pin] && (value != state[pin])
108
108
  part.update(value)
109
109
  # Also update if the component forced a read.
110
- # Always called inside callback_mutex, so @callbacks, not callbacks
110
+ # Always called inside @callback_mutex, so @callbacks, not callbacks
111
111
  elsif reading_pins[pin] && @callbacks[:force_update]
112
112
  part.update(value)
113
113
  end
@@ -14,8 +14,8 @@ module Denko
14
14
  #
15
15
  def write
16
16
  bytes = []
17
- state_mutex.synchronize do
18
- return if @previous_state == @state
17
+ @state_mutex.lock
18
+ if @state != @previous_state
19
19
  @state.each_slice(8) do |slice|
20
20
  # Convert nils in the slice to zero.
21
21
  zeroed = slice.map { |bit| bit.to_i }
@@ -27,9 +27,11 @@ module Denko
27
27
  # Pack bytes in reverse order.
28
28
  bytes.unshift byte
29
29
  end
30
+ spi_write(bytes)
30
31
  @previous_state = @state.dup
31
32
  end
32
- spi_write(bytes)
33
+ @state_mutex.unlock
34
+ @state
33
35
  end
34
36
 
35
37
  #
@@ -41,12 +43,19 @@ module Denko
41
43
  end
42
44
 
43
45
  def bit_set(pin, value)
44
- state_mutex.synchronize { @state[pin] = value }
46
+ @state_mutex.lock
47
+ @state[pin] = value
48
+ @state_mutex.unlock
49
+ value
45
50
  end
46
51
 
47
52
  def digital_read(pin)
48
53
  state[pin]
49
54
  end
55
+
56
+ def pin_is_pwm?(pin)
57
+ false
58
+ end
50
59
  end
51
60
  end
52
61
  end
@@ -1,111 +1,109 @@
1
1
  module Denko
2
2
  module SPI
3
- module Peripheral
4
- module Core
5
- include Behaviors::BusPeripheral
6
- include Behaviors::Callbacks
7
-
8
- def spi_frequency
9
- @spi_frequency ||= params[:spi_frequency] || 1_000_000
10
- end
11
-
12
- def spi_mode
13
- @spi_mode ||= params[:spi_mode] || 0
14
- end
15
-
16
- def spi_bit_order
17
- @spi_bit_order ||= params[:spi_bit_order] || :msbfirst
3
+ class ChipSelect
4
+ include Behaviors::SinglePin
5
+ include Behaviors::Callbacks
6
+ include Behaviors::Lifecycle
7
+
8
+ before_initialize do
9
+ # It actually functions as an output.
10
+ params[:mode] = :output
11
+
12
+ # But we can't claim it on Linux (the SPI hardware handles it), so don't.
13
+ if !Denko.mruby? && Object.const_defined?("Denko::PiBoard")
14
+ board = params[:board]
15
+ if board.class.ancestors.include?(Denko::PiBoard)
16
+ params[:mode] = nil
17
+ end
18
18
  end
19
+ end
20
+ end
19
21
 
20
- attr_writer :spi_frequency, :spi_mode, :spi_bit_order
21
-
22
- #
23
- # Delegate methods to the bus.
24
- #
25
- def spi_transfer(write: [], read: 0)
26
- bus.transfer(select_pin, write: write, read: read, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
27
- end
22
+ module Peripheral
23
+ include Behaviors::MultiPin
24
+ include Behaviors::BusPeripheral
25
+ include Behaviors::Callbacks
26
+ include Behaviors::Lifecycle
27
+
28
+ # We have the SPI bus set as our board, but the select pin,
29
+ # and any other pins, need to attach to the underlying board.
30
+ def proxy_pin(*args, **kwargs)
31
+ kwargs[:board] = bus.board
32
+ super(*args, **kwargs)
33
+ end
28
34
 
29
- def spi_write(byte_array)
30
- bus.transfer(select_pin, write: byte_array, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
35
+ # If given just one value in pin:, treat that as the select pin.
36
+ before_initialize do
37
+ if (params[:pin].class != Hash) && (!params[:pins])
38
+ params[:pins] = { select: params[:pin] }
39
+ params[:pin] = nil
31
40
  end
41
+ end
32
42
 
33
- def spi_read(num_bytes)
34
- bus.transfer(select_pin, read: num_bytes, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
35
- end
43
+ # Chip select pin is always treated as a subcomponent
44
+ def initialize_pins(params={})
45
+ super(params)
46
+ proxy_pin :select, ChipSelect, mode: :output
47
+ end
36
48
 
37
- def spi_listen(num_bytes)
38
- bus.listen(select_pin, read: num_bytes, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
39
- end
49
+ # SelectPin is a separate component that receives updates from Board.
50
+ # Forward them to the Peripheral
51
+ after_initialize do
52
+ select.add_callback(:peripheral_forwarder) { |data| self.update(data) }
53
+ end
40
54
 
41
- def spi_stop
42
- bus.stop(select_pin)
55
+ def ensure_byte_array(message)
56
+ if message.class == Array
57
+ # Byte array coming from PiBoard.
58
+ return message
59
+ else
60
+ # Split up comma delimited bytes coming from a microcontroller.
61
+ return message.split(",").map { |b| b.to_i }
43
62
  end
63
+ end
44
64
 
45
- def ensure_byte_array(message)
46
- if message.class == Array
47
- # Byte array coming from PiBoard.
48
- return message
49
- else
50
- # Split up comma delimited bytes coming from a microcontroller.
51
- return message.split(",").map { |b| b.to_i }
52
- end
53
- end
65
+ def update(message)
66
+ super(ensure_byte_array(message))
67
+ end
54
68
 
55
- def update(message)
56
- super(ensure_byte_array(message))
57
- end
69
+ #
70
+ # SPI Properties
71
+ #
72
+ def spi_frequency
73
+ @spi_frequency ||= params[:spi_frequency] || 1_000_000
58
74
  end
59
75
 
60
- module ChipSelectBehavior
61
- include Behaviors::SinglePin
62
- include Behaviors::Callbacks
63
- include Behaviors::Lifecycle
64
-
65
- before_initialize do
66
- # It actually functions as an output.
67
- params[:mode] = :output
68
-
69
- # But we can't claim it on Linux (the SPI hardware handles it), so don't.
70
- if Object.const_defined?("Denko::PiBoard")
71
- bus = params[:bus] || params[:board]
72
- if bus.board.class.ancestors.include?(Denko::PiBoard)
73
- params[:mode] = nil
74
- end
75
- end
76
- end
76
+ def spi_mode
77
+ @spi_mode ||= params[:spi_mode] || 0
77
78
  end
78
79
 
79
- class ChipSelect
80
- include ChipSelectBehavior
80
+ def spi_bit_order
81
+ @spi_bit_order ||= params[:spi_bit_order] || :msbfirst
81
82
  end
82
83
 
83
- module SinglePin
84
- include Core
85
- include ChipSelectBehavior
84
+ attr_writer :spi_frequency, :spi_mode, :spi_bit_order
86
85
 
87
- def select_pin
88
- pin
89
- end
86
+ #
87
+ # Delegate methods to the bus.
88
+ #
89
+ def spi_transfer(write: [], read: 0)
90
+ bus.transfer(select.pin, write: write, read: read, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
90
91
  end
91
92
 
92
- module MultiPin
93
- include Core
94
- include Behaviors::MultiPin
95
- include Behaviors::Lifecycle
93
+ def spi_write(byte_array)
94
+ bus.transfer(select.pin, write: byte_array, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
95
+ end
96
96
 
97
- def select_pin
98
- self.select.pin
99
- end
97
+ def spi_read(num_bytes)
98
+ bus.transfer(select.pin, read: num_bytes, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
99
+ end
100
100
 
101
- def initialize_pins(params={})
102
- super(params)
103
- proxy_pin :select, ChipSelect, { board: bus.board, mode: :output }
104
- end
101
+ def spi_listen(num_bytes)
102
+ bus.listen(select.pin, read: num_bytes, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
103
+ end
105
104
 
106
- after_initialize do
107
- select.add_callback(:peripheral_forwarder) { |data| self.update(data) }
108
- end
105
+ def spi_stop
106
+ bus.stop(select.pin)
109
107
  end
110
108
  end
111
109
  end
data/lib/denko/spi.rb CHANGED
@@ -1,15 +1,25 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ SPI_FILES = [
4
+ [:BusCommon, "bus_common"],
5
+ [:Bus, "bus"],
6
+ [:BitBang, "bit_bang"],
7
+ [:ChipSelect, "peripheral"],
8
+ [:Peripheral, "peripheral"],
9
+ [:BaseRegister, "base_register"],
10
+ [:InputRegister, "input_register"],
11
+ [:OutputRegister, "output_register"],
12
+ ]
13
+
1
14
  module Denko
2
15
  module SPI
3
- autoload :BusCommon, "#{__dir__}/spi/bus_common"
4
- autoload :Bus, "#{__dir__}/spi/bus"
5
- autoload :BitBang, "#{__dir__}/spi/bit_bang"
6
- module Peripheral
7
- autoload :Core, "#{__dir__}/spi/peripheral"
8
- autoload :SinglePin, "#{__dir__}/spi/peripheral"
9
- autoload :MultiPin, "#{__dir__}/spi/peripheral"
16
+ SPI_FILES.each do |file|
17
+ file_path = "#{__dir__}/spi/#{file[1]}"
18
+ if file[0]
19
+ autoload file[0], file_path
20
+ else
21
+ require file_path
22
+ end
10
23
  end
11
- autoload :BaseRegister, "#{__dir__}/spi/base_register"
12
- autoload :InputRegister, "#{__dir__}/spi/input_register"
13
- autoload :OutputRegister, "#{__dir__}/spi/output_register"
14
24
  end
15
25
  end