denko 0.13.6 → 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 (499) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{build_avr.yml → build_atmega_avr.yml} +19 -18
  3. data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +19 -18
  4. data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +18 -17
  5. data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +19 -18
  6. data/.github/workflows/build_esp32.yml +19 -18
  7. data/.github/workflows/build_esp32c3.yml +58 -0
  8. data/.github/workflows/build_esp32c6.yml +59 -0
  9. data/.github/workflows/build_esp32h2.yml +58 -0
  10. data/.github/workflows/build_esp32s2.yml +59 -0
  11. data/.github/workflows/build_esp32s3.yml +59 -0
  12. data/.github/workflows/build_esp8266.yml +16 -15
  13. data/.github/workflows/build_ra4m1.yml +17 -16
  14. data/.github/workflows/build_rp2040.yml +19 -17
  15. data/.github/workflows/ruby.yml +20 -20
  16. data/CHANGELOG.md +398 -11
  17. data/DEPS_CLI.md +16 -16
  18. data/DEPS_IDE.md +39 -39
  19. data/MICROCONTROLLERS.md +103 -0
  20. data/PERIPHERALS.md +178 -0
  21. data/README.md +73 -58
  22. data/Rakefile +1 -1
  23. data/build +1 -1
  24. data/denko.gemspec +11 -3
  25. data/lib/denko/analog_io/ads1100.rb +127 -0
  26. data/lib/denko/analog_io/ads1115.rb +8 -25
  27. data/lib/denko/analog_io/ads1118.rb +12 -27
  28. data/lib/denko/analog_io/ads111x.rb +39 -21
  29. data/lib/denko/analog_io/input.rb +29 -55
  30. data/lib/denko/analog_io/input_helper.rb +42 -0
  31. data/lib/denko/analog_io/joystick.rb +87 -0
  32. data/lib/denko/analog_io/output.rb +5 -5
  33. data/lib/denko/analog_io/potentiometer.rb +3 -9
  34. data/lib/denko/analog_io.rb +22 -7
  35. data/lib/denko/behaviors/board_proxy.rb +13 -1
  36. data/lib/denko/behaviors/bus_controller.rb +3 -1
  37. data/lib/denko/behaviors/bus_controller_addressed.rb +1 -0
  38. data/lib/denko/behaviors/bus_peripheral.rb +3 -4
  39. data/lib/denko/behaviors/bus_peripheral_addressed.rb +8 -6
  40. data/lib/denko/behaviors/callbacks.rb +18 -14
  41. data/lib/denko/behaviors/component.rb +12 -14
  42. data/lib/denko/behaviors/input_pin.rb +14 -15
  43. data/lib/denko/behaviors/lifecycle.rb +51 -0
  44. data/lib/denko/behaviors/listener.rb +9 -3
  45. data/lib/denko/behaviors/multi_pin.rb +22 -20
  46. data/lib/denko/behaviors/output_pin.rb +9 -4
  47. data/lib/denko/behaviors/poller.rb +11 -2
  48. data/lib/denko/behaviors/reader.rb +109 -21
  49. data/lib/denko/behaviors/single_pin.rb +3 -4
  50. data/lib/denko/behaviors/state.rb +24 -13
  51. data/lib/denko/behaviors/subcomponents.rb +72 -12
  52. data/lib/denko/behaviors/threaded.rb +19 -8
  53. data/lib/denko/behaviors.rb +36 -22
  54. data/lib/denko/board/core.rb +36 -18
  55. data/lib/denko/board/eeprom.rb +1 -1
  56. data/lib/denko/board/i2c.rb +15 -15
  57. data/lib/denko/board/i2c_bit_bang.rb +53 -0
  58. data/lib/denko/board/infrared.rb +6 -6
  59. data/lib/denko/board/led_array.rb +6 -5
  60. data/lib/denko/board/map.rb +6 -2
  61. data/lib/denko/board/one_wire.rb +3 -3
  62. data/lib/denko/board/spi.rb +35 -30
  63. data/lib/denko/board/spi_bit_bang.rb +14 -15
  64. data/lib/denko/board.rb +41 -36
  65. data/lib/denko/connection/binary_echo.rb +17 -0
  66. data/lib/denko/connection/flow_control.rb +12 -16
  67. data/lib/denko/connection/handshake.rb +2 -0
  68. data/lib/denko/connection/serial.rb +5 -5
  69. data/lib/denko/digital_io/button.rb +4 -0
  70. data/lib/denko/digital_io/c_bit_bang.rb +15 -0
  71. data/lib/denko/digital_io/input.rb +4 -5
  72. data/lib/denko/digital_io/output.rb +19 -10
  73. data/lib/denko/digital_io/pcf8574.rb +114 -0
  74. data/lib/denko/digital_io/relay.rb +2 -0
  75. data/lib/denko/digital_io/rotary_encoder.rb +83 -61
  76. data/lib/denko/digital_io.rb +24 -5
  77. data/lib/denko/display/canvas.rb +350 -157
  78. data/lib/denko/display/font/bmp_5x7.rb +142 -0
  79. data/lib/denko/display/font/bmp_6x8.rb +142 -0
  80. data/lib/denko/display/font/bmp_8x16.rb +141 -0
  81. data/lib/denko/display/font.rb +22 -0
  82. data/lib/denko/display/hd44780.rb +152 -105
  83. data/lib/denko/display/il0373.rb +186 -0
  84. data/lib/denko/display/mono_oled.rb +193 -0
  85. data/lib/denko/display/pcd8544.rb +154 -0
  86. data/lib/denko/display/pixel_common.rb +83 -0
  87. data/lib/denko/display/sh1106.rb +38 -0
  88. data/lib/denko/display/sh1107.rb +10 -0
  89. data/lib/denko/display/spi_common.rb +35 -0
  90. data/lib/denko/display/spi_epaper_common.rb +30 -0
  91. data/lib/denko/display/ssd1306.rb +6 -168
  92. data/lib/denko/display/ssd1680.rb +14 -0
  93. data/lib/denko/display/ssd1681.rb +8 -0
  94. data/lib/denko/display/ssd168x.rb +227 -0
  95. data/lib/denko/display/st7302.rb +207 -0
  96. data/lib/denko/display/st7565.rb +166 -0
  97. data/lib/denko/display.rb +40 -3
  98. data/lib/denko/eeprom/at24c.rb +67 -0
  99. data/lib/denko/eeprom/board.rb +69 -0
  100. data/lib/denko/eeprom.rb +15 -1
  101. data/lib/denko/helpers/engine_check.rb +13 -0
  102. data/lib/denko/helpers/mutex_stub.rb +13 -0
  103. data/lib/denko/helpers.rb +6 -0
  104. data/lib/denko/i2c/bit_bang.rb +32 -0
  105. data/lib/denko/i2c/bus.rb +8 -36
  106. data/lib/denko/i2c/bus_common.rb +50 -0
  107. data/lib/denko/i2c/peripheral.rb +32 -19
  108. data/lib/denko/i2c.rb +17 -2
  109. data/lib/denko/led/apa102.rb +42 -30
  110. data/lib/denko/led/base.rb +13 -2
  111. data/lib/denko/led/rgb.rb +18 -14
  112. data/lib/denko/led/seven_segment.rb +24 -9
  113. data/lib/denko/led/ws2812.rb +10 -7
  114. data/lib/denko/led.rb +17 -8
  115. data/lib/denko/message.rb +5 -0
  116. data/lib/denko/motor/{stepper.rb → a3967.rb} +12 -15
  117. data/lib/denko/motor/l298.rb +11 -10
  118. data/lib/denko/motor/servo.rb +37 -15
  119. data/lib/denko/motor.rb +16 -3
  120. data/lib/denko/one_wire/bus.rb +31 -23
  121. data/lib/denko/one_wire/bus_enumerator.rb +25 -14
  122. data/lib/denko/one_wire/helper.rb +4 -2
  123. data/lib/denko/one_wire/peripheral.rb +0 -3
  124. data/lib/denko/one_wire.rb +18 -5
  125. data/lib/denko/pulse_io/buzzer.rb +11 -9
  126. data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +6 -5
  127. data/lib/denko/pulse_io/pwm_output.rb +94 -15
  128. data/lib/denko/pulse_io.rb +17 -3
  129. data/lib/denko/rtc/ds3231.rb +13 -14
  130. data/lib/denko/rtc.rb +14 -1
  131. data/lib/denko/sensor/aht.rb +35 -38
  132. data/lib/denko/sensor/bme280.rb +76 -92
  133. data/lib/denko/sensor/bmp180.rb +46 -48
  134. data/lib/denko/sensor/dht.rb +34 -7
  135. data/lib/denko/sensor/ds18b20.rb +41 -34
  136. data/lib/denko/sensor/hcsr04.rb +7 -5
  137. data/lib/denko/sensor/hdc1080.rb +174 -0
  138. data/lib/denko/sensor/helper.rb +37 -0
  139. data/lib/denko/sensor/htu21d.rb +57 -57
  140. data/lib/denko/sensor/htu31d.rb +36 -36
  141. data/lib/denko/sensor/jsnsr04t.rb +49 -0
  142. data/lib/denko/sensor/qmp6988.rb +34 -48
  143. data/lib/denko/sensor/rcwl9620.rb +3 -5
  144. data/lib/denko/sensor/sht3x.rb +27 -24
  145. data/lib/denko/sensor/sht4x.rb +125 -0
  146. data/lib/denko/sensor/vl53l0x.rb +58 -0
  147. data/lib/denko/sensor.rb +33 -16
  148. data/lib/denko/spi/base_register.rb +25 -21
  149. data/lib/denko/spi/bit_bang.rb +17 -51
  150. data/lib/denko/spi/bus.rb +15 -29
  151. data/lib/denko/spi/bus_common.rb +33 -0
  152. data/lib/denko/spi/input_register.rb +37 -31
  153. data/lib/denko/spi/output_register.rb +33 -39
  154. data/lib/denko/spi/peripheral.rb +81 -14
  155. data/lib/denko/spi.rb +21 -6
  156. data/lib/denko/uart/bit_bang.rb +7 -30
  157. data/lib/denko/uart/common.rb +33 -0
  158. data/lib/denko/uart/hardware.rb +10 -34
  159. data/lib/denko/uart.rb +16 -2
  160. data/lib/denko/version.rb +1 -1
  161. data/lib/denko.rb +23 -16
  162. data/lib/denko_cli/generator.rb +2 -2
  163. data/lib/denko_cli/packages.rb +8 -10
  164. data/lib/denko_cli/targets.rb +13 -13
  165. data/lib/denko_cli/targets.txt +23 -24
  166. data/lib/denko_cli/usage.txt +1 -1
  167. data/src/denko_ethernet.ino +0 -14
  168. data/src/denko_serial.ino +0 -14
  169. data/src/denko_wifi.ino +6 -15
  170. data/src/lib/Denko.cpp +65 -16
  171. data/src/lib/Denko.h +46 -30
  172. data/src/lib/DenkoCoreIO.cpp +57 -102
  173. data/src/lib/DenkoDefines.h +32 -46
  174. data/src/lib/DenkoI2C.cpp +54 -45
  175. data/src/lib/DenkoI2CBB.cpp +238 -0
  176. data/src/lib/DenkoIROut.cpp +12 -7
  177. data/src/lib/DenkoLEDArray.cpp +29 -13
  178. data/src/lib/DenkoSPI.cpp +36 -33
  179. data/src/lib/DenkoSPIBB.cpp +19 -20
  180. data/target.yml +37 -2
  181. data/test/analog_io/input_test.rb +1 -1
  182. data/test/analog_io/potentiometer_test.rb +12 -12
  183. data/test/behaviors/board_proxy_test.rb +1 -1
  184. data/test/behaviors/bus_peripheral_test.rb +4 -4
  185. data/test/behaviors/callbacks_test.rb +28 -10
  186. data/test/behaviors/component_test.rb +32 -14
  187. data/test/behaviors/input_pin_test.rb +14 -9
  188. data/test/behaviors/multi_pin_test.rb +14 -4
  189. data/test/behaviors/output_pin_test.rb +11 -8
  190. data/test/behaviors/poller_test.rb +1 -0
  191. data/test/behaviors/reader_test.rb +3 -2
  192. data/test/behaviors/subcomponents_test.rb +22 -2
  193. data/test/board/board_test.rb +9 -9
  194. data/test/board/core_test.rb +15 -11
  195. data/test/board/i2c_test.rb +39 -33
  196. data/test/board/infrared_test.rb +1 -1
  197. data/test/board/message_test.rb +17 -11
  198. data/test/board/one_wire_test.rb +25 -14
  199. data/test/board/spi_test.rb +45 -29
  200. data/test/digital_io/button_test.rb +15 -0
  201. data/test/digital_io/input_test.rb +2 -2
  202. data/test/digital_io/relay_test.rb +18 -0
  203. data/test/digital_io/rotary_encoder_test.rb +80 -60
  204. data/test/display/canvas_test.rb +306 -0
  205. data/test/display/hd44780_test.rb +34 -7
  206. data/test/eeprom/board_test.rb +45 -0
  207. data/test/helpers/mruby_minitest.rb +95 -0
  208. data/test/helpers/mruby_runner.rb +13 -0
  209. data/test/i2c/bus_test.rb +108 -29
  210. data/test/i2c/peripheral_test.rb +38 -19
  211. data/test/led/apa102_test.rb +24 -0
  212. data/test/led/base_test.rb +2 -1
  213. data/test/led/rgb_test.rb +9 -9
  214. data/test/led/seven_segment_test.rb +7 -7
  215. data/test/motor/{stepper_test.rb → a3967_test.rb} +4 -4
  216. data/test/motor/servo_test.rb +1 -1
  217. data/test/one_wire/bus_enumerator_test.rb +1 -1
  218. data/test/one_wire/bus_test.rb +43 -35
  219. data/test/one_wire/peripheral_test.rb +5 -17
  220. data/test/pulse_io/buzzer_test.rb +7 -4
  221. data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +15 -10
  222. data/test/pulse_io/pwm_output_test.rb +74 -18
  223. data/test/rtc/ds3231_test.rb +13 -14
  224. data/test/sensor/dht_test.rb +12 -12
  225. data/test/sensor/ds18b20_test.rb +4 -8
  226. data/test/spi/bitbang_test.rb +27 -0
  227. data/test/spi/bus_test.rb +24 -34
  228. data/test/spi/input_register_test.rb +17 -17
  229. data/test/spi/output_register_test.rb +10 -28
  230. data/test/spi/peripheral_test.rb +73 -0
  231. data/test/test_helper.rb +44 -121
  232. data/vendor/board-maps/BoardMap.h +678 -54
  233. data/vendor/board-maps/lib/header_parser.rb +12 -2
  234. data/vendor/board-maps/yaml/ADAFRUIT_CAMERA_ESP32S3.yml +2 -2
  235. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32C6.yml +15 -0
  236. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +1 -1
  237. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_ADALOGGER.yml +44 -0
  238. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +1 -0
  239. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +1 -0
  240. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +1 -0
  241. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +1 -0
  242. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +1 -0
  243. data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
  244. data/vendor/board-maps/yaml/AMKEN_BB.yml +48 -0
  245. data/vendor/board-maps/yaml/AMKEN_ES.yml +48 -0
  246. data/vendor/board-maps/yaml/AMKEN_REVELOP.yml +48 -0
  247. data/vendor/board-maps/yaml/AMKEN_REVELOP_PLUS.yml +48 -0
  248. data/vendor/board-maps/yaml/ASL_CAN_X2.yml +41 -0
  249. data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
  250. data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
  251. data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
  252. data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
  253. data/vendor/board-maps/yaml/BLING.yml +25 -0
  254. data/vendor/board-maps/yaml/BRIDGETEK_IDM2040_7A.yml +48 -0
  255. data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +13 -1
  256. data/vendor/board-maps/yaml/Breadstick_Raspberry.yml +31 -0
  257. data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
  258. data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
  259. data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
  260. data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
  261. data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -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/EDGES3D.yml +25 -0
  267. data/vendor/board-maps/yaml/ELECROW_CROWPANEL_7.yml +8 -0
  268. data/vendor/board-maps/yaml/ESP32C2_DEV.yml +12 -0
  269. data/vendor/board-maps/yaml/ESP32C3_DEVKIT_LIPO.yml +14 -0
  270. data/vendor/board-maps/yaml/ESP32C6_DEV.yml +14 -0
  271. data/vendor/board-maps/yaml/ESP32C6_EVB.yml +15 -0
  272. data/vendor/board-maps/yaml/ESP32C6_QWIIC_POCKET.yml +15 -0
  273. data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +14 -0
  274. data/vendor/board-maps/yaml/ESP32H2_DEV.yml +12 -0
  275. data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +12 -0
  276. data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
  277. data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +1 -1
  278. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +43 -0
  279. data/vendor/board-maps/yaml/ESP32S3_DEVKIT_LIPO.yml +42 -0
  280. data/vendor/board-maps/yaml/ESP32S3_POWERFEATHER.yml +22 -0
  281. data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
  282. data/vendor/board-maps/yaml/ESP32_SBC_FABGL.yml +35 -0
  283. data/vendor/board-maps/yaml/EVN_ALPHA.yml +48 -0
  284. data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
  285. data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
  286. data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
  287. data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +13 -0
  288. data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
  289. data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -0
  290. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
  291. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
  292. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
  293. data/vendor/board-maps/yaml/HELTEC_WIFI_LORA_32_V3.yml +42 -0
  294. data/vendor/board-maps/yaml/HELTEC_WIRELESS_BRIDGE.yml +8 -0
  295. data/vendor/board-maps/yaml/HELTEC_WIRELESS_MINI_SHELL.yml +13 -0
  296. data/vendor/board-maps/yaml/HELTEC_WIRELESS_PAPER.yml +42 -0
  297. data/vendor/board-maps/yaml/HELTEC_WIRELESS_SHELL_V3.yml +42 -0
  298. data/vendor/board-maps/yaml/HELTEC_WIRELESS_STICK_LITE_V3.yml +30 -0
  299. data/vendor/board-maps/yaml/HELTEC_WIRELESS_TRACKER.yml +41 -0
  300. data/vendor/board-maps/yaml/HT_DE01.yml +42 -0
  301. data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
  302. data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
  303. data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
  304. data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
  305. data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
  306. data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
  307. data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
  308. data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
  309. data/vendor/board-maps/yaml/LILYGO_T3S3_LR1121.yml +9 -0
  310. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1262.yml +9 -0
  311. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1276.yml +9 -0
  312. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1278.yml +9 -0
  313. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280.yml +9 -0
  314. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280PA.yml +8 -0
  315. data/vendor/board-maps/yaml/LILYGO_T_ETH_LITE.yml +21 -0
  316. data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
  317. data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +13 -0
  318. data/vendor/board-maps/yaml/LOLIN_S3.yml +1 -0
  319. data/vendor/board-maps/yaml/LOLIN_S3_MINI_PRO.yml +40 -0
  320. data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -2
  321. data/vendor/board-maps/yaml/M5STACK_CAPSULE.yml +8 -0
  322. data/vendor/board-maps/yaml/M5STACK_CARDPUTER.yml +8 -0
  323. data/vendor/board-maps/yaml/M5STACK_DIAL.yml +8 -0
  324. data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
  325. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -2
  326. data/vendor/board-maps/yaml/M5STACK_NANOC6.yml +17 -0
  327. data/vendor/board-maps/yaml/M5STACK_PAPER.yml +9 -0
  328. data/vendor/board-maps/yaml/M5STACK_POE_CAM.yml +5 -0
  329. data/vendor/board-maps/yaml/M5STACK_STAMP_C3.yml +13 -0
  330. data/vendor/board-maps/yaml/M5STACK_STAMP_S3.yml +4 -0
  331. data/vendor/board-maps/yaml/{M5Stick_C.yml → M5STACK_STICKC.yml} +0 -1
  332. data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS.yml +9 -0
  333. data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS2.yml +9 -0
  334. data/vendor/board-maps/yaml/M5STACK_TOUGH.yml +9 -0
  335. data/vendor/board-maps/yaml/M5STACK_UNIT_CAM.yml +10 -0
  336. data/vendor/board-maps/yaml/M5STACK_UNIT_CAMS3.yml +4 -0
  337. data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -1
  338. data/vendor/board-maps/yaml/MAKERGO_C3_SUPERMINI.yml +14 -0
  339. data/vendor/board-maps/yaml/MARBLE_PICO.yml +48 -0
  340. data/vendor/board-maps/yaml/METEHOCA_AKANA_R1.yml +46 -0
  341. data/vendor/board-maps/yaml/NAMINO_BIANCO.yml +13 -0
  342. data/vendor/board-maps/yaml/NEBULAS3.yml +0 -1
  343. data/vendor/board-maps/yaml/NEWSAN_ARCHI.yml +48 -0
  344. data/vendor/board-maps/yaml/NOLOGO_ESP32C3_SUPER_MINI.yml +14 -0
  345. data/vendor/board-maps/yaml/NOLOGO_ESP32S3_PICO.yml +12 -0
  346. data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_16MB.yml +48 -0
  347. data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_2MB.yml +48 -0
  348. data/vendor/board-maps/yaml/OMGS3.yml +25 -0
  349. data/vendor/board-maps/yaml/OPTA_ANALOG.yml +7 -0
  350. data/vendor/board-maps/yaml/OPTA_DIGITAL.yml +5 -0
  351. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
  352. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
  353. data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
  354. data/vendor/board-maps/yaml/PINTRONIX_PINMAX.yml +42 -0
  355. data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -1
  356. data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +12 -0
  357. data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
  358. data/vendor/board-maps/yaml/SPARKFUN_MICROMOD_RP2040.yml +48 -0
  359. data/vendor/board-maps/yaml/SPARKFUN_PRO_MICRO_ESP32C3.yml +24 -0
  360. data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
  361. data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
  362. data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
  363. data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
  364. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER.yml +31 -0
  365. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +14 -0
  366. data/vendor/board-maps/yaml/TINYC6.yml +25 -0
  367. data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
  368. data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
  369. data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
  370. data/vendor/board-maps/yaml/UPESY_EDU_ESP32.yml +28 -0
  371. data/vendor/board-maps/yaml/UPESY_ESP32C3_BASIC.yml +13 -0
  372. data/vendor/board-maps/yaml/UPESY_ESP32C3_MINI.yml +12 -0
  373. data/vendor/board-maps/yaml/UPESY_ESP32S3_BASIC.yml +42 -0
  374. data/vendor/board-maps/yaml/VIRALINK_GATE32_01.yml +6 -0
  375. data/vendor/board-maps/yaml/VIRALINK_GATE32_11.yml +7 -0
  376. data/vendor/board-maps/yaml/WAVESHARE_ESP32S3_TOUCH_LCD_128.yml +8 -0
  377. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
  378. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
  379. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
  380. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
  381. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
  382. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
  383. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
  384. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
  385. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
  386. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
  387. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
  388. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
  389. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
  390. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
  391. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
  392. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
  393. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
  394. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
  395. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
  396. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
  397. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
  398. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
  399. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
  400. data/vendor/board-maps/yaml/WAVESHARE_RP2040_MATRIX.yml +48 -0
  401. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +1 -0
  402. data/vendor/board-maps/yaml/WAVESHARE_RP2040_PIZERO.yml +47 -0
  403. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +1 -0
  404. data/vendor/board-maps/yaml/WEACT_STUDIO_ESP32C3.yml +14 -0
  405. data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
  406. data/vendor/board-maps/yaml/WT32_SC01_PLUS.yml +7 -0
  407. data/vendor/board-maps/yaml/WiFiduinoV2.yml +1 -0
  408. data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -1
  409. data/vendor/board-maps/yaml/XIAO_ESP32C6.yml +22 -0
  410. data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
  411. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
  412. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
  413. data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
  414. data/vendor/board-maps/yaml/mercury.yml +20 -0
  415. data/vendor/board-maps/yaml/unphone9.yml +8 -0
  416. metadata +259 -105
  417. data/.vscode/settings.json +0 -5
  418. data/.vscode/tasks.json +0 -20
  419. data/HARDWARE.md +0 -264
  420. data/benchmarks/i2c_ssd1306_refresh.rb +0 -84
  421. data/examples/advanced/m5_env.rb +0 -48
  422. data/examples/advanced/rotary_encoder_mac_volume.rb +0 -48
  423. data/examples/advanced/ssd1306_time_temp_rh.rb +0 -48
  424. data/examples/analog_io/ads1115.rb +0 -57
  425. data/examples/analog_io/ads1118.rb +0 -73
  426. data/examples/analog_io/dac_loopback.rb +0 -34
  427. data/examples/analog_io/input.rb +0 -55
  428. data/examples/connection/tcp.rb +0 -34
  429. data/examples/digital_io/button.rb +0 -13
  430. data/examples/digital_io/rotary_encoder.rb +0 -26
  431. data/examples/display/hd44780.png +0 -0
  432. data/examples/display/hd44780.rb +0 -39
  433. data/examples/display/ssd1306.rb +0 -40
  434. data/examples/display/ssd1306_s2_pico.rb +0 -29
  435. data/examples/eeprom/built_in.rb +0 -32
  436. data/examples/i2c/search.rb +0 -55
  437. data/examples/led/apa102_bounce.rb +0 -33
  438. data/examples/led/apa102_breathe.rb +0 -45
  439. data/examples/led/builtin_blink.rb +0 -12
  440. data/examples/led/seven_segment_char_echo.rb +0 -15
  441. data/examples/led/ws2812_bounce.rb +0 -32
  442. data/examples/led/ws2812_builtin_blink.rb +0 -21
  443. data/examples/motor/l298.rb +0 -43
  444. data/examples/motor/servo.rb +0 -16
  445. data/examples/motor/stepper.png +0 -0
  446. data/examples/motor/stepper.rb +0 -43
  447. data/examples/pulse_io/buzzer.rb +0 -30
  448. data/examples/pulse_io/ir_transmitter.rb +0 -55
  449. data/examples/rtc/ds3231.rb +0 -48
  450. data/examples/sensor/aht10.rb +0 -19
  451. data/examples/sensor/aht20.rb +0 -19
  452. data/examples/sensor/bme280.rb +0 -38
  453. data/examples/sensor/bmp180.rb +0 -22
  454. data/examples/sensor/dht.rb +0 -24
  455. data/examples/sensor/ds18b20.rb +0 -58
  456. data/examples/sensor/generic_pir.rb +0 -25
  457. data/examples/sensor/hcsr04.rb +0 -14
  458. data/examples/sensor/htu21d.rb +0 -54
  459. data/examples/sensor/htu31d.rb +0 -35
  460. data/examples/sensor/neat_tph_readings.rb +0 -26
  461. data/examples/sensor/qmp6988.rb +0 -53
  462. data/examples/sensor/rcwl9620.rb +0 -15
  463. data/examples/sensor/sht3x.rb +0 -34
  464. data/examples/spi/input_register.rb +0 -50
  465. data/examples/spi/output_register.rb +0 -49
  466. data/examples/spi/ssd_through_register.rb +0 -40
  467. data/examples/spi/two_registers.rb +0 -46
  468. data/examples/uart/bit_bang_read.rb +0 -16
  469. data/examples/uart/bit_bang_write.rb +0 -16
  470. data/examples/uart/board_passthrough.rb +0 -34
  471. data/examples/uart/hardware_loopback.rb +0 -16
  472. data/lib/denko/analog_io/sensor.rb +0 -6
  473. data/lib/denko/eeprom/built_in.rb +0 -69
  474. data/lib/denko/fonts.rb +0 -106
  475. data/lib/denko/sensor/virtual.rb +0 -42
  476. data/src/lib/DenkoIROutESP.cpp +0 -26
  477. data/test/eeprom/built_in_test.rb +0 -61
  478. data/tutorial/01-led/led.fzz +0 -0
  479. data/tutorial/01-led/led.pdf +0 -0
  480. data/tutorial/01-led/led.rb +0 -73
  481. data/tutorial/02-button/button.fzz +0 -0
  482. data/tutorial/02-button/button.pdf +0 -0
  483. data/tutorial/02-button/button.rb +0 -64
  484. data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
  485. data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
  486. data/tutorial/03-potentiometer/potentiometer.rb +0 -62
  487. data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
  488. data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
  489. data/tutorial/04-pwm_led/pwm_led.rb +0 -66
  490. data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
  491. data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
  492. data/tutorial/05-rgb_led/rgb_led.rb +0 -58
  493. data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
  494. data/vendor/board-maps/yaml/STAMP_S3.yml +0 -8
  495. /data/vendor/board-maps/yaml/{BRIDGETEK_IDM2040-7A.yml → BRIDGETEK_IDM2040_43A.yml} +0 -0
  496. /data/vendor/board-maps/yaml/{heltec_wifi_32_lora_V3.yml → HELTEC_WIRELESS_STICK_V3.yml} +0 -0
  497. /data/vendor/board-maps/yaml/{M5Stack_Core_ESP32.yml → M5STACK_CORE.yml} +0 -0
  498. /data/vendor/board-maps/yaml/{M5Stamp_Pico.yml → M5STACK_STAMP_PICO.yml} +0 -0
  499. /data/vendor/board-maps/yaml/{M5Stack-Timer-CAM.yml → M5STACK_TIMER_CAM.yml} +0 -0
