denko 0.14.0 → 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 (344) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build_atmega_avr.yml +2 -1
  3. data/.github/workflows/build_atmega_megaavr.yml +2 -1
  4. data/.github/workflows/build_atsam3x.yml +1 -0
  5. data/.github/workflows/build_atsamd21.yml +2 -1
  6. data/.github/workflows/build_esp32.yml +4 -2
  7. data/.github/workflows/build_esp32c3.yml +4 -3
  8. data/.github/workflows/build_esp32c6.yml +4 -2
  9. data/.github/workflows/build_esp32h2.yml +4 -2
  10. data/.github/workflows/build_esp32s2.yml +4 -2
  11. data/.github/workflows/build_esp32s3.yml +4 -2
  12. data/.github/workflows/build_esp8266.yml +2 -1
  13. data/.github/workflows/build_ra4m1.yml +1 -0
  14. data/.github/workflows/build_rp2040.yml +4 -3
  15. data/.github/workflows/ruby.yml +1 -1
  16. data/CHANGELOG.md +203 -0
  17. data/DEPS_CLI.md +16 -16
  18. data/DEPS_IDE.md +31 -30
  19. data/MICROCONTROLLERS.md +103 -0
  20. data/PERIPHERALS.md +178 -0
  21. data/README.md +28 -21
  22. data/denko.gemspec +6 -1
  23. data/lib/denko/analog_io/ads1118.rb +5 -5
  24. data/lib/denko/analog_io/ads111x.rb +23 -19
  25. data/lib/denko/analog_io/joystick.rb +87 -0
  26. data/lib/denko/analog_io/potentiometer.rb +1 -5
  27. data/lib/denko/analog_io.rb +22 -8
  28. data/lib/denko/behaviors/bus_controller.rb +2 -1
  29. data/lib/denko/behaviors/bus_peripheral.rb +1 -1
  30. data/lib/denko/behaviors/callbacks.rb +18 -16
  31. data/lib/denko/behaviors/component.rb +0 -4
  32. data/lib/denko/behaviors/lifecycle.rb +1 -1
  33. data/lib/denko/behaviors/listener.rb +9 -3
  34. data/lib/denko/behaviors/multi_pin.rb +4 -6
  35. data/lib/denko/behaviors/poller.rb +11 -2
  36. data/lib/denko/behaviors/reader.rb +109 -21
  37. data/lib/denko/behaviors/single_pin.rb +2 -4
  38. data/lib/denko/behaviors/state.rb +18 -13
  39. data/lib/denko/behaviors/threaded.rb +19 -8
  40. data/lib/denko/behaviors.rb +36 -23
  41. data/lib/denko/board/eeprom.rb +1 -1
  42. data/lib/denko/board/i2c.rb +1 -1
  43. data/lib/denko/board/i2c_bit_bang.rb +9 -5
  44. data/lib/denko/board/map.rb +6 -2
  45. data/lib/denko/board/one_wire.rb +3 -3
  46. data/lib/denko/board/spi.rb +30 -30
  47. data/lib/denko/board/spi_bit_bang.rb +8 -11
  48. data/lib/denko/board.rb +6 -3
  49. data/lib/denko/connection/flow_control.rb +1 -1
  50. data/lib/denko/connection/serial.rb +5 -5
  51. data/lib/denko/digital_io/output.rb +12 -4
  52. data/lib/denko/digital_io/pcf8574.rb +114 -0
  53. data/lib/denko/digital_io/rotary_encoder.rb +10 -6
  54. data/lib/denko/digital_io.rb +24 -6
  55. data/lib/denko/display/canvas.rb +350 -157
  56. data/lib/denko/display/font/bmp_5x7.rb +142 -0
  57. data/lib/denko/display/font/bmp_6x8.rb +142 -0
  58. data/lib/denko/display/font/bmp_8x16.rb +141 -0
  59. data/lib/denko/display/font.rb +22 -0
  60. data/lib/denko/display/hd44780.rb +24 -20
  61. data/lib/denko/display/il0373.rb +186 -0
  62. data/lib/denko/display/mono_oled.rb +193 -0
  63. data/lib/denko/display/pcd8544.rb +154 -0
  64. data/lib/denko/display/pixel_common.rb +83 -0
  65. data/lib/denko/display/sh1106.rb +17 -21
  66. data/lib/denko/display/sh1107.rb +10 -0
  67. data/lib/denko/display/spi_common.rb +35 -0
  68. data/lib/denko/display/spi_epaper_common.rb +30 -0
  69. data/lib/denko/display/ssd1306.rb +6 -228
  70. data/lib/denko/display/ssd1680.rb +14 -0
  71. data/lib/denko/display/ssd1681.rb +8 -0
  72. data/lib/denko/display/ssd168x.rb +227 -0
  73. data/lib/denko/display/st7302.rb +207 -0
  74. data/lib/denko/display/st7565.rb +166 -0
  75. data/lib/denko/display.rb +40 -4
  76. data/lib/denko/eeprom/at24c.rb +67 -0
  77. data/lib/denko/eeprom/board.rb +69 -0
  78. data/lib/denko/eeprom.rb +15 -1
  79. data/lib/denko/helpers/engine_check.rb +13 -0
  80. data/lib/denko/{mutex_stub.rb → helpers/mutex_stub.rb} +6 -0
  81. data/lib/denko/helpers.rb +6 -0
  82. data/lib/denko/i2c/bit_bang.rb +1 -0
  83. data/lib/denko/i2c/bus_common.rb +9 -4
  84. data/lib/denko/i2c/peripheral.rb +5 -1
  85. data/lib/denko/i2c.rb +17 -4
  86. data/lib/denko/led/apa102.rb +1 -3
  87. data/lib/denko/led/base.rb +5 -0
  88. data/lib/denko/led/rgb.rb +16 -10
  89. data/lib/denko/led/seven_segment.rb +1 -1
  90. data/lib/denko/led.rb +17 -8
  91. data/lib/denko/motor/{stepper.rb → a3967.rb} +1 -1
  92. data/lib/denko/motor/servo.rb +16 -6
  93. data/lib/denko/motor.rb +16 -3
  94. data/lib/denko/one_wire/bus.rb +20 -16
  95. data/lib/denko/one_wire/bus_enumerator.rb +25 -14
  96. data/lib/denko/one_wire/helper.rb +4 -2
  97. data/lib/denko/one_wire.rb +18 -5
  98. data/lib/denko/pulse_io/buzzer.rb +2 -6
  99. data/lib/denko/pulse_io/ir_output.rb +1 -5
  100. data/lib/denko/pulse_io/pwm_output.rb +56 -31
  101. data/lib/denko/pulse_io.rb +17 -3
  102. data/lib/denko/rtc/ds3231.rb +4 -3
  103. data/lib/denko/rtc.rb +14 -1
  104. data/lib/denko/sensor/aht.rb +16 -20
  105. data/lib/denko/sensor/bme280.rb +23 -36
  106. data/lib/denko/sensor/bmp180.rb +8 -13
  107. data/lib/denko/sensor/dht.rb +17 -7
  108. data/lib/denko/sensor/ds18b20.rb +5 -4
  109. data/lib/denko/sensor/hdc1080.rb +174 -0
  110. data/lib/denko/sensor/htu21d.rb +17 -6
  111. data/lib/denko/sensor/htu31d.rb +6 -5
  112. data/lib/denko/sensor/jsnsr04t.rb +49 -0
  113. data/lib/denko/sensor/qmp6988.rb +14 -30
  114. data/lib/denko/sensor/rcwl9620.rb +1 -0
  115. data/lib/denko/sensor/sht3x.rb +6 -5
  116. data/lib/denko/sensor/sht4x.rb +125 -0
  117. data/lib/denko/sensor/vl53l0x.rb +58 -0
  118. data/lib/denko/sensor.rb +33 -15
  119. data/lib/denko/spi/base_register.rb +11 -7
  120. data/lib/denko/spi/bus_common.rb +12 -15
  121. data/lib/denko/spi/input_register.rb +6 -6
  122. data/lib/denko/spi/output_register.rb +13 -4
  123. data/lib/denko/spi/peripheral.rb +82 -84
  124. data/lib/denko/spi.rb +20 -10
  125. data/lib/denko/uart/bit_bang.rb +2 -27
  126. data/lib/denko/uart/common.rb +33 -0
  127. data/lib/denko/uart/hardware.rb +1 -26
  128. data/lib/denko/uart.rb +16 -2
  129. data/lib/denko/version.rb +1 -1
  130. data/lib/denko.rb +22 -25
  131. data/lib/denko_cli/targets.rb +7 -7
  132. data/lib/denko_cli/targets.txt +19 -20
  133. data/src/lib/Denko.cpp +26 -13
  134. data/src/lib/Denko.h +4 -4
  135. data/src/lib/DenkoDefines.h +7 -26
  136. data/src/lib/DenkoLEDArray.cpp +1 -8
  137. data/src/lib/DenkoSPI.cpp +31 -29
  138. data/src/lib/DenkoSPIBB.cpp +12 -14
  139. data/test/analog_io/input_test.rb +1 -1
  140. data/test/analog_io/potentiometer_test.rb +2 -2
  141. data/test/behaviors/bus_peripheral_test.rb +4 -4
  142. data/test/behaviors/callbacks_test.rb +20 -10
  143. data/test/behaviors/component_test.rb +18 -8
  144. data/test/board/board_test.rb +9 -9
  145. data/test/board/one_wire_test.rb +25 -14
  146. data/test/board/spi_test.rb +31 -15
  147. data/test/digital_io/input_test.rb +2 -2
  148. data/test/display/canvas_test.rb +306 -0
  149. data/test/display/hd44780_test.rb +34 -7
  150. data/test/eeprom/board_test.rb +45 -0
  151. data/test/helpers/mruby_minitest.rb +95 -0
  152. data/test/helpers/mruby_runner.rb +13 -0
  153. data/test/i2c/bus_test.rb +93 -30
  154. data/test/i2c/peripheral_test.rb +2 -2
  155. data/test/led/apa102_test.rb +24 -0
  156. data/test/led/rgb_test.rb +4 -4
  157. data/test/motor/{stepper_test.rb → a3967_test.rb} +2 -2
  158. data/test/one_wire/bus_enumerator_test.rb +1 -1
  159. data/test/one_wire/bus_test.rb +42 -35
  160. data/test/one_wire/peripheral_test.rb +5 -17
  161. data/test/pulse_io/ir_output_test.rb +5 -0
  162. data/test/pulse_io/pwm_output_test.rb +10 -10
  163. data/test/rtc/ds3231_test.rb +3 -2
  164. data/test/sensor/dht_test.rb +11 -11
  165. data/test/spi/bitbang_test.rb +27 -0
  166. data/test/spi/bus_test.rb +19 -29
  167. data/test/spi/input_register_test.rb +2 -2
  168. data/test/spi/{peripheral_multi_pin_test.rb → peripheral_test.rb} +25 -5
  169. data/test/test_helper.rb +44 -124
  170. data/vendor/board-maps/BoardMap.h +264 -0
  171. data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
  172. data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
  173. data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
  174. data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
  175. data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
  176. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +0 -1
  177. data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
  178. data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
  179. data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
  180. data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
  181. data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
  182. data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
  183. data/vendor/board-maps/yaml/ESP32C6_DEV.yml +3 -4
  184. data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +0 -1
  185. data/vendor/board-maps/yaml/ESP32H2_DEV.yml +0 -1
  186. data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +0 -1
  187. data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
  188. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -1
  189. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO.yml +0 -1
  190. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +0 -1
  191. data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
  192. data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
  193. data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
  194. data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +0 -1
  195. data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
  196. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
  197. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
  198. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
  199. data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
  200. data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
  201. data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
  202. data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
  203. data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
  204. data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
  205. data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
  206. data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
  207. data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +1 -2
  208. data/vendor/board-maps/yaml/LoPy.yml +0 -1
  209. data/vendor/board-maps/yaml/LoPy4.yml +0 -1
  210. data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
  211. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -1
  212. data/vendor/board-maps/yaml/OMGS3.yml +25 -0
  213. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
  214. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
  215. data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
  216. data/vendor/board-maps/yaml/PYCOM_GPY.yml +0 -1
  217. data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +1 -1
  218. data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
  219. data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
  220. data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
  221. data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
  222. data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
  223. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +0 -1
  224. data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
  225. data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
  226. data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
  227. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
  228. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
  229. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
  230. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
  231. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
  232. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
  233. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
  234. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
  235. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
  236. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
  237. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
  238. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
  239. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
  240. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
  241. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
  242. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
  243. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
  244. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
  245. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
  246. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
  247. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
  248. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
  249. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
  250. data/vendor/board-maps/yaml/WIPY3.yml +0 -1
  251. data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
  252. data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
  253. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
  254. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
  255. data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
  256. data/vendor/board-maps/yaml/mercury.yml +20 -0
  257. metadata +116 -101
  258. data/.vscode/settings.json +0 -5
  259. data/.vscode/tasks.json +0 -20
  260. data/HARDWARE.md +0 -263
  261. data/benchmarks/analog_listen.rb +0 -49
  262. data/benchmarks/digital_write.rb +0 -28
  263. data/benchmarks/i2c_ssd1306_refresh.rb +0 -91
  264. data/examples/advanced/m5_env3.rb +0 -46
  265. data/examples/advanced/rotary_encoder_mac_volume.rb +0 -53
  266. data/examples/advanced/ssd1306_time_temp_rh.rb +0 -43
  267. data/examples/analog_io/ads1100.rb +0 -48
  268. data/examples/analog_io/ads1115.rb +0 -57
  269. data/examples/analog_io/ads1118.rb +0 -65
  270. data/examples/analog_io/dac_loopback.rb +0 -34
  271. data/examples/analog_io/input.rb +0 -56
  272. data/examples/analog_io/input_smoothing.rb +0 -27
  273. data/examples/analog_io/potentiometer.rb +0 -31
  274. data/examples/connection/binary_echo.rb +0 -34
  275. data/examples/connection/tcp.rb +0 -19
  276. data/examples/digital_io/button.rb +0 -17
  277. data/examples/digital_io/relay.rb +0 -17
  278. data/examples/digital_io/rotary_encoder.rb +0 -36
  279. data/examples/display/hd44780.png +0 -0
  280. data/examples/display/hd44780.rb +0 -47
  281. data/examples/display/ssd1306.rb +0 -43
  282. data/examples/display/ssd1306_s2_pico.rb +0 -29
  283. data/examples/eeprom/built_in.rb +0 -32
  284. data/examples/i2c/search.rb +0 -39
  285. data/examples/led/apa102_bounce.rb +0 -32
  286. data/examples/led/apa102_fade.rb +0 -44
  287. data/examples/led/builtin_blink.rb +0 -14
  288. data/examples/led/builtin_fade.rb +0 -19
  289. data/examples/led/rgb_led.rb +0 -31
  290. data/examples/led/seven_segment_char_echo.rb +0 -17
  291. data/examples/led/ws2812_bounce.rb +0 -30
  292. data/examples/led/ws2812_builtin_blink.rb +0 -22
  293. data/examples/led/ws2812_fade.rb +0 -43
  294. data/examples/motor/l298.rb +0 -45
  295. data/examples/motor/servo.rb +0 -17
  296. data/examples/motor/stepper.png +0 -0
  297. data/examples/motor/stepper.rb +0 -43
  298. data/examples/one_wire/search.rb +0 -32
  299. data/examples/pulse_io/buzzer.rb +0 -35
  300. data/examples/pulse_io/ir_output.rb +0 -51
  301. data/examples/pulse_io/pwm_output.rb +0 -30
  302. data/examples/rtc/ds3231.rb +0 -31
  303. data/examples/sensor/aht10.rb +0 -17
  304. data/examples/sensor/aht20.rb +0 -17
  305. data/examples/sensor/bme280.rb +0 -38
  306. data/examples/sensor/bmp180.rb +0 -26
  307. data/examples/sensor/dht.rb +0 -29
  308. data/examples/sensor/ds18b20.rb +0 -57
  309. data/examples/sensor/generic_pir.rb +0 -27
  310. data/examples/sensor/hcsr04.rb +0 -17
  311. data/examples/sensor/htu21d.rb +0 -43
  312. data/examples/sensor/htu31d.rb +0 -33
  313. data/examples/sensor/neat_tph_readings.rb +0 -32
  314. data/examples/sensor/qmp6988.rb +0 -51
  315. data/examples/sensor/rcwl9620.rb +0 -15
  316. data/examples/sensor/sht3x.rb +0 -32
  317. data/examples/spi/bitbang_loopback.rb +0 -46
  318. data/examples/spi/input_register.rb +0 -40
  319. data/examples/spi/output_register.rb +0 -41
  320. data/examples/spi/ssd_through_registers.rb +0 -28
  321. data/examples/spi/two_registers.rb +0 -40
  322. data/examples/uart/bit_bang_demo.rb +0 -25
  323. data/examples/uart/board_passthrough.rb +0 -40
  324. data/examples/uart/hardware_loopback.rb +0 -16
  325. data/lib/denko/eeprom/built_in.rb +0 -72
  326. data/lib/denko/fonts.rb +0 -106
  327. data/test/eeprom/built_in_test.rb +0 -61
  328. data/test/spi/peripheral_single_pin_test.rb +0 -48
  329. data/tutorial/01-led/led.fzz +0 -0
  330. data/tutorial/01-led/led.pdf +0 -0
  331. data/tutorial/01-led/led.rb +0 -73
  332. data/tutorial/02-button/button.fzz +0 -0
  333. data/tutorial/02-button/button.pdf +0 -0
  334. data/tutorial/02-button/button.rb +0 -65
  335. data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
  336. data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
  337. data/tutorial/03-potentiometer/potentiometer.rb +0 -66
  338. data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
  339. data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
  340. data/tutorial/04-pwm_led/pwm_led.rb +0 -64
  341. data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
  342. data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
  343. data/tutorial/05-rgb_led/rgb_led.rb +0 -58
  344. data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
