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
@@ -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
@@ -2,7 +2,7 @@ require_relative '../test_helper'
2
2
 
3
3
  class APIOneWireTest < Minitest::Test
4
4
  include TestPacker
5
-
5
+
6
6
  def connection
7
7
  @connection ||= ConnectionMock.new
8
8
  end
@@ -10,36 +10,47 @@ class APIOneWireTest < Minitest::Test
10
10
  def board
11
11
  @board ||= Denko::Board.new(connection)
12
12
  end
13
-
13
+
14
14
  def test_one_wire_reset
15
15
  board
16
- message = Denko::Message.encode command: 41, pin: 1, value: 255
17
-
16
+ message = Denko::Message.encode command: 41, pin: 1, value: 0
17
+
18
18
  mock = Minitest::Mock.new.expect :call, nil, [message]
19
19
  connection.stub(:write, mock) do
20
- board.one_wire_reset(1, 255)
20
+ board.one_wire_reset(1, false)
21
21
  end
22
22
  mock.verify
23
23
  end
24
-
24
+
25
+ def test_one_wire_reset_with_presence
26
+ board
27
+ message = Denko::Message.encode command: 41, pin: 1, value: 1
28
+
29
+ mock = Minitest::Mock.new.expect :call, nil, [message]
30
+ connection.stub(:write, mock) do
31
+ board.one_wire_reset(1, true)
32
+ end
33
+ mock.verify
34
+ end
35
+
25
36
  def test_one_wire_search
26
37
  board
27
38
  message = Denko::Message.encode command: 42, pin: 1, aux_message: pack(:uint64, 128, max:8)
28
-
39
+
29
40
  mock = Minitest::Mock.new.expect :call, nil, [message]
30
41
  connection.stub(:write, mock) do
31
42
  board.one_wire_search(1, 128)
32
43
  end
33
44
  mock.verify
34
45
  end
35
-
46
+
36
47
  def test_one_wire_write
37
48
  board
38
-
49
+
39
50
  # Calculate length and parasite power properly.
40
51
  message1 = Denko::Message.encode command: 43, pin: 1, value: 0b10000000 | 3, aux_message: pack(:uint8, [1,2,3])
41
52
  message2 = Denko::Message.encode command: 43, pin: 1, value: 4, aux_message: pack(:uint8, [1,2,3,4])
42
-
53
+
43
54
  mock = Minitest::Mock.new
44
55
  mock.expect :call, nil, [message1]
45
56
  mock.expect :call, nil, [message2]
@@ -48,18 +59,18 @@ class APIOneWireTest < Minitest::Test
48
59
  board.one_wire_write(1, nil, [1,2,3,4])
49
60
  end
50
61
  mock.verify
51
-
62
+
52
63
  # Don't allow more than 127 bytes of data.
53
- assert_raises(ArgumentError) do
64
+ assert_raises(ArgumentError) do
54
65
  too_big = Array.new(128).map { 42 }
55
66
  board.one_wire_write(1, true, too_big)
56
67
  end
57
68
  end
58
-
69
+
59
70
  def test_one_wire_read
60
71
  board
61
72
  message = Denko::Message.encode command: 44, pin: 1, value: 9
62
-
73
+
63
74
  mock = Minitest::Mock.new.expect :call, nil, [message]
64
75
  connection.stub(:write, mock) do
65
76
  board.one_wire_read(1, 9)
@@ -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,59 @@ class APISPITest < Minitest::Test
13
13
  def board
14
14
  @board ||= Denko::Board.new(connection)
15
15
  end
16
-
16
+
17
+ def header_args
18
+ length = board.aux_limit - 8
19
+
20
+ [nil, Array.new(length){0}, length, 1000000, 0, :msbfirst]
21
+ end
22
+
17
23
  def test_spi_modes
18
- # Start with mode = 0.
19
- args = [[], 0, 1000000, 0, :msbfirst]
20
- assert_equal (pack :uint8, 0b10000000), board.spi_header(*args)[0]
24
+ # Default to mode 0.
25
+ assert_equal (pack :uint8, 0b10000000), board.spi_header(*header_args)[0]
21
26
 
22
- args[3] = 1
27
+ args = header_args.tap { |a| a[4] = 1 }
23
28
  assert_equal (pack :uint8, 0b10000001), board.spi_header(*args)[0]
