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
@@ -0,0 +1,238 @@
1
+ //
2
+ // Adds I2C bitbang functionality to the Denko class if DENKO_I2C_BB defined in DenkoDefines.h.
3
+ //
4
+ #include "Denko.h"
5
+
6
+ #ifdef DENKO_I2C_BB
7
+
8
+ void Denko::i2c_bb_delay_quarter_period() {
9
+ #ifndef __AVR__
10
+ microDelay(i2c_bb_quarter_period);
11
+ #endif
12
+ }
13
+
14
+ // Delays for timing. Not sure how necessary this is.
15
+ void Denko::i2c_bb_delay_half_period() {
16
+ #ifndef __AVR__
17
+ microDelay(i2c_bb_quarter_period*2);
18
+ #endif
19
+ }
20
+
21
+ // Can't use output mode for SDA. Toggle between input for HIGH, output for LOW.
22
+ void Denko::i2c_bb_sda_high() { pinMode(i2c_bb_sda_pin, INPUT); }
23
+ void Denko::i2c_bb_sda_low() { pinMode(i2c_bb_sda_pin, OUTPUT); }
24
+
25
+ // Matching SCL functions for readability.
26
+ void Denko::i2c_bb_scl_high() { digitalWrite(i2c_bb_scl_pin, HIGH); }
27
+ void Denko::i2c_bb_scl_low() { digitalWrite(i2c_bb_scl_pin, LOW); }
28
+
29
+ // Start condition is SDA then SCL going low, from both high.
30
+ void Denko::i2c_bb_start() {
31
+ i2c_bb_delay_quarter_period();
32
+ i2c_bb_sda_low();
33
+ i2c_bb_delay_quarter_period();
34
+ i2c_bb_scl_low();
35
+ }
36
+
37
+ // Stop condition is SDA going high, while SCL is also high.
38
+ void Denko::i2c_bb_stop() {
39
+ i2c_bb_delay_quarter_period();
40
+ i2c_bb_sda_low();
41
+ i2c_bb_delay_quarter_period();
42
+ i2c_bb_scl_high();
43
+ i2c_bb_delay_quarter_period();
44
+ i2c_bb_sda_high();
45
+ }
46
+
47
+ uint8_t Denko::i2c_bb_read_bit() {
48
+ uint8_t bit;
49
+
50
+ // Ensure SDA high before we pull SCL high.
51
+ // i2c_bb_delay_quarter_period();
52
+ i2c_bb_sda_high();
53
+ i2c_bb_delay_quarter_period();
54
+
55
+ // Pull SCL high.
56
+ i2c_bb_scl_high();
57
+
58
+ // Wait 1/4 period and sample SDA.
59
+ i2c_bb_delay_quarter_period();
60
+ bit = digitalRead(i2c_bb_sda_pin);
61
+
62
+ // Leave SCL low.
63
+ // i2c_bb_delay_quarter_period();
64
+ i2c_bb_scl_low();
65
+
66
+ return bit;
67
+ }
68
+
69
+ void Denko::i2c_bb_write_bit(uint8_t bit) {
70
+ // i2c_bb_delay_quarter_period();
71
+ // Set SDA while SCL is low.
72
+ if (bit == 0) {
73
+ i2c_bb_sda_low();
74
+ } else {
75
+ i2c_bb_sda_high();
76
+ }
77
+ // i2c_bb_delay_quarter_period();
78
+
79
+ // Pull SCL high, wait (should be half cycle), then leave it low.
80
+ i2c_bb_scl_high();
81
+ i2c_bb_delay_quarter_period();
82
+ // i2c_bb_delay_half_period();
83
+ i2c_bb_scl_low();
84
+ }
85
+
86
+ uint8_t Denko::i2c_bb_read_byte(bool ack) {
87
+ uint8_t b;
88
+
89
+ // Receive MSB first.
90
+ for (int i=7; i>=0; i--) bitWrite(b, i, i2c_bb_read_bit());
91
+
92
+ // Send ACK or NACK and return byte.
93
+ if (ack) {
94
+ i2c_bb_write_bit(0);
95
+ } else {
96
+ i2c_bb_write_bit(1);
97
+ }
98
+ return b;
99
+ }
100
+
101
+ int Denko::i2c_bb_write_byte(uint8_t data) {
102
+ // Send MSB first.
103
+ for (int i=7; i>=0; i--) i2c_bb_write_bit(bitRead(data, i));
104
+
105
+ // Return -1 for NACK, 0 for ACK.
106
+ return (i2c_bb_read_bit() == 0) ? 0 : -1;
107
+ }
108
+
109
+ void Denko::i2c_bb_init(uint8_t scl, uint8_t sda) {
110
+ // Set pins in state variables, to avoid passing them around.
111
+ i2c_bb_scl_pin = scl;
112
+ i2c_bb_sda_pin = sda;
113
+
114
+ // Ensure SCL is output, and reset both pins to high.
115
+ pinMode(i2c_bb_scl_pin, OUTPUT);
116
+ i2c_bb_stop();
117
+ }
118
+
119
+ //
120
+ // Search for I2C devices on a bit banged I2C interface.
121
+ //
122
+ // cmd = 31
123
+ // pin = SCL pin
124
+ // val = SDA pin
125
+ //
126
+ // Ask each address for a single byte to see if it exists on the bus.
127
+ //
128
+ void Denko::i2c_bb_search() {
129
+ int ack;
130
+ uint8_t addr;
131
+
132
+ // Switch our "bus" to the given pins.
133
+ i2c_bb_init((uint8_t)pin, (uint8_t)val);
134
+
135
+ // Start sending results.
136
+ stream->print(i2c_bb_sda_pin);
137
+
138
+ // If SDA is low here, nothing connected to bus. Return no results.
139
+ if (digitalRead(i2c_bb_sda_pin) == 0) {
140
+ stream->print('\n');
141
+ return;
142
+ }
143
+
144
+ // Only addresses from 0x08 to 0x77 are usable (8 to 127).
145
+ for (addr = 0x08; addr < 0x78; addr++) {
146
+ i2c_bb_start();
147
+ ack = i2c_bb_write_byte((addr << 1) & 0b11111110);
148
+ if (ack == 0) {
149
+ stream->print(':');
150
+ stream->print(addr);
151
+ }
152
+ i2c_bb_stop();
153
+ }
154
+ stream->print('\n');
155
+ }
156
+
157
+ //
158
+ // Write to an I2C device over a bit banged I2C interface.
159
+ //
160
+ // cmd = 31
161
+ // pin = SCL pin
162
+ // val = SDA pin
163
+ // auxMsg[0] = I2C settings
164
+ // Bits[7..0] = <reserved>
165
+ // auxMsg[1] = Device address in bits [6..0] + repeated start in bit 7
166
+ // auxMsg[2] = Data length to write
167
+ // auxMsg[3]+ = Data
168
+ //
169
+ void Denko::i2c_bb_write() {
170
+ // Get parameters from message.
171
+ uint8_t address = auxMsg[1] & 0b01111111;
172
+ uint8_t writeAddress = (address << 1) & 0b11111110;
173
+ uint8_t sendStop = auxMsg[1] >> 7;
174
+ uint8_t dataLength = auxMsg[2];
175
+
176
+ // Switch our "bus" to the given pins.
177
+ i2c_bb_init((uint8_t)pin, (uint8_t)val);
178
+
179
+ i2c_bb_start();
180
+ i2c_bb_write_byte(writeAddress);
181
+ for (int i=0; i<dataLength; i++) i2c_bb_write_byte(auxMsg[3+i]);
182
+ i2c_bb_stop();
183
+ }
184
+
185
+ //
186
+ // Read from an I2C device over a bit banged I2C interface.
187
+ //
188
+ // cmd = 32
189
+ // pin = SCL pin
190
+ // val = SDA pin
191
+ // auxMsg[0] = I2C settings
192
+ // Bits[7..0] = <reserved>
193
+ // auxMsg[1] = Device address in bits [6..0] + repeated start in bit 7
194
+ // auxMsg[2] = Data length to read
195
+ // auxMsg[3] = Register address length
196
+ // auxMsg[4]+ = Register address bytes if length > 0
197
+ //
198
+ void Denko::i2c_bb_read() {
199
+ // Get parameters from message.
200
+ uint8_t address = auxMsg[1] & 0b01111111;
201
+ uint8_t writeAddress = (address << 1) & 0b11111110;
202
+ uint8_t readAddress = (address << 1) | 0b00000001;
203
+ uint8_t sendStop = auxMsg[1] >> 7;
204
+ uint8_t dataLength = auxMsg[2];
205
+
206
+ // Switch our "bus" to the given pins.
207
+ i2c_bb_init((uint8_t)pin, (uint8_t)val);
208
+
209
+ // Optionally write up to a 4 byte register address before reading.
210
+ if ((auxMsg[3] > 0) && (auxMsg[3] < 5)) {
211
+ i2c_bb_start();
212
+ i2c_bb_write_byte(writeAddress);
213
+ for(int i=0; i<auxMsg[3]; i++) i2c_bb_write_byte(auxMsg[4+i]);
214
+ i2c_bb_stop();
215
+ }
216
+
217
+ // If no ACK from device, return without sending any data.
218
+ i2c_bb_start();
219
+ int ack = i2c_bb_write_byte(readAddress);
220
+ if (ack < 0) return;
221
+
222
+ // Start streaming data as if coming from the SDA pin.
223
+ stream->print(i2c_bb_sda_pin); stream->print(':');
224
+ stream->print(address); stream->print('-');
225
+
226
+ // Read and ACK for all but the last byte.
227
+ for(int i=0; i<dataLength-1; i++){
228
+ stream->print(i2c_bb_read_byte(true));
229
+ stream->print(',');
230
+ }
231
+ stream->print(i2c_bb_read_byte(false));
232
+
233
+ // Finish stream and send stop condition.
234
+ stream->print(',');
235
+ stream->print('\n');
236
+ i2c_bb_stop();
237
+ }
238
+ #endif
@@ -2,7 +2,7 @@
2
2
  // This file adds to the Denko class only if DENKO_IR_OUT is defined in Denko.h.
