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
@@ -3,13 +3,11 @@ module Denko
3
3
  module SinglePin
4
4
  include Component
5
5
  attr_reader :pin, :mode
6
-
7
- def mode=(mode)
6
+
7
+ def mode=(mode)
8
8
  board.set_pin_mode(pin, mode)
9
9
  @mode = mode
10
10
  end
11
-
12
- protected
13
11
 
14
12
  def convert_pins(options={})
15
13
  raise ArgumentError, 'a pin is required for this component' unless options[:pin]
@@ -18,6 +16,7 @@ module Denko
18
16
 
19
17
  def initialize_pins(options={})
20
18
  @pin = options[:pin]
19
+ self.mode = params[:mode] if params[:mode]
21
20
  end
22
21
  end
23
22
  end
@@ -1,22 +1,33 @@
1
1
  module Denko
2
2
  module Behaviors
3
3
  module State
4
- def initialize(options={})
5
- # Component includes State, so no need to call super here.
6
- @state_mutex = Mutex.new
7
- @state = nil
8
- end
9
-
10
- def state
11
- @state_mutex.synchronize { @state }
4
+ include Lifecycle
5
+
6
+ # Force state and mutex initialization.
7
+ after_initialize do
8
+ @state_mutex = Denko.gil? ? Denko::MutexStub.new : Mutex.new
9
+ state
12
10
  end
13
-
14
- protected
15
11
 
16
- def state=(value)
17
- @state_mutex.synchronize { @state = value }
12
+ # mruby optimization. Bypass state_mutex for simple states.
13
+ if Denko.mruby?
14
+ attr_accessor :state
15
+ else
16
+ def state
17
+ @state_mutex.lock
18
+ value = @state
19
+ @state_mutex.unlock
20
+ value
21
+ end
22
+
23
+ def state=(value)
24
+ @state_mutex.lock
25
+ @state = value
26
+ @state_mutex.unlock
27
+ @state
28
+ end
18
29
  end
19
-
30
+
20
31
  def update_state(value)
21
32
  self.state = value if value
22
33
  end
@@ -1,15 +1,32 @@
1
1
  module Denko
2
2
  module Behaviors
3
3
  module Subcomponents
4
- def components
5
- @components ||= []
4
+ #
5
+ # Main Methods
6
+ #
7
+ def add_component(component)
8
+ add_single_pin(component)
9
+ add_hw_i2c(component)
10
+ add_hw_spi(component)
11
+ components << component
6
12
  end
7
13
 
8
- def single_pin_components
9
- @single_pin_components ||= {}
14
+ def remove_component(component)
15
+ remove_single_pin(component)
16
+ remove_hw_i2c(component)
17
+ remove_hw_spi(component)
18
+ deleted = components.delete(component)
19
+ component.stop if deleted && component.respond_to?(:stop)
10
20
  end
11
21
 
12
- def add_component(component)
22
+ def components
23
+ @components ||= []
24
+ end
25
+
26
+ #
27
+ # Single Pin
28
+ #
29
+ def add_single_pin(component)
13
30
  if component.respond_to?(:pin) && component.pin.class == Integer
14
31
  unless single_pin_components[component.pin]
15
32
  single_pin_components[component.pin] = component
@@ -18,17 +35,60 @@ module Denko
18
35
  "already in use by: #{single_pin_components[component.pin]}"
19
36
  end
20
37
  end
21
-
22
- components << component
23
38
  end
24
39
 
25
- def remove_component(component)
40
+ def remove_single_pin(component)
26
41
  if component.respond_to?(:pin) && component.pin.class == Integer
27
- single_pin_components[component.pin] = nil
42
+ single_pin_components.delete(component.pin)
28
43
  end
