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
@@ -1,45 +1,49 @@
1
1
  module Denko
2
2
  class Board
3
- def spi_header_generic(write, read, mode, bit_order)
4
- # Defaults.
5
- mode ||= 0
6
- bit_order ||= :msbfrst
3
+ # Use all of the board's aux buffer, except 8 bytes for header, or default to 512.
4
+ # NOTE: SPI lengths are sent as 12-bit, so hard upper limit of 4095.
5
+ def spi_limit
6
+ @spi_limit ||= aux_limit ? aux_limit-8 : 512
7
+ end
7
8
 
8
- raise ArgumentError, "can't read more than 255 SPI bytes at a time" if read > 255
9
- raise ArgumentError, "can't write more than 255 SPI bytes at a time" if write.length > 255
9
+ def spi_header_generic(select_pin, write, read, mode=0, bit_order=:msbfirst)
10
+ raise ArgumentError, "can't read more than #{spi_limit} SPI bytes at a time" if read > spi_limit
11
+ raise ArgumentError, "can't write more than #{spi_limit} SPI bytes at a time" if write.length > spi_limit
10
12
 
11
- # Lowest 2 bits of settings control the SPI mode.
13
+ # Lowest 2 bits of settings hold the SPI mode number.
14
+ raise ArgumentError, "invalid SPI mode: #{mode}. Must be 0, 1, 2, or 3" unless (0..3).include? mode
12
15
  settings = mode
13
- unless (0..3).include? settings
14
- raise ArgumentError, "invalid SPI mode: #{settings.inspect}. Must be 0, 1, 2, or 3"
15
- end
16
16
 
17
17
  # Bit 7 of settings toggles MSBFIRST (1) or LSBFIRST (0) for both read and write.
18
- settings = settings | 0b10000000 unless bit_order == :lsbfirst
18
+ settings |= 0b10000000 unless bit_order == :lsbfirst
19
19
 
20
- # Return generic portion of header (used by both hardware and bit bang SPI).
21
- pack(:uint8, [settings, read, write.length])
22
- end
20
+ # Bit 6 of settings indicates whether a select pin needs to be toggled.
21
+ settings |= 0b01000000 if select_pin
23
22
 
24
- def spi_header(write, read, frequency, mode, bit_order)
25
- # Set default frequency and validate.
26
- frequency ||= 1000000
27
- unless [Integer, Float].include? frequency.class
28
- raise ArgumentError, "error in SPI frequency: #{frequency.inspect}"
29
- end
23
+ # 3 bytes are available for read and write length, so 12-bits each.
24
+ # Bytes 1 and 2 are lower 8 bits for read and write respectively.
25
+ # Byte 3 is shared: upper 4 hold read[8..12], lower 4 hold write.length[8..12]
26
+ shared_byte = ((read & 0xF00) >> 4) | ((write.length & 0xF00) >> 8)
30
27
 
31
- # Get the generic part of the SPI header.
32
- header = spi_header_generic(write, read, mode, bit_order)
28
+ # Generic portion (first 4 bytes), used by both hardware and bit bang SPI.
29
+ pack :uint8, [settings, read & 0xFF, write.length & 0xFF, shared_byte]
30
+ end
31
+
32
+ def spi_header(select_pin, write, read, frequency=1_000_000, mode=0, bit_order=:msbfirst)
33
+ raise ArgumentError, "error in SPI frequency: #{frequency}" unless [Integer, Float].include?(frequency.class)
34
+ frequency = frequency.to_i
33
35
 
34
36
  # Generic header + packed frequency = hardware SPI header.
35
- header + pack(:uint32, frequency)
37
+ header = spi_header_generic(select_pin, write, read, mode, bit_order)
38
+ header += pack(:uint32, frequency)
36
39
  end
37
40
 
38
41
  # CMD = 26
39
- def spi_transfer(select_pin, write: [], read: 0, frequency: nil, mode: nil, bit_order: nil)
40
- raise ArgumentError, "no bytes given to read or write" if (read == 0) && (write.empty?)
42
+ def spi_transfer(spi_index, select_pin, write: [], read: 0, frequency: 1_000_000, mode: 0, bit_order: :msbfirst)
43
+ raise ArgumentError, "no bytes given to read or write" if (read <= 0) && (write.empty?)
44
+ raise ArgumentError, "select_pin cannot be nil when reading or listening" if (read > 0) && (select_pin == nil)
41
45
 
