denko 0.13.6 → 0.14.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 (376) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{build_avr.yml → build_atmega_avr.yml} +18 -18
  3. data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +18 -18
  4. data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +17 -17
  5. data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +18 -18
  6. data/.github/workflows/build_esp32.yml +17 -18
  7. data/.github/workflows/build_esp32c3.yml +57 -0
  8. data/.github/workflows/build_esp32c6.yml +57 -0
  9. data/.github/workflows/build_esp32h2.yml +56 -0
  10. data/.github/workflows/build_esp32s2.yml +57 -0
  11. data/.github/workflows/build_esp32s3.yml +57 -0
  12. data/.github/workflows/build_esp8266.yml +15 -15
  13. data/.github/workflows/build_ra4m1.yml +16 -16
  14. data/.github/workflows/build_rp2040.yml +17 -16
  15. data/.github/workflows/ruby.yml +20 -20
  16. data/CHANGELOG.md +195 -11
  17. data/DEPS_CLI.md +9 -9
  18. data/DEPS_IDE.md +17 -18
  19. data/HARDWARE.md +50 -51
  20. data/README.md +61 -53
  21. data/Rakefile +1 -1
  22. data/benchmarks/analog_listen.rb +49 -0
  23. data/benchmarks/digital_write.rb +28 -0
  24. data/benchmarks/i2c_ssd1306_refresh.rb +13 -6
  25. data/build +1 -1
  26. data/denko.gemspec +5 -2
  27. data/examples/advanced/{m5_env.rb → m5_env3.rb} +12 -14
  28. data/examples/advanced/rotary_encoder_mac_volume.rb +18 -13
  29. data/examples/advanced/ssd1306_time_temp_rh.rb +8 -13
  30. data/examples/analog_io/ads1100.rb +48 -0
  31. data/examples/analog_io/ads1115.rb +2 -2
  32. data/examples/analog_io/ads1118.rb +3 -11
  33. data/examples/analog_io/input.rb +17 -16
  34. data/examples/analog_io/input_smoothing.rb +27 -0
  35. data/examples/analog_io/potentiometer.rb +31 -0
  36. data/examples/connection/binary_echo.rb +34 -0
  37. data/examples/connection/tcp.rb +12 -27
  38. data/examples/digital_io/button.rb +7 -3
  39. data/examples/digital_io/relay.rb +17 -0
  40. data/examples/digital_io/rotary_encoder.rb +21 -11
  41. data/examples/display/hd44780.rb +13 -5
  42. data/examples/display/ssd1306.rb +20 -17
  43. data/examples/display/ssd1306_s2_pico.rb +2 -2
  44. data/examples/i2c/search.rb +10 -26
  45. data/examples/led/apa102_bounce.rb +3 -4
  46. data/examples/led/apa102_fade.rb +44 -0
  47. data/examples/led/builtin_blink.rb +3 -1
  48. data/examples/led/builtin_fade.rb +19 -0
  49. data/examples/led/rgb_led.rb +31 -0
  50. data/examples/led/seven_segment_char_echo.rb +4 -2
  51. data/examples/led/ws2812_bounce.rb +5 -7
  52. data/examples/led/ws2812_builtin_blink.rb +3 -2
  53. data/examples/led/ws2812_fade.rb +43 -0
  54. data/examples/motor/l298.rb +10 -8
  55. data/examples/motor/servo.rb +4 -3
  56. data/examples/motor/stepper.rb +13 -13
  57. data/examples/one_wire/search.rb +32 -0
  58. data/examples/pulse_io/buzzer.rb +8 -3
  59. data/examples/pulse_io/ir_output.rb +51 -0
  60. data/examples/pulse_io/pwm_output.rb +30 -0
  61. data/examples/rtc/ds3231.rb +18 -35
  62. data/examples/sensor/aht10.rb +4 -6
  63. data/examples/sensor/aht20.rb +4 -6
  64. data/examples/sensor/bme280.rb +4 -4
  65. data/examples/sensor/bmp180.rb +9 -5
  66. data/examples/sensor/dht.rb +20 -15
  67. data/examples/sensor/ds18b20.rb +20 -21
  68. data/examples/sensor/generic_pir.rb +4 -2
  69. data/examples/sensor/hcsr04.rb +5 -2
  70. data/examples/sensor/htu21d.rb +9 -20
  71. data/examples/sensor/htu31d.rb +7 -9
  72. data/examples/sensor/neat_tph_readings.rb +15 -9
  73. data/examples/sensor/qmp6988.rb +5 -7
  74. data/examples/sensor/rcwl9620.rb +3 -3
  75. data/examples/sensor/sht3x.rb +4 -6
  76. data/examples/spi/bitbang_loopback.rb +46 -0
  77. data/examples/spi/input_register.rb +9 -19
  78. data/examples/spi/output_register.rb +9 -17
  79. data/examples/spi/ssd_through_registers.rb +28 -0
  80. data/examples/spi/two_registers.rb +18 -24
  81. data/examples/uart/bit_bang_demo.rb +25 -0
  82. data/examples/uart/board_passthrough.rb +19 -13
  83. data/examples/uart/hardware_loopback.rb +1 -1
  84. data/lib/denko/analog_io/ads1100.rb +127 -0
  85. data/lib/denko/analog_io/ads1115.rb +8 -25
  86. data/lib/denko/analog_io/ads1118.rb +10 -25
  87. data/lib/denko/analog_io/ads111x.rb +25 -11
  88. data/lib/denko/analog_io/input.rb +29 -55
  89. data/lib/denko/analog_io/input_helper.rb +42 -0
  90. data/lib/denko/analog_io/output.rb +5 -5
  91. data/lib/denko/analog_io/potentiometer.rb +6 -8
  92. data/lib/denko/analog_io.rb +2 -1
  93. data/lib/denko/behaviors/board_proxy.rb +13 -1
  94. data/lib/denko/behaviors/bus_controller.rb +1 -0
  95. data/lib/denko/behaviors/bus_controller_addressed.rb +1 -0
  96. data/lib/denko/behaviors/bus_peripheral.rb +3 -4
  97. data/lib/denko/behaviors/bus_peripheral_addressed.rb +8 -6
  98. data/lib/denko/behaviors/callbacks.rb +9 -7
  99. data/lib/denko/behaviors/component.rb +16 -14
  100. data/lib/denko/behaviors/input_pin.rb +14 -15
  101. data/lib/denko/behaviors/lifecycle.rb +51 -0
  102. data/lib/denko/behaviors/multi_pin.rb +22 -18
  103. data/lib/denko/behaviors/output_pin.rb +9 -4
  104. data/lib/denko/behaviors/single_pin.rb +1 -0
  105. data/lib/denko/behaviors/state.rb +15 -9
  106. data/lib/denko/behaviors/subcomponents.rb +72 -12
  107. data/lib/denko/behaviors.rb +2 -1
  108. data/lib/denko/board/core.rb +36 -18
  109. data/lib/denko/board/i2c.rb +14 -14
  110. data/lib/denko/board/i2c_bit_bang.rb +49 -0
  111. data/lib/denko/board/infrared.rb +6 -6
  112. data/lib/denko/board/led_array.rb +6 -5
  113. data/lib/denko/board/spi.rb +15 -10
  114. data/lib/denko/board/spi_bit_bang.rb +9 -7
  115. data/lib/denko/board.rb +35 -33
  116. data/lib/denko/connection/binary_echo.rb +17 -0
  117. data/lib/denko/connection/flow_control.rb +11 -15
  118. data/lib/denko/connection/handshake.rb +2 -0
  119. data/lib/denko/digital_io/button.rb +4 -0
  120. data/lib/denko/digital_io/c_bit_bang.rb +15 -0
  121. data/lib/denko/digital_io/input.rb +4 -5
  122. data/lib/denko/digital_io/output.rb +7 -6
  123. data/lib/denko/digital_io/relay.rb +2 -0
  124. data/lib/denko/digital_io/rotary_encoder.rb +78 -60
  125. data/lib/denko/digital_io.rb +1 -0
  126. data/lib/denko/display/hd44780.rb +136 -93
  127. data/lib/denko/display/sh1106.rb +42 -0
  128. data/lib/denko/display/ssd1306.rb +105 -45
  129. data/lib/denko/display.rb +1 -0
  130. data/lib/denko/eeprom/built_in.rb +19 -16
  131. data/lib/denko/i2c/bit_bang.rb +31 -0
  132. data/lib/denko/i2c/bus.rb +8 -36
  133. data/lib/denko/i2c/bus_common.rb +45 -0
  134. data/lib/denko/i2c/peripheral.rb +28 -19
  135. data/lib/denko/i2c.rb +2 -0
  136. data/lib/denko/led/apa102.rb +43 -29
  137. data/lib/denko/led/base.rb +8 -2
  138. data/lib/denko/led/rgb.rb +5 -7
  139. data/lib/denko/led/seven_segment.rb +24 -9
  140. data/lib/denko/led/ws2812.rb +10 -7
  141. data/lib/denko/message.rb +5 -0
  142. data/lib/denko/motor/l298.rb +11 -10
  143. data/lib/denko/motor/servo.rb +22 -10
  144. data/lib/denko/motor/stepper.rb +11 -14
  145. data/lib/denko/mutex_stub.rb +7 -0
  146. data/lib/denko/one_wire/bus.rb +9 -5
  147. data/lib/denko/one_wire/peripheral.rb +0 -3
  148. data/lib/denko/pulse_io/buzzer.rb +9 -3
  149. data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +9 -4
  150. data/lib/denko/pulse_io/pwm_output.rb +69 -15
  151. data/lib/denko/pulse_io.rb +3 -3
  152. data/lib/denko/rtc/ds3231.rb +11 -13
  153. data/lib/denko/sensor/aht.rb +22 -21
  154. data/lib/denko/sensor/bme280.rb +60 -63
  155. data/lib/denko/sensor/bmp180.rb +41 -38
  156. data/lib/denko/sensor/dht.rb +22 -5
  157. data/lib/denko/sensor/ds18b20.rb +40 -34
  158. data/lib/denko/sensor/hcsr04.rb +7 -5
  159. data/lib/denko/sensor/helper.rb +37 -0
  160. data/lib/denko/sensor/htu21d.rb +44 -55
  161. data/lib/denko/sensor/htu31d.rb +32 -33
  162. data/lib/denko/sensor/qmp6988.rb +25 -23
  163. data/lib/denko/sensor/rcwl9620.rb +2 -5
  164. data/lib/denko/sensor/sht3x.rb +23 -21
  165. data/lib/denko/sensor.rb +1 -2
  166. data/lib/denko/spi/base_register.rb +22 -22
  167. data/lib/denko/spi/bit_bang.rb +17 -51
  168. data/lib/denko/spi/bus.rb +15 -29
  169. data/lib/denko/spi/bus_common.rb +36 -0
  170. data/lib/denko/spi/input_register.rb +36 -30
  171. data/lib/denko/spi/output_register.rb +25 -40
  172. data/lib/denko/spi/peripheral.rb +93 -24
  173. data/lib/denko/spi.rb +6 -1
  174. data/lib/denko/uart/bit_bang.rb +5 -3
  175. data/lib/denko/uart/hardware.rb +9 -8
  176. data/lib/denko/version.rb +1 -1
  177. data/lib/denko.rb +10 -0
  178. data/lib/denko_cli/generator.rb +2 -2
  179. data/lib/denko_cli/packages.rb +8 -10
  180. data/lib/denko_cli/targets.rb +8 -8
  181. data/lib/denko_cli/targets.txt +4 -4
  182. data/lib/denko_cli/usage.txt +1 -1
  183. data/src/denko_ethernet.ino +0 -14
  184. data/src/denko_serial.ino +0 -14
  185. data/src/denko_wifi.ino +6 -15
  186. data/src/lib/Denko.cpp +39 -3
  187. data/src/lib/Denko.h +42 -26
  188. data/src/lib/DenkoCoreIO.cpp +57 -102
  189. data/src/lib/DenkoDefines.h +36 -31
  190. data/src/lib/DenkoI2C.cpp +54 -45
  191. data/src/lib/DenkoI2CBB.cpp +238 -0
  192. data/src/lib/DenkoIROut.cpp +12 -7
  193. data/src/lib/DenkoLEDArray.cpp +36 -13
  194. data/src/lib/DenkoSPI.cpp +6 -5
  195. data/src/lib/DenkoSPIBB.cpp +7 -6
  196. data/target.yml +37 -2
  197. data/test/analog_io/potentiometer_test.rb +10 -10
  198. data/test/behaviors/board_proxy_test.rb +1 -1
  199. data/test/behaviors/callbacks_test.rb +11 -3
  200. data/test/behaviors/component_test.rb +17 -9
  201. data/test/behaviors/input_pin_test.rb +14 -9
  202. data/test/behaviors/multi_pin_test.rb +14 -4
  203. data/test/behaviors/output_pin_test.rb +11 -8
  204. data/test/behaviors/poller_test.rb +1 -0
  205. data/test/behaviors/reader_test.rb +3 -2
  206. data/test/behaviors/subcomponents_test.rb +22 -2
  207. data/test/board/core_test.rb +15 -11
  208. data/test/board/i2c_test.rb +39 -33
  209. data/test/board/infrared_test.rb +1 -1
  210. data/test/board/message_test.rb +17 -11
  211. data/test/board/spi_test.rb +21 -21
  212. data/test/digital_io/button_test.rb +15 -0
  213. data/test/digital_io/relay_test.rb +18 -0
  214. data/test/digital_io/rotary_encoder_test.rb +80 -60
  215. data/test/eeprom/built_in_test.rb +9 -9
  216. data/test/i2c/bus_test.rb +30 -14
  217. data/test/i2c/peripheral_test.rb +36 -17
  218. data/test/led/base_test.rb +2 -1
  219. data/test/led/rgb_test.rb +6 -6
  220. data/test/led/seven_segment_test.rb +7 -7
  221. data/test/motor/servo_test.rb +1 -1
  222. data/test/motor/stepper_test.rb +2 -2
  223. data/test/one_wire/bus_test.rb +1 -0
  224. data/test/pulse_io/buzzer_test.rb +7 -4
  225. data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +10 -10
  226. data/test/pulse_io/pwm_output_test.rb +74 -18
  227. data/test/rtc/ds3231_test.rb +11 -13
  228. data/test/sensor/dht_test.rb +1 -1
  229. data/test/sensor/ds18b20_test.rb +4 -8
  230. data/test/spi/bus_test.rb +7 -7
  231. data/test/spi/input_register_test.rb +15 -15
  232. data/test/spi/output_register_test.rb +10 -28
  233. data/test/spi/peripheral_multi_pin_test.rb +53 -0
  234. data/test/spi/peripheral_single_pin_test.rb +48 -0
  235. data/test/test_helper.rb +36 -33
  236. data/tutorial/02-button/button.rb +5 -4
  237. data/tutorial/03-potentiometer/potentiometer.rb +9 -5
  238. data/tutorial/04-pwm_led/pwm_led.rb +14 -16
  239. data/tutorial/05-rgb_led/rgb_led.rb +6 -6
  240. data/tutorial/05-rgb_led/rgb_mapping.rb +11 -11
  241. data/vendor/board-maps/BoardMap.h +416 -56
  242. data/vendor/board-maps/lib/header_parser.rb +12 -2
  243. data/vendor/board-maps/yaml/ADAFRUIT_CAMERA_ESP32S3.yml +2 -2
  244. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32C6.yml +15 -0
  245. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +1 -1
  246. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_ADALOGGER.yml +44 -0
  247. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +1 -0
  248. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +1 -0
  249. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +1 -0
  250. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +1 -0
  251. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +1 -0
  252. data/vendor/board-maps/yaml/AMKEN_BB.yml +48 -0
  253. data/vendor/board-maps/yaml/AMKEN_ES.yml +48 -0
  254. data/vendor/board-maps/yaml/AMKEN_REVELOP.yml +48 -0
  255. data/vendor/board-maps/yaml/AMKEN_REVELOP_PLUS.yml +48 -0
  256. data/vendor/board-maps/yaml/ASL_CAN_X2.yml +41 -0
  257. data/vendor/board-maps/yaml/BLING.yml +25 -0
  258. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +1 -0
  259. data/vendor/board-maps/yaml/BRIDGETEK_IDM2040_7A.yml +48 -0
  260. data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +13 -1
  261. data/vendor/board-maps/yaml/Breadstick_Raspberry.yml +31 -0
  262. data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32C6.yml +8 -0
  263. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32C6.yml +20 -0
  264. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_ESP32.yml +46 -0
  265. data/vendor/board-maps/yaml/DPTECHNICS_WALTER.yml +39 -0
  266. data/vendor/board-maps/yaml/ELECROW_CROWPANEL_7.yml +8 -0
  267. data/vendor/board-maps/yaml/ESP32C2_DEV.yml +12 -0
  268. data/vendor/board-maps/yaml/ESP32C3_DEVKIT_LIPO.yml +14 -0
  269. data/vendor/board-maps/yaml/ESP32C6_DEV.yml +15 -0
  270. data/vendor/board-maps/yaml/ESP32C6_EVB.yml +15 -0
  271. data/vendor/board-maps/yaml/ESP32C6_QWIIC_POCKET.yml +15 -0
  272. data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +15 -0
  273. data/vendor/board-maps/yaml/ESP32H2_DEV.yml +13 -0
  274. data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +13 -0
  275. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +1 -0
  276. data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +2 -1
  277. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +44 -0
  278. data/vendor/board-maps/yaml/ESP32S3_DEVKIT_LIPO.yml +42 -0
  279. data/vendor/board-maps/yaml/ESP32S3_POWERFEATHER.yml +22 -0
  280. data/vendor/board-maps/yaml/ESP32_SBC_FABGL.yml +35 -0
  281. data/vendor/board-maps/yaml/EVN_ALPHA.yml +48 -0
  282. data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
  283. data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +14 -0
  284. data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -0
  285. data/vendor/board-maps/yaml/HELTEC_WIFI_LORA_32_V3.yml +42 -0
  286. data/vendor/board-maps/yaml/HELTEC_WIRELESS_BRIDGE.yml +8 -0
  287. data/vendor/board-maps/yaml/HELTEC_WIRELESS_MINI_SHELL.yml +13 -0
  288. data/vendor/board-maps/yaml/HELTEC_WIRELESS_PAPER.yml +42 -0
  289. data/vendor/board-maps/yaml/HELTEC_WIRELESS_SHELL_V3.yml +42 -0
  290. data/vendor/board-maps/yaml/HELTEC_WIRELESS_STICK_LITE_V3.yml +30 -0
  291. data/vendor/board-maps/yaml/HELTEC_WIRELESS_TRACKER.yml +41 -0
  292. data/vendor/board-maps/yaml/HT_DE01.yml +42 -0
  293. data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
  294. data/vendor/board-maps/yaml/LILYGO_T3S3_LR1121.yml +9 -0
  295. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1262.yml +9 -0
  296. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1276.yml +9 -0
  297. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1278.yml +9 -0
  298. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280.yml +9 -0
  299. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280PA.yml +8 -0
  300. data/vendor/board-maps/yaml/LILYGO_T_ETH_LITE.yml +21 -0
  301. data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +14 -0
  302. data/vendor/board-maps/yaml/LOLIN_S3.yml +1 -0
  303. data/vendor/board-maps/yaml/LOLIN_S3_MINI_PRO.yml +40 -0
  304. data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -2
  305. data/vendor/board-maps/yaml/LoPy.yml +1 -0
  306. data/vendor/board-maps/yaml/LoPy4.yml +1 -0
  307. data/vendor/board-maps/yaml/M5STACK_CAPSULE.yml +8 -0
  308. data/vendor/board-maps/yaml/M5STACK_CARDPUTER.yml +8 -0
  309. data/vendor/board-maps/yaml/M5STACK_DIAL.yml +8 -0
  310. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +0 -1
  311. data/vendor/board-maps/yaml/M5STACK_NANOC6.yml +17 -0
  312. data/vendor/board-maps/yaml/M5STACK_PAPER.yml +9 -0
  313. data/vendor/board-maps/yaml/M5STACK_POE_CAM.yml +5 -0
  314. data/vendor/board-maps/yaml/M5STACK_STAMP_C3.yml +13 -0
  315. data/vendor/board-maps/yaml/M5STACK_STAMP_S3.yml +4 -0
  316. data/vendor/board-maps/yaml/{M5Stick_C.yml → M5STACK_STICKC.yml} +0 -1
  317. data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS.yml +9 -0
  318. data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS2.yml +9 -0
  319. data/vendor/board-maps/yaml/M5STACK_TOUGH.yml +9 -0
  320. data/vendor/board-maps/yaml/M5STACK_UNIT_CAM.yml +10 -0
  321. data/vendor/board-maps/yaml/M5STACK_UNIT_CAMS3.yml +4 -0
  322. data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -1
  323. data/vendor/board-maps/yaml/MAKERGO_C3_SUPERMINI.yml +14 -0
  324. data/vendor/board-maps/yaml/MARBLE_PICO.yml +48 -0
  325. data/vendor/board-maps/yaml/METEHOCA_AKANA_R1.yml +46 -0
  326. data/vendor/board-maps/yaml/NAMINO_BIANCO.yml +13 -0
  327. data/vendor/board-maps/yaml/NEBULAS3.yml +0 -1
  328. data/vendor/board-maps/yaml/NEWSAN_ARCHI.yml +48 -0
  329. data/vendor/board-maps/yaml/NOLOGO_ESP32C3_SUPER_MINI.yml +14 -0
  330. data/vendor/board-maps/yaml/NOLOGO_ESP32S3_PICO.yml +12 -0
  331. data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_16MB.yml +48 -0
  332. data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_2MB.yml +48 -0
  333. data/vendor/board-maps/yaml/OPTA_ANALOG.yml +7 -0
  334. data/vendor/board-maps/yaml/OPTA_DIGITAL.yml +5 -0
  335. data/vendor/board-maps/yaml/PINTRONIX_PINMAX.yml +42 -0
  336. data/vendor/board-maps/yaml/PYCOM_GPY.yml +1 -0
  337. data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -1
  338. data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +12 -0
  339. data/vendor/board-maps/yaml/SPARKFUN_MICROMOD_RP2040.yml +48 -0
  340. data/vendor/board-maps/yaml/SPARKFUN_PRO_MICRO_ESP32C3.yml +24 -0
  341. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER.yml +31 -0
  342. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +15 -0
  343. data/vendor/board-maps/yaml/TINYC6.yml +25 -0
  344. data/vendor/board-maps/yaml/UPESY_EDU_ESP32.yml +28 -0
  345. data/vendor/board-maps/yaml/UPESY_ESP32C3_BASIC.yml +13 -0
  346. data/vendor/board-maps/yaml/UPESY_ESP32C3_MINI.yml +12 -0
  347. data/vendor/board-maps/yaml/UPESY_ESP32S3_BASIC.yml +42 -0
  348. data/vendor/board-maps/yaml/VIRALINK_GATE32_01.yml +6 -0
  349. data/vendor/board-maps/yaml/VIRALINK_GATE32_11.yml +7 -0
  350. data/vendor/board-maps/yaml/WAVESHARE_ESP32S3_TOUCH_LCD_128.yml +8 -0
  351. data/vendor/board-maps/yaml/WAVESHARE_RP2040_MATRIX.yml +48 -0
  352. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +1 -0
  353. data/vendor/board-maps/yaml/WAVESHARE_RP2040_PIZERO.yml +47 -0
  354. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +1 -0
  355. data/vendor/board-maps/yaml/WEACT_STUDIO_ESP32C3.yml +14 -0
  356. data/vendor/board-maps/yaml/WIPY3.yml +1 -0
  357. data/vendor/board-maps/yaml/WT32_SC01_PLUS.yml +7 -0
  358. data/vendor/board-maps/yaml/WiFiduinoV2.yml +1 -0
  359. data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -1
  360. data/vendor/board-maps/yaml/XIAO_ESP32C6.yml +22 -0
  361. data/vendor/board-maps/yaml/unphone9.yml +8 -0
  362. metadata +169 -30
  363. data/examples/led/apa102_breathe.rb +0 -45
  364. data/examples/pulse_io/ir_transmitter.rb +0 -55
  365. data/examples/spi/ssd_through_register.rb +0 -40
  366. data/examples/uart/bit_bang_read.rb +0 -16
  367. data/examples/uart/bit_bang_write.rb +0 -16
  368. data/lib/denko/analog_io/sensor.rb +0 -6
  369. data/lib/denko/sensor/virtual.rb +0 -42
  370. data/src/lib/DenkoIROutESP.cpp +0 -26
  371. data/vendor/board-maps/yaml/STAMP_S3.yml +0 -8
  372. /data/vendor/board-maps/yaml/{BRIDGETEK_IDM2040-7A.yml → BRIDGETEK_IDM2040_43A.yml} +0 -0
  373. /data/vendor/board-maps/yaml/{heltec_wifi_32_lora_V3.yml → HELTEC_WIRELESS_STICK_V3.yml} +0 -0
  374. /data/vendor/board-maps/yaml/{M5Stack_Core_ESP32.yml → M5STACK_CORE.yml} +0 -0
  375. /data/vendor/board-maps/yaml/{M5Stamp_Pico.yml → M5STACK_STAMP_PICO.yml} +0 -0
  376. /data/vendor/board-maps/yaml/{M5Stack-Timer-CAM.yml → M5STACK_TIMER_CAM.yml} +0 -0