@@ -10,6 +10,7 @@ module Denko
10
10
  include Behaviors::MultiPin
11
11
  include Behaviors::Callbacks
12
12
  include Behaviors::Lifecycle
13
+ include Common
13
14
 
14
15
  attr_reader :baud
15
16
 
@@ -24,32 +25,6 @@ module Denko
24
25
  start(params[:baud] || 9600)
25
26
  end
26
27
 
27
- def initialize_buffer
28
- @buffer = ""
29
- @buffer_mutex = Mutex.new
30
- self.add_callback(:buffer) do |data|
31
- @buffer_mutex.synchronize do
32
- @buffer = "#{@buffer}#{data}"
33
- end
34
- end
35
- end
36
-
37
- def gets
38
- @buffer_mutex.synchronize do
39
- newline = @buffer.index("\n")
40
- return nil unless newline
41
- line = @buffer[0..newline-1]
42
- @buffer = @buffer[newline+1..-1]
43
- return line
44
- end
45
- end
46
-
47
- def flush
48
- @buffer_mutex.synchronize do
49
- @buffer = ""
50
- end
51
- end
52
-
53
28
  def start(baud)
54
29
  @baud = baud
55
30
  board.uart_bb_start(pins[:tx], pins[:rx], @baud)
@@ -64,7 +39,7 @@ module Denko
64
39
  end