@@ -6,47 +6,46 @@ 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_component_update(bus, "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
- bus.stub(:_read, mock) do
40
+ bus.stub(:read_nb, 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)]
48
+ part.read_nb
50
49
  part.stub(:update_state, mock) do
51
50
  bus.send(:update, "104-0,0,0,6,1,1,48")
52
51
  end
@@ -2,19 +2,19 @@ require_relative '../test_helper'
2
2
 
3
3
  class DHTTest < Minitest::Test
4
4
  PIN = 1
5
-
5
+
6
6
  # Actual raw data from a sensor
7
7
  GOOD_STRING = "14,82,77,57,26,52,26,57,26,51,32,51,26,57,26,52,72,57,26,67,72,57,26,51,27,56,72,52,77,52,77,51,26,57,72,67,26,52,26,57,26,52,26,57,26,51,31,52,26,57,72,67,26,52,26,56,72,57,26,52,26,57,72,52,77,51,72,67,72,57,72,51,32,51,26,57,26,52,72,57,72,56,72,47"
8
8
  GOOD_ARRAY = [14, 82, 77, 57, 26, 52, 26, 57, 26, 51, 32, 51, 26, 57, 26, 52, 72, 57, 26, 67, 72, 57, 26, 51, 27, 56, 72, 52, 77, 52, 77, 51, 26, 57, 72, 67, 26, 52, 26, 57, 26, 52, 26, 57, 26, 51, 31, 52, 26, 57, 72, 67, 26, 52, 26, 56, 72, 57, 26, 52, 26, 57, 72, 52, 77, 51, 72, 67, 72, 57, 72, 51, 32, 51, 26, 57, 26, 52, 72, 57, 72, 56, 72, 47]