@@ -8,12 +8,34 @@ class PWMOutTest < Minitest::Test
8
8
  def part
9
9
  @part ||= Denko::PulseIO::PWMOutput.new(board: board, pin: 14)
10
10
  end
11
-
11
+
12
+ def part2
13
+ @part2 ||= Denko::PulseIO::PWMOutput.new(board: board, pin: 6, frequency: 1000, resolution: 12)
14
+ end
15
+
16
+ def test_initialize_stores_settings
17
+ assert_equal 12, part2.resolution
18
+ assert_equal 1000, part2.frequency
19
+ assert_equal (2**12-1), part2.pwm_high
20
+ end
21
+
22
+ def test_duty
23
+ mock = Minitest::Mock.new
24
+ mock.expect :call, nil, [14, 0]
25
+ mock.expect :call, nil, [14, 128]
26
+ mock.expect :call, nil, [14, 255]
27
+ board.stub(:pwm_write, mock) do
28
+ part.duty = 0
29
+ part.duty = 50
30
+ part.duty = 100
31
+ end
32
+ end
33
+
12
34
  def test_pwm_write
13
35
  enable_mock = Minitest::Mock.new.expect :call, nil
14
36
  write_mock = Minitest::Mock.new
15
37
  write_mock.expect :call, nil, [14, 128]