29
-
30
- deleted = components.delete(component)
31
- component.stop if deleted && component.respond_to?(:stop)
44
+ end
45
+
46
+ def single_pin_components
47
+ @single_pin_components ||= {}
48
+ end
49
+
50
+ #
51
+ # I2C
52
+ #
53
+ def add_hw_i2c(component)
54
+ if component.respond_to?(:i2c_index)
55
+ unless hw_i2c_comps[component.i2c_index]
56
+ hw_i2c_comps[component.i2c_index] = component
57
+ else
58
+ raise StandardError, "Error adding #{component} to #{self}. I2C dev: #{component.i2c_index} " \
59
+ "already in use by: #{hw_i2c_comps[component.i2c_index]}"
60
+ end
61
+ end
62
+ end
63
+
64
+ def remove_hw_i2c(component)
65
+ hw_i2c_comps.delete(component.i2c_index) if component.respond_to?(:i2c_index)
66
+ end
67
+
68
+ def hw_i2c_comps
69
+ @hw_i2c_comps ||= {}
70
+ end
71
+
72
+ #
73
+ # SPI
74
+ #
75
+ def add_hw_spi(component)
76
+ if component.respond_to?(:spi_index)
77
+ unless hw_spi_comps[component.spi_index]
78
+ hw_spi_comps[component.spi_index] = component
79
+ else
80
+ raise StandardError, "Error adding #{component} to #{self}. SPI dev: #{component.spi_index} " \
81
+ "already in use by: #{hw_spi_comps[component.spi_index]}"
82
+ end
83
+ end
84
+ end
85
+
86
+ def remove_hw_spi(component)
87
+ hw_spi_comps.delete(component.spi_index) if component.respond_to?(:spi_index)
88
+ end
89
+
90
+ def hw_spi_comps
91
+ @hw_spi_comps ||= {}
32
92
  end
33
93
  end
34
94
  end
@@ -11,39 +11,50 @@ module Denko
11
11
  end
12
12
  end
13
13
 
14
+ def mruby_thread_check
15
+ if Denko.mruby?
16
+ raise NotImplementedError, "threads unavailable in mruby "
17
+ end
18
+ end
19
+
14
20
  def self.included(base)
15
21
  base.extend ClassMethods
16
22
  end
17
23
 
18
24
  def threaded(&block)
25
+ mruby_thread_check
19
26
  stop_thread
20
27
  enable_interrupts unless interrupts_enabled
21
28
  @thread = Thread.new(&block)
22
29
  end
23
30
 
24
31
  def threaded_loop(&block)
32
+ mruby_thread_check
25
33
  threaded do
26
34
  loop(&block)
27
35
  end
28
36
  end
29
37
 
30
38
  def stop_thread
39
+ mruby_thread_check
31
40
  @thread.kill if @thread
32
41
  end
33
42
 
34
43
  def stop
35
- stop_thread
36
- super if defined?(super)
44
+ stop_thread unless Denko.mruby?
45
+ begin; super; rescue NoMethodError; end
37
46
  end
38
47
 
39
48
  def enable_interrupts
40
- interrupts = self.class.class_eval('@@interrupts') rescue []
41
- interrupts.each do |method_name|
42
- standard_method = self.method(method_name)
49
+ unless Denko.mruby?
50
+ interrupts = self.class.class_eval('@@interrupts') rescue []
51
+ interrupts.each do |method_name|
52
+ standard_method = self.method(method_name)
43
53
 
44
- singleton_class.send(:define_method, method_name) do |*args|
45
- stop_thread unless (Thread.current == @thread)
46
- standard_method.call(*args)
54
+ singleton_class.send(:define_method, method_name) do |*args|
55
+ stop_thread unless (Thread.current == @thread)
56
+ standard_method.call(*args)
57
+ end
47
58
  end
48
59
  end
49
60
 
@@ -1,26 +1,40 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ BEHAVIORS_FILES = [
4
+ # Pin and component setup stuff
5
+ [:Lifecycle, "lifecycle"],
6
+ [:State, "state"],
7
+ [:Component, "component"],
8
+ [:SinglePin, "single_pin"],
9
+ [:InputPin, "input_pin"],
10
+ [:OutputPin, "output_pin"],
11
+ [:MultiPin, "multi_pin"],
12
+
13
+ # Subcomponent stuff
14
+ [:Subcomponents, "subcomponents"],
15
+ [:BusController, "bus_controller"],
16
+ [:BusControllerAddressed, "bus_controller_addressed"],
17
+ [:BusPeripheral, "bus_peripheral"],
18
+ [:BusPeripheralAddressed, "bus_peripheral_addressed"],
19
+ [:BoardProxy, "board_proxy"],
20
+
21
+ # Async stuff
22
+ [:Threaded, "threaded"],
23
+ [:Callbacks, "callbacks"],
24
+ [:Reader, "reader"],
25
+ [:Poller, "poller"],
26
+ [:Listener, "listener"],
27
+ ]
28
+
1
29
  module Denko
