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
@@ -5,8 +5,9 @@ class MultiPinComponent
5
5
 
6
6
  def initialize_pins(options={})
7
7
  require_pin :one
8
- proxy_pin :two, Denko::DigitalIO::Output
9
- proxy_pin :maybe, Denko::DigitalIO::Input, optional: true
8
+ proxy_pin :two, Denko::DigitalIO::Output
9
+ proxy_pin :maybe, Denko::DigitalIO::Input, optional: true
10
+ proxy_pin :other_board, Denko::DigitalIO::Output, board: options[:board2], optional: true
10
11
  end
11
12
  end
12
13
 
@@ -15,9 +16,14 @@ class MultiPinTest < Minitest::Test
15
16
  @board ||= BoardMock.new
16
17
  end
17
18
 
19
+ def board2
20
+ @board2 ||= BoardMock.new
21
+ end
22
+
18
23
  def part
19
24
  @part ||= MultiPinComponent.new board: board,
20
- pins: { one: 9, two: 10, maybe: 11 }
25
+ board2: board2,
26
+ pins: { one: 9, two: 10, maybe: 11, other_board: 13 }
21
27
  end
22
28
 
23
29
  def test_validate_pins
@@ -38,6 +44,10 @@ class MultiPinTest < Minitest::Test
38
44
  assert_equal Denko::DigitalIO::Output, part.proxies[:two].class
39
45
  assert_equal Denko::DigitalIO::Input, part.proxies[:maybe].class
40
46
  end
47
+
48
+ def test_build_proxy_on_other_board
49
+ assert_equal board2, part.proxies[:other_board].board
50
+ end
41
51
 
42
52
  def attr_reader_exists_for_optional_pins
43
53
  part = MultiPinComponent.new board: board, pins: { one: 9, two:10 }
@@ -56,7 +66,7 @@ class MultiPinTest < Minitest::Test
56
66
 
57
67
  def test_proxy_states
58
68
  part.two.high
59
- assert_equal({two: board.high, maybe: nil}, part.proxy_states)
69
+ assert_equal({two: board.high, maybe: nil, other_board: nil}, part.proxy_states)
60
70
 
61
71
  part2 = MultiPinComponent.new board: board, pins: { one: 'A1', two:12 }
62
72
  part2.two.low
@@ -9,19 +9,22 @@ class OutputPinTest < Minitest::Test
9
9
  @board ||= BoardMock.new
10
10
  end
11
11
 
12
- def part
13
- @part ||= OutputComponent.new(board: board, pin: 1)
14
- end
15
-
16
12
  def test_set_mode
13
+ modes = [:output, :output_pwm, :output_dac, :output_open_drain, :output_open_source]
14
+
17
15
  mock = Minitest::Mock.new
18
- mock.expect :call, nil, [1, :output]
19
-
16
+ modes.each_with_index do |mode, pin|
17
+ mock.expect :call, nil, [pin+1, mode]
18
+ end
19
+
20
20
  board.stub(:set_pin_mode, mock) do
21
- part
21
+ modes.each_with_index do |mode, pin|
22
+ part = OutputComponent.new(board: board, pin: pin+1, mode: mode)
23
+ assert_equal mode, part.mode
24
+ end
22
25
  end
23
26
  mock.verify
24
27
 
25
- assert_equal :output, part.mode
28
+ assert_raises { OutputComponent.new(board: board, pin: modes.count+1, mode: :wrong_mode) }
26
29
  end
27
30
  end
@@ -18,6 +18,7 @@ class PollerTest < Minitest::Test
18
18
  def inject(data, wait_for_callbacks = true)
19
19
  Thread.new do
20
20
  if wait_for_callbacks
21
+ while (!part.callbacks) do; sleep 0.01; end
21
22
  while (!part.callbacks[:read]) do; sleep 0.01; end
22
23
  end
23
24
  loop do