42
- header = spi_header(write, read, frequency, mode, bit_order)
46
+ header = spi_header(select_pin, write, read, frequency, mode, bit_order)
43
47
 
44
48
  self.write Message.encode command: 26,
45
49
  pin: select_pin,
@@ -47,11 +51,12 @@ module Denko
47
51
  end
48
52
 
49
53
  # CMD = 27
50
- def spi_listen(select_pin, read: 0, frequency: nil, mode: nil, bit_order: nil)
51
- raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read > 0)
54
+ def spi_listen(spi_index, select_pin, read: 0, frequency: 1_000_000, mode: 0, bit_order: :msbfirst)
55
+ raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read.class == Integer) && (read > 0)
56
+ raise ArgumentError, "select_pin cannot be nil when reading or listening" if (select_pin == nil)
57
+
58
+ header = spi_header(select_pin, [], read, frequency, mode, bit_order)
52
59
 
53
- header = spi_header([], read, frequency, mode, bit_order)
54
-
55
60
  self.write Message.encode command: 27,
56
61
  pin: select_pin,
57
62
  aux_message: header
@@ -1,26 +1,24 @@
1
1
  module Denko
2
2
  class Board
3
- def spi_bb_header(clock, input, output, write, read, mode, bit_order)
4
- # Validate clock and data pins
5
- raise ArgumentError, "no clock pin given" unless clock
6
- raise ArgumentError, "no input or output pin given. Require either or both" unless(input || output)
3
+ def spi_bb_header(clock, input, output, select_pin, write, read, mode=0, bit_order=:msbfirst)
4
+ raise ArgumentError, "either output or input pin required" unless (input || output)
5
+ raise ArgumentError, "clock pin required" unless clock
7
6
 
8
7
  # Set the other to disabled if only one given.
9
8
  input ||= 255
10
- ouptut ||= 255
9
+ output ||= 255
11
10
 
12
- # Get the generic part of the SPI header.
13
- header = spi_header_generic(write, read, mode, bit_order)
14
-
15
- # Generic header + packed pins + empty byte = bit bang SPI bheader.
11
+ # Generic header + packed pins + empty byte = bit bang SPI header.
12
+ header = spi_header_generic(select_pin, write, read, mode, bit_order)
16
13
  header = header + pack(:uint8, [clock, input, output, 0])
17
14
  end
18
15
 
19
16
  # CMD = 21
20
- def spi_bb_transfer(select_pin, clock: nil, output: nil, input: nil, write: [], read: 0, frequency: nil, mode: nil, bit_order: nil)
21
- raise ArgumentError, "no bytes given to read or write" if (read == 0) && (write.empty?)
17
+ def spi_bb_transfer(select_pin, clock: nil, output: nil, input: nil, write: [], read: 0, frequency: nil, mode: 0, bit_order: :msbfirst)
18
+ raise ArgumentError, "no bytes given to read or write" if (read <= 0) && (write.empty?)
19
+ raise ArgumentError, "select_pin cannot be nil when reading or listening" if (read > 0) && (select_pin == nil)
22
20
 
23
- header = spi_bb_header(clock, input, output, write, read, mode, bit_order)
21
+ header = spi_bb_header(clock, input, output, select_pin, write, read, mode, bit_order)
24
22
 
25
23
  self.write Message.encode command: 21,
26
24
  pin: select_pin,
@@ -28,10 +26,11 @@ module Denko
28
26
  end
29
27
 
30
28
  # CMD = 22
31
- def spi_bb_listen(select_pin, clock: nil, input: nil, read: 0, frequency: nil, mode: nil, bit_order: nil)
32
- raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read > 0)
29
+ def spi_bb_listen(select_pin, clock: nil, input: nil, read: 0, frequency: nil, mode: 0, bit_order: :msbfirst)
30
+ raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read.class == Integer) && (read > 0)
31
+ raise ArgumentError, "select_pin cannot be nil when reading or listening" if (select_pin == nil)
33
32
 
34
- header = spi_bb_header(clock, input, nil, [], read, mode, bit_order)
33
+ header = spi_bb_header(clock, input, nil, select_pin, [], read, mode, bit_order)
35
34
 
36
35
  self.write Message.encode command: 22,
37
36
  pin: select_pin,
data/lib/denko/board.rb CHANGED
@@ -3,28 +3,31 @@ Dir["#{Denko.root}/lib/denko/board/*.rb"].each { |file| require file }
3
3
 