2
30
  module Behaviors
3
- # Pin and component setup stuff
4
- autoload :State, "#{__dir__}/behaviors/state"
5
- autoload :Component, "#{__dir__}/behaviors/component"
6
- autoload :SinglePin, "#{__dir__}/behaviors/single_pin"
7
- autoload :InputPin, "#{__dir__}/behaviors/input_pin"
8
- autoload :OutputPin, "#{__dir__}/behaviors/output_pin"
9
- autoload :MultiPin, "#{__dir__}/behaviors/multi_pin"
10
-
11
- # Subcomponent stuff
12
- autoload :Subcomponents, "#{__dir__}/behaviors/subcomponents"
13
- autoload :BusController, "#{__dir__}/behaviors/bus_controller"
14
- autoload :BusControllerAddressed, "#{__dir__}/behaviors/bus_controller_addressed"
15
- autoload :BusPeripheral, "#{__dir__}/behaviors/bus_peripheral"
16
- autoload :BusPeripheralAddressed, "#{__dir__}/behaviors/bus_peripheral_addressed"
17
- autoload :BoardProxy, "#{__dir__}/behaviors/board_proxy"
18
-
19
- # Async stuff
20
- autoload :Threaded, "#{__dir__}/behaviors/threaded"
21
- autoload :Callbacks, "#{__dir__}/behaviors/callbacks"
22
- autoload :Reader, "#{__dir__}/behaviors/reader"
23
- autoload :Poller, "#{__dir__}/behaviors/poller"
24
- autoload :Listener, "#{__dir__}/behaviors/listener"
31
+ BEHAVIORS_FILES.each do |file|
32
+ file_path = "#{__dir__}/behaviors/#{file[1]}"
33
+ if file[0]
34
+ autoload file[0], file_path
35
+ else
36
+ require file_path
37
+ end
38
+ end
25
39
  end
26
40
  end
@@ -3,29 +3,44 @@ module Denko
3
3
  DIVIDERS = [1, 2, 4, 8, 16, 32, 64, 128]
4
4
 
5
5
  PIN_MODES = {
6
- output: 0b000,
7
- output_pwm: 0b010,
8
- output_dac: 0b100,
9
- input: 0b001,
10
- input_pulldown: 0b011,
11
- input_pullup: 0b101,
12
- input_output: 0b111
6
+ output: 0b0000,
7
+ output_pwm: 0b0010,
8
+ output_dac: 0b0100,
9
+ output_open_drain: 0b0110,
10
+ output_open_source: 0b1000,
11
+ input: 0b0001,
12
+ input_pulldown: 0b0011,
13
+ input_pullup: 0b0101,
13
14
  }
14
15
 
15
16
  # CMD = 0
16
- def set_pin_mode(pin, mode=:input)
17
+ def set_pin_mode(pin, mode=:input, options={})
17
18
  unless PIN_MODES.keys.include? mode
18
19
  raise ArgumentError, "cannot set mode: #{mode}. Should be one of: #{PIN_MODES.keys.inspect}"
19
20
  end
21
+
22
+ # Set frequency and resolution for PWM if given.
23
+ aux = nil
24
+ if (mode == :output_pwm) && options
25
+ aux = [0, 0]
26
+ aux[0] = options[:frequency] if options[:frequency]
27
+ aux[1] = options[:resolution] if options[:resolution]
28
+ aux = pack :uint32, aux, min: 8, max: 8
29
+ end
30
+
20
31
  write Message.encode command: 0,
21
32
  pin: pin,
22
- value: PIN_MODES[mode]
33
+ value: PIN_MODES[mode],
34
+ aux_message: aux
35
+ end
36
+
37
+ def set_pin_debounce(pin, debounce_time)
23
38
  end
24
39
 
25
40
  # CMD = 1
26
41
  def digital_write(pin,value)
27
42
  unless (value == 1) || (value == 0)