@@ -18,6 +18,7 @@ class ReaderTest < Minitest::Test
18
18
  def inject(data, wait_for_callbacks = true)
19
19
  Thread.new do
20
20
  if wait_for_callbacks
21
+ while (!part.callbacks) do; sleep 0.01; end
21
22
  while (!part.callbacks[:read]) do; sleep 0.01; end
22
23
  end
23
24
  loop do
@@ -39,7 +40,7 @@ class ReaderTest < Minitest::Test
39
40
  def test_read_once
40
41
  mock = Minitest::Mock.new.expect :call, nil
41
42
  inject(1)
42
-
43
+
43
44
  part.stub(:_read, mock) do
44
45
  part.read
45
46
  end
@@ -50,7 +51,7 @@ class ReaderTest < Minitest::Test
50
51
  inject(42)
51
52
  assert_equal part.read, 42
52
53
  end
53
-
54
+
54
55
  def test_read_using_with_lambda
55
56
  inject(1)
56
57
  reader = Minitest::Mock.new.expect :call, nil
@@ -15,7 +15,7 @@ class MultiPinComponentMock
15
15
  def pin
16
16
  {a: 1, b: 2}
17
17
  end
18
- end
18
+ end
19
19
 
20
20
  class SubcomponentsTest < Minitest::Test
21
21
  def connection
@@ -60,7 +60,7 @@ class SubcomponentsTest < Minitest::Test
60
60
  board.remove_component(multi_pin)
61
61
  assert_empty board.components
62
62
  end
63
-
63
+
64
64
  def test_calls_stop_on_remove
65
65
  pinless = PinlessComponentMock.new
66
66
  board.add_component(pinless)
@@ -72,4 +72,24 @@ class SubcomponentsTest < Minitest::Test
72
72
 
73
73
  mock.verify
74
74
  end
75
+
76
+ def test_disallows_duplicate_hw_i2c_buses
77
+ i2c0 = Denko::I2C::Bus.new(board: board, pin: 0)
78
+ assert_raises { Denko::I2C::Bus.new(board: board) }
79
+ end
80
+
81
+ def test_hw_i2c_buses_add_and_remove_properly
82
+ i2c0 = Denko::I2C::Bus.new(board: board, i2c_index: 0)
83
+ i2c1 = Denko::I2C::Bus.new(board: board, i2c_index: 1)
84
+ assert_equal [i2c0, i2c1], board.components
85
+
86
+ # Have the right hash keys.
87
+ assert_equal i2c0, board.hw_i2c_comps[0]
88
+ assert_equal i2c1, board.hw_i2c_comps[1]
89
+
90
+ # Get removed correctly.
91
+ board.remove_component(i2c0)
92
+ hash = { 1 => i2c1 }
93
+ assert_equal hash, board.hw_i2c_comps
94
+ end
75
95
  end
@@ -14,27 +14,31 @@ class BoardCoreTest < Minitest::Test
14
14
  def test_set_pin_mode
15
15
  mock = Minitest::Mock.new
16
16
  mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b000)])
17
- mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b010)])
17
+ mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b010, aux_message: pack(:uint32, [0, 0]))])
18
+ mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b010, aux_message: pack(:uint32, [1000, 12]))])
18
19
  mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b100)])
19
20
  mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b001)])
20
21
  mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b011)])
21
22
  mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b101)])
22
- mock.expect(:call, nil, [Denko::Message.encode(command: 0, pin: 1, value: 0b111)])
23
23
 
24
24
  board.stub(:write, mock) do
25
25
  board.set_pin_mode 1, :output
26
26
  board.set_pin_mode 1, :output_pwm
27
+ board.set_pin_mode 1, :output_pwm, frequency: 1000, resolution: 12
27
28
  board.set_pin_mode 1, :output_dac
28
29
  board.set_pin_mode 1, :input
29
30
  board.set_pin_mode 1, :input_pulldown
30
31
  board.set_pin_mode 1, :input_pullup