9
9
  SHORT_ARRAY = [1,2,3,4,5,6]
10
-
10
+
11
11
  # Make test data with a bad CRC byte (all 1s = 255).
12
12
  def bad_crc
13
13
  bad_crc = GOOD_ARRAY.dup
14
14
  (67..82).each { |i| bad_crc[i] = 56 }
15
15
  bad_crc
16
16
  end
17
-
17
+
18
18
  def board
19
19
  @board ||= BoardMock.new
20
20
  end
@@ -22,17 +22,17 @@ class DHTTest < Minitest::Test
22
22
  def part
23
23
  @part ||= Denko::Sensor::DHT.new(board: board, pin:PIN)
24
24
  end
25
-
25
+
26
26
  # It should tell the board to do a #pulse_read
27
27
  def test__read
28
28
  part
29
- mock = Minitest::Mock.new.expect(:call, nil, [PIN], reset: board.low, reset_time: 20000, pulse_limit: 84, timeout: 100)
29
+ mock = Minitest::Mock.new.expect(:call, nil, [PIN], reset: board.low, reset_time: 10_000, pulse_limit: 84, timeout: 100)
30
30
  board.stub(:pulse_read, mock) do
31
- part._read
31
+ part.read_nb
32
32
  end
33
33
  mock.verify