24
29
 
25
- args[3] = 2
30
+ args = header_args.tap { |a| a[4] = 2 }
26
31
  assert_equal (pack :uint8, 0b10000010), board.spi_header(*args)[0]
27
32
 
28
- args[3] = 3
33
+ args = header_args.tap { |a| a[4] = 3 }
29
34
  assert_equal (pack :uint8, 0b10000011), board.spi_header(*args)[0]
30
35
 
31
- # Invalid mode = 4.
32
- assert_raises(ArgumentError) { board.spi_header(*args[3] = 4) }
36
+ args = header_args.tap { |a| a[4] = 4 }
37
+ assert_raises(ArgumentError) { board.spi_header(*args) }
33
38
  end
34
-
39
+
35
40
  def test_spi_lsbfirst
36
- args = [[], 0, 1000000, 0, :lsbfirst]
41
+ # Default to :msbfirst
42
+ assert_equal (pack :uint8, 0b10000000), board.spi_header(*header_args)[0]
43
+
44
+ args = header_args.tap { |a| a[5] = :lsbfirst }
37
45
  assert_equal (pack :uint8, 0b00000000), board.spi_header(*args)[0]
38
46
  end
39
47
 
40
48
  def test_spi_frequency
41
- args = [[], 0, 1000000, 0, :msbfirst]
42
- assert_equal (pack :uint32, 1000000), board.spi_header(*args)[3..6]
49
+ # Default to 1 MHz.
50
+ assert_equal (pack :uint32, 1_000_000), board.spi_header(*header_args)[4..7]
43
51
 
44
- args[2] = 8000000
45
- assert_equal (pack :uint32, 8000000), board.spi_header(*args)[3..6]
52
+ args = header_args.tap { |a| a[3] = 8_000_000 }
53
+ assert_equal (pack :uint32, 8_000_000), board.spi_header(*args)[4..7]
46
54
  end
47
-
55
+
48
56
  def test_spi_too_many_bytes
49
- assert_raises(ArgumentError) { board.spi_header(read: 256) }
50
- assert_raises(ArgumentError) { board.spi_header(write: Array.new(256){0})}
57
+ # Default args have maximum read and write based on aux_limit.
58
+ board.spi_header(*header_args)
59
+
60
+ # Too many write
61
+ args = header_args.tap { |a| a[1] << 0 }
62
+ assert_raises(ArgumentError) { board.spi_header(*args) }
63
+
64
+ # Too many read
65
+ args = header_args.tap { |a| a[2] += 1 }
66
+ assert_raises(ArgumentError) { board.spi_header(*args) }
51
67
  end
52
-
68
+
53
69
  def test_spi_no_bytes
54
70
  assert_raises(ArgumentError) { board.spi_transfer(3, read: 0) }
55
71
  assert_raises(ArgumentError) { board.spi_listen(3, read: 0) }
@@ -58,34 +74,34 @@ class APISPITest < Minitest::Test
58
74
  def test_spi_bad_frequency
59
75
  assert_raises(ArgumentError) { board.spi_transfer(3, read: 0, frequency: "string") }
60
76
  end
61
-
77
+
62
78
  def test_spi_transfer
63
79
  board
64
80
  bytes = [1,2,3,4]
65
- header = board.spi_header(bytes, 4, 8000000, 2, :lsbfirst)
81
+ header = board.spi_header(3, bytes, 4, 8000000, 2, :lsbfirst)
66
82
  aux = header + pack(:uint8, bytes)
67
83
  mock = Minitest::Mock.new.expect :call, nil,
68
84
  [Denko::Message.encode(command: 26, pin: 3, aux_message: aux)]
69
-
85
+
70
86
  board.stub(:write, mock) do
71
87
  args = { write: [1,2,3,4], read: 4, bit_order: :lsbfirst, frequency: 8000000, mode: 2 }
72
- board.spi_transfer(3, **args)
88
+ board.spi_transfer(0, 3, **args)
73
89
  end
74
90
  mock.verify
75
91
  end
76
-
92
+
77
93
  def test_spi_listen
78
94
  board
79
- header = board.spi_header([], 8, 1000000, 0, :lsbfirst)
95
+ header = board.spi_header(3, [], 8, 1000000, 0, :lsbfirst)
80
96
  mock = Minitest::Mock.new.expect :call, nil,