28
- raise ArgumentError, "cannot write digital value: #{value}. Should be Integer either 0 or 1"
43
+ raise ArgumentError, "cannot write digital value: #{value}. Should be Integer either 0 or 1"
29
44
  end
30
45
  write Message.encode command: 1, pin: pin, value: value
31
46
  end
@@ -37,12 +52,10 @@ module Denko
37
52
 
38
53
  # CMD = 3
39
54
  def pwm_write(pin,value)
40
- if (value < 0) || (value > pwm_high)
41
- raise ArgumentError, "cannot write PWM value: #{value}. Should be Integer in range 0..#{pwm_high} "
42
- end
55
+ raise ArgumentError, "PWM value cannot be negative" if (value < 0)
43
56
  write Message.encode command: 3, pin: pin, value: value.round
44
57
  end
45
-
58
+
46
59
  # CMD = 4
47
60
  def dac_write(pin,value)
48
61
  if (value < 0) || (value > dac_high)
@@ -60,7 +73,7 @@ module Denko
60
73
  def set_listener(pin, state=:off, **options)
61
74
  # Default to digital listener and validate.
62
75
  options[:mode] ||= :digital
63
- unless (options[:mode] == :digital) || (options[:mode] == :analog)
76
+ unless (options[:mode] == :digital) || (options[:mode] == :analog)
64
77
  raise ArgumentError, "error in mode: #{options[:mode]}. Should be one of: [:digital, :analog]"
65
78
  end
66
79
  mode_byte = (options[:mode] == :digital) ? 0 : 1
@@ -71,7 +84,7 @@ module Denko
71
84
  else
72
85
  options[:divider] ||= 16
73
86
  end
74
-
87
+
75
88
  # Convert divider to exponent and validate.
76
89
  exponent = Math.log2(options[:divider]).round
77
90
  if (exponent < 0) || (exponent > 7)
@@ -79,7 +92,7 @@ module Denko
79
92
  end
80
93
 
81
94
  # Validate state.
82
- unless (state == :on) || (state == :off)
95
+ unless (state == :on) || (state == :off)
83
96
  raise ArgumentError, "error in state: #{options[:state]}. Should be one of: [:on, :off]"
84
97
  end
85
98
  state_byte = (state == :on) ? 1 : 0
@@ -131,7 +144,7 @@ module Denko
131
144
  end
132
145
  write Message.encode(command: 96, value: value)
133
146
  end
134
-
147
+
135
148
  # CMD = 97
136
149
  def set_analog_read_resolution(value)
137
150
  if (value < 0) || (value > 16)
@@ -140,6 +153,11 @@ module Denko
140
153
  write Message.encode(command: 97, value: value)
141
154
  end
142
155
 
156
+ # CMD = 98
157
+ def binary_echo(pin, data=[])
158
+ write Message.encode command: 98, pin: pin, value: data.length, aux_message: pack(:uint8, data)
159
+ end
160
+
143
161
  # CMD = 99
144
162
  def micro_delay(duration)
145
163
  if (duration < 0) || (duration > 0xFFFF)
@@ -11,7 +11,7 @@ module Denko
11
11
  # CMD = 8
12
12
  def eeprom_write(address, bytes)
13
13
  address = pack :uint16, address
14
- bytes = pack :uint8, bytes, min: 1, max: 128
14
+ bytes = pack :uint8, bytes
15
15
  write Message.encode command: 8,
16
16
  value: bytes.length,
17
17
  aux_message: address + bytes
@@ -14,38 +14,37 @@ module Denko
14
14
  freq = 100000 unless freq
15
15
 
16
16
  unless I2C_FREQUENCIES.include?(freq)
17
- raise ArgumentError, "I2C frequency must be in: #{I2C_FREQUENCIES.keys.inspect}"
17
+ raise ArgumentError, "I2C frequency must be in: #{I2C_FREQUENCIES.keys.inspect}"
18
18
  end
19
19
  I2C_FREQUENCIES[freq]
20
20
  end
21
21
 
22
22
  # CMD = 33
23
- def i2c_search
23
+ def i2c_search(i2c_index)
24
24
  write Message.encode command: 33
25
25
  end
26
26
 
27
27
  # CMD = 34
