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
@@ -18,19 +18,19 @@ class BusPeripheralTest < Minitest::Test
18
18
  def bus
19
19
  @bus ||= NoAddressController.new(board: board)
20
20
  end
21
-
21
+
22
22
  def part
23
23
  @part ||= NoAddressPeripheral.new(bus: bus, address: 0x22)
24
24
  end
25
-
25
+
26
26
  def test_initialize
27
27
  assert_equal part.board, bus
28
28
  end
29
29
 
30
- def test_can_use_bus_atomically
30
+ def test_can_use_bus_atomically
31
31
  mock = Minitest::Mock.new
32
32
  1.times {mock.expect(:call, nil)}
33
-
33
+
34
34
  bus.mutex.stub(:synchronize, mock) do
35
35
  part.atomically { true; false; }
36
36
  end
@@ -27,17 +27,35 @@ class CallbacksTest < Minitest::Test
27
27
  @part ||= CallbackComponent.new(board: board, pin: 1)
28
28
  end
29
29
 
30
+ def callback_mutex_is_correct_class
31
+ if (RUBY_ENGINE == "ruby")
32
+ assert_equal Denko::MutexStub, part.instance_variable_get(:@callback_mutex).class
33
+ else
34
+ assert_equal Mutex, part.instance_variable_get(:@callback_mutex).class
35
+ end
36
+ end
37
+
30
38
  def test_callback_mutex
31
39
  callback = Proc.new{}
32
- mock = Minitest::Mock.new
33
- 3.times {mock.expect(:call, nil)}
34
-
35
- part.callback_mutex.stub(:synchronize, mock) do
36
- part.callbacks
37
- part.add_callback(:key, &callback)
38
- part.remove_callbacks(:key)
40
+ lock_mock = Minitest::Mock.new
41
+ 2.times {lock_mock.expect(:call, nil)}
42
+
43
+ unlock_mock = Minitest::Mock.new
44
+ 2.times {unlock_mock.expect(:call, nil)}
45
+
46
+ mutex = part.instance_variable_get(:@callback_mutex)
47
+ mutex.stub(:lock, lock_mock) do
48
+ mutex.stub(:unlock, unlock_mock) do
49
+ part.callbacks
50
+ assert_equal({}, part.callbacks)
51
+ part.add_callback(:key, &callback)
52
+ assert part.callbacks[:key]
53
+ part.remove_callbacks(:key)
54
+ assert_equal({}, part.callbacks)
55
+ end
39
56
  end
40
- mock.verify
57
+ lock_mock.verify
58
+ unlock_mock.verify
41
59
  end
42
60
 
43
61
  def test_add_callback
@@ -105,7 +123,7 @@ class CallbacksTest < Minitest::Test
105
123
  value = 0
106
124
  part.add_callback { value = 1 }
107
125
  part.update(nil)
108
- assert_equal 0, value
126
+ assert_equal 0, value
109
127
  end
110
128
 
111
129
  def test_no_callbacks_with_filter_returning_nil
@@ -113,6 +131,6 @@ class CallbacksTest < Minitest::Test
113
131
  value = 0
114
132
  part2.add_callback { value = 1 }
115
133
  part2.update("anything")
116
- assert_equal 0, value
134
+ assert_equal 0, value
117
135
  end
118
136
  end
@@ -8,7 +8,7 @@ class ComponentTest < Minitest::Test
8
8
  def board
9
9
  @board ||= BoardMock.new
10
10
  end
11
-
11
+
12
12
  def part
13
13
  @part ||= BaseComponent.new(board: board)
14
14
  end
@@ -20,35 +20,53 @@ class ComponentTest < Minitest::Test
20
20
  def test_registers_with_board
21
21
  assert_equal board.components, [part]
22
22
  end
23
-
23
+
24
24
  def test_unregisters_with_board
25
25
  part.send(:unregister)
26
26
  assert_equal board.components, []
27
27
  end
28
-
28
+
29
29
  def test_start_with_nil_state
30
30
  assert_nil BaseComponent.new(board: board).state
31
31
  end
32
-
32
+
33
+ def test_state_mutex_is_correct_class
34
+ if (RUBY_ENGINE == "ruby")
35
+ assert_equal Denko::MutexStub, part.instance_variable_get(:@state_mutex).class
36
+ else
37
+ assert_equal Mutex, part.instance_variable_get(:@state_mutex).class
38
+ end
39
+ end
40
+
33
41
  def test_sets_and_gets_state
34
42
  part.send(:state=, 10)
35
43
  assert_equal part.state, 10
36
44
  end
37
-
45
+
46
+ # ONLY for pass by value states. If state is Hash or Array, ignore mutex.
38
47
  def test_state_through_mutex
39
- mock = Minitest::Mock.new
40
- 2.times {mock.expect(:call, nil)}
41
-
42
- part.instance_variable_get(:@state_mutex).stub(:synchronize, mock) do
43
- part.state
44
- part.send(:state=, nil)
48
+ lock_mock = Minitest::Mock.new
49
+ 2.times { lock_mock.expect(:call, nil) }
50
+
51
+ unlock_mock = Minitest::Mock.new
52
+ 2.times { unlock_mock.expect(:call, nil) }
53
+
54
+ mutex = part.instance_variable_get(:@state_mutex)
55
+ mutex.stub(:lock, lock_mock) do
56
+ mutex.stub(:unlock, unlock_mock) do
57
+ part.state
58
+ part.send(:state=, 20)
59
+ end
45
60
  end