16
-
38
+
17
39
  board.stub(:pwm_write, write_mock) do
18
40
  part.stub(:pwm_enable, enable_mock) do
19
41
  assert_equal :output, part.mode
@@ -21,7 +43,7 @@ class PWMOutTest < Minitest::Test
21
43
  assert_equal 128, part.state
22
44
  end
23
45
  end
24
-
46
+
25
47
  part.pwm_write(64)
26
48
  assert_equal 64, part.state
27
49
  assert_equal :output_pwm, part.mode
@@ -30,35 +52,68 @@ class PWMOutTest < Minitest::Test
30
52
  enable_mock.verify
31
53
  end
32
54
 
33
- def test_write_uses_digital_write_at_limits
55
+ def test_write_uses_board_pwm_write_always
56
+ mock = Minitest::Mock.new.expect :call, nil, [14, 128]
57
+ board.stub(:pwm_write, mock) do
58
+ part.write(128)
59
+ end
60
+ mock.verify
61
+ end
62
+
63
+ def test_pwm_enable
64
+ part
34
65
  mock = Minitest::Mock.new
35
- mock.expect :call, nil, [board.high]
36
- mock.expect :call, nil, [board.low]
37
- part.stub(:digital_write, mock) do
38
- part.write(board.pwm_high)
39
- part.write(board.low)
66
+ if (RUBY_VERSION.split(".")[0].to_i < 3)
67
+ mock.expect :call, nil, [14, :output_pwm], {frequency: 1000, resolution: 8}
68
+ else
69
+ mock.expect :call, nil, [14, :output_pwm, {frequency: 1000, resolution: 8}]
70
+ end
71
+
72
+ board.stub(:set_pin_mode, mock) do
73
+ part.pwm_enable
40
74
  end