31
- board.set_pin_mode 1, :input_output
32
32
  end
33
33
  mock.verify
34
34
 
35
35
  assert_raises { board.set_pin_mode 1, "wrong" }
36
36
  end
37
37
 
38
+ def test_set_pin_debounce
39
+ board.set_pin_debounce(1, 1)
40
+ end
41
+
38
42
  def test_digital_write
39
43
  mock = Minitest::Mock.new
40
44
  mock.expect(:call, nil, [Denko::Message.encode(command: 1, pin: 1, value: board.low)])
@@ -74,7 +78,7 @@ class BoardCoreTest < Minitest::Test
74
78
 
75
79
  assert_raises { board.pwm_write 1, "wrong" }
76
80
  end
77
-
81
+
78
82
  def test_dac_write
79
83
  mock = Minitest::Mock.new
80
84
  mock.expect(:call, nil, [Denko::Message.encode(command: 4, pin: 1, value: board.low)])
@@ -153,11 +157,11 @@ class BoardCoreTest < Minitest::Test
153
157
  def test_analog_resolution
154
158
  mock = Minitest::Mock.new
155
159
  mock.expect(:call, nil, [Denko::Message.encode(command: 96, value: 10)])
156
- mock.expect(:call, nil, [Denko::Message.encode(command: 97, value: 10)])
160
+ mock.expect(:call, nil, [Denko::Message.encode(command: 97, value: 8)])
157
161
 
158
162
  board.stub(:write, mock) do
159
163
  board.analog_write_resolution = 10
160
- board.analog_read_resolution = 10
164
+ board.analog_read_resolution = 8
161
165
  end
162
166
  mock.verify
163
167
 
@@ -167,16 +171,16 @@ class BoardCoreTest < Minitest::Test
167
171
  assert_raises { board.analog_read_resolution= "wrong" }
168
172
  end
169
173
 
170
- def micro_delay
174
+ def micro_delay
171
175
  aux = pack(:uint16, [1000])
172
176
  message = Denko::Message.encode command: 99, aux_message: aux
173
177
  mock = Minitest::Mock.new.expect :call, nil, [message]
174
-
178
+
175
179
  board.stub(:write, mock) do
176
180
  board.micro_delay(1000)
177
181
  end
178
-
179
- assert_raises(ArgumentError) { board.micro_delay(65536) }
180
- assert_raises(ArgumentError) { board.micro_delay("wrong") }
182
+
183
+ assert_raises(ArgumentError) { board.micro_delay(65536) }
184
+ assert_raises(ArgumentError) { board.micro_delay("wrong") }
181
185
  end
182
186
  end
@@ -2,7 +2,7 @@ require_relative '../test_helper'
2
2
 
3
3
  class APII2CTest < Minitest::Test
4
4
  include TestPacker
5
-
5
+
6
6
  def connection
7
7
  @connection ||= ConnectionMock.new
8
8
  end
@@ -10,91 +10,97 @@ class APII2CTest < Minitest::Test
10
10
  def board
11
11
  @board ||= Denko::Board.new(connection)
12
12
  end
13
-
13
+
14
14
  def test_search
15
15
  board
16
16
  message = Denko::Message.encode command: 33
17
-
17
+
18
18
  mock = Minitest::Mock.new.expect :call, nil, [message]
19
19
  connection.stub(:write, mock) do
20
- board.i2c_search
20
+ board.i2c_search(0)
21
21
  end
22
22
  mock.verify
23
23
  end
24
24
 
25
25
  def test_write
26
26
  board
27
- aux = pack(:uint8, 0x00) + pack(:uint8, [1,2,3,4])
28
27
  address = 0x30
29
-
28
+ data = [1,2,3,4]
29
+
30
30
  # Normal