3
3
  //
4
4
  #include "Denko.h"
5
- #if defined(DENKO_IR_OUT) && !defined(ESP8266) && !defined(ESP32)
5
+ #if defined(DENKO_IR_OUT)
6
6
 
7
7
  // Save memory by disabling receiver.
8
8
  #undef RAW_BUFFER_LENGTH
@@ -20,14 +20,19 @@
20
20
  // CMD = 16
21
21
  // Send an infrared signal.
22
22
  void Denko::irSend(){
23
- // Byte 1+ of auxMsg is already little-endian uint16 pulses.
24
- uint16_t *pulseArray = reinterpret_cast<uint16_t *>(auxMsg + 1);
25
-
26
- // Dynamically set the sending pin. Needs to be PWM capable.
23
+ // Change send pin per call. Must be PWM capable.
27
24
  IrSender.setSendPin(pin);
28
25
 
29
- // auxMsg[0] contains number of uint16_t
26
+ // Byte 2+ of auxMsg is already little-endian uint16 pulses.
27
+ //
28
+ // WARNING: This offset must always be an even number, for aligned
29
+ // memory access on the ESP8266, or it breaks.
30
+ uint16_t *pulseArray = reinterpret_cast<uint16_t *>(auxMsg + 2);
31
+
32
+ // auxMsg[0..1] contains number of pulses, also uint16.
33
+ uint16_t length = *reinterpret_cast<uint16_t *>(auxMsg);
34
+
30
35
  // Val contains frequency
31
- IrSender.sendRaw(pulseArray, auxMsg[0], val);
36
+ IrSender.sendRaw(pulseArray, length, val);
32
37
  }