41
75
  mock.verify
76
+ assert_equal :output_pwm, part.mode
77
+ assert_equal true, part.pwm_enabled
42
78
  end
43
79
 
44
- def test_write_uses_analog_write_between_limits
45
- mock = Minitest::Mock.new.expect :call, nil, [128]
46
- part.stub(:pwm_write, mock) do
47
- part.write(128)
80
+ def test_pwm_enable_uses_stored_settings
81
+ part2
82
+ mock = Minitest::Mock.new
83
+ if (RUBY_VERSION.split(".")[0].to_i < 3)
84
+ mock.expect :call, nil, [6, :output_pwm], {frequency: 1000, resolution: 12}
85
+ else
86
+ mock.expect :call, nil, [6, :output_pwm, {frequency: 1000, resolution: 12}]
87
+ end
88
+
89
+ board.stub(:set_pin_mode, mock) do
90
+ part2.pwm_enable
48
91
  end
49
92
  mock.verify
93
+ assert_equal :output_pwm, part2.mode
94
+ assert_equal true, part2.pwm_enabled
50
95
  end
51
-
52
- def test_pwm_enable
96
+
97
+ def test_pwm_enable_uses_arg_settings
53
98
  part
54
- mock = Minitest::Mock.new.expect :call, nil, [14, :output_pwm]
99
+ mock = Minitest::Mock.new
100
+ if (RUBY_VERSION.split(".")[0].to_i < 3)
101
+ mock.expect :call, nil, [14, :output_pwm], {frequency: 500, resolution: 14}
102
+ else
103
+ mock.expect :call, nil, [14, :output_pwm, {frequency: 500, resolution: 14}]
104
+ end
105
+
55
106
  board.stub(:set_pin_mode, mock) do