65
40
 
66
41
  def hook_rx_callback
67
- rx.add_callback {|data| self.update(data)}
42
+ rx.add_callback { |data| self.update(data) }
68
43
  end
69
44
  end
70
45
  end
@@ -0,0 +1,33 @@
1
+ module Denko
2
+ module UART
3
+ module Common
4
+ def initialize_buffer
5
+ @buffer = String.new
6
+ @buffer_mutex = Denko.gil? ? Denko::MutexStub.new : Mutex.new
7
+ self.add_callback(:buffer) do |data|
8
+ @buffer_mutex.lock
9
+ @buffer = "#{@buffer}#{data}"
10
+ @buffer_mutex.unlock
11
+ end
12
+ end
13
+
14
+ def gets
15
+ line = nil
16
+ @buffer_mutex.lock
17
+ newline = @buffer.index("\n")
18
+ if newline
19
+ line = @buffer[0..newline-1]
20
+ @buffer = @buffer[newline+1..-1]
21
+ end
22
+ @buffer_mutex.unlock
23
+ line
24
+ end
25
+
26
+ def flush
27
+ @buffer_mutex.lock
28
+ @buffer = ""
29
+ @buffer_mutex.unlock
30
+ end
31
+ end
32
+ end
33
+ end
@@ -4,6 +4,7 @@ module Denko
4
4
  include Behaviors::SinglePin