28
- def i2c_write(address, bytes, frequency=100000, repeated_start=false)
29
- bytes = [bytes] unless bytes.class == Array
28
+ def i2c_write(i2c_index, address, bytes, frequency=100000, repeated_start=false)
29
+ bytes = [bytes].flatten unless bytes.class == Array
30
30
  raise ArgumentError, "I2C write must be 1..#{i2c_limit} bytes long" if (bytes.length > i2c_limit || bytes.length < 1)
31
-
31
+
32
32
  # Use top bit of address to select stop condition (1), or repated start (0).
33
33
  send_stop = repeated_start ? 0 : 1
34
- frequency = i2c_convert_frequency(frequency)
35
-
34
+
36
35
  write Message.encode command: 34,
37
- pin: address | (send_stop << 7),
38
- value: bytes.length,
39
- aux_message: pack(:uint8, frequency) + pack(:uint8, bytes)
36
+ aux_message: pack(:uint8, i2c_convert_frequency(frequency)) +
37
+ pack(:uint8, address | (send_stop << 7)) +
38
+ pack(:uint8, bytes.length) +
39
+ pack(:uint8, bytes)
40
40
  end
41
41
 
42
42
  # CMD = 35
43
- def i2c_read(address, register, read_length, frequency=100000, repeated_start=false)
43
+ def i2c_read(i2c_index, address, register, read_length, frequency=100000, repeated_start=false)
44
44
  raise ArgumentError, "I2C read must be 1..#{i2c_limit} bytes long" if (read_length > i2c_limit || read_length < 1)
45
45
 
46
46
  # Use top bit of address to select stop condition (1), or repated start (0).
47
47
  send_stop = repeated_start ? 0 : 1
48
- frequency = i2c_convert_frequency(frequency)
49
48
 
50
49
  # A register address starting register address can be given (up to 4 bytes)
51
50
  if register
@@ -57,9 +56,10 @@ module Denko
57
56
  end
58
57
 
59
58
  write Message.encode command: 35,
60
- pin: address | (send_stop << 7),
61
- value: read_length,
62
- aux_message: pack(:uint8, frequency) + register_packed
59
+ aux_message: pack(:uint8, i2c_convert_frequency(frequency)) +
60
+ pack(:uint8, address | (send_stop << 7)) +
61
+ pack(:uint8, read_length) +
62
+ register_packed
63
63
  end
64
64
  end
65
65
  end
@@ -0,0 +1,53 @@
1
+ module Denko
2
+ class Board
3
+ def i2c_bb_setup(scl, sda)
4
+ # Stub method. Other implementations may call this.
5
+ end
6
+
7
+ # CMD = 30
8
+ def i2c_bb_search(scl, sda)
9
+ write Message.encode command: 30,
10
+ pin: scl,
11
+ value: sda
12
+ end
13
+
14
+ # CMD = 31
15
+ def i2c_bb_write(scl, sda, address, bytes, repeated_start=false)
16
+ bytes = [bytes].flatten unless bytes.class == Array
17
+
18
+ # Use top bit of address to select stop condition (1), or repated start (0).
19
+ send_stop = repeated_start ? 0 : 1
20
+
21
+ write Message.encode command: 31,
22
+ pin: scl,
23
+ value: sda,
24
+ aux_message: pack(:uint8, 0x00) +
25
+ pack(:uint8, address | (send_stop << 7)) +
26
+ pack(:uint8, bytes.length) +
27
+ pack(:uint8, bytes)
28
+ end
29
+
30
+ # CMD = 32
31
+ def i2c_bb_read(scl, sda, address, register, read_length, repeated_start=false)
32
+ # Use top bit of address to select stop condition (1), or repated start (0).
33
+ send_stop = repeated_start ? 0 : 1
34
+
35
+ # A register address starting register address can be given (up to 4 bytes)
36
+ if register
37
+ register = [register].flatten
38
+ raise ArgumentError, 'maximum 4 byte register address for I2C read' if register.length > 4
39
+ register_packed = pack(:uint8, [register.length] + register)
40
+ else
41
+ register_packed = pack(:uint8, [0])
42
+ end
43
+
44
+ write Message.encode command: 32,
45
+ pin: scl,
46
+ value: sda,
47
+ aux_message: pack(:uint8, 0x00) +
48
+ pack(:uint8, address | (send_stop << 7)) +
49
+ pack(:uint8, read_length) +
50
+ register_packed
51
+ end
52
+ end
53
+ end
@@ -2,17 +2,17 @@ module Denko
2
2
  class Board