56
- part.pwm_enable
107
+ part.pwm_enable(frequency: 500, resolution: 14)
57
108
  end
58
109
  mock.verify
59
110
  assert_equal :output_pwm, part.mode
111
+ assert_equal true, part.pwm_enabled
112
+ assert_equal 14, part.resolution
113
+ assert_equal 500, part.frequency
114
+ assert_equal (2**14-1), part.pwm_high
60
115
  end
61
-
116
+
62
117
  def test_pwm_disable
63
118
  part.pwm_enable
64
119
  mock = Minitest::Mock.new
@@ -68,5 +123,6 @@ class PWMOutTest < Minitest::Test
68
123
  end
69
124
  mock.verify
70
125
  assert_equal :output, part.mode
126
+ assert_equal false, part.pwm_enabled
71
127
  end
72
128
  end
@@ -6,45 +6,43 @@ class DS3231Test < Minitest::Test
6
6
  end
7
7
 
8
8
  def bus
9
- return @bus if @bus
10
- @bus = Denko::I2C::Bus.new(board: board, pin:5)
11
- @bus
9
+ @bus ||= Denko::I2C::Bus.new(board: board)
12
10
  end
13
-
11
+
14
12
  def part
15
- @part ||= Denko::RTC::DS3231.new(bus: bus, address: 0x68)
13
+ @part ||= Denko::RTC::DS3231.new(bus: bus)
16
14
  end
17
-
15
+
18
16
  def test_time_to_bcd
19
17
  time = Time.new(2000, 1, 1, 0, 0, 0.0)
20
18
  bytes = part.time_to_bcd(time)
21
19
  assert_equal bytes, [0, 0, 0, 6, 1, 1, 48]
22
20
  end
23
-
21
+
24
22
  def test_bcd_to_time
25
23
  bytes = [0, 0, 0, 6, 1, 1, 48]
26
24
  time = part.bcd_to_time(bytes)
27
25
  assert_equal time, Time.new(2000, 1, 1, 0, 0, 0.0)
28
26
  end
29
-
27
+
30
28
  def test_time=
31
- mock = Minitest::Mock.new.expect :call, nil, [[0, [0, 0, 0, 6, 1, 1, 48]]]
29
+ mock = Minitest::Mock.new.expect :call, nil, [[0, 0, 0, 0, 6, 1, 1, 48]]
32
30
  part.stub(:i2c_write, mock) do
33
31
  part.time = Time.new(2000, 1, 1, 0, 0, 0.0)
34
32
  end
35
33
  mock.verify
36
34
  end
37
-
35
+
38
36
  def test_read