5
5
  include Behaviors::Callbacks
6
6
  include Behaviors::Lifecycle
7
+ include Common
7
8
 
8
9
  attr_reader :index, :baud
9
10
 
@@ -23,32 +24,6 @@ module Denko
23
24
  start(params[:baud] ||= 9600)
24
25
  end
25
26
 
26
- def initialize_buffer
27
- @buffer = ""
28
- @buffer_mutex = Mutex.new
29
- self.add_callback(:buffer) do |data|
30
- @buffer_mutex.synchronize do
31
- @buffer = "#{@buffer}#{data}"
32
- end
33
- end
34
- end
35
-
36
- def gets
37
- @buffer_mutex.synchronize do
38
- newline = @buffer.index("\n")
39
- return nil unless newline
40
- line = @buffer[0..newline-1]
41
- @buffer = @buffer[newline+1..-1]
42
- return line
43
- end
44
- end
45
-
46
- def flush
47
- @buffer_mutex.synchronize do
48
- @buffer = ""
49
- end
50
- end
51
-
52
27
  def start(baud)
53
28
  @baud = baud
54
29
  board.uart_start(index, baud, true)
data/lib/denko/uart.rb CHANGED
@@ -1,6 +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
+ UART_FILES = [
4
+ [nil, "common"],
5
+ [:Hardware, "hardware"],
6
+ [:BitBang, "bit_bang"],
7
+ ]
8
+
1
9
  module Denko
2
10
  module UART
3
- autoload :Hardware, "#{__dir__}/uart/hardware"
4
- autoload :BitBang, "#{__dir__}/uart/bit_bang"
11
+ UART_FILES.each do |file|
12
+ file_path = "#{__dir__}/uart/#{file[1]}"
13
+ if file[0]
14
+ autoload file[0], file_path
15
+ else
16
+ require file_path
17
+ end
18
+ end
5
19
  end
6
20
  end
data/lib/denko/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Denko
2
- VERSION = "0.14.0"
2
+ VERSION = "0.15.0"
3
3
  end
data/lib/denko.rb CHANGED
@@ -1,49 +1,46 @@
1
- Thread.abort_on_exception = true
1
+ # Helpers needed during loading.
2
+ require_relative 'denko/helpers'
2
3
 
3
- module Denko
4
- def self.root
5
- File.expand_path '../..', __FILE__
6
- end
4
+ unless Denko.in_mruby_build?
5
+ Thread.abort_on_exception = true
6
+
7
+ require 'bcd'
7
8
 
8
- def self.cruby?
9
- RUBY_ENGINE == "ruby"
9
+ module Denko
10
+ def self.root
11
+ File.expand_path '../..', __FILE__
12
+ end
10
13
  end
11
14
  end
12
15
 
13
- # For method delegation.
14
- require 'forwardable'
15
-
16
- # Bypass mutexes where possible for CRuby.
17
- require_relative 'denko/mutex_stub'
18
-
19
- # Component support stuff.
16
+ # Early shared behavior
20
17
  require_relative 'denko/version'