81
97
  [Denko::Message.encode(command: 27, pin: 3, aux_message: header)]
82
-
98
+
83
99
  board.stub(:write, mock) do
84
- board.spi_listen(3, read: 8, bit_order: :lsbfirst)
100
+ board.spi_listen(0, 3, read: 8, bit_order: :lsbfirst)
85
101
  end
86
102
  mock.verify
87
103
  end
88
-
104
+
89
105
  def test_spi_stop
90
106
  board
91
107
  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
@@ -16,7 +16,7 @@ class DigitalIOInputTest < Minitest::Test
16
16
  end
17
17
  mock.verify
18
18
  end
19
-
19
+
20
20
  def test_converts_to_integer
21
21
  part
22
22
  part.update("1")
@@ -26,7 +26,7 @@ class DigitalIOInputTest < Minitest::Test
26
26
  def test__read
27
27
  mock = Minitest::Mock.new.expect :call, nil, [14]
28
28
  board.stub(:digital_read, mock) do
29
- part._read
29
+ part.read_nb
30
30
  end
31
31
  mock.verify
32
32
  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
@@ -6,94 +6,114 @@ class RotaryEncoderTest < Minitest::Test
6
6
  end
7
7
 
8
8
  def part
9
- @part ||= Denko::DigitalIO::RotaryEncoder.new board: board, pins: {data:3, clock: 4}
9
+ @part ||= Denko::DigitalIO::RotaryEncoder.new board: board, pins: {b: 3, a: 4}
10
10
  end
11
11
 
12
- def test_sets_steps_per_revolution
13
- assert_equal 30, part.steps_per_revolution
14
- assert_equal 12.to_f, part.instance_variable_get(:@degrees_per_step)
12
+ def test_alternate_pin_names
13
+ short = Denko::DigitalIO::RotaryEncoder.new board: board, pins: {dt: 3, clk: 4}
14
+ assert_equal 3, short.b.pin
15
+ assert_equal 4, short.a.pin
16
+
17
+ long = Denko::DigitalIO::RotaryEncoder.new board: board, pins: {data: 5, clock: 6}
18
+ assert_equal 5, long.b.pin
19
+ assert_equal 6, long.a.pin
20
+ end
21
+
22
+ def test_counts_per_revolution
23
+ assert_equal 60, part.counts_per_revolution
24
+ assert_equal 6.to_f, part.degrees_per_count
15
25
  end
16
-
26
+
17
27
  def test_resets_on_initialize
18
- assert_equal part.state, {steps: 0, angle: 0}
28
+ assert_equal({count: 0, angle: 0}, part.state)
29
+ end
30
+
31
+ def test_sets_debounce_time_for_both_pins
32
+ a_mock = Minitest::Mock.new.expect(:call, nil, [1])
33
+ b_mock = Minitest::Mock.new.expect(:call, nil, [1])
34
+
35
+ part.a.stub(:debounce_time=, a_mock) do
36
+ part.b.stub(:debounce_time=, b_mock) do
37
+ part.send(:run_after_initialize_cbs)
38
+ end
39
+ end
40
+ a_mock.verify
41
+ b_mock.verify
19
42
  end
20
-
43
+
21
44
  def test_calls_listen_on_both_pins_with_given_divider
22
- clock_mock = Minitest::Mock.new.expect(:call, nil, [1])
23
- clock_mock.expect(:call, nil, [2])
24
- data_mock = Minitest::Mock.new.expect(:call, nil, [1])
25
- data_mock.expect(:call, nil, [2])
26
-
27
- part.clock.stub(:listen, clock_mock) do
28
- part.data.stub(:listen, data_mock) do
29
- part.send(:after_initialize)
30
- part.send(:after_initialize, divider: 2)
45
+ a_mock = Minitest::Mock.new.expect(:call, nil, [1])
46
+ b_mock = Minitest::Mock.new.expect(:call, nil, [1])
47
+
48
+ part.a.stub(:listen, a_mock) do
49
+ part.b.stub(:listen, b_mock) do
50
+ part.send(:run_after_initialize_cbs)
31
51
  end
32
52
  end
53
+ a_mock.verify
54
+ b_mock.verify
33
55
  end