39
- board.inject_read_for_component(part, 5, "104-0,0,0,6,1,1,48")
40
-
37
+ board.inject_read_for_i2c(0, "104-0,0,0,6,1,1,48")
38
+
41
39
  mock = Minitest::Mock.new.expect :call, nil, [part.address, 0x00, 7, 100000, false]
42
40
  bus.stub(:_read, mock) do
43
41
  part.time
44
42
  end
45
43
  mock.verify
46
44
  end
47
-
45
+
48
46
  def test_pre_callback_filter
49
47
  mock = Minitest::Mock.new.expect :call, nil, [Time.new(2000, 1, 1, 0, 0, 0.0)]
50
48
  part.stub(:update_state, mock) do
@@ -55,7 +55,7 @@ class DHTTest < Minitest::Test
55
55
 
56
56
  # It should calculate output correctly.
57
57
  result = part.decode(GOOD_ARRAY)
58
- assert_equal result, {celsius: 29.5, fahrenheit: 85.1, humidity: 66.9}
58
+ assert_equal result, {temperature: 29.5, humidity: 66.9}
59
59
  end
60
60
 
61
61
  def test_crc
@@ -17,14 +17,10 @@ class DS18B20Test < Minitest::Test
17
17
  end
18
18
 
19
19
  def test_decode_temperatures
20
- assert_equal({ celsius: 125, fahrenheit: 257 },
21
- part.decode_temperature([0b1101_0000,0b0000_0111]))
22
- assert_equal({ celsius: 0, fahrenheit: 32 },
23
- part.decode_temperature([0b0000_0000,0b0000_0000]))
24
- assert_equal({ celsius: -10.125, fahrenheit: 13.775 },
25
- part.decode_temperature([0b0101_1110,0b1111_1111]))
26
- assert_equal({ celsius: -55, fahrenheit: -67 },
27
- part.decode_temperature([0b1001_0000,0b1111_1100]))
20
+ assert_equal 125, part.decode_temperature([0b1101_0000,0b0000_0111])
21
+ assert_equal 0, part.decode_temperature([0b0000_0000,0b0000_0000])
22
+ assert_equal -10.125, part.decode_temperature([0b0101_1110,0b1111_1111])
23
+ assert_equal -55, part.decode_temperature([0b1001_0000,0b1111_1100])
28
24
  end
29
25
 
30
26
  def test_decode_resolution
data/test/spi/bus_test.rb CHANGED
@@ -4,7 +4,7 @@ class TempSpiPeripheral
4
4
  def initialize(pin)
5
5
  @pin = pin
6
6
  end
7
-
7
+
8
8
  attr_reader :pin
9
9
  end
10
10
 
@@ -14,28 +14,28 @@ class SPIBusTest < Minitest::Test
14
14
  end
15
15
 
16
16
  def part
17
- @bus ||= Denko::SPI::Bus.new(board: board)
17
+ @bus ||= Denko::SPI::Bus.new(board: board, index: 5)
18
18
  end
19
19
 
20
20
  PIN = 9
21
21
  OPTIONS = { read: 2, frequency: 800000, mode: 2, bit_order: :lsbfirst }
22
22
 
23
23
  def test_transfer
24
- mock = Minitest::Mock.new.expect :call, nil, [PIN], **OPTIONS
24
+ mock = Minitest::Mock.new.expect :call, nil, [5, PIN], **OPTIONS
25
25
  board.stub(:spi_transfer, mock) do
26
26
  part.transfer(PIN, **OPTIONS)
27
27
  end
28
28
  mock.verify
29
29
  end
30
-
30
+
31
31
  def test_listen
32
- mock = Minitest::Mock.new.expect :call, nil, [PIN], **OPTIONS
32
+ mock = Minitest::Mock.new.expect :call, nil, [5, PIN], **OPTIONS
33
33
  board.stub(:spi_listen, mock) do
34
34
  part.listen(PIN, **OPTIONS)
35
35
  end
36
36
  mock.verify
37
37
  end
38
-
38
+
39
39
  def test_stop
40
40
  mock = Minitest::Mock.new.expect :call, nil, [PIN]
41
41
  board.stub(:spi_stop, mock) do
@@ -70,7 +70,7 @@ class SPIBusTest < Minitest::Test
70
70
  end
71
71
 
72
72
  def test_no_select_pin
73
- part.add_component TempSpiPeripheral.new(255)
73
+ part.add_component TempSpiPeripheral.new(nil)
74
74
  assert_empty part.components
75
75
  end
76
76
  end
@@ -16,14 +16,14 @@ class InputRegisterTest < Minitest::Test
16
16
  def part
17
17
  @part ||= Denko::SPI::InputRegister.new(options)
18
18
  end
19
-
19
+
20
20
  def button
21
21
  @button ||= Denko::DigitalIO::Button.new(board: part, pin: 0)
22
22
  end
23
23
 
24
24
  def test_state_setup
25
- assert_equal part.instance_variable_get(:@reading_pins), Array.new(16) { false }
26
- assert_equal part.instance_variable_get(:@listening_pins), Array.new(16) { false }
25
+ assert_equal Array.new(16) { false }, part.reading_pins
26
+ assert_equal Array.new(16) { false }, part.listening_pins
27
27
  refute_nil part.callbacks[:board_proxy]
28
28
  end
29
29
 
@@ -34,7 +34,7 @@ class InputRegisterTest < Minitest::Test
34
34
  end
35
35
  mock.verify
36
36
  end
37
-
37
+
38
38
  def test_listen
39
39
  mock = Minitest::Mock.new.expect :call, nil, [9], read: 2, frequency: 800000, mode: 2, bit_order: :lsbfirst
40
40
  bus.stub(:listen, mock) do
@@ -42,7 +42,7 @@ class InputRegisterTest < Minitest::Test
42
42
  end
43
43
  mock.verify
44
44
  end
45
-
45
+
46
46
  def test_stop
47
47
  mock = Minitest::Mock.new.expect :call, nil, [9]
48
48
  bus.stub(:stop, mock) do
@@ -50,7 +50,7 @@ class InputRegisterTest < Minitest::Test
50
50
  end
51
51
  mock.verify
52
52
  end
53
-
53
+
54
54
  def test_updates_child_components
55
55
  button
56
56
  part.update("1")
@@ -58,7 +58,7 @@ class InputRegisterTest < Minitest::Test
58
58
  part.update("0")
59
59
  assert button.low?
60
60
  end
61
-
61
+
62
62
  def test_bit_array_conversion_and_state_update
63
63
  part.update("127")
64
64
  assert_equal [1,1,1,1,1,1,1,0], part.state
@@ -67,7 +67,7 @@ class InputRegisterTest < Minitest::Test
67
67
  new_part.update("127,128")