4
4
  module Denko
5
5
  class Board
6
- attr_reader :name, :version, :serial_buffer_size, :aux_limit, :eeprom_length
7
- attr_reader :low, :high, :analog_write_high, :analog_read_high
6
+ attr_reader :name, :version, :serial_buffer_size, :aux_limit, :eeprom_length, :i2c_limit
7
+ attr_reader :low, :high, :analog_write_resolution, :analog_read_resolution, :analog_write_high, :analog_read_high
8
8
 
9
- def initialize(transport, options={})
9
+ def platform
10
+ :arduino
11
+ end
12
+
13
+ def initialize(connection, options={})
10
14
  # Shake hands
11
- @transport = transport
12
- ack = transport.handshake
15
+ @connection = connection
16
+ ack = connection.handshake
13
17
 
14
18
  # Split handshake acknowledgement into separate values.
15
19
  @name, @version, @serial_buffer_size, @aux_limit, @eeprom_length, @i2c_limit = ack.split(",")
16
20
 
17
- # Tell transport how much serial buffer the board has, for flow control.
21
+ # Tell connection how much serial buffer the board has, for flow control.
18
22
  @serial_buffer_size = @serial_buffer_size.to_i
19
23
  raise StandardError, "no serial buffer size given in handshake" if @serial_buffer_size < 1
20
- @transport.remote_buffer_size = @serial_buffer_size
24
+ @connection.remote_buffer_size = @serial_buffer_size
21
25
 
22
26
  # Load board map by name.
23
27
  @name = nil if @name.empty?
24
28
  load_map(@name)
25
29
 
26
- # Leave room for null termination of aux messages.
27
- @aux_limit = @aux_limit.to_i - 1
30
+ @aux_limit = @aux_limit.to_i
28
31
 
29
32
  # Set I2C transaction size limit. Safe minimum is 32.
30
33
  # This makes I2C fail silently if board does not implement.
@@ -35,62 +38,54 @@ module Denko
35
38
  @version = nil if @version.empty?
36
39
  @eeprom_length = @eeprom_length.to_i
37
40
 
38
- # Transport calls #update on board when data is received.
39
- transport.add_observer(self)
40
-
41
+ # connection calls #update on board when data is received.
42
+ connection.add_observer(self)
43
+
41
44
  # Set digital and analog IO levels.
42
45
  @low = 0
43
46
  @high = 1
44
47
  self.analog_write_resolution = options[:write_bits] || 8
45
48
  self.analog_read_resolution = options[:read_bits] || 10
46
49
  end
47
-
50
+
48
51
  def finish_write
49
- sleep 0.001 while @transport.writing?
52
+ sleep 0.001 while @connection.writing?
50
53
  write "\n91\n"
51
- sleep 0.001 while @transport.writing?
54
+ sleep 0.001 while @connection.writing?
52
55
  end
53
-
56
+
54
57
  def analog_write_resolution=(value)
55
58
  set_analog_write_resolution(value)
56
- @write_bits = value
57
- @analog_write_high = (2 ** @write_bits) - 1
59
+ @analog_write_resolution = value
60
+ @analog_write_high = (2 ** @analog_write_resolution) - 1
58
61
  end
59
-
62
+
60
63
  def analog_read_resolution=(value)
61
64
  set_analog_read_resolution(value)
62
- @read_bits = value
63
- @analog_read_high = (2 ** @read_bits) - 1
64
- end
65
-
66
- def analog_write_resolution
67
- @write_bits
65
+ @analog_read_resolution = value
66
+ @analog_read_high = (2 ** @analog_read_resolution) - 1
68
67
  end
69
68
 
70
- def analog_read_resolution
71
- @read_bits
72
- end
73
-
74
69
  alias :pwm_high :analog_write_high
75
70
  alias :dac_high :analog_write_high
76
71
  alias :adc_high :analog_read_high
77
-
72
+
78
73
  def write(msg)
79
- @transport.write(msg)
74
+ @connection.write(msg)
80
75
  end
81
76
 
82
77
  #
83
78
  # Use Board#write_and_halt to call C++ board functions that disable interrupts
84
79
  # for a long time. "Long" being more than 1 serial character (~85us for 115200 baud).
85
80
  #
