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,39 +1,50 @@
1
1
  module Denko
2
2
  module LED
3
3
  class APA102
4
- include SPI::Peripheral
4
+ include Behaviors::BusPeripheral
5
+ include Behaviors::Lifecycle
5
6
 
6
- attr_reader :length, :bpp, :brightness
7
-
8
- def before_initialize(options={})
9
- options[:pin] = 255
10
- super(options)
7
+ def length
8
+ @length ||= params[:length] || 1
11
9
  end
12
10
 
13
- def after_initialize(options={})
14
- super(options)
15
-
16
- raise ArgumentError, "no length given for APA102 array" unless options[:length]
17
- @length = options[:length]
11
+ # Start frame is always 32 0-bits (4 bytes).
12
+ def start_frame
13
+ @start_frame ||= Array.new(4) { 0 }
14
+ end
18
15
 
19
- # Start frame is always 32 0-bits (4 bytes).
20
- @start_frame = Array.new(4) { 0 }
16
+ def end_frame
17
+ return @end_frame if @end_frame
21
18
 
22
- # End frame must be at least @length/2 bits long, and 32 bits (4 bytes) minimum.
23
- end_frame_bytes = (@length / 16.0).ceil
19
+ # End frame must be at least length/2 bits long, and 32 bits (4 bytes) minimum.
20
+ end_frame_bytes = (length / 16.0).ceil
24
21
  end_frame_bytes = 4 if end_frame_bytes < 4
25
22
 
26
23
  # Use all 0's for end frame instead of 1's. Prevents extra pixel when using partial strip.
27
24
  @end_frame = Array.new(end_frame_bytes) { 0 }
25
+ end
26
+
27
+ # This is BYTES per pixel, not bits per pixel.
28
+ # 0th byte is per-pixel brightness (PWM applied to all 3 colors).
29
+ def bpp
30
+ @bpp ||= 4
31
+ end
28
32
 
29
- # This is BYTES per pixel, not bits per pixel.
30
- # 0th byte is per-pixel brightness (PWM applied to all 3 colors).
31
- @bpp = 4
32
- @buffer = Array.new(length * bpp) { 0 }
33
+ def buffer
34
+ @buffer ||= Array.new(length * bpp) { 0 }
35
+ end
36
+
37
+ attr_writer :buffer
38
+
39
+ before_initialize do
40
+ unless [Denko::SPI::Bus, Denko::SPI::BitBang].include? params[:bus].class
41
+ raise "APA102 must be connected to the output pin of a SPI bus"
42
+ end
43
+ end
33
44
 
45
+ after_initialize do
34
46
  # Default to max brightness.
35
47
  self.brightness = 31
36
-
37
48
  off
38
49
  end
39
50
 
@@ -47,26 +58,26 @@ module Denko
47
58
  @masked_brightness = 0b11100000 | @brightness
48
59
 
49
60
  # Set brightness for all pixels.
50
- (0..@length-1).each do |index|
51
- @buffer[index*bpp+0] = @masked_brightness
61
+ (0..length-1).each do |index|
62
+ buffer[index*bpp+0] = @masked_brightness
52
63
  end
53
64
  end
54
65
 
55
66
  def []=(index, array)
56
67
  # Per-pixel brightness control, as optional 3rd indexed element of array.
57
68
  if array[3]
58
- @buffer[index*bpp+0] = 0b11100000 | array[3]
69
+ buffer[index*bpp+0] = 0b11100000 | array[3]
59
70
  end
60
-
71
+
61
72
  # APA102 uses BGR ordering.
62
- @buffer[index*bpp+1] = array[2]
63
- @buffer[index*bpp+2] = array[1]
64
- @buffer[index*bpp+3] = array[0]
73
+ buffer[index*bpp+1] = array[2]
74
+ buffer[index*bpp+2] = array[1]
75
+ buffer[index*bpp+3] = array[0]
65
76
  end
66
77
 
67
78
  def all_on
68
79
  self.brightness = 31
69
- @buffer = @buffer.each_slice(bpp).map { [@masked_brightness,255,255,255] }.flatten
80
+ self.buffer = buffer.each_slice(bpp).map { [@masked_brightness,255,255,255] }.flatten
70
81
  show
71
82
  end
72
83
 
@@ -76,11 +87,12 @@ module Denko
76
87
  end
77
88
 
78
89
  def clear