31
- message1 = Denko::Message.encode command: 34, pin: address | (1 << 7), value: 4, aux_message: aux
31
+ aux_stop = pack(:uint8, 0x00) + pack(:uint8, address | (1 << 7)) + pack(:uint8, data.length) + pack(:uint8, data)
32
+ message1 = Denko::Message.encode command: 34, aux_message: aux_stop
32
33
  # Repeated start
33
- message2 = Denko::Message.encode command: 34, pin: address | (0 << 7), value: 4, aux_message: aux
34
+ aux_repeat = pack(:uint8, 0x00) + pack(:uint8, address | (0 << 7)) + pack(:uint8, data.length) + pack(:uint8, data)
35
+ message2 = Denko::Message.encode command: 34, aux_message: aux_repeat
34
36
 
35
37
  mock = Minitest::Mock.new
36
38
  mock.expect :call, nil, [message1]
37
39
  mock.expect :call, nil, [message2]
38
-
40
+
39
41
  connection.stub(:write, mock) do
40
- board.i2c_write(0x30, [1,2,3,4])
41
- board.i2c_write(0x30, [1,2,3,4], 100000, true)
42
+ board.i2c_write(0, 0x30, [1,2,3,4])
43
+ board.i2c_write(0, 0x30, [1,2,3,4], 100000, true)
42
44
  end
43
45
  mock.verify
44
46
  end
45
47
 
46
48
  def test_write_limits
47
- assert_raises { board.i2c_write(0x30, Array.new(33) {0x00}) }
48
- assert_raises { board.i2c_write(0x30, Array.new(0) {0x00}) }
49
+ assert_raises { board.i2c_write(0, 0x30, Array.new(33) {0x00}) }
50
+ assert_raises { board.i2c_write(0, 0x30, Array.new(0) {0x00}) }
49
51
  end
50
52
 
51
53
  def test_read
52
54
  board
53
- aux = pack(:uint8, 0x00) + pack(:uint8, [1, 0x03])
55
+ address = 0x30
56
+
54
57
  # Normal
55
- message1 = Denko::Message.encode command: 35, pin: 0x30 | (1 << 7), value: 4, aux_message: aux
58
+ aux_stop = pack(:uint8, 0x00) + pack(:uint8, address | (1 << 7)) + pack(:uint8, 4) + pack(:uint8, [1, 0x03])
59
+ message1 = Denko::Message.encode command: 35, aux_message: aux_stop
56
60
  # Repeated start
57
- message2 = Denko::Message.encode command: 35, pin: 0x30 | (0 << 7), value: 4, aux_message: aux
61
+ aux_repeat = pack(:uint8, 0x00) + pack(:uint8, address | (0 << 7)) + pack(:uint8, 4) + pack(:uint8, [1, 0x03])
62
+ message2 = Denko::Message.encode command: 35, aux_message: aux_repeat
58
63
 
59
64
  mock = Minitest::Mock.new
60
65
  mock.expect :call, nil, [message1]
61
66
  mock.expect :call, nil, [message2]
62
-
67
+
63
68
  connection.stub(:write, mock) do
64
- board.i2c_read(0x30, 0x03, 4)
65
- board.i2c_read(0x30, 0x03, 4, 100000, true)
69
+ board.i2c_read(0, 0x30, 0x03, 4)
70
+ board.i2c_read(0, 0x30, 0x03, 4, 100000, true)
66
71
  end
67
72
  mock.verify
68
73
  end
69
-
74
+
70
75
  def test_read_without_register
71
76
  board
72
- aux = pack(:uint8, 0x00) + pack(:uint8, [0])
73
- message = Denko::Message.encode command: 35, pin: 0x30 | (1 << 7), value: 4, aux_message: aux
77
+ aux = pack(:uint8, 0x00) + pack(:uint8, 0x30 | (1 << 7)) + pack(:uint8, 4) + pack(:uint8, [0])
78
+ message = Denko::Message.encode command: 35, aux_message: aux
74
79
 
75
80
  mock = Minitest::Mock.new
76
81
  mock.expect :call, nil, [message]