86
- # The "halt" part tells the TxRx to halt transmission to the board after this message.
81
+ # The "halt" part tells the Connection to halt transmission to the board after this message.
87
82
  # Since it expects interrupts to be disabled, any data sent could be lost.
88
- #
83
+ #
89
84
  # When the board function has re-enabled interrupts, it should call sendReady(). That
90
- # signal is read by the TxRx, telling it to resume transmisison.
85
+ # signal is read by the Connection, telling it to resume transmisison.
91
86
  #
92
87
  def write_and_halt(msg)
93
- @transport.write(msg, true)
88
+ @connection.write(msg, true)
94
89
  end
95
90
 
96
91
  #
@@ -100,6 +95,16 @@ module Denko
100
95
 
101
96
  def update(line)
102
97
  pin, message = line.split(":", 2)
98
+
99
+ # Handle messages from hardware I2C buses.
100
+ match = pin.match /\AI2C(\d*)/
101
+ if match
102
+ dev_index = match[1].to_i
103
+ dev = hw_i2c_comps[dev_index]
104
+ dev.update(message) if dev
105
+ return
106
+ end
107
+
103
108
  pin = pin.to_i
104
109
  if single_pin_components[pin]
105
110
  single_pin_components[pin].update(message)
@@ -111,7 +116,7 @@ module Denko
111
116
  #
112
117
  def eeprom
113
118
  raise StandardError, 'board has no built-in EEPROM, or EEPROM disabled in sketch' if @eeprom_length == 0
114
- @eeprom ||= EEPROM::BuiltIn.new(board: self)
119
+ @eeprom ||= EEPROM::Board.new(board: self)
115
120
  end
116
121
  end
117
122
  end
@@ -0,0 +1,17 @@
1
+ module Denko
2
+ module Connection
3
+ class BinaryEcho
4
+ include Behaviors::SinglePin
5
+ include Behaviors::Reader
6
+
7
+ def test_range(min:0, max:255)
8
+ bytes = (min..max).to_a
9
+ board.binary_echo(pin, bytes)
10
+ end
11
+
12
+ def test_array(arr)
13
+ board.binary_echo(pin, arr)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -8,8 +8,8 @@ module Denko
8
8
  @transit_mutex.synchronize { @remote_buffer_size = size }
9
9
  end
10
10
 
11
- def initialize(*args)
12
- super(*args)
11
+ def initialize(*args, **kwargs)
12
+ super(*args, **kwargs)
13
13
  # Start with minimum known buffer size. Board will update after handshake.
14
14
  # WARNING: If not updated, and ack threshold on the board is > minimum,
15
15
  # FlowControl will stop sending data, and appear to hang. Fix this.
@@ -27,7 +27,7 @@ module Denko
27
27
  @tx_halt_points << @write_buffer.length if tx_halt_after
28
28
  end
29
29
  end
30
-
30
+
31
31
  def writing?
32
32
  @write_buffer_mutex.synchronize { !@write_buffer.empty? }
33
33
  end
@@ -41,17 +41,16 @@ module Denko
41
41
 
42
42
  @write_buffer_mutex ||= Mutex.new
43
43
  @write_buffer_mutex.synchronize do
44
- @write_buffer = ""
44
+ @write_buffer = String.new
45
45
  @tx_halt_points = []
46
46
  end
47
47
  end
48
-
48
+
49
49
  def write_from_buffer
50
50
  fragment = nil
51
51
  halt_after_fragment = false
52
52
 
53
53
  @write_buffer_mutex.synchronize do
54
- # Nothing to write.
55
54
  break if @write_buffer.empty?
56
55
 
57
56
  # Try to send the entire buffer unless a halt point is coming up.
@@ -80,12 +79,10 @@ module Denko
80
79
  end
81
80
  end
82
81
 
83
- # If no fragment, wait.
84
82
  return wait unless fragment
85
83
 
86
- # If fragment, write it.
87
84
  loop do
88
- # Write and end loop if the board is ready.
85
+ # Write fragment if @tx_ready.
89
86
  @tx_ready_mutex.synchronize do
90
87
  if @tx_ready
91
88
  _write fragment
@@ -110,7 +107,7 @@ module Denko
110
107
 
111
108
  def read
112
109
  line = _read
113
-
110
+
114
111
  if line
115
112
  case line[0..2]
116
113
  # Board read (freed) this many bytes from its input buffer.
@@ -142,19 +139,18 @@ module Denko
142
139
  end
143
140
 