79
- @buffer = @buffer.each_slice(bpp).map { [@masked_brightness,0,0,0] }.flatten
90
+ self.buffer = buffer.each_slice(bpp).map { [@masked_brightness,0,0,0] }.flatten
80
91
  end
81
92
 
82
93
  def show
83
- spi_write(@start_frame + @buffer + @end_frame)
94
+ data = start_frame + buffer + end_frame
95
+ bus.transfer(nil, write: data)
84
96
  end
85
97
  end
86
98
  end
@@ -2,11 +2,22 @@ module Denko
2
2
  module LED
3
3
  class Base < PulseIO::PWMOutput
4
4
  def blink(interval=0.5)
5
- threaded_loop do
5
+ self.blink_interval = interval
6
+ threaded_loop do
6
7
  toggle
7
- sleep interval
8
+ sleep @blink_interval
8
9
  end
9
10
  end
11
+
12
+ def blink_interval=(interval)
13
+ @blink_interval = interval
14
+ end
15
+ attr_reader :blink_interval
16
+ end
17
+
18
+ # Shortcut, so LED.new does LED::Base.new.
19
+ def self.new(options={})
20
+ self::Base.new(options)
10
21
  end
11
22
  end
12
23
  end
data/lib/denko/led/rgb.rb CHANGED
@@ -11,27 +11,31 @@ module Denko
11
11
 
12
12
  # Format: [R, G, B]
13
13
  COLORS = {
14
- red: [255, 000, 000],
15
- green: [000, 255, 000],
16
- blue: [000, 000, 255],
17
- cyan: [000, 255, 255],
18
- yellow: [255, 255, 000],
19
- magenta: [255, 000, 255],
20
- white: [255, 255, 255],
14
+ red: [100, 000, 000],
15
+ green: [000, 100, 000],
16
+ blue: [000, 000, 100],
17
+ cyan: [000, 100, 100],
18
+ yellow: [100, 100, 000],
19
+ magenta: [100, 000, 100],
20
+ white: [100, 100, 100],
21
21
  off: [000, 000, 000]
22
22
  }
23
23
 
24
- def write(array)
25
- red.write array[0]
26
- green.write array[1]
27
- blue.write array[2]
24
+ def write(r, g, b)
25
+ red.duty = r
26
+ green.duty = g
27
+ blue.duty = b
28
28
  end
29
29
 
30
- def color=(color)
31
- return write(color) if color.class == Array
30
+ def write_8_bit(r, g, b)
31
+ red.duty = ((r / 255.0) * 100).round
32
+ green.duty = ((g / 255.0) * 100).round
33
+ blue.duty = ((b / 255.0) * 100).round
34
+ end
32
35
 
36
+ def color=(color)
33
37
  color = color.to_sym
34
- write(COLORS[color]) if COLORS.include? color
38
+ write(*COLORS[color]) if COLORS.include? color
35
39
  end
36
40
  end
37
41
  end
@@ -2,7 +2,8 @@ module Denko
2
2
  module LED
3
3
  class SevenSegment
4
4
  include Behaviors::MultiPin
5
-
5
+ include Behaviors::Lifecycle
6
+
6
7
  ALL_OFF = [0,0,0,0,0,0,0]
7
8
  BLANK = " "
8
9
 
@@ -14,13 +15,15 @@ module Denko
14
15
  proxy_pin :cathode, DigitalIO::Output, optional: true
15
16
  proxy_pin :anode, DigitalIO::Output, optional: true
16
17
  end
17
-
18
- def after_initialize(options={})
19
- @segments = [a,b,c,d,e,f,g]
20
- clear; on
18
+
19
+ def segments
20
+ @segments ||= [a,b,c,d,e,f,g]
21
21
  end
22
22
 
23
- attr_reader :segments
23
+ after_initialize do
24
+ clear
25
+ on
26
+ end
24
27
 
25
28
  def clear
26
29
  write(BLANK)
@@ -46,7 +49,7 @@ module Denko
46
49
 
47
50
  def on?; @on; end
48
51
  def off?; !@on; end
