denko 0.13.6 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
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