144
141
  def tx_halt
145
- @tx_ready_mutex.synchronize { @tx_ready = false }
142
+ @tx_ready_mutex.synchronize { @tx_ready = false }
146
143
  end
147
144
 
148
145
  def tx_resume
149
146
  @tx_ready_mutex.synchronize { @tx_ready = true }
150
147
  end
151
148
 
152
- def add_transit_bytes(value)
153
- @transit_mutex.synchronize { @transit_bytes = @transit_bytes + value }
154
- end
155
-
156
149
  def remove_transit_bytes(value)
157
- @transit_mutex.synchronize { @transit_bytes = @transit_bytes - value }
150
+ @transit_mutex.synchronize do
151
+ @transit_bytes = @transit_bytes - value
152
+ @transit_bytes = 0 if @transit_bytes < 0
153
+ end
158
154
  end
159
155
  end
160
156
  end
@@ -22,7 +22,9 @@ module Denko
22
22
  HANDSHAKE_TIMEOUT = 2
23
23
 
24
24
  def handshake
25
+ _write Message.encode(command: 90)
25
26
  io_reset
27
+
26
28
  HANDSHAKE_TRIES.times do |retries|
27
29
  begin
28
30
  print "Sending handshake to: #{self.to_s}... "
@@ -6,10 +6,10 @@ module Denko
6
6
  BAUD = 115200
7
7
 
8
8
  def initialize(options={})
9
- @device = options[:device]
10
- @baud = options[:baud] || BAUD
11
- @rx_buffer = ""
12
- @rx_line = ""
9
+ @device = options[:device]
10
+ @baud = options[:baud] || BAUD
11
+ @rx_buffer = String.new
12
+ @rx_line = String.new
13
13
  @rx_escaped = false
14
14
  end
15
15
 
@@ -36,7 +36,7 @@ module Denko
36
36
  else
37
37
  if (char == "\n")
38
38
  line = @rx_line
39
- @rx_line = ""
39
+ @rx_line = String.new
40
40
  return line
41
41
  elsif (char == "\\")
42
42
  @rx_escaped = true
@@ -1,6 +1,10 @@
1
1
  module Denko
2
2
  module DigitalIO
3
3
  class Button < Input
4
+ before_initialize do
5
+ params[:divider] = 1
6
+ end
7
+
4
8
  alias :down :on_low
5
9
  alias :up :on_high
6
10
  end
@@ -0,0 +1,15 @@
1
+ module Denko
2
+ module DigitalIO
3
+ class CBitBang
4
+ include Behaviors::SinglePin
5
+ include Behaviors::Callbacks
6
+ include Behaviors::Lifecycle
7
+
8
+ # This is purely to force initialize validation for any pins
9
+ # being used by C libraries that bit-bang.
10
+ before_initialize do
11
+ params[:mode] ||= :input
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,11 +5,10 @@ module Denko
5
5
  include Behaviors::Reader
6
6
  include Behaviors::Poller
7
7
  include Behaviors::Listener
8
+ include Behaviors::Lifecycle
8
9
 
9
- def after_initialize(options={})
10
- super(options)
11
- @divider = 4
12
- _listen
10
+ after_initialize do
11
+ _listen(params[:divider] || 4)
13
12
  end
14
13
 
15
14
  def _read
@@ -32,7 +31,7 @@ module Denko
32
31
  block.call(data) if data.to_i == board.low
33
32
  end
34
33
  end
35
-
34
+
36
35
  def pre_callback_filter(value)
37
36
  value.to_i
38
37
  end
@@ -4,22 +4,31 @@ module Denko
4
4
  include Behaviors::OutputPin
5
5
  include Behaviors::Callbacks
6
6
  include Behaviors::Threaded
7
+ include Behaviors::Lifecycle
8
+
7
9
  interrupt_with :digital_write
8
10
 
9
- def after_initialize(options={})
10
- super(options)
11
- board.digital_read(pin)
11
+ after_initialize do
12
+ board.digital_read(pin) unless @board.platform == :linux_milkv_duo
12
13
  end
13
14
 
14
15
  def pre_callback_filter(board_state)
15
16
  board_state.to_i
16
17
  end
17
18
 