34
34
  end
35
-
35
+
36
36
  # Callback pre filter should convert string of bytes to array and call #decode with it.
37
37
  def test_pre_callback_filter
38
38
  part
@@ -41,23 +41,23 @@ class DHTTest < Minitest::Test
41
41
  part.update(GOOD_STRING)
42
42
  end
43
43
  end
44
-
44
+
45
45
  def test_decode
46
46
  # Error message in output if data is missing.
47
47
  result = part.decode(SHORT_ARRAY)
48
48
  assert result.keys.include? :error
49
49
  assert result[:error].match(/missing/i)
50
-
50
+
51
51
  # Error message in output if bad CRC.
52
52
  result = part.decode(bad_crc)
53
53
  assert result.keys.include? :error
54
54
  assert result[:error].match(/crc/i)
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
62
62
  refute part.crc(bad_crc)
63
63
  end
@@ -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
@@ -0,0 +1,27 @@
1
+ require_relative '../test_helper'
2
+
3
+ class TempSpiPeripheral
4
+ include Denko::SPI::Peripheral
5
+ end
6
+
7
+ class SPIBitBangTest < Minitest::Test
8
+ def board
9
+ @board ||= BoardMock.new
10
+ end
11
+
12
+ def part
13
+ @bus ||= Denko::SPI::BitBang.new(board: board, pins: {mosi: 4, miso: 5, clock: 6})
14
+ end
15
+
16
+ def test_no_miso
17
+ no_miso = Denko::SPI::BitBang.new(board: board, pins: {mosi: 4, clock: 6})
18
+ refute no_miso.params[:pins][:input]
19
+ refute no_miso.pins[:input]
20
+ end
21
+
22
+ def test_no_mosi
23
+ no_mosi = Denko::SPI::BitBang.new(board: board, pins: {miso: 5, clock: 6})
24
+ refute no_mosi.params[:pins][:output]
25
+ refute no_mosi.pins[:output]
26
+ end
27
+ end
data/test/spi/bus_test.rb CHANGED
@@ -1,11 +1,7 @@
1
1
  require_relative '../test_helper'