77
-
82
+
78
83
  connection.stub(:write, mock) do
79
- board.i2c_read(0x30, nil, 4)
84
+ board.i2c_read(0, 0x30, nil, 4)
80
85
  end
81
86
  mock.verify
82
87
  end
83
88
 
84
89
  def test_read_limits
85
- assert_raises { board.i2c_read(0x30, nil, 33) }
86
- assert_raises { board.i2c_read(0x30, nil, 0) }
90
+ assert_raises { board.i2c_read(0, 0x30, nil, 33) }
91
+ assert_raises { board.i2c_read(0, 0x30, nil, 0) }
87
92
  end
88
93
 
89
94
  def test_frequencies
90
95
  board
91
96
  data = [1,2,3,4]
92
97
  address = 0x30
93
-
98
+
94
99
  messages = []
95
100
  # 100 kHz, 400 kHz, 1 Mhz, 3.4 MHz
101
+ aux_after_config = pack(:uint8, 0x30 | (1 << 7)) + pack(:uint8, data.length) + pack(:uint8, data)
96
102
  [0x00, 0x01, 0x02, 0x03].each do |code|
97
- messages << Denko::Message.encode(command: 34, pin: 0x30 | (1 << 7), value: 4, aux_message: pack(:uint8, code) + pack(:uint8, data))
103
+ messages << Denko::Message.encode(command: 34, aux_message: pack(:uint8, code) + aux_after_config)
98
104
  end
99
105
 
100
106
  mock = Minitest::Mock.new
@@ -102,13 +108,13 @@ class APII2CTest < Minitest::Test
102
108
  mock.expect :call, nil, [message]
103
109
  end
104
110
  connection.stub(:write, mock) do
105
- board.i2c_write(address, data, 100000)
106
- board.i2c_write(address, data, 400000)
107
- board.i2c_write(address, data, 1000000)
108
- board.i2c_write(address, data, 3400000)
111
+ board.i2c_write(0, address, data, 100000)
112
+ board.i2c_write(0, address, data, 400000)
113
+ board.i2c_write(0, address, data, 1000000)
114
+ board.i2c_write(0, address, data, 3400000)
109
115
  end
110
116
  mock.verify
111
117
 
112
- assert_raises(ArgumentError) { board.i2c_write(0x30, [1,2,3,4], 5000000, false) }
118
+ assert_raises(ArgumentError) { board.i2c_write(0, 0x30, [1,2,3,4], 5000000, false) }
113
119
  end
114
120
  end
@@ -13,7 +13,7 @@ class APIInfraredTest < Minitest::Test
13
13
 
14
14
  def test_infrared_emit
15
15
  board
16
- aux = pack(:uint8, 4) + pack(:uint16, [255,0,255,0])
16
+ aux = pack(:uint16, 4) + pack(:uint16, [255,0,255,0])
17
17
  message = Denko::Message.encode command: 16, pin: 8, value: 38, aux_message: aux
18
18
 
19
19
  mock = Minitest::Mock.new.expect :call, nil, [message]
@@ -30,25 +30,31 @@ class MessageTest < Minitest::Test
30
30
  end
31
31
 
32
32
  def test_build_messages_correctly
33
- assert_equal "1.1.1\n", Denko::Message.encode(command: 1, pin: 1, value: 1)
34
- assert_equal "1.1\n", Denko::Message.encode(command: 1, pin: 1)
35
- assert_equal "1..1\n", Denko::Message.encode(command: 1, value: 1)
36
- assert_equal "1\n", Denko::Message.encode(command: 1)
37
- assert_equal "1...test\n", Denko::Message.encode(command: 1, aux_message: "test")
33
+ assert_equal "0.1.1\n", Denko::Message.encode(command: 0, pin: 1, value: 1)
34
+ assert_equal "0.1\n", Denko::Message.encode(command: 0, pin: 1)
35
+ assert_equal "0..1\n", Denko::Message.encode(command: 0, value: 1)
36
+ assert_equal "0\n", Denko::Message.encode(command: 0)
37
+ assert_equal "0...test\n", Denko::Message.encode(command: 0, aux_message: "test")
38
+ end
39
+
40
+ def test_single_byte_digital_write
41
+ assert_equal 0b11000100.chr, Denko::Message.encode(command: 1, pin: 4, value: 1)
42
+ assert_equal 0b10000100.chr, Denko::Message.encode(command: 1, pin: 4, value: 0)
43
+ assert_equal "1.64.1\n", Denko::Message.encode(command: 1, pin: 64, value: 1)
38
44
  end