21
18
  require_relative 'denko/behaviors'
22
- require_relative 'denko/fonts'
23
19
 
24
- # Board stuff.
25
- require_relative 'denko/message'
26
- require_relative 'denko/connection'
27
- require_relative 'denko/board'
20
+ # Denko::Board implementation for connected microcontrollers
21
+ unless Denko.in_mruby_build?
22
+ require_relative 'denko/message'
23
+ require_relative 'denko/connection'
24
+ require_relative 'denko/board'
25
+ # Diagnostics
26
+ require_relative 'denko/connection/binary_echo'
27
+ end
28
28
 
29
- # Basic IO components.
29
+ # Basic IO peripherals
30
30
  require_relative 'denko/digital_io'
31
31
  require_relative 'denko/analog_io'
32
32
  require_relative 'denko/pulse_io'
33
33
 
34
- # Buses and interfaces.
34
+ # Buses and interfaces
35
35
  require_relative 'denko/uart'
36
36
  require_relative 'denko/spi'
37
37
  require_relative 'denko/i2c'
38
38
  require_relative 'denko/one_wire'
39
39
 
40
- # Everything else.
40
+ # Everything else
41
41
  require_relative 'denko/display'
42
42
  require_relative 'denko/eeprom'
43
43
  require_relative 'denko/led'
44
44
  require_relative 'denko/motor'
45
45
  require_relative 'denko/rtc'
46
46
  require_relative 'denko/sensor'
47
-
48
- # Diagnostics
49
- require_relative 'denko/connection/binary_echo'
@@ -8,7 +8,7 @@ class DenkoCLI::Generator
8
8
  core: [:core],
9
9
 
10
10
  # Specific features for the old mega168 chips.
11
- atmega168: [:core, :one_wire, :tone, :i2c, :spi, :servo],
11
+ atmega168: [:core, :tone, :i2c, :spi, :servo, :uart_bb],
12
12
 
13
13
  # Other ATmega chips do everything.
14
14
  # Add bit bang serial for 328p / UNO since it has no extra hardware UART.
@@ -16,18 +16,18 @@ class DenkoCLI::Generator
16
16
 
17
17
  # No tone, infrared or EEPROM on SAM3X / Due.
18
18
  atsam3x: STANDARD_PACKAGES - [:tone, :ir_out, :eeprom],
19
-
19
+
20
20
  # No EEPROM on SAMD / Zero.
21
21
  atsamd21: STANDARD_PACKAGES - [:eeprom],
22
22
 
23
- # No IR out and WS2812 on the UNO R4. WS2812 compiles but doesn't work.
24
- ra4m1: STANDARD_PACKAGES - [:ir_out, :led_array],
23
+ # Infrared library does not support the UNO R4.
24
+ ra4m1: STANDARD_PACKAGES - [:ir_out],
25
25
 
26
- # ESP8266 uses an IR library specific to it.
26
+ # ESP8266 & ESP32
27
27
  esp8266: STANDARD_PACKAGES,
28
28
  esp32: STANDARD_PACKAGES,
29
-
30
- # RP2040 can't use WS2812 yet.
29
+
30
+ # RP2040
31
31
  rp2040: STANDARD_PACKAGES,
32
32
  }
33
33
  end
@@ -4,7 +4,7 @@
4
4
  atmega (default)
5
5
 
6
6
  Covers the Atmel/Microchip AVR 8-bit chips and associated Arduino boards.
7
- This is the default target. All component features are included.
7
+ This is the default target. All interfaces are included.
8
8
 
9
9
  Chips: ATmega328p, ATmega32u4, ATmega1280, ATmega2560
10
10
  Atmega4809 (unconfirmed)
@@ -17,20 +17,20 @@
17
17
  esp32
18
18
 
19
19
  For the the ESP32 chip by Espressif, with integrated 2.4Ghz WiFi.
20
- No WiFi OTA updates yet.
21
- This option includes all component features EXCEPT:
20
+ WiFi over-the-air updates are enabled by default.
21
+ This option includes all interfaces EXCEPT:
22
22
  SoftwareSerial
23
23
 
24
24
  Chips: ESP32, ESP32-S2, ESP32-S3
25
25
  Boards: ESP32 DevKit, LOLIN D32 / D32 Pro, LOLIN S2 Pico / Mini,
26
26
  LOLIN S3 Pico / Mini
27
-
27
+
28
28
 
29
29
  esp8266
30
30
 
31
31
  For the ESP8266 chip by Espressif, with integrated 2.4Ghz WiFi.
32
32
  WiFi over-the-air updates are enabled by default.
33
- This option includes all component features EXCEPT:
33
+ This option includes all interfaces EXCEPT:
34
34
  SoftwareSerial
35
35
 
36
36
  Chips: ES8266, ESP8285
@@ -41,24 +41,23 @@
41
41
 
42
42
  Note: After the initial upload via serial, the WiFi sketch for this target
43
43
  supports over-the-air updates from the Arduino IDE using ArduinoOTA.
44
-
45
-
44
+
45
+
46
46
  rp2040
47
47
 
48
- For the Raspberry Pi RP2040 microcontroller.
49
- Software Serial doesn't work. WiFi available only on the W version.
50
- This option includes all component features EXCEPT:
51
- SoftwareSerial, LEDArray
48
+ For the Raspberry Pi RP2040 microcontroller. WiFi available on the W version.
49
+ This option includes all interfaces EXCEPT:
50
+ SoftwareSerial
52
51
 
53
52
  Chips: RP2040
54
53
  Boards: Raspberry Pi Pico, Raspberry Pi Pico W, and many others
55
-
54
+
56
55
 
57
56
  atsamd21
58
57
 
59
58
  For the ATSAMD21G18, with native USB and no EEPROM.
60
59
  Similar to the mega option, but Software Serial doesn't work.
61
- This option includes all component features EXCEPT:
60
+ This option includes all interfaces EXCEPT:
62
61
  EEPROM, SoftwareSerial