46
- mock.verify
61
+
62
+ lock_mock.verify
63
+ unlock_mock.verify
64
+ assert_equal 20, part.state
47
65
  end
48
-
66
+
49
67
  def test_micro_delay
50
68
  mock = Minitest::Mock.new.expect :call, nil, [1000]
51
-
69
+
52
70
  board.stub(:micro_delay, mock) do
53
71
  part.micro_delay(1000)
54
72
  end
@@ -14,21 +14,26 @@ class InputPinTest < Minitest::Test
14
14
  end
15
15
 
16
16
  def test_mode_and_pullup
17
+ modes = [:input, :input_pulldown, :input_pullup]
18
+
17
19
  mock = Minitest::Mock.new
18
- mock.expect :call, nil, [1, :input]
19
- mock.expect :call, nil, [2, :input_pulldown]
20
- mock.expect :call, nil, [3, :input_pullup]
21
- mock.expect :call, nil, [4, :input_output]
20
+ modes.each_with_index do |mode, pin|
21
+ mock.expect :call, nil, [pin+1, mode]
22
+ end
22
23
 
23
24
  board.stub(:set_pin_mode, mock) do
24
- part
25
- InputComponent.new(board: board, pin: 2, pulldown: true)
26
- InputComponent.new(board: board, pin: 3, pullup: true)
27
- InputComponent.new(board: board, pin: 4, mode: :input_output)
25
+ modes.each_with_index do |mode, pin|
26
+ local_part = InputComponent.new(board: board, pin: pin+1, mode: mode)
27
+ assert_equal mode, local_part.mode
28
+ end
28
29
  end
29
30
  mock.verify
30
31
 
31
- assert_equal :input, part.mode
32
+ assert_raises { InputComponent.new(board: board, pin: modes.count+1, mode: :wrong_mode) }
33
+ end
34
+
35
+ def test_debounce_time=
36
+ part.debounce_time = 1
32
37
  end
33
38
 
34
39
  def test_stop_listener
@@ -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
@@ -31,7 +31,7 @@ class BoardTest < Minitest::Test
31
31
  end
32
32
 
33
33
  def test_set_aux_limit
34
- assert_equal 527, board.aux_limit
34
+ assert_equal 528, board.aux_limit
35
35
  end
36
36
 
37
37
  def test_set_eeprom_length
@@ -42,13 +42,13 @@ class BoardTest < Minitest::Test
42
42
  assert_equal 0, board.low
43
43
  assert_equal 1, board.high
44
44
  end
45
-
45
+
46
46
  def test_analog_resolution
47
47
  assert_equal 255, board.analog_write_high
48
48
  assert_equal 8, board.analog_write_resolution
49
49
  assert_equal 1023, board.analog_read_high
50
50
  assert_equal 10, board.analog_read_resolution
51
-
51
+
52
52
  mock = Minitest::Mock.new
53
53
  mock.expect(:call, nil, [Denko::Message.encode(command:96, value:12)])
54
54
  mock.expect(:call, nil, [Denko::Message.encode(command:97, value:12)])
@@ -57,17 +57,17 @@ class BoardTest < Minitest::Test
57
57
  board.analog_read_resolution = 12
58
58
  end
59
59
  mock.verify
60
-
60
+
61
61
  assert_equal 0, board.low
62
62
  assert_equal 12, board.analog_write_resolution
63
63
  assert_equal 4095, board.analog_write_high
64
64
  assert_equal 12, board.analog_read_resolution
65
65
  assert_equal 4095, board.analog_read_high
66
66
  end
67
-
67
+
68
68
  def test_eeprom
69
69
  mock = Minitest::Mock.new.expect(:call, "test eeprom", [], board: board)
70
- Denko::EEPROM::BuiltIn.stub(:new, mock) do
70
+ Denko::EEPROM::Board.stub(:new, mock) do
71
71
  board.eeprom
72
72
  end
73
73
  mock.verify
@@ -85,16 +85,16 @@ class BoardTest < Minitest::Test
85
85
  def test_update_passes_messages_to_correct_components
86
86
  mock1 = Minitest::Mock.new.expect(:update, nil, ["data"])
87
87
  3.times { mock1.expect(:pin, 1) }
88
-
88
+
89
89
  # Make sure lines are split only on the first colon.
90
90
  # Tests for string based pine names too.
91
91
  mock2 = Minitest::Mock.new.expect(:update, nil, ["with:colon"])
92
92
  3.times { mock2.expect(:pin, 14) }
93
-
93
+
94
94
  # Special EEPROM mock.
95
95
  mock3 = Minitest::Mock.new.expect(:update, nil, ["bytes"])
96
96
  3.times { mock3.expect(:pin, 254) }
97
-
97
+
98
98
  board.add_component(mock1)
99
99
  board.add_component(mock2)
100
100
  board.add_component(mock3)
@@ -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]