18
- def digital_write(value)
19
- @board.digital_write(@pin, value)
20
- self.state = value
19
+ # mruby optimization. Bypass #state= setter.
20
+ if Denko.mruby?
21
+ def digital_write(value)
22
+ @board.digital_write(@pin, value)
23
+ @state = value
24
+ end
25
+ else
26
+ def digital_write(value)
27
+ @board.digital_write(@pin, value)
28
+ self.state = value
29
+ end
21
30
  end
22
-
31
+
23
32
  alias :write :digital_write
24
33
 
25
34
  def low
@@ -33,13 +42,13 @@ module Denko
33
42
  def toggle
34
43
  state == board.low ? high : low
35
44
  end
36
-
45
+
37
46
  alias :off :low
38
47
  alias :on :high
39
-
48
+
40
49
  def high?; state == board.high end
41
50
  def low?; state == board.low end
42
-
51
+
43
52
  alias :on? :high?
44
53
  alias :off? :low?
45
54
  end
@@ -0,0 +1,114 @@
1
+ module Denko
2
+ module DigitalIO
3
+ class PCF8574
4
+ include I2C::Peripheral
5
+ include Behaviors::Lifecycle
6
+
7
+ # Default I2C address. Override with i2c_address: key in initialize hash.
8
+ I2C_ADDRESS = 0x3F
9
+ I2C_FREQUENCY = 400_000
10
+
11
+ #
12
+ # 8 bit I/O expander where each read/write is a single I2C byte that gets/sets the whole register.
13
+ # - No separate data direction register.
14
+ # - Writing 1 to a bit puts that pin into high-impedance mode. It behaves as input or high output.
15
+ # - Writing 0 is low output.
16
+ # - Reading gives the actual state of the pins, regardless of direction.
17
+ #
18
+ after_initialize do
19
+ read_state
20
+ end
21
+
22
+ def write
23
+ bytes = []
24
+ @state_mutex.lock
25
+ if @state != @previous_state
26
+ @state.each_slice(8) do |slice|
27
+ byte = 0
28
+ slice.each_with_index do |bit, index|
29
+ next unless bit
30
+ byte |= (bit << index)
31
+ end
32
+
33
+ bytes.unshift byte
34
+ end
35
+ i2c_write bytes
36
+ @previous_state = @state.dup
37
+ end
38
+ @state_mutex.unlock
39
+ @state
40
+ end
41
+
42
+ def read_state
43
+ @state_mutex.lock
44
+ byte = i2c_read_raw(1)[0]
45
+ 8.times do |i|
46
+ @state[i] = (byte >> i) & 0b1
47
+ end
48
+ @state_mutex.unlock
49
+ @state
50
+ end
51
+
52
+ #
53
+ # BoardProxy interface. Refactor maybe?
54
+ #
55
+ def platform
56
+ :pcf8574
57
+ end
58
+
59
+ def set_pin_mode(pin, mode, options={})
60
+ if mode == :output
61
+ digital_write(pin, 0)
62
+ else
63
+ digital_write(pin, 1)
64
+ end
65
+ end
66
+
67
+ def digital_read(pin)
68
+ state[pin]
69
+ end
70
+
71
+ def is_a_register?
72
+ true
73
+ end
74
+
75
+ #
76
+ # Taken from SPI::BaseRegister
77
+ #
78
+ include Behaviors::BoardProxy
79
+ #
80
+ # Default registers to 1 byte, or 8 pins when used as Board Proxy.
81
+ # Can be ignored if reading / writing the register directly.
82
+ def bytes
83
+ @bytes = params[:bytes] || 1
84
+ end
85
+ attr_writer :bytes
86
+ #
87
+ # When used as BoardProxy, store the state of each register
88
+ # pin as a 0 or 1 in an array that is (@bytes * 8) long.
89
+ #
90
+ def state
91
+ @state ||= Array.new(bytes*8) { 1 }
92
+ end
93
+
94
+ #
95
+ # Taken from SPI::Output Register.
96
+ #
97
+ def digital_write(pin, value)
98
+ bit_set(pin, value)
99
+ write
100
+ end
101
+
102
+ def bit_set(pin, value)
103
+ @state_mutex.lock
104
+ @state[pin] = value
105
+ @state_mutex.unlock
106
+ value
107
+ end
108
+
109
+ def pin_is_pwm?(pin)
110
+ false
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,6 +1,8 @@
1
1
  module Denko
2
2
  module DigitalIO
3
3
  class Relay < Output
4
+ alias :open :off
5
+ alias :close :on
4
6
  end
5
7
  end
6
8
  end