39
45
 
40
46
  def test_escape_newline_in_aux
41
- assert_equal "1...line1\\\nline2\\\n\n",
42
- Denko::Message.encode(command: 1, aux_message: "line1\nline2\n")
47
+ assert_equal "0...line1\\\nline2\\\n\n",
48
+ Denko::Message.encode(command: 0, aux_message: "line1\nline2\n")
43
49
  end
44
50
 
45
51
  def test_escape_backslash_in_aux
46
- assert_equal "1...line1\\\\line2\\\\\n",
47
- Denko::Message.encode(command: 1, aux_message: "line1\\line2\\")
52
+ assert_equal "0...line1\\\\line2\\\\\n",
53
+ Denko::Message.encode(command: 0, aux_message: "line1\\line2\\")
48
54
  end
49
55
 
50
56
  def test_escape_newline_and_backslashes_together
51
- assert_equal "1...line1\\\\\\\nline2\\\\\\\n\n",
52
- Denko::Message.encode(command: 1, aux_message: "line1\\\nline2\\\n")
57
+ assert_equal "0...line1\\\\\\\nline2\\\\\\\n\n",
58
+ Denko::Message.encode(command: 0, aux_message: "line1\\\nline2\\\n")
53
59
  end
54
60
  end
@@ -5,7 +5,7 @@ require_relative '../test_helper'
5
5
 
6
6
  class APISPITest < Minitest::Test
7
7
  include TestPacker
8
-
8
+
9
9
  def connection
10
10
  @connection ||= ConnectionMock.new
11
11
  end
@@ -13,43 +13,43 @@ class APISPITest < Minitest::Test
13
13
  def board
14
14
  @board ||= Denko::Board.new(connection)
15
15
  end
16
-
16
+
17
17
  def test_spi_modes
18
18
  # Start with mode = 0.
19
- args = [[], 0, 1000000, 0, :msbfirst]
19
+ args = [nil, [], 0, 1000000, 0, :msbfirst]
20
20
  assert_equal (pack :uint8, 0b10000000), board.spi_header(*args)[0]
21
21
 
22
- args[3] = 1
22
+ args[4] = 1
23
23
  assert_equal (pack :uint8, 0b10000001), board.spi_header(*args)[0]
24
24
 
25
- args[3] = 2
25
+ args[4] = 2
26
26
  assert_equal (pack :uint8, 0b10000010), board.spi_header(*args)[0]
27
27
 
28
- args[3] = 3
28
+ args[4] = 3
29
29
  assert_equal (pack :uint8, 0b10000011), board.spi_header(*args)[0]
30
30
 
31
31
  # Invalid mode = 4.
32
32
  assert_raises(ArgumentError) { board.spi_header(*args[3] = 4) }
33
33
  end
34
-
34
+
35
35
  def test_spi_lsbfirst
36
- args = [[], 0, 1000000, 0, :lsbfirst]
36
+ args = [nil, [], 0, 1000000, 0, :lsbfirst]
37
37
  assert_equal (pack :uint8, 0b00000000), board.spi_header(*args)[0]
38
38
  end
39
39
 
40
40
  def test_spi_frequency