49
-
52
+
50
53
  CHARACTERS = {
51
54
  '0' => [1,1,1,1,1,1,0],
52
55
  '1' => [0,1,1,0,0,0,0],
@@ -93,9 +96,21 @@ module Denko
93
96
 
94
97
  def write(char)
95
98
  bits = CHARACTERS[char] || ALL_OFF
99
+ bits = bits.map { |b| 1^b } if anode
100
+
96
101
  bits.each_with_index do |bit, index|
97
- bit = 1^bit if anode
98
- segments[index].write(bit) unless (segments[index].state == bit)
102
+ if board.is_a_register?
103
+ # On a register, use #bit_set except for the last bit. This changes state in memory.
104
+ # #digital_write on the last bit causes the register to write to its parallel out.
105
+ if (index == bits.length-1)
106
+ segments[index].digital_write(bit)
107
+ else
108
+ board.bit_set(segments[index].pin, bit)
109
+ end
110
+ else
111
+ # On a board, only set bits if changed.
112
+ segments[index].digital_write(bit) unless (segments[index].state == bit)
113
+ end
99
114
  end
100
115
  end
101
116
 
@@ -2,16 +2,19 @@ module Denko
2
2
  module LED
3
3
  class WS2812
4
4
  include Behaviors::SinglePin
5
+ include Behaviors::Lifecycle
5
6
 
6
- attr_reader :length, :bpp
7
+ def length
8
+ @length ||= params[:length] || 1
9
+ end
10
+
11
+ def bpp
12
+ @bpp ||= params[:bpp] || 3
13
+ end
7
14
 
8
- def after_initialize(options={})
9
- super(options)
10
- raise ArgumentError, "no length given for WS2812 array" unless options[:length]
11
- @length = options[:length]
15
+ attr_writer :length, :bpp
12
16
 
13
- # This is BYTES per pixel, not bits per pixel.
14
- @bpp = 3
17
+ after_initialize do
15
18
  off
16
19
  end
17
20
 
data/lib/denko/led.rb CHANGED
@@ -1,13 +1,22 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ LED_FILES = [
4
+ [nil, "base"],
5
+ [:RGB, "rgb"],
6
+ [:SevenSegment, "seven_segment"],
7
+ [:WS2812, "ws2812"],
8
+ [:APA102, "apa102"],
9
+ ]
10
+
1
11
  module Denko
2
12
  module LED
3
- autoload :Base, "#{__dir__}/led/base"
4
- autoload :RGB, "#{__dir__}/led/rgb"
5
- autoload :SevenSegment, "#{__dir__}/led/seven_segment"
6
- autoload :WS2812, "#{__dir__}/led/ws2812"
7
- autoload :APA102, "#{__dir__}/led/apa102"
8
-
9
- def self.new(options={})
10
- self::Base.new(options)
13
+ LED_FILES.each do |file|
14
+ file_path = "#{__dir__}/led/#{file[1]}"
15
+ if file[0]
16
+ autoload file[0], file_path
17
+ else
18
+ require file_path
19
+ end
11
20
  end
12
21
  end
13
22
  end
data/lib/denko/message.rb CHANGED
@@ -5,6 +5,11 @@ module Denko
5
5
  VAL_MAX = 9999
6
6
 
7
7
  def self.encode(command: nil, pin: nil, value: nil, aux_message: nil)
8
+ # Optimized single byte binary message for digital write on pins 0..63.
9
+ if (command == 1) && (pin < 64) && (value == 1 || value == 0)
10
+ return (pin | 0b10000000 | (value << 6)).chr
11
+ end
12
+
8
13
  # Start building message backwards with aux_message first.
9
14
  if aux_message
10
15
  # Convert it to String.
@@ -1,26 +1,25 @@
1
1
  module Denko
2
2
  module Motor
3
- class Stepper
3
+ class A3967
4
4
  include Behaviors::MultiPin
5
-
5
+ include Behaviors::Lifecycle
6
+
6
7
  def initialize_pins(options={})
7
8
  proxy_pin :step, DigitalIO::Output
8
9
  proxy_pin :direction, DigitalIO::Output
9
-
10
+
10
11
  proxy_pin :ms1, DigitalIO::Output, optional: true
11
12
  proxy_pin :ms2, DigitalIO::Output, optional: true
12
13
  proxy_pin :enable, DigitalIO::Output, optional: true
13
- proxy_pin :slp, DigitalIO::Output, optional: true
14
+ proxy_pin :slp, DigitalIO::Output, optional: true
14
15
  end
15
-
16
+
16
17
  attr_reader :microsteps
17
-
18
- def after_initialize(options={})
19
- wake; on;
20
-
21
- if (ms1 && ms2)
22
- self.microsteps = 8
23
- end
18
+
19
+ after_initialize do
20
+ wake
21
+ on
22
+ self.microsteps = 8 if (ms1 && ms2)
24
23
  end
25
24
 
26
25
  def sleep
@@ -53,7 +52,7 @@ module Denko
53
52
  @microsteps = steps
54
53
  end
55
54
 
56
- def step_cc
55
+ def step_ccw
57
56
  direction.high unless direction.high?
58
57
  step.high
59
58
  step.low
@@ -64,8 +63,6 @@ module Denko
64
63
  step.high
65
64
  step.low
66
65
  end
67
-
68
- alias :step_ccw :step_cc
69
66
  end
70
67
  end
71
68
  end
@@ -2,47 +2,48 @@ module Denko
2
2
  module Motor
3
3
  class L298
4
4
  include Behaviors::MultiPin
5
+ include Behaviors::Lifecycle
5
6
 
6
7
  attr_reader :speed
7
-
8
+
8
9
  def initialize_pins(options={})
9
10
  proxy_pin :direction1, DigitalIO::Output
10
11
  proxy_pin :direction2, DigitalIO::Output
11
- proxy_pin :enable, PulseIO::PWMOutput
12
+ proxy_pin :enable, PulseIO::PWMOutput
12
13
  end
13
-
14
- def after_initialize(options={})
14
+
15
+ after_initialize do
15
16
  off
16
17
  end
17
18
 
18
19
  def speed=(value)
19
- enable.write(value)
20
+ enable.duty = value
20
21
  @speed = value
21
22
  end
22
-
23
+
23
24
  def forward(value=nil)
24
25
  direction1.high
25
26
  direction2.low
26
27
  self.speed = value if value
27
28
  end
28
-
29
+
29
30
  def reverse(value=nil)
30
31
  direction1.low
31
32
  direction2.high
32
33
  self.speed = value if value
33
34
  end
34
-
35
+
35
36
  def idle
36
37
  direction1.low
37
38
  direction2.low
38
39
  self.speed = 0
39
40
  end
40
41
  alias :off :idle
41
-
42
+
42
43
  def brake
43
44
  direction1.high
44
45
  direction2.high
45
- self.speed = board.pwm_high
46
+ self.speed = 100
46
47
  end
47
48
  end
48
49
  end
@@ -1,40 +1,58 @@
1
1
  module Denko
2
2
  module Motor
3
3
  class Servo
4
+ FREQUENCY = 50
5
+ PERIOD_NS = 20_000_000
6
+
4
7
  include Behaviors::SinglePin
5
- include Behaviors::Threaded
8
+ include Behaviors::Lifecycle
9
+
10
+ before_initialize do
11
+ params[:mode] = :output_pwm
12
+ end
6
13
 
7
- def after_initialize(options={})
8
- super(options)
9
- @min = options[:min] || 544
10
- @max = options[:max] || 2400
14
+ after_initialize do
11
15
  attach
12
16
  end
13
17
 
18
+ def min
19
+ @min ||= params[:min] || 500
20
+ end
21
+
22
+ def max
23
+ @max ||= params[:max] || 2500
24
+ end
25
+
26
+ attr_writer :min, :max
27
+
14
28
  def attach
15
- board.servo_toggle(pin, :on, min: @min, max: @max)
29
+ if board.platform == :arduino
30
+ board.servo_toggle(pin, :on, min: min, max: max)
31
+ else
32
+ board.set_pin_mode(pin, :output_pwm, {frequency: FREQUENCY, period: PERIOD_NS})
33
+ end
16
34
  end
17
35
 
18
36
  def detach
19
- board.servo_toggle(pin, :off)
37
+ board.servo_toggle(pin, :off) if board.platform == :arduino
20
38
  end
21
39
 
22
40
  def position=(value)
23
41
  value = value % 180 unless value == 180
24
42
 
25
- microseconds = ((value.to_f / 180) * (@max - @min)) + @min
26
- board.servo_write(pin, microseconds.round)
43
+ microseconds = ((value.to_f / 180) * (max - min)) + min
44
+ write_microseconds(microseconds)
27
45
 
28
- @state = value
46
+ self.state = value
29
47
  end
30
48
 
31
49
  def speed=(value)
32
50
  raise 'invalid speed value' if value > 100 || value < -100
33
51
 
34
- microseconds = (((value.to_f + 100) / 200) * (@max - @min)) + @min
35
- board.servo_write(pin, microseconds.round)
52
+ microseconds = (((value.to_f + 100) / 200) * (max - min)) + min
53
+ write_microseconds(microseconds)
36
54
 
37
- @state = value
55
+ self.state = value
38
56
  end
39
57
 
40
58
  alias :angle= :position=
@@ -43,8 +61,12 @@ module Denko
43
61
  alias :speed :state
44
62
 
45
63
  def write_microseconds(value)
46
- raise 'invalid microsecond value' if value > @max || value < @min
47
- board.servo_write(pin, value)
64
+ raise 'invalid microsecond value' if value > max || value < min
65
+ if board.platform == :arduino
66
+ board.servo_write(pin, value)
67
+ else
68
+ board.pwm_write(pin, (value * 1000.0).round)
69
+ end
48
70
  end
49
71
  end
50
72
  end
data/lib/denko/motor.rb CHANGED
@@ -1,7 +1,20 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ MOTOR_FILES = [
4
+ [:Servo, "servo"],
5
+ [:A3967, "a3967"],
6
+ [:L298, "l298"],
7
+ ]
8
+
1
9
  module Denko
2
10
  module Motor
3
- autoload :Servo, "#{__dir__}/motor/servo"
4
- autoload :Stepper, "#{__dir__}/motor/stepper"
5
- autoload :L298, "#{__dir__}/motor/l298"
11
+ MOTOR_FILES.each do |file|
12
+ file_path = "#{__dir__}/motor/#{file[1]}"
13
+ if file[0]
14
+ autoload file[0], file_path
15
+ else
16
+ require file_path
17
+ end
18
+ end
6
19
  end
7
20
  end
@@ -1,44 +1,47 @@
1
1
  module Denko
2
2
  module OneWire
3
- class Bus
4
- include Behaviors::SinglePin
3
+ class Bus < DigitalIO::CBitBang
5
4
  include Behaviors::BusControllerAddressed
6
5
  include Behaviors::Reader
6
+ include Behaviors::Lifecycle
7
7
  include BusEnumerator
8
8
  include Constants
9
9
 
10
10
  attr_reader :parasite_power
11
11
 
12
- def after_initialize(options = {})
13
- super(options)
12
+ after_initialize do
14
13
  read_power_supply
15
14
  end
16
15
 
17
16
  def read_power_supply
18
- mutex.synchronize do
19
- # Without driving low first, results are inconsistent.
20
- board.set_pin_mode(self.pin, :output)
21
- board.digital_write(self.pin, board.low)
22
- sleep 0.1
23
-
24
- reset
25
- write(SKIP_ROM, READ_POWER_SUPPLY)
26
-
27
- # Only LSBIT matters, but we can only read whole bytes.
28
- byte = read(1)
29
- @parasite_power = (byte[0] == 0) ? true : false
30
- end
17
+ mutex.lock
18
+
19
+ # Without driving low first, results are inconsistent.
20
+ board.set_pin_mode(self.pin, :output)
21
+ board.digital_write(self.pin, board.low)
22
+ sleep 0.1
23
+
24
+ reset
25
+ write(SKIP_ROM, READ_POWER_SUPPLY)
26
+
27
+ # Only LSBIT matters, but we can only read whole bytes.
28
+ byte = read(1)
29
+ @parasite_power = (byte & 0b1 == 0) ? true : false
30
+
31
+ mutex.unlock
32
+ @parasite_power
31
33
  end
32
34
 
33
35
  def device_present
34
- mutex.synchronize do
35
- byte = read_using -> { reset(1) }
36
- (byte == 0) ? true : false
37
- end
36
+ mutex.lock
37
+ byte = read_using -> { reset(true) }
38
+ presence = (byte == 0) ? true : false
39
+ mutex.unlock
40
+ presence
38
41
  end
39
42
  alias :device_present? :device_present
40
43
 
41
- def reset(get_presence=0)
44
+ def reset(get_presence=false)
42
45
  board.one_wire_reset(pin, get_presence)
43
46
  end
44
47
 
@@ -53,7 +56,12 @@ module Denko
53
56
  end
54
57
 
55
58
  def pre_callback_filter(bytes)
56
- bytes = bytes.split(",").map(&:to_i)
59
+ # C extensions respond with Ruby array
60
+ # External Board responds with comma delimited String
61
+ unless bytes.class == Array
62
+ bytes = bytes.split(",").map(&:to_i)
63
+ end
64
+
57
65
  bytes.length > 1 ? bytes : bytes[0]
58
66
  end
59
67
  end