2
2
 
3
3
  class TempSpiPeripheral
4
- def initialize(pin)
5
- @pin = pin
6
- end
7
-
8
- attr_reader :pin
4
+ include Denko::SPI::Peripheral
9
5
  end
10
6
 
11
7
  class SPIBusTest < Minitest::Test
@@ -14,29 +10,45 @@ class SPIBusTest < Minitest::Test
14
10
  end
15
11
 
16
12
  def part
17
- @bus ||= Denko::SPI::Bus.new(board: board)
13
+ @bus ||= Denko::SPI::Bus.new(board: board, index: 5)
18
14
  end
19
15
 
20
16
  PIN = 9
21
17
  OPTIONS = { read: 2, frequency: 800000, mode: 2, bit_order: :lsbfirst }
22
18
 
19
+ def test_automatically_adds_and_removes_component
20
+ obj = TempSpiPeripheral.new(bus: part, pin: 1)
21
+ assert part.components.include?(obj)
22
+
23
+ part.remove_component(obj)
24
+ refute part.components.include?(obj)
25
+ end
26
+
27
+ def test_unique_select_pins
28
+ TempSpiPeripheral.new(bus: part, pin: 1)
29
+
30
+ assert_raises do
31
+ TempSpiPeripheral.new(bus: part, pin: 1)
32
+ end
33
+ end
34
+
23
35
  def test_transfer