63
62
 
64
63
  Chips: ATSAMD21G18
@@ -69,16 +68,16 @@
69
68
 
70
69
  Fpr the ATSAM3X8E, with native USB and no EEPROM.
71
70
  Similar to the mega option, but some features don't work.
72
- This option includes all component features EXCEPT:
71
+ This option includes all interfaces EXCEPT:
73
72
  EEPROM, SoftwareSerial, Tone, IR Out
74
73
 
75
74
  Chips: ATSAM3X8E
76
75
  Boards: Arduino Due
77
-
78
-
76
+
77
+
79
78
  core
80
79
 
81
- This includes only the core component feature set of denko:
80
+ This includes only the core interface set of denko:
82
81
  Set Pin Mode
83
82
  Digital Read/Write/Listen
84
83
  Analog Read/Write/Listen
@@ -91,8 +90,8 @@
91
90
 
92
91
  This targets the older ATmega168 chip used in early Arduinos.
93
92
  With half the RAM and flash available, we need to cut the sketch down.
94
- This option includes all component features EXCEPT:
95
- SoftwareSerial, IR Out
93
+ This option includes all interfaces EXCEPT:
94
+ EEPROM, OneWire, BitBang I2C, BitBang SPI, Hardware UART, IR Out, WS2812
96
95
 
97
96
  Chips: ATmega168
98
97
  Boards: Duemilanove, Diecimila, Pro (some), Pro Mini (some)
@@ -103,7 +102,7 @@
103
102
  There is not enough memory available for Wi-Fi or Ethernet.
104
103
  Try the core target instead to tradeoff features for networking.
105
104
 
106
- Note: Aux message is always limited to 264 bytes or less for the ATmega168.
105
+ Note: Aux message is always limited to 48 bytes or less for the ATmega168.
107
106
  Servo count is always limited to 6 (normally 12) for the ATmega168 chip.
108
107
  These limits apply as long as an Atmega168 is selected in the
109
108
  Arduino IDE, regardless of the options passed to this sketch generator.
data/src/lib/Denko.cpp CHANGED
@@ -168,7 +168,14 @@ void Denko::process() {
168
168
 
169
169
  // Implemented in DenkoSPIBB.cpp
170
170
  #ifdef DENKO_SPI_BB
171
- case 21: spiBBtransfer (auxMsg[3], auxMsg[4], auxMsg[5], pin, auxMsg[0], auxMsg[1], auxMsg[2], &auxMsg[7]); break;
171
+ case 21: {
172
+ // Unpack read and write lengths from their 3 shared bytes.
173
+ uint16_t readLength = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1];
174
+ uint16_t writeLength = (((uint16_t)auxMsg[3] & 0x0F) << 8) | auxMsg[2];
175
+
176
+ spiBBtransfer (auxMsg[4], auxMsg[5], auxMsg[6], pin, auxMsg[0], readLength, writeLength, &auxMsg[8]);
177
+ break;
178
+ }
172
179
  case 22: spiBBaddListener (); break;
173
180
  #endif
174
181
 
@@ -176,11 +183,17 @@ void Denko::process() {
176
183
  #ifdef DENKO_SPI
177
184
  case 26: {
178
185
  // Do this since RP2040 crashes with reinterpet_cast of uint32_t.
179
- uint32_t clockRate = (uint32_t)auxMsg[3];
180
- clockRate |= (uint32_t)auxMsg[4] << 8;
181
- clockRate |= (uint32_t)auxMsg[5] << 16;
182
- clockRate |= (uint32_t)auxMsg[6] << 24;
183
- spiTransfer(clockRate, pin, auxMsg[0], auxMsg[1], auxMsg[2], &auxMsg[7]); break;
186
+ uint32_t clockRate = (uint32_t)auxMsg[4];
187
+ clockRate |= (uint32_t)auxMsg[5] << 8;
188
+ clockRate |= (uint32_t)auxMsg[6] << 16;
189
+ clockRate |= (uint32_t)auxMsg[7] << 24;
190
+
191
+ // Unpack read and write lengths from their 3 shared bytes.
192
+ uint16_t readLength = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1];
193
+ uint16_t writeLength = (((uint16_t)auxMsg[3] & 0x0F) << 8) | auxMsg[2];
194
+
195
+ spiTransfer(clockRate, pin, auxMsg[0], readLength, writeLength, &auxMsg[8]);
196
+ break;
184
197
  }
185
198
  case 27: spiAddListener (); break;
186
199
  #endif