68
68
  assert_equal [1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1], new_part.state
69
69
  end
70
-
70
+
71
71
  def test_callbacks_get_bit_array
72
72
  mock = Minitest::Mock.new.expect :call, nil, [[1,1,1,1,1,1,1,0]]
73
73
  part.add_callback do |data|
@@ -76,11 +76,11 @@ class InputRegisterTest < Minitest::Test
76
76
  part.update("127")
77
77
  mock.verify
78
78
  end
79
-
79
+
80
80
  def test_read_proxy
81
81
  # Stop automatic listening first.
82
82
  button.stop
83
-
83
+
84
84
  # Give #read some value so it stops blocking.
85
85
  Thread.new do
86
86
  sleep(0.01) while !part.callbacks[:force_update]
@@ -101,12 +101,12 @@ class InputRegisterTest < Minitest::Test
101
101
  part.stub(:listen, mock) do
102
102
  # Tells the register to start listening when it initializees.
103
103
  button
104
-
104
+
105
105
  # Should not make a second listen call to the board.
106
106
  Denko::DigitalIO::Button.new(board: part, pin: 1)
107
107
  end
108
108
  mock.verify
109
-
109
+
110
110
  expected_array = Array.new(options[:bytes] * 8) { false }
111
111
  expected_array[0] = true
112
112
  expected_array[1] = true
@@ -114,17 +114,17 @@ class InputRegisterTest < Minitest::Test
114
114
  # Should be listening to the lowest 2 bits now.
115
115
  assert_equal expected_array, part.instance_variable_get(:@listening_pins)
116
116
  end
117
-
117
+
118
118
  def test_stop_listener_proxy
119
119
  button
120
-
120
+
121
121
  # Calling stop on a child part, when only it is listening, should call stop on the register too.
122
122
  mock = Minitest::Mock.new.expect :call, nil
123
123
  part.stub(:stop, mock) do
124
124
  button.stop
125
125
  end
126
126
  mock.verify
127
-
127
+
128
128
  # Check listener tracking is correct.
129
129
  assert_equal Array.new(options[:bytes] * 8) { false }, part.instance_variable_get(:@listening_pins)
130
130
  refute part.any_listening
@@ -16,7 +16,7 @@ class OutputRegisterTest < Minitest::Test
16
16
  def part
17
17
  @part ||= Denko::SPI::OutputRegister.new(options)
18
18
  end
19
-
19
+
20
20
  def led
21
21
  @led ||= Denko::LED.new(board: part, pin: 0)
22
22
  end
@@ -26,53 +26,42 @@ class OutputRegisterTest < Minitest::Test
26
26
  mock = Minitest::Mock.new.expect :call, nil, [9], write: [255,127], frequency: 800000, mode: 2, bit_order: :lsbfirst
27
27
  bus.stub(:transfer, mock) do
28
28
  arr = Array.new(16) { 1 }; arr[7] = 0
29
- part.instance_variable_set(:@state, arr)
29
+ part.instance_variable_set(:@state, arr)
30
30
  part.write
31
31
  end
32
32
  mock.verify
33
33
  end
34
-
35
- def test_state_setup
36
- assert_equal part.instance_variable_get(:@write_delay), 0.001
37
- assert_equal part.instance_variable_get(:@buffer_writes), true
38
- end
39
-
40
- def test_write_buffering_control
41
- new_part = Denko::SPI::OutputRegister.new(options.merge(buffer_writes: false, write_delay: 0.5))
42
- assert_equal new_part.instance_variable_get(:@write_delay), 0.5
43
- assert_equal new_part.instance_variable_get(:@buffer_writes), false
44
- end
45
-
34
+
46
35
  def test_updates_and_writes_state_for_children
47
36
  led
48
-
37
+
49
38
  mock = Minitest::Mock.new.expect :call, nil, [9], write: [0, 1], frequency: 800000, mode: 2, bit_order: :lsbfirst
50
39
  bus.stub(:transfer, mock) do
51
40
  led.on
52
41
  sleep 0.050
53
42
  end
54
43
  mock.verify
55
-
44
+
56
45
  expected_state = Array.new(options[:bytes] * 8) { |i| 0 }
57
46
  expected_state[0] = 1
58
47
 
59
48
  assert_equal expected_state, part.state
60
49
  end
61
-
50
+
62
51
  def test_implements_digital_read_for_children
63
52
  led
64
-
53
+
65
54
  mock = Minitest::Mock.new.expect :call, nil, [0]
66
55
  part.stub(:digital_read, mock) do
67
56
  led.board.digital_read(led.pin)
68
57
  end
69
58
  mock.verify
70
59
  end
71
-
60
+
72
61
  def test_bit_and_byte_orders_correct
73
62
  part.instance_variable_set(:@bytes, 2)
74
63
  bit_array = "0101010100001111".split("")
75
-
64
+
76
65
  mock = Minitest::Mock.new.expect :call, nil, [9], write: [0b11110000, 0b10101010], frequency: 800000, mode: 2, bit_order: :lsbfirst
77
66
  bus.stub(:transfer, mock) do
78
67
  part.instance_variable_set(:@state, bit_array)
@@ -80,14 +69,7 @@ class OutputRegisterTest < Minitest::Test
80
69
  sleep 0.002
81
70
  end
82
71
  mock.verify
83
-
72
+
84
73
  assert_equal part.state, bit_array
85
74
  end
86
-
87
- def test_disable_buffering
88
- part.instance_variable_set(:@buffer_writes, false)
89
- part.instance_variable_set(:@write_delay, 1)
90
- led.on
91
- assert_nil part.thread
92
- end
93
75
  end