3
3
  def infrared_emit(pin, frequency, pulses)
4
4
  #
5
- # Limit to 255 marks/spaces (not pairs) for now.
5
+ # Limit to 255 marks/spaces (not pairs).
6
6
  #
7
- # Length must be 1-byte long, not literally 1
7
+ # Make length uint16 as well, for aligned memory access on ESP8266.
8
8
  # Pulses max is 2x255 bytes long since each is 2 bytes.
9
- length = pack :uint8, pulses.length, max: 1
9
+ length = pack :uint16, pulses.length, max: 2
10
10
  bytes = pack :uint16, pulses, min: 1, max: 510
11
11
 
12
12
  write Message.encode command: 16,
13
- pin: pin,
14
- value: frequency,
15
- aux_message: length + bytes
13
+ pin: pin,
14
+ value: frequency,
15
+ aux_message: length + bytes
16
16
  end
17
17
  end
18
18
  end
@@ -1,15 +1,16 @@
1
1
  module Denko
2
2
  class Board
3
3
  def show_ws2812(pin, pixel_buffer)
4
- # Settings are blank for now.
5
- settings = pack :uint8, [0, 0, 0, 0]
6
-
7
- packed_pixels = pack :uint8, pixel_buffer
4
+ # ALWAYS have first 4 bytes set to 0. ESP32 crashes without this!
5
+ # Last 4 bytes will be settings, but not yet. Just 24-bit 800 kHz for now.
6
+ settings = pack :uint8, [0, 0, 0, 0, 0, 0, 0, 0]
7
+
8
+ pixel_bytes = pack :uint8, pixel_buffer
8
9
 
9
10
  write_and_halt Message.encode command: 19,
10
11
  pin: pin,
11
12
  value: pixel_buffer.length,
12
- aux_message: settings + packed_pixels
13
+ aux_message: settings + pixel_bytes
13
14
  end
14
15
  end
15
16
  end
@@ -5,7 +5,7 @@ module Denko
5
5
  MAPS_FOLDER = File.join(Denko.root, "vendor/board-maps/yaml")
6
6
 
7
7
  attr_reader :map
8
-
8
+
9
9
  def substitute_zero_pins
10
10
  ["SDA", "SCL", "MOSI", "MISO", "SCK", "SS"].each do |name|
11
11
  symbol = name.to_sym
@@ -25,7 +25,7 @@ module Denko
25
25
  rescue
26
26
  raise StandardError, "error loading board map from file for board name: '#{board_name}'"
27
27
  end
28
-
28
+
29
29
  def convert_pin(pin)
30
30
  # Convert non numerical strings to symbols.
31
31
  pin = pin.to_sym if (pin.class == String) && !(pin.match (/\A\d+\.*\d*/))
@@ -50,6 +50,10 @@ module Denko
50
50
  rescue
51
51
  raise ArgumentError, "error in pin: #{pin.inspect}"
52
52
  end
53
+
54
+ def pin_is_pwm?(pin)
55
+ false
56
+ end
53
57
  end
54
58
  end
55
59
  end
@@ -1,9 +1,9 @@
1
1
  module Denko
2
2
  class Board
3
- def one_wire_reset(pin, value=0)
3
+ def one_wire_reset(pin, read_presence=false)
4
4
  write Message.encode command: 41,
5
5
  pin: pin,
6
- value: value
6
+ value: read_presence ? 1 : 0
7
7
  end
8
8
 
9
9
  def one_wire_search(pin, branch_mask)
@@ -12,7 +12,7 @@ module Denko
12
12
  aux_message: pack(:uint64, branch_mask, max: 8)
13
13
  end
14
14
 
15
- def one_wire_write(pin, parasite_power, *data)
15
+ def one_wire_write(pin, parasite_power, data)
16
16
  bytes = pack :uint8, data, min: 1, max: 127 # Should be 128 with 0 = 1.
17
17
 
18
18
  # Set high bit of length if the bus must drive high after write.