24
- mock = Minitest::Mock.new.expect :call, nil, [PIN], **OPTIONS
36
+ mock = Minitest::Mock.new.expect :call, nil, [5, PIN], **OPTIONS
25
37
  board.stub(:spi_transfer, mock) do
26
38
  part.transfer(PIN, **OPTIONS)
27
39
  end
28
40
  mock.verify
29
41
  end
30
-
42
+
31
43
  def test_listen
32
- mock = Minitest::Mock.new.expect :call, nil, [PIN], **OPTIONS
44
+ mock = Minitest::Mock.new.expect :call, nil, [5, PIN], **OPTIONS
33
45
  board.stub(:spi_listen, mock) do
34
46
  part.listen(PIN, **OPTIONS)
35
47
  end
36
48
  mock.verify
37
49
  end
38
-
39
- def test_stop
50
+
51
+ def test_stop_forwarded
40
52
  mock = Minitest::Mock.new.expect :call, nil, [PIN]
41
53
  board.stub(:spi_stop, mock) do
42
54
  part.stop(PIN)
@@ -44,33 +56,11 @@ class SPIBusTest < Minitest::Test
44
56
  mock.verify
45
57
  end
46
58
 
47
- def test_add_and_remove_component
48
- obj = TempSpiPeripheral.new(1)
49
- part.add_component(obj)
50
- assert board.components.include?(obj)
51
-
52
- part.remove_component(obj)
53
- refute board.components.include?(obj)
54
- end
55
-
56
- def test_set_pin_mode
59
+ def test_set_pin_mode_forwarded
57
60
  mock = Minitest::Mock.new.expect :call, nil, [9, :output]