41
- args = [[], 0, 1000000, 0, :msbfirst]
41
+ args = [nil, [], 0, 1000000, 0, :msbfirst]
42
42
  assert_equal (pack :uint32, 1000000), board.spi_header(*args)[3..6]
43
43
 
44
- args[2] = 8000000
44
+ args[3] = 8000000
45
45
  assert_equal (pack :uint32, 8000000), board.spi_header(*args)[3..6]
46
46
  end
47
-
47
+
48
48
  def test_spi_too_many_bytes
49
49
  assert_raises(ArgumentError) { board.spi_header(read: 256) }
50
50
  assert_raises(ArgumentError) { board.spi_header(write: Array.new(256){0})}
51
51
  end
52
-
52
+
53
53
  def test_spi_no_bytes
54
54
  assert_raises(ArgumentError) { board.spi_transfer(3, read: 0) }
55
55
  assert_raises(ArgumentError) { board.spi_listen(3, read: 0) }
@@ -58,34 +58,34 @@ class APISPITest < Minitest::Test
58
58
  def test_spi_bad_frequency
59
59
  assert_raises(ArgumentError) { board.spi_transfer(3, read: 0, frequency: "string") }
60
60
  end
61
-
61
+
62
62
  def test_spi_transfer
63
63
  board
64
64
  bytes = [1,2,3,4]
65
- header = board.spi_header(bytes, 4, 8000000, 2, :lsbfirst)
65
+ header = board.spi_header(3, bytes, 4, 8000000, 2, :lsbfirst)
66
66
  aux = header + pack(:uint8, bytes)
67
67
  mock = Minitest::Mock.new.expect :call, nil,
68
68
  [Denko::Message.encode(command: 26, pin: 3, aux_message: aux)]
69
-
69
+
70
70
  board.stub(:write, mock) do
71
71
  args = { write: [1,2,3,4], read: 4, bit_order: :lsbfirst, frequency: 8000000, mode: 2 }
72
- board.spi_transfer(3, **args)
72
+ board.spi_transfer(0, 3, **args)
73
73
  end
74
74
  mock.verify
75
75
  end
76
-
76
+
77
77
  def test_spi_listen
78
78
  board
79
- header = board.spi_header([], 8, 1000000, 0, :lsbfirst)
79
+ header = board.spi_header(3, [], 8, 1000000, 0, :lsbfirst)
80
80
  mock = Minitest::Mock.new.expect :call, nil,
81
81
  [Denko::Message.encode(command: 27, pin: 3, aux_message: header)]
82
-
82
+
83
83
  board.stub(:write, mock) do
84
- board.spi_listen(3, read: 8, bit_order: :lsbfirst)
84
+ board.spi_listen(0, 3, read: 8, bit_order: :lsbfirst)
85
85
  end
86
86
  mock.verify
87
87
  end
88
-
88
+
89
89
  def test_spi_stop
90
90
  board
91
91
  mock = Minitest::Mock.new.expect :call, nil, [Denko::Message.encode(command: 28, pin: 3)]
@@ -0,0 +1,15 @@
1
+ require_relative '../test_helper'
2
+
3
+ class DigitalIOButtonTest < Minitest::Test
4
+ def board
5
+ @board ||= BoardMock.new
6
+ end
7
+
8
+ def part
9
+ @part ||= Denko::DigitalIO::Button.new(board: board, pin: 14)
10
+ end
11
+
12
+ def test_divider_set_correctly
13
+ assert_equal 1, part.divider
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../test_helper'
2
+
3
+ class DigitalIORelaynTest < Minitest::Test
4
+ def board
5
+ @board ||= BoardMock.new
6
+ end
7
+
8
+ def relay
9
+ @relay ||= Denko::DigitalIO::Relay.new(board: board, pin: 14)
10
+ end
11
+
12
+ def test_open_and_close
13
+ relay.close
14
+ assert_equal 1, relay.state
15
+ relay.open
16
+ assert_equal 0, relay.state
17
+ end
18
+ end