34
-
56
+
35
57
  def test_observes_on_initialize
36
58
  mock = Minitest::Mock.new.expect(:call, nil)
37
59
  part.stub(:observe_pins, mock) do
38
- part.send(:after_initialize)
60
+ part.send(:run_after_initialize_cbs)
39
61
  end
62
+ mock.verify
40
63
  end
41
-
42
- def test_observes_the_right_pin
43
- refute_empty part.clock.callbacks
44
- assert_empty part.data.callbacks
45
-
46
- part2 = Denko::DigitalIO::RotaryEncoder.new board: board, pins: {data:6, clock: 5}
47
-
48
- refute_empty part2.data.callbacks
49
- assert_empty part2.clock.callbacks
50
- end
51
-
52
- def test_goes_the_right_direction
53
- part.data.send(:update, 1)
54
- part.clock.send(:update, 1)
55
- assert_equal({ steps: -1, angle: 348.0 }, part.state)
56
-
57
- part.reset
58
-
59
- part.data.send(:update, 1)
60
- part.clock.send(:update, 0)
61
- assert_equal({ steps: 1, angle: 12.0 }, part.state)
64
+
65
+ def test_observes_the_pins
66
+ part2 = Denko::DigitalIO::RotaryEncoder.new board: board, pins: {b: 6, a: 5}
67
+ refute_empty part2.b.callbacks
68
+ refute_empty part2.a.callbacks
62
69
  end
63
70
 
64
71
  def test_reverse
65
72
  part.reverse
66
73
  assert part.reversed
67
74
 
68
- part.data.send(:update, 1)
69
- part.clock.send(:update, 1)
70
- assert_equal({ steps: 1, angle: 12.0 }, part.state)
75
+ part.a.send(:update, 1)
76
+ part.b.send(:update, 1)
77
+ assert_equal({ count: 2, angle: 12.0 }, part.state)
71
78
  end
72
79
 
73
- def test_swapped_pins
74
- part2 = Denko::DigitalIO::RotaryEncoder.new board: board, pins: {data:4, clock: 3}
75
-
76
- part2.clock.send(:update, 1)
77
- part2.data.send(:update, 1)
78
- assert_equal({ steps: 1, angle: 12.0 }, part2.state)
79
- end
80
-
81
- def test_callback_prefilter
82
- part.data.send(:update, 1)
83
- part.clock.send(:update, 0)
80
+ def test_quadrature_decoding
81
+ part.b.send(:update, 0)
82
+ part.a.send(:update, 0)
84
83
  callback_value = nil
85
84
  part.add_callback do |value|
86
85
  callback_value = value.dup
87
86
  end
88
- part.data.send(:update, 1)
89
- part.clock.send(:update, 0)
90
-
91
- assert_equal({change: 1, steps: 2, angle: 24.0}, callback_value)
87
+
88
+ part.reset
89
+ part.a.send(:update, 1)
90
+ assert_equal({change: -1, count: -1, angle: 354.0}, callback_value)
91
+
92
+ part.b.send(:update, 1)
93
+ assert_equal({change: -1, count: -2, angle: 348.0}, callback_value)
94
+
95
+ part.a.send(:update, 0)
96
+ assert_equal({change: -1, count: -3, angle: 342.0}, callback_value)
97
+
98
+ part.b.send(:update, 0)
99
+ assert_equal({change: -1, count: -4, angle: 336.0}, callback_value)
100
+
101
+ part.b.send(:update, 1)
102
+ assert_equal({change: 1, count: -3, angle: 342.0}, callback_value)
103
+
104
+ part.a.send(:update, 1)
105
+ assert_equal({change: 1, count: -2, angle: 348.0}, callback_value)
106
+
107
+ part.b.send(:update, 0)
108
+ assert_equal({change: 1, count: -1, angle: 354.0}, callback_value)
109
+
110
+ part.a.send(:update, 0)
111
+ assert_equal({change: 1, count: 0, angle: 0.0}, callback_value)
92
112
  end
93
-
113
+
94
114
  def test_update_state_removes_change
95
- part.data.send(:update, 1)
96
- part.clock.send(:update, 1)
115
+ part.b.send(:update, 1)
116
+ part.a.send(:update, 1)
97
117
  assert_nil part.state[:change]
98
118
  end
99
119
  end