58
61
  board.stub(:set_pin_mode, mock) do
59
62
  part.set_pin_mode(9, :output)
60
63
  end
61
64
  mock.verify
62
65
  end
63
-
64
- def test_unique_select_pins
65
- part.add_component TempSpiPeripheral.new(1)
66
-
67
- assert_raises do
68
- part.add_component TempSpiPeripheral.new(1)
69
- end
70
- end
71
-
72
- def test_no_select_pin
73
- part.add_component TempSpiPeripheral.new(255)
74
- assert_empty part.components
75
- end
76
66
  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,26 +114,26 @@ 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
131
131
  end
132
132
 
133
- def test_gets_reads_through_pin
133
+ def test_gets_reads_through_select
134
134
  mock = Minitest::Mock.new.expect :call, nil, ["127,255"]
135
135
  part.stub(:update, mock) do
136
- board.update("#{part.pin}:127,255")
136
+ board.update("#{part.select.pin}:127,255")
137
137
  end
138
138
  mock.verify
139
139
  end
@@ -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,73 @@
1
+ require_relative '../test_helper'
2
+
3
+ class SPITester
4
+ include Denko::SPI::Peripheral
5
+
6
+ def initialize_pins(options={})
7
+ super(options)
8
+ proxy_pin :other_pin, Denko::DigitalIO::Output
9
+ end
10
+
11
+ def some_callback(data)
12
+ end
13
+ end
14
+
15
+ class SPITesterSingle
16
+ include Denko::SPI::Peripheral
17
+ end
18
+
19
+ class SPIPeripheralTest < Minitest::Test
20
+ def board
21
+ @board ||= BoardMock.new
22
+ end
23
+
24
+ def bus
25
+ @bus ||= Denko::SPI::Bus.new(board: board)
26
+ end
27
+
28
+ def options
29
+ { bus: bus, pins: {select: 9, other_pin: 10}, spi_frequency: 800000, spi_mode: 2, spi_bit_order: :lsbfirst}
30
+ end
31
+
32
+ def part
33
+ @part ||= SPITester.new(options)
34
+ end
35
+
36
+ def test_string_data_converts_to_bytes_for_callbacks
37
+ part.on_data do |bytes|
38
+ part.some_callback(bytes)
39
+ end
40
+ mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
41
+ part.stub(:some_callback, mock) do
42
+ board.update("#{part.select.pin}:127,255")
43
+ end
44
+ mock.verify
45
+ end
46
+
47
+ def test_array_data_reaches_callbacks
48
+ part.on_data do |bytes|
49
+ part.some_callback(bytes)
50
+ end
51
+ mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
52
+ part.stub(:some_callback, mock) do
53
+ part.select.update([127,255])
54
+ end
55
+ mock.verify
56
+ end
57
+
58
+ def test_allows_pin_alone
59
+ part2 = SPITesterSingle.new(bus: bus, pin: 5)
60
+ assert bus.components.include?(part2)
61
+ end
62
+
63
+ def test_subcomponents_attach_to_board_not_bus
64
+ part
65
+ assert board, part.select.board
66
+ assert board, part.other_pin.board
67
+ end
68
+
69
+ def test_added_to_bus
70
+ part
71
+ assert bus.components.include?(part)
72
+ end
73
+ end