@@ -189,7 +202,7 @@ void Denko::process() {
189
202
  #if defined(DENKO_SPI) || defined(DENKO_SPI_BB)
190
203
  case 28: spiRemoveListener(); break;
191
204
  #endif
192
-
205
+
193
206
  // Implemented in DenkoI2CBB.cpp
194
207
  #ifdef DENKO_I2C_BB
195
208
  case 30: i2c_bb_search (); break;
@@ -239,11 +252,11 @@ void Denko::process() {
239
252
  void Denko::updateListeners() {
240
253
  currentTime = micros();
241
254
  timeDiff = currentTime - lastTime;
242
-
255
+
243
256
  if (timeDiff > 999) {
244
257
  // Add a tick for every 1000us passed.
245
258
  tickCount = tickCount + (timeDiff / 1000);
246
-
259
+
247
260
  // lastTime for next run is currentTime offset by remainder.
248
261
  lastTime = currentTime - (timeDiff % 1000);
249
262
 
@@ -269,7 +282,7 @@ void Denko::handshake() {
269
282
 
270
283
  // Reset this so we never send Rx along with ACK:
271
284
  rxBytes = 0;
272
-
285
+
273
286
  // First handshake value is BOARD_MAP if set.
274
287
  stream->print("ACK:");
275
288
  #ifdef BOARD_MAP
@@ -281,7 +294,7 @@ void Denko::handshake() {
281
294
  #ifdef DENKO_VERSION
282
295
  stream->print(DENKO_VERSION);
283
296
  #endif
284
-
297
+
285
298
  // Third is serial buffer size.
286
299
  stream->print(',');
287
300
  stream->print(DENKO_SERIAL_BUFFER_SIZE);
@@ -289,7 +302,7 @@ void Denko::handshake() {
289
302
  // Fourth is AUX_SIZE.
290
303
  stream->print(',');
291
304
  stream->print(AUX_SIZE);
292
-
305
+
293
306
  // Fifth is EEPROM size. None on Due or Zero.
294
307
  stream->print(',');
295
308
  #if defined(EEPROM_EMULATED)
@@ -303,7 +316,7 @@ void Denko::handshake() {
303
316
  #ifdef DENKO_I2C
304
317
  stream->print(DENKO_I2C_BUFFER_SIZE);
305
318
  #endif
306
-
319
+
307
320
  // End
308
321
  stream->print('\n');
309
322
  }
data/src/lib/Denko.h CHANGED
@@ -120,7 +120,7 @@ class Denko {
120
120
 
121
121
  // Bit Bang SPI
122
122
  void spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
123
- uint8_t rLength, uint8_t wLength, byte *data); //cmd = 21
123
+ uint16_t rLength, uint16_t wLength, byte *data); //cmd = 21
124
124
  byte spiBBtransferByte (uint8_t clock, uint8_t input, uint8_t output, uint8_t select,
125
125
  uint8_t mode, uint8_t bitOrder, byte data);
126
126
  void spiBBaddListener (); //cmd = 22
@@ -129,7 +129,7 @@ class Denko {
129
129
  // Hardware SPI
130
130
  void spiBegin (byte settings, uint32_t clockRate);
131
131
  void spiEnd ();
132
- void spiTransfer (uint32_t clockRate, uint8_t select, uint8_t settings, uint8_t rLength, uint8_t wLength, byte *data); //cmd = 26
132
+ void spiTransfer (uint32_t clockRate, uint8_t select, uint8_t settings, uint16_t rLength, uint16_t wLength, byte *data); //cmd = 26
133
133
  void spiAddListener (); //cmd = 27
134
134
  void spiReadListener (uint8_t i);
135
135
 
@@ -228,10 +228,10 @@ class Denko {
228
228
 
229
229
  // How to store a SPI listener.
230
230
  struct SpiListener{
231
- uint32_t clock; // Clock rate if hardware SPI. If bit bang: bits[0..7] = clock pin, bits [8..15] = input pin.
231
+ uint32_t freq; // Frequency if hardware SPI. If bit bang: bits[0..7] = SCK pin, bits [8..15] = MOSI pin.
232
232
  uint8_t select; // Select pin.
233
233
  uint8_t settings; // Settings mask as given in request.
234
- uint8_t length; // Read length as given in request.
234
+ uint16_t length; // Read length as given in request.
235
235
  uint8_t enabled; // 0 = disabled, 1 = hardware, 2 = bit bang.
236
236
  };
237
237
  SpiListener spiListeners[SPI_LISTENER_COUNT];
@@ -28,29 +28,14 @@
28
28
 
29
29
  // Define number of pins to set up listener storage.
30
30
  #if defined(ESP32)
31
- #define PIN_COUNT 45
32
- #elif defined(ESP8266)
33
- #define PIN_COUNT 18
34
- #elif defined(ARDUINO_ARCH_RP2040)
35
- #define PIN_COUNT 30
36
- // These may have more physical pins, but limited to 54 by the Arduino cores.
37
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__SAM3X8E__)
38
- #define PIN_COUNT 54
39
- // Very small optimization for the 328P/UNO.
40
- #elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
41
- #define PIN_COUNT 20
42
- // This catches ATmega32u4, SAMD21, RA4M1 etc.
31
+ #define PIN_COUNT SOC_GPIO_PIN_COUNT
43
32
  #else
44
- #define PIN_COUNT 22
33
+ #define PIN_COUNT NUM_DIGITAL_PINS
45
34
  #endif
46
35
 
47
36
  // Figure out how many LEDC channels are available on ESP32 boards.
48
37
  #ifdef ESP32
49
- #if CONFIG_IDF_TARGET_ESP32
50
- #define LEDC_CHANNEL_COUNT 16
51
- #else
52
- #define LEDC_CHANNEL_COUNT SOC_LEDC_CHANNEL_NUM
53
- #endif
38
+ #define LEDC_CHANNEL_COUNT SOC_LEDC_CHANNEL_NUM
54
39
  #endif
55
40
 
56
41
  // Filter for boards that can set their analog write resolution.
@@ -72,7 +57,7 @@
72
57
  #elif defined(PIN_SERIAL_1_TX)
73
58
  #define DENKO_UARTS 1
74
59
  #endif
75
-
60
+
76
61
  // ESP32 has either 1 or 2 extra UARTS enabled, depending on chip and board.
77
62
  #elif defined(ESP32)
78
63
  #define DENKO_UARTS (SOC_UART_NUM - 1)
@@ -105,15 +90,11 @@
105
90
  #include <SoftwareSerial.h>
106
91
  #endif
107
92
 
108
- // If no high usage features (core sketch), 32 + 16.
109
- #if !defined(DENKO_SHIFT) && !defined (DENKO_I2C) && !defined(DENKO_SPI) && !defined(DENKO_UARTS) && !defined(DENKO_UART_BB) && !defined(DENKO_IR_OUT) && !defined(DENKO_LED_ARRAY)
93
+ // 32 + 16 bytes aux message for ATmega168. 512 + 16 bytes for all others.
94
+ #if defined(__AVR_ATmega168__)
110
95
  #define AUX_SIZE 48
111
- // If using IR_OUT or LED_ARRAY, and not on the ATmega168, 768 + 16.
112
- #elif (defined(DENKO_IR_OUT) || defined(DENKO_LED_ARRAY)) && !defined(__AVR_ATmega168__)
113
- #define AUX_SIZE 784
114
- // Default aux message size to 256 + 16 bytes.
115
96
  #else
116
- #define AUX_SIZE 272
97
+ #define AUX_SIZE 528
117
98
  #endif
118
99
 
119
100
  // Define 'DENKO_SERIAL_IF' as the serial interface to use.
@@ -10,9 +10,6 @@
10
10
  //
11
11
  #ifdef DENKO_LED_WS2812
12
12
  #include <Adafruit_NeoPixel.h>
13
- #ifdef ESP32
14
- #include <esp.c>
15
- #endif
16
13
 
17
14
  #ifdef ARDUINO_ARCH_RP2040
18
15
  Adafruit_NeoPixel ledArray;
@@ -32,12 +29,8 @@
32
29
  #define WS2812_DATA_OFFSET 8
33
30
  //
34
31
  void Denko::showLEDArray() {
35
- // Avoid memcpy on ESP32 by calling espShow() directly.
36
- #ifdef ESP32
37
- espShow(pin, &auxMsg[WS2812_DATA_OFFSET], val, true);
38
-
39
32
  // Pre-init instance (one PIO) on Pi Pico.
40
- #elif defined(ARDUINO_ARCH_RP2040)
33
+ #ifdef ARDUINO_ARCH_RP2040
41
34
  ledArray.setPin(pin);
42
35
  ledArray.updateLength(val);
43
36
  memcpy(ledArray.getPixels(), &auxMsg[WS2812_DATA_OFFSET], val);
data/src/lib/DenkoSPI.cpp CHANGED
@@ -45,7 +45,7 @@ void Denko::spiBegin(byte settings, uint32_t clockRate) {
45
45
 
46
46
  // SPI mode is the lowest 2 bits of settings.
47
47
  byte mode = settings & 0B00000011;
48
-
48
+
49
49
  // Bit 7 of settings controls bit order. 0 = LSBFIRST, 1 = MSBFIRST.
50
50
  if (bitRead(settings, 7) == 0) {
51
51
  // True integer value for these macros vary by platform, so just do this.
@@ -92,35 +92,39 @@ void Denko::spiEnd() {
92
92
  // auxMsg[3-6] = clock frequency (uint32_t as 4 bytes)
93
93
  // auxMsg[7+] = data (bytes) (write only)
94
94
  //
95
- void Denko::spiTransfer(uint32_t clockRate, uint8_t select, uint8_t settings, uint8_t rLength, uint8_t wLength, byte *data) {
95
+ void Denko::spiTransfer(uint32_t clockRate, uint8_t select, uint8_t settings, uint16_t rLength, uint16_t wLength, byte *data) {
96
96
  spiBegin(settings, clockRate);
97
97
 
98
- // Stream read bytes as if coming from select pin.
99
- if (rLength > 0) {
100
- stream->print(select);
101
- stream->print(':');
102
- }
103
-
104
98
  // Pull select low.
105
99
  if (bitRead(settings, 6) == 1) {
106
100
  pinMode(select, OUTPUT);
107
101
  digitalWrite(select, LOW);
108
102
  }
109
-
110
- for (byte i = 0; (i < rLength || i < wLength); i++) {
111
- byte b;
112
103
 
113
- if (i < wLength) {
114
- b = SPI.transfer(data[i]);
115
- } else {
116
- b = SPI.transfer(0x00);
117
- }
104
+ // Go one byte at a time if reading bytes out.
105
+ if (rLength > 0) {
106
+ // Stream read bytes as if coming from select pin.
107
+ stream->print(select);
108
+ stream->print(':');
109
+
110
+ for (uint16_t i=0; (i < rLength || i < wLength); i++) {
111
+ byte b;
118
112
 
119
- if (i < rLength) {
120
- // Print read byte, then a comma or \n if it's the last read byte.
121
- stream->print(b);
122
- stream->print((i+1 == rLength) ? '\n' : ',');
113
+ if (i < wLength) {
114
+ b = SPI.transfer(data[i]);
115
+ } else {
116
+ b = SPI.transfer(0x00);
117
+ }
118
+
119
+ if (i < rLength) {
120
+ // Print read byte, then a comma or \n if it's the last read byte.
121
+ stream->print(b);
122
+ stream->print((i+1 == rLength) ? '\n' : ',');
123
+ }
123
124
  }
125
+ // Write the entire buffer at once if not reading.
126
+ } else {
127
+ SPI.transfer(data, wLength);
124
128
  }
125
129
 
126
130
  // Leave select high.
@@ -137,16 +141,14 @@ void Denko::spiAddListener() {
137
141
  clockRate |= (uint32_t)auxMsg[4] << 8;
138
142
  clockRate |= (uint32_t)auxMsg[5] << 16;
139
143
  clockRate |= (uint32_t)auxMsg[6] << 24;
140
-
144
+
141
145
  for (int i = 0; i < SPI_LISTENER_COUNT; i++) {
142
146
  if (spiListeners[i].enabled == 0) {
143
- spiListeners[i] = {
144
- clockRate,
145
- pin, // Select pin
146
- auxMsg[0], // Settings
147
- auxMsg[1], // Read length
148
- 1 // Enabled = 1 sets hardware SPI listener
149
- };
147
+ spiListeners[i].freq = clockRate;
148
+ spiListeners[i].select = pin; // Select pin
149
+ spiListeners[i].settings = auxMsg[0]; // Settings mask
150
+ spiListeners[i].length = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1]; // Read length
151
+ spiListeners[i].enabled = 1; // 1 sets this listener as Hardware SPI
150
152
  return;
151
153
  } else {
152
154
  // Should send some kind of error if all are in use.
@@ -156,7 +158,7 @@ void Denko::spiAddListener() {
156
158
 
157
159
  // Called by spiUpdateListeners to read an individual hardware SPI listener.
158
160
  void Denko::spiReadListener(uint8_t i) {
159
- spiTransfer(spiListeners[i].clock,
161
+ spiTransfer(spiListeners[i].freq,
160
162
  spiListeners[i].select,
161
163
  spiListeners[i].settings,
162
164
  spiListeners[i].length,