@@ -0,0 +1,53 @@
1
+ require_relative '../test_helper'
2
+
3
+ class SPITesterMulti
4
+ include Denko::SPI::Peripheral::MultiPin
5
+
6
+ def initialize_pins(options={})
7
+ super(options)
8
+ proxy_pin :other_pin, Denko::DigitalIO::Output, board: bus.board
9
+ end
10
+
11
+ def some_callback(data)
12
+ end
13
+ end
14
+
15
+ class SPIPeripheralMultiPinTest < Minitest::Test
16
+ def board
17
+ @board ||= BoardMock.new
18
+ end
19
+
20
+ def bus
21
+ @bus ||= Denko::SPI::Bus.new(board: board)
22
+ end
23
+
24
+ def options
25
+ { bus: bus, pins: {select: 9, other_pin: 10}, spi_frequency: 800000, spi_mode: 2, spi_bit_order: :lsbfirst}
26
+ end
27
+
28
+ def part
29
+ @part ||= SPITesterMulti.new(options)
30
+ end
31
+
32
+ def test_string_data_converts_to_bytes_for_callbacks
33
+ part.on_data do |bytes|
34
+ part.some_callback(bytes)
35
+ end
36
+ mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
37
+ part.stub(:some_callback, mock) do
38
+ board.update("#{part.select.pin}:127,255")
39
+ end
40
+ mock.verify
41
+ end
42
+
43
+ def test_array_data_reaches_callbacks
44
+ part.on_data do |bytes|
45
+ part.some_callback(bytes)
46
+ end
47
+ mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
48
+ part.stub(:some_callback, mock) do
49
+ part.select.update([127,255])
50
+ end
51
+ mock.verify
52
+ end
53
+ end
@@ -0,0 +1,48 @@
1
+ require_relative '../test_helper'
2
+
3
+ class SPITester
4
+ include Denko::SPI::Peripheral::SinglePin
5
+
6
+ def some_callback(data)
7
+ end
8
+ end
9
+
10
+ class SPIPeripheralSinglePinTest < Minitest::Test
11
+ def board
12
+ @board ||= BoardMock.new
13
+ end
14
+
15
+ def bus
16
+ @bus ||= Denko::SPI::Bus.new(board: board)
17
+ end
18
+
19
+ def options
20
+ { bus: bus, pin: 9, spi_frequency: 800000, spi_mode: 2, spi_bit_order: :lsbfirst}
21
+ end
22
+
23
+ def part
24
+ @part ||= SPITester.new(options)
25
+ end
26
+
27
+ def test_string_data_converts_to_bytes_for_callbacks
28
+ part.on_data do |bytes|
29
+ part.some_callback(bytes)
30
+ end
31
+ mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
32
+ part.stub(:some_callback, mock) do
33
+ board.update("#{part.pin}:127,255")
34
+ end
35
+ mock.verify
36
+ end
37
+
38
+ def test_array_data_reaches_callbacks
39
+ part.on_data do |bytes|
40
+ part.some_callback(bytes)
41
+ end
42
+ mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
43
+ part.stub(:some_callback, mock) do
44
+ part.update([127,255])
45
+ end
46
+ mock.verify
47
+ end
48
+ end
data/test/test_helper.rb CHANGED
@@ -18,7 +18,6 @@ Denko::AnalogIO::ADS1118
18
18
  Denko::AnalogIO::Input
19
19
  Denko::AnalogIO::Output
20
20
  Denko::AnalogIO::Potentiometer
21
- Denko::AnalogIO::Sensor
22
21
 
23
22
  # Behaviors
24
23
  # Not needed, since every behavior will be included by at least one class.
@@ -68,15 +67,13 @@ Denko::OneWire::Helper
68
67
 
69
68
  # Pulse IO
70
69
  Denko::PulseIO::Buzzer
71
- Denko::PulseIO::IRTransmitter
70
+ Denko::PulseIO::IROutput
72
71
  Denko::PulseIO::PWMOutput
73
72
 
74
73
  # RTC
75
74
  Denko::RTC::DS3231
76
75
 
77
76
  # Sensor
78
- Denko::Sensor::Temperature
79
- Denko::Sensor::Humidity
80
77
  Denko::Sensor::BME280
81
78
  Denko::Sensor::BMP280
82
79
  Denko::Sensor::DHT
@@ -155,13 +152,6 @@ class BoardMock < Denko::Board
155
152
 
156
153
  WAITING_ON_READ_KEYS = [:read, :bus_controller, :board_proxy, :force_udpate]
157
154
 
158
- def component_exists_for_pin(pin)
159
- self.components.each do |component|
160
- return component if component.pin == pin
161
- end
162
- false
163
- end
164
-
165
155
  def waiting_on_read(component)
166
156
  WAITING_ON_READ_KEYS.each do |key|
167
157
  return true if component.callbacks[key]
@@ -169,6 +159,16 @@ class BoardMock < Denko::Board
169
159
  false
170
160
  end
171
161
 
162
+ def single_pin_component_exists(pin)
163
+ return single_pin_components[pin]
164
+ false
165
+ end
166
+
167
+ def hw_i2c_exists(index)
168
+ return hw_i2c_comps[index]
169
+ false
170
+ end
171
+
172
172
  #
173
173
  # Inject a message into the Board instance as if it were coming from the phsyical board.
174
174
  # Use this to mock input data for the blocking #read pattern in the Reader behavior.
@@ -179,36 +179,39 @@ class BoardMock < Denko::Board
179
179
  component = false
180
180
  while !component
181
181
  sleep(0.001)
182
- component = component_exists_for_pin(pin)
182
+ component = single_pin_component_exists(pin)
183
183
  end
184
+ inject_read(component, "#{pin}:#{message}")
185
+ end
186
+ end
184
187
 
185
- # Wait for the component to have a "WAITING_ON_READ" callback.
186
- sleep(0.001) while !component.callback_mutex
187
- sleep(0.001) while !component.callbacks
188
- sleep(0.001) while !waiting_on_read(component)
189
-
190
- # Then inject the message.
191
- @read_injection_mutex.synchronize do
192
- self.update("#{pin}:#{message}")
188
+ def inject_read_for_i2c(index, message)
189
+ Thread.new do
190
+ # Wait for a component to be added.
191
+ component = false
192
+ while !component
193
+ sleep(0.001)
194
+ component = hw_i2c_exists(index)
193
195
  end
196
+ inject_read(component, "I2C#{index}:#{message}")
194
197
  end
195
198
  end
196
199
 
197
- #
198
- # Inject a message into the Board instance as if it were coming from the phsyical board.
199
- # Use this to mock input data for the blocking #read pattern in the Reader behavior.
200
- #
201
200
  def inject_read_for_component(component, pin, message)
202
201
  Thread.new do
203
- # Wait for the component to have a "WAITING_ON_READ" callback.
204
- sleep(0.001) while !component.callback_mutex
205
- sleep(0.001) while !component.callbacks
206
- sleep(0.001) while !waiting_on_read(component)
207
-
208
- # Then inject the message.
209
- @read_injection_mutex.synchronize do
210
- self.update("#{pin}:#{message}")
211
- end
202
+ inject_read(component, "#{pin}:#{message}")
203
+ end
204
+ end
205
+
206
+ def inject_read(component, string)
207
+ # Wait for the component to have a "WAITING_ON_READ" callback.
208
+ sleep(0.001) while !component.callback_mutex
209
+ sleep(0.001) while !component.callbacks
210
+ sleep(0.001) while !waiting_on_read(component)
211
+
212
+ # Then inject the message.
213
+ @read_injection_mutex.synchronize do
214
+ self.update(string)
212
215
  end
213
216
  end
214
217
  end