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
@@ -22,8 +22,8 @@
22
22
  // auxMsg[6] = ** unused **
23
23
  // auxMsg[7+] = data (bytes) (write only) - Start from 7 for parity with hardware SPI.
24
24
  //
25
- void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
26
- uint8_t rLength, uint8_t wLength, byte *data) {
25
+ void Denko::spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
26
+ uint16_t rLength, uint16_t wLength, byte *data) {
27
27
 
28
28
  // Mode is the lowest 2 bits of settings.
29
29
  uint8_t mode = settings & 0b00000011;
@@ -53,7 +53,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
53
53
  digitalWrite(select, LOW);
54
54
  }
55
55
 
56
- for (byte i = 0; (i < rLength || i < wLength); i++) {
56
+ for (uint16_t i=0; (i < rLength || i < wLength); i++) {
57
57
  byte b;
58
58
 
59
59
  if (i < wLength) {
@@ -68,7 +68,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
68
68
  stream->print((i+1 == rLength) ? '\n' : ',');
69
69
  }
70
70
  }
71
-
71
+
72
72
  // Leave select high.
73
73
  if (bitRead(settings, 6) == 1) digitalWrite(select, HIGH);
74
74
  }
@@ -79,7 +79,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
79
79
  byte Denko::spiBBtransferByte(uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t mode, uint8_t bitOrder, byte data) {
80
80
  // Byte to return
81
81
  byte b = 0x00;
82
-
82
+
83
83
  // Track which of the 8 bits we're on.
84
84
  uint8_t bitPos;
85
85
 
@@ -129,13 +129,11 @@ void Denko::spiBBaddListener() {
129
129
  for (int i = 0; i < SPI_LISTENER_COUNT; i++) {
130
130
  // Overwrite the first disabled listener in the struct array.
131
131
  if (spiListeners[i].enabled == 0) {
132
- spiListeners[i] = {
133
- ((uint32_t)(auxMsg[4] << 8) | auxMsg[3]), // Clock: [0..7], input: [8..15]
134
- pin, // Select pin
135
- auxMsg[0], // Settings mask
136
- auxMsg[1], // Read length
137
- 2 // Enabled = 2 sets bit bang SPI listener
138
- };
132
+ spiListeners[i].freq = ((uint32_t)(auxMsg[4] << 8) | auxMsg[3]); // SCK: [0..7], MOSI: [8..15] in freq's uint32.
133
+ spiListeners[i].select = pin; // Select pin
134
+ spiListeners[i].settings = auxMsg[0]; // Settings mask
135
+ spiListeners[i].length = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1]; // Read length
136
+ spiListeners[i].enabled = 2; // 2 sets this listener as Bit-Bang
139
137
  return;
140
138
  } else {
141
139
  // Should send some kind of error if all are in use.
@@ -145,8 +143,8 @@ void Denko::spiBBaddListener() {
145
143
 
146
144
  // Called by spiUpdateListeners to read an individual bit bang SPI listener.
147
145
  void Denko::spiBBreadListener(uint8_t i) {
148
- spiBBtransfer((spiListeners[i].clock & 0xFF), // Clock pin is bits [0..7] of the uint32
149
- ((spiListeners[i].clock >> 8) & 0xFF), // Input pin is bits [8..15] of the uint32
146
+ spiBBtransfer ((spiListeners[i].freq & 0xFF), // SCK pin is bits [0..7] of freq's uint32
147
+ ((spiListeners[i].freq >> 8) & 0xFF), // MOSI pin is bits [8..15] of freq's uint32
150
148
  255, // Disabled output pin
151
149
  spiListeners[i].select, // Select pin
152
150
  spiListeners[i].settings,
@@ -12,7 +12,7 @@ class AnalogIOInputTest < Minitest::Test
12
12
  def test__read
13
13
  mock = Minitest::Mock.new.expect :call, nil, [14, nil, nil, nil]
14
14
  board.stub(:analog_read, mock) do
15
- part._read
15
+ part.read_nb
16
16
  end
17
17
  mock.verify
18
18
  end
@@ -15,19 +15,19 @@ class AnalogIOPotentiometerTest < Minitest::Test
15
15
  part
16
16
  end
17
17
 
18
- assert part.smoothing
19
18
  assert_equal 8, part.divider
20
19
  assert_equal [], part.smoothing_set
21
20
  end
22
21
 
23
22
  def test_smoothing_on
23
+ part.smoothing = true
24
24
  7.times do
25
25
  part.update(10)
26
26
  end
27
27
  part.update(50)
28
28
 
29
29
  # 120/8 = 15
30
- assert_equal part.state, 15
30
+ assert_equal 15, part.state
31
31
  end
32
32
 
33
33
  def test_smoothing_off
@@ -18,19 +18,19 @@ class BusPeripheralTest < Minitest::Test
18
18
  def bus
19
19
  @bus ||= NoAddressController.new(board: board)
20
20
  end
21
-
21
+
22
22
  def part
23
23
  @part ||= NoAddressPeripheral.new(bus: bus, address: 0x22)
24
24
  end
25
-
25
+
26
26
  def test_initialize
27
27
  assert_equal part.board, bus
28
28
  end
29
29
 
30
- def test_can_use_bus_atomically
30
+ def test_can_use_bus_atomically
31
31
  mock = Minitest::Mock.new
32
32
  1.times {mock.expect(:call, nil)}
33
-
33
+
34
34
  bus.mutex.stub(:synchronize, mock) do
35
35
  part.atomically { true; false; }
36
36
  end
@@ -29,23 +29,33 @@ class CallbacksTest < Minitest::Test
29
29
 
30
30
  def callback_mutex_is_correct_class
31
31
  if (RUBY_ENGINE == "ruby")
32
- assert_equal Denko::MutexStub, part.callback_mutex.class
32
+ assert_equal Denko::MutexStub, part.instance_variable_get(:@callback_mutex).class
33
33
  else
34
- assert_equal Mutex, part.callback_mutex.class
34
+ assert_equal Mutex, part.instance_variable_get(:@callback_mutex).class
35
35
  end
36
36
  end
37
37
 
38
38
  def test_callback_mutex
39
39
  callback = Proc.new{}
40
- mock = Minitest::Mock.new
41
- 3.times {mock.expect(:call, nil)}
42
-
43
- part.callback_mutex.stub(:synchronize, mock) do
44
- part.callbacks
45
- part.add_callback(:key, &callback)
46
- part.remove_callbacks(:key)
40
+ lock_mock = Minitest::Mock.new
41
+ 2.times {lock_mock.expect(:call, nil)}
42
+
43
+ unlock_mock = Minitest::Mock.new
44
+ 2.times {unlock_mock.expect(:call, nil)}
45
+
46
+ mutex = part.instance_variable_get(:@callback_mutex)
47
+ mutex.stub(:lock, lock_mock) do
48
+ mutex.stub(:unlock, unlock_mock) do
49
+ part.callbacks
50
+ assert_equal({}, part.callbacks)
51
+ part.add_callback(:key, &callback)
52
+ assert part.callbacks[:key]
53
+ part.remove_callbacks(:key)
54
+ assert_equal({}, part.callbacks)
55
+ end
47
56
  end
48
- mock.verify
57
+ lock_mock.verify
58
+ unlock_mock.verify
49
59
  end
50
60
 
51
61
  def test_add_callback
@@ -32,9 +32,9 @@ class ComponentTest < Minitest::Test
32
32
 
33
33
  def test_state_mutex_is_correct_class
34
34
  if (RUBY_ENGINE == "ruby")
35
- assert_equal Denko::MutexStub, part.state_mutex.class
35
+ assert_equal Denko::MutexStub, part.instance_variable_get(:@state_mutex).class
36
36
  else
37
- assert_equal Mutex, part.state_mutex.class
37
+ assert_equal Mutex, part.instance_variable_get(:@state_mutex).class
38
38
  end
39
39
  end
40
40
 
@@ -43,15 +43,25 @@ class ComponentTest < Minitest::Test
43
43
  assert_equal part.state, 10
44
44
  end
45
45
 
46
+ # ONLY for pass by value states. If state is Hash or Array, ignore mutex.
46
47
  def test_state_through_mutex
47
- mock = Minitest::Mock.new
48
- 2.times {mock.expect(:call, nil)}
48
+ lock_mock = Minitest::Mock.new
49
+ 2.times { lock_mock.expect(:call, nil) }
49
50
 
50
- part.state_mutex.stub(:synchronize, mock) do
51
- part.state
52
- part.send(:state=, nil)
51
+ unlock_mock = Minitest::Mock.new
52
+ 2.times { unlock_mock.expect(:call, nil) }
53
+
54
+ mutex = part.instance_variable_get(:@state_mutex)
55
+ mutex.stub(:lock, lock_mock) do
56
+ mutex.stub(:unlock, unlock_mock) do
57
+ part.state
58
+ part.send(:state=, 20)
59
+ end
53
60
  end
54
- mock.verify
61
+
62
+ lock_mock.verify
63
+ unlock_mock.verify
64
+ assert_equal 20, part.state
55
65
  end
56
66
 
57
67
  def test_micro_delay
@@ -31,7 +31,7 @@ class BoardTest < Minitest::Test
31
31
  end
32
32
 
33
33
  def test_set_aux_limit
34
- assert_equal 527, board.aux_limit
34
+ assert_equal 528, board.aux_limit
35
35
  end
36
36
 
37
37
  def test_set_eeprom_length
@@ -42,13 +42,13 @@ class BoardTest < Minitest::Test
42
42
  assert_equal 0, board.low
43
43
  assert_equal 1, board.high
44
44
  end
45
-
45
+
46
46
  def test_analog_resolution
47
47
  assert_equal 255, board.analog_write_high
48
48
  assert_equal 8, board.analog_write_resolution
49
49
  assert_equal 1023, board.analog_read_high
50
50
  assert_equal 10, board.analog_read_resolution
51
-
51
+
52
52
  mock = Minitest::Mock.new
53
53
  mock.expect(:call, nil, [Denko::Message.encode(command:96, value:12)])
54
54
  mock.expect(:call, nil, [Denko::Message.encode(command:97, value:12)])
@@ -57,17 +57,17 @@ class BoardTest < Minitest::Test
57
57
  board.analog_read_resolution = 12
58
58
  end
59
59
  mock.verify
60
-
60
+
61
61
  assert_equal 0, board.low
62
62
  assert_equal 12, board.analog_write_resolution
63
63
  assert_equal 4095, board.analog_write_high
64
64
  assert_equal 12, board.analog_read_resolution
65
65
  assert_equal 4095, board.analog_read_high
66
66
  end
67
-
67
+
68
68
  def test_eeprom
69
69
  mock = Minitest::Mock.new.expect(:call, "test eeprom", [], board: board)
70
- Denko::EEPROM::BuiltIn.stub(:new, mock) do
70
+ Denko::EEPROM::Board.stub(:new, mock) do
71
71
  board.eeprom
72
72
  end
73
73
  mock.verify
@@ -85,16 +85,16 @@ class BoardTest < Minitest::Test
85
85
  def test_update_passes_messages_to_correct_components
86
86
  mock1 = Minitest::Mock.new.expect(:update, nil, ["data"])
87
87
  3.times { mock1.expect(:pin, 1) }
88
-
88
+
89
89
  # Make sure lines are split only on the first colon.
90
90
  # Tests for string based pine names too.
91
91
  mock2 = Minitest::Mock.new.expect(:update, nil, ["with:colon"])
92
92
  3.times { mock2.expect(:pin, 14) }
93
-
93
+
94
94
  # Special EEPROM mock.
95
95
  mock3 = Minitest::Mock.new.expect(:update, nil, ["bytes"])
96
96
  3.times { mock3.expect(:pin, 254) }
97
-
97
+
98
98
  board.add_component(mock1)
99
99
  board.add_component(mock2)
100
100
  board.add_component(mock3)
@@ -2,7 +2,7 @@ require_relative '../test_helper'
2
2
 
3
3
  class APIOneWireTest < Minitest::Test
4
4
  include TestPacker
5
-
5
+
6
6
  def connection
7
7
  @connection ||= ConnectionMock.new
8
8
  end
@@ -10,36 +10,47 @@ class APIOneWireTest < Minitest::Test
10
10
  def board
11
11
  @board ||= Denko::Board.new(connection)
12
12
  end
13
-
13
+
14
14
  def test_one_wire_reset
15
15
  board
16
- message = Denko::Message.encode command: 41, pin: 1, value: 255
17
-
16
+ message = Denko::Message.encode command: 41, pin: 1, value: 0
17
+
18
18
  mock = Minitest::Mock.new.expect :call, nil, [message]
19
19
  connection.stub(:write, mock) do
20
- board.one_wire_reset(1, 255)
20
+ board.one_wire_reset(1, false)
21
21
  end
22
22
  mock.verify
23
23
  end
24
-
24
+
25
+ def test_one_wire_reset_with_presence
26
+ board
27
+ message = Denko::Message.encode command: 41, pin: 1, value: 1
28
+
29
+ mock = Minitest::Mock.new.expect :call, nil, [message]
30
+ connection.stub(:write, mock) do
31
+ board.one_wire_reset(1, true)
32
+ end
33
+ mock.verify
34
+ end
35
+
25
36
  def test_one_wire_search
26
37
  board
27
38
  message = Denko::Message.encode command: 42, pin: 1, aux_message: pack(:uint64, 128, max:8)
28
-
39
+
29
40
  mock = Minitest::Mock.new.expect :call, nil, [message]
30
41
  connection.stub(:write, mock) do
31
42
  board.one_wire_search(1, 128)
32
43
  end
33
44
  mock.verify
34
45
  end
35
-
46
+
36
47
  def test_one_wire_write
37
48
  board
38
-
49
+
39
50
  # Calculate length and parasite power properly.
40
51
  message1 = Denko::Message.encode command: 43, pin: 1, value: 0b10000000 | 3, aux_message: pack(:uint8, [1,2,3])
41
52
  message2 = Denko::Message.encode command: 43, pin: 1, value: 4, aux_message: pack(:uint8, [1,2,3,4])
42
-
53
+
43
54
  mock = Minitest::Mock.new
44
55
  mock.expect :call, nil, [message1]
45
56
  mock.expect :call, nil, [message2]
@@ -48,18 +59,18 @@ class APIOneWireTest < Minitest::Test
48
59
  board.one_wire_write(1, nil, [1,2,3,4])
49
60
  end
50
61
  mock.verify
51
-
62
+
52
63
  # Don't allow more than 127 bytes of data.
53
- assert_raises(ArgumentError) do
64
+ assert_raises(ArgumentError) do
54
65
  too_big = Array.new(128).map { 42 }
55
66
  board.one_wire_write(1, true, too_big)
56
67
  end
57
68
  end
58
-
69
+
59
70
  def test_one_wire_read
60
71
  board
61
72
  message = Denko::Message.encode command: 44, pin: 1, value: 9
62
-
73
+
63
74
  mock = Minitest::Mock.new.expect :call, nil, [message]
64
75
  connection.stub(:write, mock) do
65
76
  board.one_wire_read(1, 9)
@@ -14,40 +14,56 @@ class APISPITest < Minitest::Test
14
14
  @board ||= Denko::Board.new(connection)
15
15
  end
16
16
 
17
+ def header_args
18
+ length = board.aux_limit - 8
19
+
20
+ [nil, Array.new(length){0}, length, 1000000, 0, :msbfirst]
21
+ end
22
+
17
23
  def test_spi_modes
18
- # Start with mode = 0.
19
- args = [nil, [], 0, 1000000, 0, :msbfirst]
20
- assert_equal (pack :uint8, 0b10000000), board.spi_header(*args)[0]
24
+ # Default to mode 0.
25
+ assert_equal (pack :uint8, 0b10000000), board.spi_header(*header_args)[0]
21
26
 
22
- args[4] = 1
27
+ args = header_args.tap { |a| a[4] = 1 }
23
28
  assert_equal (pack :uint8, 0b10000001), board.spi_header(*args)[0]
24
29
 
25
- args[4] = 2
30
+ args = header_args.tap { |a| a[4] = 2 }
26
31
  assert_equal (pack :uint8, 0b10000010), board.spi_header(*args)[0]
27
32
 
28
- args[4] = 3
33
+ args = header_args.tap { |a| a[4] = 3 }
29
34
  assert_equal (pack :uint8, 0b10000011), board.spi_header(*args)[0]
30
35
 
31
- # Invalid mode = 4.
32
- assert_raises(ArgumentError) { board.spi_header(*args[3] = 4) }
36
+ args = header_args.tap { |a| a[4] = 4 }
37
+ assert_raises(ArgumentError) { board.spi_header(*args) }
33
38
  end
34
39
 
35
40
  def test_spi_lsbfirst
36
- args = [nil, [], 0, 1000000, 0, :lsbfirst]
41
+ # Default to :msbfirst
42
+ assert_equal (pack :uint8, 0b10000000), board.spi_header(*header_args)[0]
43
+
44
+ args = header_args.tap { |a| a[5] = :lsbfirst }
37
45
  assert_equal (pack :uint8, 0b00000000), board.spi_header(*args)[0]
38
46
  end
39
47
 
40
48
  def test_spi_frequency
41
- args = [nil, [], 0, 1000000, 0, :msbfirst]
42
- assert_equal (pack :uint32, 1000000), board.spi_header(*args)[3..6]
49
+ # Default to 1 MHz.
50
+ assert_equal (pack :uint32, 1_000_000), board.spi_header(*header_args)[4..7]
43
51
 
44
- args[3] = 8000000
45
- assert_equal (pack :uint32, 8000000), board.spi_header(*args)[3..6]
52
+ args = header_args.tap { |a| a[3] = 8_000_000 }
53
+ assert_equal (pack :uint32, 8_000_000), board.spi_header(*args)[4..7]
46
54
  end
47
55
 
48
56
  def test_spi_too_many_bytes
49
- assert_raises(ArgumentError) { board.spi_header(read: 256) }
50
- assert_raises(ArgumentError) { board.spi_header(write: Array.new(256){0})}
57
+ # Default args have maximum read and write based on aux_limit.
58
+ board.spi_header(*header_args)
59
+
60
+ # Too many write
61
+ args = header_args.tap { |a| a[1] << 0 }
62
+ assert_raises(ArgumentError) { board.spi_header(*args) }
63
+
64
+ # Too many read
65
+ args = header_args.tap { |a| a[2] += 1 }
66
+ assert_raises(ArgumentError) { board.spi_header(*args) }
51
67
  end
52
68
 
53
69
  def test_spi_no_bytes
@@ -16,7 +16,7 @@ class DigitalIOInputTest < Minitest::Test
16
16
  end
17
17
  mock.verify
18
18
  end
19
-
19
+
20
20
  def test_converts_to_integer
21
21
  part
22
22
  part.update("1")
@@ -26,7 +26,7 @@ class DigitalIOInputTest < Minitest::Test
26
26
  def test__read
27
27
  mock = Minitest::Mock.new.expect :call, nil, [14]
28
28
  board.stub(:digital_read, mock) do
29
- part._read
29
+ part.read_nb
30
30
  end
31
31
  mock.verify
32
32
  end