33
38
  #endif
@@ -10,6 +10,10 @@
10
10
  //
11
11
  #ifdef DENKO_LED_WS2812
12
12
  #include <Adafruit_NeoPixel.h>
13
+
14
+ #ifdef ARDUINO_ARCH_RP2040
15
+ Adafruit_NeoPixel ledArray;
16
+ #endif
13
17
  #endif
14
18
 
15
19
  //
@@ -18,24 +22,36 @@
18
22
  //
19
23
  // pin = Microcontroller pin connected to Data In pin of the LED array.
20
24
  // val = Number of raw pixel data bytes to expect. Max 9999.
21
- // auxMsg[0..3] = Reserved for future settings.
22
- // auxMsg[4+] = Raw pixel data, already in correct byte order (GRB, RGB, etc.).
25
+ // auxMsg[0..3] = ALWAYS ZERO or ESP32 can crash if pixel bytes have certain low values. Very confusing.
26
+ // auxMsg[4..7] = Reserved for future settings.
27
+ // auxMsg[8+] = Raw pixel data, already in correct byte order (GRB, RGB, etc.).
28
+ //
29
+ #define WS2812_DATA_OFFSET 8
23
30
  //
24
31
  void Denko::showLEDArray() {
25
- // Setup a new LED array object.
26
- Adafruit_NeoPixel ledArray(val, pin, NEO_GRB + NEO_KHZ800);
27
- ledArray.begin();
32
+ // Pre-init instance (one PIO) on Pi Pico.
33
+ #ifdef ARDUINO_ARCH_RP2040
34
+ ledArray.setPin(pin);
35
+ ledArray.updateLength(val);
36
+ memcpy(ledArray.getPixels(), &auxMsg[WS2812_DATA_OFFSET], val);
37
+ ledArray.show();
28
38
 
29
- // Copy LED data into the pixel buffer.
30
- memcpy(ledArray.getPixels(), &auxMsg[4], val);
39
+ // Reinit and memcpy for everything else.
40
+ #else
41
+ // Setup a new LED array object.
42
+ Adafruit_NeoPixel ledArray(val, pin, NEO_GRB + NEO_KHZ800);
43
+ ledArray.begin();
31
44
 
32
- // ATmega4809 still needs this delay to avoid corrupt data. Not sure why.
33
- #if defined(__AVR_ATmega4809__)
34
- microDelay(64);
35
- #endif
45
+ // Copy LED data into the pixel buffer.
46
+ memcpy(ledArray.getPixels(), &auxMsg[WS2812_DATA_OFFSET], val);
47
+
48
+ // Let the line stay low for about 6 bytes worth of data.
49
+ // Prevents first pixel green being stuck on.
50
+ microDelay(60);
36
51
 
37
- // Write the pixel buffer to the array.
38
- ledArray.show();
52
+ // Write the pixel buffer to the array.
53
+ ledArray.show();
54
+ #endif
39
55
 
40
56
  // Tell the computer to resume sending data.
41
57
  sendReady();
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.
@@ -84,46 +84,51 @@ void Denko::spiEnd() {
84
84
  // val = empty
85
85
  // auxMsg[0] = SPI settings
86
86
  // Bit 0..1 = SPI mode
87
- // Bit 2..6 = ** unused **
87
+ // Bit 2..5 = ** unused **
88
+ // Bit 6 = Whether to toggle select pin (1), or not (0)
88
89
  // Bit 7 = Read and write bit order: MSBFIRST(1) or LSBFIRST(0)
89
90
  // auxMsg[1] = read length (number of bytes)
90
91
  // auxMsg[2] = write length (number of bytes)
91
92
  // auxMsg[3-6] = clock frequency (uint32_t as 4 bytes)
92
93
  // auxMsg[7+] = data (bytes) (write only)
93
94
  //
94
- 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) {
95
96
  spiBegin(settings, clockRate);
96
97
 
97
- // Stream read bytes as if coming from select pin.
98
+ // Pull select low.
99
+ if (bitRead(settings, 6) == 1) {
100
+ pinMode(select, OUTPUT);
101
+ digitalWrite(select, LOW);
102
+ }
103
+
104
+ // Go one byte at a time if reading bytes out.
98
105
  if (rLength > 0) {
106
+ // Stream read bytes as if coming from select pin.
99
107
  stream->print(select);
100
108
  stream->print(':');
101
- }
102
109
 
103
- // Pull select pin low, treating 255 as no select pin.
104
- if (select != 255) {
105
- pinMode(select, OUTPUT);
106
- digitalWrite(select, LOW);
107
- }
108
-
109
- for (byte i = 0; (i < rLength || i < wLength); i++) {
110
- byte b;
110
+ for (uint16_t i=0; (i < rLength || i < wLength); i++) {
111
+ byte b;
111
112
 
112
- if (i < wLength) {
113
- b = SPI.transfer(data[i]);
114
- } else {
115
- b = SPI.transfer(0x00);
116
- }
113
+ if (i < wLength) {
114
+ b = SPI.transfer(data[i]);
115
+ } else {
116
+ b = SPI.transfer(0x00);
117
+ }
117
118
 
118
- if (i < rLength) {
119
- // Print read byte, then a comma or \n if it's the last read byte.
120
- stream->print(b);
121
- stream->print((i+1 == rLength) ? '\n' : ',');
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
+ }
122
124
  }
125
+ // Write the entire buffer at once if not reading.
126
+ } else {
127
+ SPI.transfer(data, wLength);
123
128
  }
124
129
 
125
- // Leave select high, treating 255 as no select pin.
126
- if (select != 255) digitalWrite(select, HIGH);
130
+ // Leave select high.
131
+ if (bitRead(settings, 6) == 1) digitalWrite(select, HIGH);
127
132
 
128
133
  spiEnd();
129
134
  }
@@ -136,16 +141,14 @@ void Denko::spiAddListener() {
136
141
  clockRate |= (uint32_t)auxMsg[4] << 8;
137
142
  clockRate |= (uint32_t)auxMsg[5] << 16;
138
143
  clockRate |= (uint32_t)auxMsg[6] << 24;
139
-
144
+
140
145
  for (int i = 0; i < SPI_LISTENER_COUNT; i++) {
141
146
  if (spiListeners[i].enabled == 0) {
142
- spiListeners[i] = {
143
- clockRate,
144
- pin, // Select pin
145
- auxMsg[0], // Settings
146
- auxMsg[1], // Read length
147
- 1 // Enabled = 1 sets hardware SPI listener
148
- };
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
149
152
  return;
150
153
  } else {
151
154
  // Should send some kind of error if all are in use.
@@ -155,7 +158,7 @@ void Denko::spiAddListener() {
155
158
 
156
159
  // Called by spiUpdateListeners to read an individual hardware SPI listener.
157
160
  void Denko::spiReadListener(uint8_t i) {
158
- spiTransfer(spiListeners[i].clock,
161
+ spiTransfer(spiListeners[i].freq,
159
162
  spiListeners[i].select,
160
163
  spiListeners[i].settings,
161
164
  spiListeners[i].length,
@@ -11,7 +11,8 @@
11
11
  // val = empty
12
12
  // auxMsg[0] = SPI settings
13
13
  // Bit 0..1 = SPI mode
14
- // Bit 2..6 = ** unused **
14
+ // Bit 2..5 = ** unused **
15
+ // Bit 6 = Whether to toggle select pin (1), or not (0)
15
16
  // Bit 7 = Read and write bit order: MSBFIRST(1) or LSBFIRST(0)
16
17
  // auxMsg[1] = read length (number of bytes)
17
18
  // auxMsg[2] = write length (number of bytes)
@@ -21,8 +22,8 @@
21
22
  // auxMsg[6] = ** unused **
22
23
  // auxMsg[7+] = data (bytes) (write only) - Start from 7 for parity with hardware SPI.
23
24
  //
24
- void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
25
- uint8_t rLength, uint8_t wLength, byte *data) {
25
+ void Denko::spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
26
+ uint16_t rLength, uint16_t wLength, byte *data) {
26
27
 
27
28
  // Mode is the lowest 2 bits of settings.
28
29
  uint8_t mode = settings & 0b00000011;
@@ -38,7 +39,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
38
39
  // Set idle state of clock pin based on SPI mode.
39
40
  pinMode(clock, OUTPUT);
40
41
  if ((mode == 0)||(mode == 1)) digitalWrite(clock, LOW);
41
- if ((mode == 2)||(mode == 3)) digitalWrite(clock, LOW);
42
+ if ((mode == 2)||(mode == 3)) digitalWrite(clock, HIGH);
42
43
 
43
44
  // Stream read bytes as if coming from select pin.
44
45
  if (rLength > 0) {
@@ -46,13 +47,13 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
46
47
  stream->print(':');
47
48
  }
48
49
 
49
- // Pull select pin low, treating 255 as no select pin.
50
- if (select != 255) {
50
+ // Pull select low, if needed.
51
+ if (bitRead(settings, 6) == 1) {
51
52
  pinMode(select, OUTPUT);
52
53
  digitalWrite(select, LOW);
53
54
  }
54
55
 
55
- for (byte i = 0; (i < rLength || i < wLength); i++) {
56
+ for (uint16_t i=0; (i < rLength || i < wLength); i++) {
56
57
  byte b;
57
58
 
58
59
  if (i < wLength) {
@@ -67,9 +68,9 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
67
68
  stream->print((i+1 == rLength) ? '\n' : ',');
68
69
  }
69
70
  }
70
-
71
- // Leave select high, treating 255 as no select pin.
72
- if (select != 255) digitalWrite(select, HIGH);
71
+
72
+ // Leave select high.
73
+ if (bitRead(settings, 6) == 1) digitalWrite(select, HIGH);
73
74
  }
74
75
 
75
76
  //
@@ -78,7 +79,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
78
79
  byte Denko::spiBBtransferByte(uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t mode, uint8_t bitOrder, byte data) {
79
80
  // Byte to return
80
81
  byte b = 0x00;
81
-
82
+
82
83
  // Track which of the 8 bits we're on.
83
84
  uint8_t bitPos;
84
85
 
@@ -128,13 +129,11 @@ void Denko::spiBBaddListener() {
128
129
  for (int i = 0; i < SPI_LISTENER_COUNT; i++) {
129
130
  // Overwrite the first disabled listener in the struct array.
130
131
  if (spiListeners[i].enabled == 0) {
131
- spiListeners[i] = {
132
- ((uint32_t)(auxMsg[4] << 8) | auxMsg[3]), // Clock: [0..7], input: [8..15]
133
- pin, // Select pin
134
- auxMsg[0], // Settings mask
135
- auxMsg[1], // Read length
136
- 2 // Enabled = 2 sets bit bang SPI listener
137
- };
132
+ spiListeners[i].freq = ((uint32_t)(auxMsg[4] << 8) | auxMsg[3]); // SCK: [0..7], MOSI: [8..15] in freq's uint32.
133
+ spiListeners[i].select = pin; // Select pin
134
+ spiListeners[i].settings = auxMsg[0]; // Settings mask
135
+ spiListeners[i].length = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1]; // Read length
136
+ spiListeners[i].enabled = 2; // 2 sets this listener as Bit-Bang
138
137
  return;
139
138
  } else {
140
139
  // Should send some kind of error if all are in use.
@@ -144,8 +143,8 @@ void Denko::spiBBaddListener() {
144
143
 
145
144
  // Called by spiUpdateListeners to read an individual bit bang SPI listener.
146
145
  void Denko::spiBBreadListener(uint8_t i) {
147
- spiBBtransfer((spiListeners[i].clock & 0xFF), // Clock pin is bits [0..7] of the uint32
148
- ((spiListeners[i].clock >> 8) & 0xFF), // Input pin is bits [8..15] of the uint32
146
+ spiBBtransfer ((spiListeners[i].freq & 0xFF), // SCK pin is bits [0..7] of freq's uint32
147
+ ((spiListeners[i].freq >> 8) & 0xFF), // MOSI pin is bits [8..15] of freq's uint32
149
148
  255, // Disabled output pin
150
149
  spiListeners[i].select, // Select pin
151
150
  spiListeners[i].settings,
data/target.yml CHANGED
@@ -1,3 +1,38 @@
1
- name: mega
1
+ name: atmega
2
2
  fqbn: arduino:avr:uno
3
- port: /dev/cu.usbmodem14B01
3
+ port: /dev/cu.usbmodem14501
4
+
5
+ # name: atmega
6
+ # fqbn: arduino:avr:mega
7
+ # port: /dev/cu.usbmodem14501
8
+
9
+ # name: atmega
10
+ # fqbn: arduino:avr:leonardo
11
+ # port: /dev/cu.usbmodem14501
12
+
13
+ # Uses native USB port
14
+ # name: atsam3x
15
+ # fqbn: arduino:sam:arduino_due_x
16
+ # port: /dev/cu.usbmodem14501
17
+
18
+ # Uses native USB port
19
+ # name: atsamd21
20
+ # fqbn: arduino:samd:arduino_zero_native
21
+ # port: /dev/cu.usbmodem14501
22
+
23
+ # name: esp8266
24
+ # fqbn: esp8266:esp8266:nodemcuv2
25
+ # port: /dev/cu.SLAB_USBtoUART
26
+
27
+ # name: esp32
28
+ # fqbn: esp32:esp32:esp32doit-devkit-v1
29
+ # port: /dev/cu.SLAB_USBtoUART
30
+
31
+ # Use for S3 on secondary UART port (not native USB). Native USB needs to be enabled in IDE.
32
+ # name: esp32
33
+ # fqbn: esp32:esp32:lolin_s3
34
+ # port: /dev/cu.usbmodem14501
35
+
36
+ # name: rp2040
37
+ # fqbn: rp2040:rp2040:rpipicow
38
+ # port: /dev/cu.usbmodem14501
@@ -12,7 +12,7 @@ class AnalogIOInputTest < Minitest::Test
12
12
  def test__read
13
13
  mock = Minitest::Mock.new.expect :call, nil, [14, nil, nil, nil]
14
14
  board.stub(:analog_read, mock) do
15
- part._read
15
+ part.read_nb
16
16
  end
17
17
  mock.verify
18
18
  end
@@ -15,47 +15,47 @@ class AnalogIOPotentiometerTest < Minitest::Test
15
15
  part
16
16
  end
17
17
 
18
- assert part.smoothing
19
18
  assert_equal 8, part.divider
20
- assert_equal [], part.instance_variable_get(:@smoothing_set)
19
+ assert_equal [], part.smoothing_set
21
20
  end
22
-
21
+
23
22
  def test_smoothing_on
23
+ part.smoothing = true
24
24
  7.times do
25
25
  part.update(10)
26
26
  end
27
27
  part.update(50)
28
-
28
+
29
29
  # 120/8 = 15
30
- assert_equal part.state, 15
30
+ assert_equal 15, part.state
31
31
  end
32
-
32
+
33
33
  def test_smoothing_off
34
34
  part.smoothing = false
35
35
  7.times do
36
36
  part.update(10)
37
37
  end
38
38
  part.update(50)
39
-
39
+
40
40
  # Give latest value.
41
41
  assert_equal part.state, 50
42
42
  end
43
-
43
+
44
44
  def test_on_change
45
45
  mock = Minitest::Mock.new.expect(:call, nil)
46
-
46
+
47
47
  # Turn off smoothing and set an initial value
48
48
  part.smoothing = false
49
49
  part.update(100)
50
-
50
+
51
51
  # Add the callback
52
52
  part.on_change { mock.call }
53
-
53
+
54
54
  # Send a few updates
55
55
  part.update(100)
56
56
  part.update(100)
57
57
  part.update(101)
58
-
58
+
59
59
  # Should have only been called once.
60
60
  mock.verify
61
61
  end
@@ -18,7 +18,7 @@ class BoardProxyTest < Minitest::Test
18
18
  assert_equal part.high, 1
19
19
  assert_equal part.low, 0
20
20
  assert_equal part.convert_pin("7"), 7
21
- part.set_pin_mode(1, :output, :pullup)
21
+ part.set_pin_mode(1, :output)
22
22
  part.start_read
23
23
  end
24
24
  end