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
data/src/lib/Denko.h CHANGED
@@ -13,14 +13,6 @@ class Denko {
13
13
  // Store it and call ->print, ->write, ->available, ->read etc. on it.
14
14
  Stream* stream;
15
15
 
16
- // Callback hooks for local logic (defined in main sketch) based on listeners.
17
- // These should be used if:
18
- // 1) a round-trip to the remote client is too slow, or
19
- // 2) something needs to happen regardless of remote client connection.
20
- // Eg. Instant feedback from a smart light switch.
21
- void (*digitalListenCallback)(byte p, byte v);
22
- void (*analogListenCallback)(byte p, int v);
23
-
24
16
  // Core IO API Functions
25
17
  // Functions with a cmd value can be called through the remote API.
26
18
  //
@@ -35,10 +27,10 @@ class Denko {
35
27
  void dacWrite (byte p, int v, boolean echo=true); //cmd = 4
36
28
  int aRead (byte p); //cmd = 5
37
29
  void setListener (byte p, boolean enabled, byte analog, byte exponent, boolean local=true); //cmd = 6
38
-
30
+
39
31
  // Read value of micros() every loop.
40
32
  unsigned long currentTime;
41
-
33
+
42
34
  // Counts 1ms ticks based on currentTime. Rolls over every 256ms.
43
35
  byte tickCount;
44
36
 
@@ -53,19 +45,10 @@ class Denko {
53
45
  void clearCoreListeners ();
54
46
  void findLastActiveListener();
55
47
 
56
- //
57
- // Tanslating aWrite to ledcWrite for PWM out on the ESP32.
58
- //
59
- // Track which pin is assigned to each LEDC channel.
60
- // Byte 0 = enabled or disabled
61
- // Byte 1 = pin number attached to that channel
62
- //
63
48
  #ifdef ESP32
64
- byte ledcPins[LEDC_CHANNEL_COUNT][2];
65
- byte ledcChannel(byte p);
66
- byte assignLEDC(byte channel, byte pin);
67
- void releaseLEDC(byte p);
68
- void clearLedcChannels();
49
+ // 8-bit global PWM resolution by default, to match other boards. Reconfigurable.
50
+ uint8_t esp32AnalogWRes = 8;
51
+ void ledcDetachAll();
69
52
  #endif
70
53
 
71
54
  //
@@ -136,8 +119,8 @@ class Denko {
136
119
  void showLEDArray (); //cmd = 19
137
120
 
138
121
  // Bit Bang SPI
139
- void spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
140
- uint8_t rLength, uint8_t wLength, byte *data); //cmd = 21
122
+ void spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
123
+ uint16_t rLength, uint16_t wLength, byte *data); //cmd = 21
141
124
  byte spiBBtransferByte (uint8_t clock, uint8_t input, uint8_t output, uint8_t select,
142
125
  uint8_t mode, uint8_t bitOrder, byte data);
143
126
  void spiBBaddListener (); //cmd = 22
@@ -146,10 +129,10 @@ class Denko {
146
129
  // Hardware SPI
147
130
  void spiBegin (byte settings, uint32_t clockRate);
148
131
  void spiEnd ();
149
- 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
150
133
  void spiAddListener (); //cmd = 27
151
134
  void spiReadListener (uint8_t i);
152
-
135
+
153
136
  // SPI Listeners (both hardware and bit bang)
154
137
  void spiRemoveListener (); //cmd = 28
155
138
  void spiUpdateListeners ();
@@ -182,6 +165,7 @@ class Denko {
182
165
  void setRegisterDivider (); //cmd = 97
183
166
  void setAnalogWriteResolution (); //cmd = 96
184
167
  void setAnalogReadResolution (); //cmd = 97
168
+ void binaryEcho (); //cmd = 98
185
169
  void microDelay(uint32_t microseconds); //cmd = 99, Platform specific microsecond delay
186
170
  unsigned long lastTime;
187
171
  unsigned long timeDiff;
@@ -211,7 +195,12 @@ class Denko {
211
195
  //
212
196
  // Notify computer that board has received bytes.
213
197
  void rxNotify();
214
- uint8_t rxBytes = 0;
198
+ // 8-bit counter on AVR for efficiency, 32-bit otherwise.
199
+ #ifdef __AVR__
200
+ uint8_t rxBytes = 0;
201
+ #else
202
+ uint32_t rxBytes = 0;
203
+ #endif
215
204
  //
216
205
  // Tell the computer to halt or resume sending data to the board.
217
206
  //
@@ -232,19 +221,46 @@ class Denko {
232
221
 
233
222
  //
234
223
  // Shared SPI listeners that can be used by either hardware or bit bang SPI.
235
- //
224
+ //
236
225
  #if defined(DENKO_SPI) || defined(DENKO_SPI_BB)
237
226
  // How many SPI lsiteners.
238
227
  #define SPI_LISTENER_COUNT 4
239
228
 
240
229
  // How to store a SPI listener.
241
230
  struct SpiListener{
242
- 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.
243
232
  uint8_t select; // Select pin.
244
233
  uint8_t settings; // Settings mask as given in request.
245
- uint8_t length; // Read length as given in request.
234
+ uint16_t length; // Read length as given in request.
246
235
  uint8_t enabled; // 0 = disabled, 1 = hardware, 2 = bit bang.
247
236
  };
248
237
  SpiListener spiListeners[SPI_LISTENER_COUNT];
249
238
  #endif
239
+
240
+ // I2C Bit Bang Interface
241
+ #if defined(DENKO_I2C_BB)
242
+ uint8_t i2c_bb_scl_pin;
243
+ uint8_t i2c_bb_sda_pin;
244
+ uint8_t i2c_bb_quarter_period = 1;
245
+
246
+ // Internal stuff
247
+ void i2c_bb_delay_quarter_period();
248
+ void i2c_bb_delay_half_period();
249
+ void i2c_bb_sda_high ();
250
+ void i2c_bb_sda_low ();
251
+ void i2c_bb_scl_high ();
252
+ void i2c_bb_scl_low ();
253
+ void i2c_bb_start ();
254
+ void i2c_bb_stop ();
255
+ uint8_t i2c_bb_read_bit ();
256
+ void i2c_bb_write_bit (uint8_t bit );
257
+ uint8_t i2c_bb_read_byte (bool back);
258
+ int i2c_bb_write_byte (uint8_t data);
259
+ void i2c_bb_init (uint8_t scl, uint8_t sda);
260
+
261
+ // Remote exposed interface
262
+ void i2c_bb_search ();
263
+ void i2c_bb_write ();
264
+ void i2c_bb_read ();
265
+ #endif
250
266
  };
@@ -4,62 +4,82 @@
4
4
  // Set up a single pin for the desired type of input or output.
5
5
  void Denko::setMode(byte p, byte m) {
6
6
  //
7
- // Use the lowest 3 bits of m to set different input/output modes, and enable
8
- // or disable needed peripherals on different platforms.
7
+ // Use the lowest 4 bits of m to set different input/output modes.
8
+ // Also enables/disables peripherals for certain targets.
9
9
  //
10
- // OUTPUT MODES:
11
- // 000 = Digital Output
12
- // 010 = PWM Ouptut
13
- // 100 = DAC Output
10
+ // OUTPUT MODES:
11
+ // 0000 = Digital Output
12
+ // 0010 = PWM Ouptut
13
+ // 0100 = DAC Output
14
+ // 0110 = Open Drain Output (Only ESP32 implements this, and we don't really use it)
15
+ // 1000 = Open Source Output (Nothing implements this yet)
14
16
  //
15
17
  // INPUT MODES
16
- // 001 = Digital Input
17
- // 011 = Digital Input with internal pulldown if available.
18
- // 101 = Digital Input with internal pullup if available.
19
- // 111 = Digital Input/Output (ESP32 Only?)
20
- m = m & 0b00000111;
18
+ // 0001 = Input with no pull bias
19
+ // 0011 = Input with internal pulldown, if available.
20
+ // 0101 = Input with internal pullup, if available.
21
+ m = m & 0b00001111;
21
22
 
22
23
  #if defined(ESP32)
23
- // Free the LEDC channel if leaving PWM mode.
24
- if (m != 0b010) releaseLEDC(p);
25
-
26
24
  // Disable attached DAC if leaving DAC mode.
27
25
  #if defined(SOC_DAC_SUPPORTED)
28
- if (m != 0b100) dacDisable(p);
26
+ if (m != 0b0100) dacDisable(p);
29
27
  #endif
28
+
29
+ // Attach or detach LEDC channel whether entering or leaving PWM mode.
30
+ if (m == 0b0010) {
31
+ // auxMsg[0..3] is frequency, [4..7] is resolution.
32
+ uint32_t freq = *reinterpret_cast<uint32_t *>(auxMsg);
33
+ uint8_t res = *reinterpret_cast<uint8_t *>(auxMsg + 4);
34
+ // Fallback to defaults.
35
+ if (freq == 0) freq = 1000;
36
+ if (res == 0) res = esp32AnalogWRes;
37
+ ledcAttach(p, freq, res);
38
+ return;
39
+ } else {
40
+ ledcDetach(p);
41
+ }
30
42
  #endif
31
-
43
+
32
44
  // On the SAMD21 and RA4M1, mode needs to be INPUT when using the DAC.
33
45
  #if defined(__SAMD21G18A__) || defined(_RENESAS_RA_)
34
- if (m == 0b100){
46
+ if (m == 0b0100){
35
47
  pinMode(p, INPUT);
36
48
  return;
37
49
  }
38
50
  #endif
39
-
40
- // Handle the named INPUT_* states on boards implementing them.
51
+
52
+ // Handle INPUT_* states on boards implementing them.
41
53
  #ifdef INPUT_PULLDOWN
42
- if (m == 0b011) {
54
+ if (m == 0b0011) {
43
55
  pinMode(p, INPUT_PULLDOWN);
44
56
  return;
45
57
  }
46
58
  #endif
47
-
48
- #ifdef INPUT_OUTPUT
49
- if (m == 0b111) {
50
- pinMode(p, INPUT_OUTPUT);
59
+
60
+ #ifdef INPUT_PULLUP
61
+ if (m == 0b0101) {
62
+ pinMode(p, INPUT_PULLUP);
51
63
  return;
52
64
  }
53
65
  #endif
54
-
55
- #ifdef INPUT_PULLUP
56
- if (m == 0b101) {
57
- pinMode(p, INPUT_PULLUP);
66
+
67
+ // Handle OUTPUT_* states on boards implementing them.
68
+ #ifdef OUTPUT_OPEN_DRAIN
69
+ if (m == 0b0110) {
70
+ pinMode(p, OUTPUT_OPEN_DRAIN);
71
+ return;
72
+ }
73
+ #endif
74
+
75
+ #ifdef OUTPUT_OPEN_SOURCE
76
+ if (m == 0b1000) {
77
+ pinMode(p, OUTPUT_OPEN_SOURCE);
58
78
  return;
59
79
  }
60
80
  #endif
61
-
62
- // Handle the standard INPUT and OUTPUT states.
81
+
82
+ // Handle standard INPUT and OUTPUT states.
63
83
  // Allows INPUT_* to fallback to INPUT when not implemented.
64
84
  if (bitRead(m, 0) == 0) {
65
85
  pinMode(p, OUTPUT);
@@ -69,7 +89,7 @@ void Denko::setMode(byte p, byte m) {
69
89
 
70
90
  // Write high to set pullup for AVRs that use this method.
71
91
  #ifdef __AVR__
72
- if (m == 0b101) digitalWrite(p, HIGH);
92
+ if (m == 0b0101) digitalWrite(p, HIGH);
73
93
  #endif
74
94
  }
75
95
 
@@ -89,9 +109,9 @@ void Denko::dWrite(byte p, byte v, boolean echo) {
89
109
  #if defined(SOC_DAC_SUPPORTED)
90
110
  dacDisable(p);
91
111
  #endif
92
- ledcDetachPin(p);
112
+ ledcDetach(p);
93
113
  #endif
94
-
114
+
95
115
  if (v == 0) {
96
116
  digitalWrite(p, LOW);
97
117
  }
@@ -113,13 +133,7 @@ byte Denko::dRead(byte p) {
113
133
  // Write an analog output pin. 0 for LOW, up to 255 for HIGH @ 8-bit resolution.
114
134
  void Denko::pwmWrite(byte p, int v, boolean echo) {
115
135
  #ifdef ESP32
116
- // Assign new or find existing LEDC channel for this pin.
117
- byte channel = ledcChannel(p);
118
-
119
- // Reattach the pin in case dWrite detached it.
120
- ledcAttachPin(p, channel);
121
-
122
- ledcWrite(channel, v);
136
+ ledcWrite(p, v);
123
137
  #else
124
138
  analogWrite(p,v);
125
139
  #endif
@@ -127,66 +141,9 @@ void Denko::pwmWrite(byte p, int v, boolean echo) {
127
141
  if (echo) coreResponse(p, v);
128
142
  }
129
143
 
130
- //
131
- // Manage ESP32 LEDC channels so we can do PWM write.
132
- //
133
144
  #ifdef ESP32
134
- byte Denko::ledcChannel(byte p) {
135
- // Search for enabled LEDC channel with given pin and use that if found.
136
- for (int i = LEDC_CHANNEL_COUNT -1; i > 0; i--){
137
- if ((ledcPins[i][0] == 1) && (ledcPins[i][1] == p)){
138
- return i;
139
- }
140
- }
141
-
142
- // We didn't find a channel to reuse.
143
- for (int i = LEDC_CHANNEL_COUNT -1; i > 0; i--){
144
- // If the channel isn't initialized and it isn't marked as used, use it.
145
- // should find some way to check if the channel itslef is being used
146
- if ((ledcPins[i][0] == 0)) {
147
- assignLEDC(i, p);
148
- return i;
149
- }
150
- }
151
-
152
- // Return a useless channel if none available.
153
- return 255;
154
- };
155
-
156
- // Assign a LEDC channel to a pin and save it.
157
- byte Denko::assignLEDC(byte channel, byte p){
158
- // First 8 channels: up to 40Mhz @ 16-bits
159
- // Last 8 channels: up to 500kHz @ 13-bits
160
- // Just use similar settings to ATmega for now.
161
- ledcSetup(channel, 1000, 8);
162
- ledcAttachPin(p, channel);
163
-
164
- // Save the pin and mark it as in use.
165
- ledcPins[channel][0] = 1;
166
- ledcPins[channel][1] = p;
167
- return channel;
168
- }
169
-
170
- // Release a LEDC channel when done with it.
171
- void Denko::releaseLEDC(byte p){
172
- // Detach the pin from the channel.
173
- ledcDetachPin(p);
174
-
175
- // Mark any channel associated with the pin as unused.
176
- for (int i = LEDC_CHANNEL_COUNT -1; i > 0; i--){
177
- if (ledcPins[i][1] == p) ledcPins[i][0] = 0;
178
- }
179
- }
180
-
181
- // Clear all the LEDC channels on reset.
182
- void Denko::clearLedcChannels(){
183
- for (int i = LEDC_CHANNEL_COUNT -1; i > 0; i--){
184
- // Stop the channel if it was still enabled.
185
- if (ledcPins[i][0] != 0) ledcDetachPin(ledcPins[i][1]);
186
-
187
- // Mark the channel as unused.
188
- ledcPins[i][0] = 0;
189
- }
145
+ void Denko::ledcDetachAll() {
146
+ for(byte i=0; i++; i<256) ledcDetach(i);
190
147
  }
191
148
  #endif
192
149
 
@@ -197,7 +154,7 @@ void Denko::dacWrite(byte p, int v, boolean echo) {
197
154
  #if defined(ESP32) && defined(SOC_DAC_SUPPORTED)
198
155
  ::dacWrite(p, v);
199
156
  #endif
200
-
157
+
201
158
  #if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(_RENESAS_RA_)
202
159
  analogWrite(p, v);
203
160
  #endif
@@ -284,7 +241,6 @@ void Denko::updateCoreListeners() {
284
241
  // Handle a single analog listener when it needs to read.
285
242
  void Denko::analogListenerUpdate(byte i){
286
243
  int rval = analogRead(listeners[i][1]);
287
- analogListenCallback(listeners[i][1], rval);
288
244
  coreResponse(listeners[i][1], rval);
289
245
  }
290
246
 
@@ -295,7 +251,6 @@ void Denko::digitalListenerUpdate(byte i){
295
251
  if (rval != bitRead(listeners[i][0], 5)){
296
252
  // State for digital listeners is stored in byte 5 of the listener itself.
297
253
  bitWrite(listeners[i][0], 5, rval);
298
- digitalListenCallback(listeners[i][1], rval);
299
254
  coreResponse(listeners[i][1], rval);
300
255
  }
301
256
  }
@@ -11,6 +11,7 @@
11
11
  // #define DENKO_EEPROM
12
12
  // #define DENKO_ONE_WIRE
13
13
  // #define DENKO_TONE
14
+ // #define DENKO_I2C_BB
14
15
  // #define DENKO_SPI_BB
15
16
  // #define DENKO_I2C
16
17
  // #define DENKO_SPI
@@ -26,29 +27,15 @@
26
27
  #endif
27
28
 
28
29
  // Define number of pins to set up listener storage.
29
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
30
- #define PIN_COUNT 70
31
- #elif defined(__SAM3X8E__)
32
- #define PIN_COUNT 72
33
- #elif defined(ESP8266)
34
- #define PIN_COUNT 18
35
- #elif defined(ESP32)
36
- #define PIN_COUNT 40
37
- #elif defined(ARDUINO_ARCH_RP2040)
38
- #define PIN_COUNT 26
30
+ #if defined(ESP32)
31
+ #define PIN_COUNT SOC_GPIO_PIN_COUNT
39
32
  #else
40
- #define PIN_COUNT 22
33
+ #define PIN_COUNT NUM_DIGITAL_PINS
41
34
  #endif
42
35
 
43
36
  // Figure out how many LEDC channels are available on ESP32 boards.
44
37
  #ifdef ESP32
45
- #if CONFIG_IDF_TARGET_ESP32
46
- #define LEDC_CHANNEL_COUNT 16
47
- #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
48
- #define LEDC_CHANNEL_COUNT 8
49
- #elif CONFIG_IDF_TARGET_ESP32C3
50
- #define LEDC_CHANNEL_COUNT 6
51
- #endif
38
+ #define LEDC_CHANNEL_COUNT SOC_LEDC_CHANNEL_NUM
52
39
  #endif
53
40
 
54
41
  // Filter for boards that can set their analog write resolution.
@@ -70,14 +57,10 @@
70
57
  #elif defined(PIN_SERIAL_1_TX)
71
58
  #define DENKO_UARTS 1
72
59
  #endif
73
-
60
+
74
61
  // ESP32 has either 1 or 2 extra UARTS enabled, depending on chip and board.
75
62
  #elif defined(ESP32)
76
- #if SOC_UART_NUM == 3
77
- #define DENKO_UARTS 2
78
- #elif SOC_UART_NUM == 2
79
- #define DENKO_UARTS 1
80
- #endif
63
+ #define DENKO_UARTS (SOC_UART_NUM - 1)
81
64
 
82
65
  // ESP8266 has a single open transmit-only UART.
83
66
  #elif defined(ESP8266) && defined(SERIAL_PORT_HARDWARE_OPEN)
@@ -107,24 +90,20 @@
107
90
  #include <SoftwareSerial.h>
108
91
  #endif
109
92
 
110
- // If no high usage features (core sketch), 32 + 16.
111
- #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__)
112
95
  #define AUX_SIZE 48
113
- // If using IR_OUT or LED_ARRAY, and not on the ATmega168, 768 + 16.
114
- #elif (defined(DENKO_IR_OUT) || defined(DENKO_LED_ARRAY)) && !defined(__AVR_ATmega168__)
115
- #define AUX_SIZE 784
116
- // Default aux message size to 256 + 16 bytes.
117
96
  #else
118
- #define AUX_SIZE 272
97
+ #define AUX_SIZE 528
119
98
  #endif
120
99
 
121
100
  // Define 'DENKO_SERIAL_IF' as the serial interface to use.
122
101
  // Uses SerialUSB (left port), which is native USB, on Arduino Due & Zero, or Serial otherwise.
123
102
  // On many boards, eg. Arduino Leonardo, RP2040, ESP32-S3, Serial is native USB regardless.
124
103
  #if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
125
- #define DENKO_SERIAL_IF SerialUSB
104
+ #define DENKO_SERIAL_IF SERIAL_PORT_USBVIRTUAL
126
105
  #define DENKO_USB_CDC
127
- // To use programming USB (right) on Due and Zero, comment 2 lines above, uncomment 1 line below.
106
+ // "Serial" is UART (right port) on Due and Zero, but may be native USB on boards with one port.
128
107
  // #define DENKO_SERIAL_IF Serial
129
108
  #else
130
109
  #define DENKO_SERIAL_IF Serial
@@ -135,30 +114,37 @@
135
114
  //
136
115
  // These are 256/64 regardless of whether native USB CDC or UART bridge.
137
116
  #if defined(ARDUINO_ARCH_RP2040) || defined(ESP8266) || defined(__SAM3X8E__)
138
- #define DENKO_SERIAL_BUFFER_SIZE 256
117
+ #define DENKO_SERIAL_BUFFER_SIZE 248
139
118
  #define DENKO_RX_ACK_INTERVAL 64
119
+
140
120
  // ESP32 defaults to 256 buffer. Stay one under.
141
121
  #elif defined(ESP32)
142
- #define DENKO_SERIAL_BUFFER_SIZE 255
143
- #ifdef ARDUINO_USB_CDC_ON_BOOT
144
- // S2 unreliable with acknowledgement before buffer is full.
145
- #ifdef CONFIG_IDF_TARGET_ESP32S2
146
- #define DENKO_RX_ACK_INTERVAL 255
147
- // S3 and C3 are fine acknowledging at half buffer filled.
122
+ #define DENKO_SERIAL_BUFFER_SIZE 248
123
+ // H2 and C6 unreliable with CDC. Use UART bridge. Still unreliable ACK before buffer full, like S2.
124
+ #if defined(CONFIG_IDF_TARGET_ESP32H2) || defined(CONFIG_IDF_TARGET_ESP32C6)
125
+ #define DENKO_RX_ACK_INTERVAL 248
126
+ #else
127
+ #ifdef ARDUINO_USB_CDC_ON_BOOT
128
+ // S2 unreliable with acknowledgement before buffer is full.
129
+ #ifdef CONFIG_IDF_TARGET_ESP32S2
130
+ #define DENKO_RX_ACK_INTERVAL 248
131
+ // S3 and C3 are fine acknowledging at half buffer filled.
132
+ #else
133
+ #define DENKO_RX_ACK_INTERVAL 128
134
+ #endif
135
+ // Fall back to 64 if using a UART bridge.
148
136
  #else
149
- #define DENKO_RX_ACK_INTERVAL 128
137
+ #define DENKO_RX_ACK_INTERVAL 64
150
138
  #endif
151
- // Default to 64 if using a UART bridge.
152
- #else
153
- #define DENKO_RX_ACK_INTERVAL 64
154
139
  #endif
140
+
155
141
  // RA4M1 has a 512 Serial buffer.
156
142
  #elif defined(_RENESAS_RA_)
157
- #define DENKO_SERIAL_BUFFER_SIZE 512
143
+ #define DENKO_SERIAL_BUFFER_SIZE 504
158
144
  #define DENKO_RX_ACK_INTERVAL 64
159
145
  // SAMD21 is 256/128 in native USB mode ONLY. Must use defaults on programming port to avoid data loss.
160
146
  #elif defined(__SAMD21G18A__) && defined(DENKO_USB_CDC)
161
- #define DENKO_SERIAL_BUFFER_SIZE 256
147
+ #define DENKO_SERIAL_BUFFER_SIZE 248
162
148
  #define DENKO_RX_ACK_INTERVAL 128
163
149
  // 32u4 is odd. Size is 63 instead of 64. Interval must be 31. 32 doesn't work at all. Off by 1 errors?
164
150
  #elif defined(__AVR_ATmega32U4__)
data/src/lib/DenkoI2C.cpp CHANGED
@@ -37,6 +37,14 @@ void Denko::i2cSetSpeed(uint8_t code) {
37
37
  default: Wire.setClock(100000); break;
38
38
  }
39
39
  i2cSpeed = code;
40
+
41
+ // ESP32-H2 doesn't safely fallback if speed > 400kHz is chosen.
42
+ #ifdef CONFIG_IDF_TARGET_ESP32H2
43
+ if (i2cSpeed > 1) {
44
+ i2cSpeed = 1;
45
+ Wire.setClock(400000);
46
+ }
47
+ #endif
40
48
  }
41
49
 
42
50
  // CMD = 33
@@ -46,7 +54,7 @@ void Denko::i2cSearch() {
46
54
  uint8_t addr;
47
55
  if (!i2cStarted) i2cBegin();
48
56
  i2cSetSpeed(0);
49
- stream->print(SDA);
57
+ stream->print("I2C0");
50
58
 
51
59
  // Only addresses from 0x08 to 0x77 are usable (8 to 127).
52
60
  for (addr = 0x08; addr < 0x78; addr++) {
@@ -59,88 +67,89 @@ void Denko::i2cSearch() {
59
67
  stream->print('\n');
60
68
  }
61
69
 
62
- // CMD = 34
63
- // Write to an I2C device over a harwdare I2C interface.
64
- //
65
- // pin
66
- // bits 0..6 = Device address
67
- // bit 7 = Send stop condition. 0 = no, repeated start. 1 = yes.
68
70
  //
69
- // val
70
- // bits 0..4 = Data length. NOTE: maximum of 32. Anything more is ignored.
71
- //
72
- // auxMsg[0] = I2C settings. Just speed selection for now.
73
- //
74
- // auxMsg[1]+ = data
71
+ // cmd = 34
72
+ // pin = <reseverd>
73
+ // val = <reserved>
74
+ // auxMsg[0] = I2C settings
75
+ // Bits[7..2] = <reserved>
76
+ // Bits[1..0] = Bitmask for I2C speed
77
+ // auxMsg[1] = Device address in bits [6..0] + repeated start in bit 7
78
+ // auxMsg[2] = Data length to write
79
+ // auxMsg[3]+ = Data
75
80
  //
76
81
  void Denko::i2cWrite() {
77
82
  // Get parameters from message.
78
- uint8_t address = (uint8_t)pin & 0b01111111;
79
- uint8_t dataLength = (uint8_t)val;
83
+ uint8_t speedMask = auxMsg[0] & 0b00000011;
84
+ uint8_t address = auxMsg[1] & 0b01111111;
85
+ uint8_t sendStop = auxMsg[1] >> 7;
86
+ uint8_t dataLength = auxMsg[2];
80
87
 
81
- // Limit to 32 bytes.
88
+ // Limit to board's I2C buffer size.
82
89
  if (dataLength > DENKO_I2C_BUFFER_SIZE) dataLength = DENKO_I2C_BUFFER_SIZE;
83
90
 
91
+ // Start and set speed.
84
92
  if (!i2cStarted) i2cBegin();
85
- if (i2cSpeed != auxMsg[0]) i2cSetSpeed(auxMsg[0]);
93
+ if (i2cSpeed != speedMask) i2cSetSpeed(speedMask);
86
94
 
87
95
  Wire.beginTransmission(address);
88
- Wire.write(&auxMsg[1], dataLength);
96
+ Wire.write(&auxMsg[3], dataLength);
89
97
 
90
98
  // No repeated start on ESP32.
91
99
  #if defined(ESP32)
92
100
  Wire.endTransmission();
93
101
  #else
94
- uint8_t sendStop = (uint8_t)pin >> 7;
102
+
95
103
  Wire.endTransmission(sendStop);
96
104
  #endif
97
105
  }
98
106
 
99
- // CMD = 35
100
- // Read from an I2C device over a harwdare I2C interface.
101
107
  //
102
- // pin
103
- // bits 0..6 = Device address
104
- // bit 7 = Send stop condition. 0 = no, repeated start. 1 = yes.
105
- //
106
- // val
107
- // bits 0..4 = Data length. NOTE: maximum of 32. Anything more is ignored.
108
- //
109
- // auxMsg[0] = I2C settings. Just speed selection for now.
108
+ // Read from an I2C device over a harwdare I2C interface.
110
109
  //
111
- // auxMsg[1] = If > 0, write a register address of that many bytes before reading.
112
- // auxMsg[2]+ = Register address bytes in order.
110
+ // cmd = 35
111
+ // pin = <reseverd>
112
+ // val = <reserved>
113
+ // auxMsg[0] = I2C settings
114
+ // Bits[7..2] = <reserved>
115
+ // Bits[1..0] = Bitmask for I2C speed
116
+ // auxMsg[1] = Device address in bits [6..0] + repeated start in bit 7
117
+ // auxMsg[2] = Data length to read
118
+ // auxMsg[3] = Register address length
119
+ // auxMsg[4]+ = Register address bytes if length > 0
113
120
  //
114
121
  void Denko::i2cRead() {
115
122
  // Get parameters from message.
116
- uint8_t address = (uint8_t)pin & 0b01111111;
117
- uint8_t sendStop = (uint8_t)pin >> 7;
118
- uint8_t dataLength = (uint8_t)val;
123
+ uint8_t speedMask = auxMsg[0] & 0b00000011;
124
+ uint8_t address = auxMsg[1] & 0b01111111;
125
+ uint8_t sendStop = auxMsg[1] >> 7;
126
+ uint8_t dataLength = auxMsg[2];
119
127
 
120
- // Limit to 32 bytes.
128
+ // Limit to board's I2C buffer size.
121
129
  if (dataLength > DENKO_I2C_BUFFER_SIZE) dataLength = DENKO_I2C_BUFFER_SIZE;
122
130
 
131
+ // Start and set speed.
123
132
  if (!i2cStarted) i2cBegin();
124
- if (i2cSpeed != auxMsg[0]) i2cSetSpeed(auxMsg[0]);
125
-
133
+ if (i2cSpeed != speedMask) i2cSetSpeed(speedMask);
134
+
126
135
  // Optionally write up to a 4 byte register address before reading.
127
- if ((auxMsg[1] > 0) && (auxMsg[1] < 5)) {
136
+ if ((auxMsg[3] > 0) && (auxMsg[3] < 5)) {
128
137
  Wire.beginTransmission(address);
129
- Wire.write(&auxMsg[2], auxMsg[1]);
138
+ Wire.write(&auxMsg[4], auxMsg[3]);
130
139
  Wire.endTransmission(sendStop);
131
140
  }
132
-
141
+
133
142
  // ESP32 crashes if requestFrom gets the 3rd arg.
134
- #if defined(ESP32)
143
+ #if defined(ESP32)
135
144
  Wire.requestFrom(address, dataLength);
136
145
  #else
137
146
  Wire.requestFrom(address, dataLength, sendStop);
138
147
  #endif
139
-
140
- // Send data as if coming from SDA pin. Prefix with device adddress.
148
+
149
+ // Send data as if coming from a pin called "I2C0". Prefix with device adddress.
141
150
  // Fail silently if no bytes read / invalid device address.
142
- stream->print(SDA); stream->print(':');
143
- stream->print(address); stream->print('-');
151
+ stream->print("I2C0:");
152
+ stream->print(address); stream->print('-');
144
153
  while(Wire.available()){
145
154
  stream->print(Wire.read());
146
155
  stream->print(',');