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,166 @@
1
+ module Denko
2
+ module Display
3
+ class ST7565
4
+ include Behaviors::Lifecycle
5
+ include SPICommon
6
+
7
+ COLUMNS = 128
8
+ ROWS = 64
9
+
10
+ # Overall commands
11
+ RESET = 0b11100010
12
+ DISPLAY_ON = 0b10101111
13
+ DISPLAY_OFF = 0b10101110
14
+ ALL_POINTS_OFF = 0b10100100
15
+ ALL_POINTS_ON = 0b10100100
16
+ STATIC_INDICATOR_OFF = 0b10101100
17
+ STATIC_INDICATOR_ON = 0b10101101
18
+
19
+ def standby
20
+ command [DISPLAY_OFF, ALL_POINTS_ON]
21
+ end
22
+
23
+ def slp
24
+ command [STATIC_INDICATOR_OFF, 0b00, DISPLAY_OFF, ALL_POINTS_ON]
25
+ end
26
+
27
+ def wake
28
+ # Note static indicator stays disabled. Not sure how to use it.
29
+ command [ALL_POINTS_OFF, DISPLAY_ON, STATIC_INDICATOR_OFF, 0b00]
30
+ end
31
+
32
+ # Overall votage commands
33
+ POWER_CONTROL = 0b00101000
34
+ LCD_BIAS_1_7 = 0b10100011
35
+ VOLUME = 0b10000001
36
+ VALID_VOLUMES = (0..63).to_a
37
+ #
38
+ # Control voltage regulator circuit. Values 0-7 are OR'ed into last 3 bits.
39
+ # 5 seems to work best for non-inverted mode, and 6 for inverted.
40
+ RESISTOR_RATIO = 0b00100000
41
+ VALID_RESISTOR_RATIOS = (0..7).to_a
42
+
43
+ def resistor_ratio=(ratio)
44
+ raise ArgumentError, "invalid resistor ratio #{ratio}" unless VALID_RESISTOR_RATIOS.include? ratio
45
+ command [RESISTOR_RATIO | ratio]
46
+ end
47
+
48
+ def volume=(value)
49
+ raise ArgumentError, "invalid volume #{value}" unless VALID_VOLUMES.include? value
50
+ command [VOLUME, value]
51
+ end
52
+
53
+ #
54
+ # Addressing and writing to display RAM.
55
+ # Always in write mode. Called Read-Modify-Write and END in datasheet.
56
+ RMW_WRITE = 0b11100000
57
+ RMW_END = 0b11101110
58
+ #
59
+ # Set page and column to start on before writing data.
60
+ # Page and column nibbles are OR'ed into lower 4 bits.
61
+ PASET = 0b10110000
62
+ CASET_UPPER = 0b00010000
63
+ CASET_LOWER = 0b00000000
64
+ #
65
+ # Control X and Y mirroring, so the display can be reflected
66
+ # in either axis, or rotated 180 degrees, in hardware.
67
+ #
68
+ # How RAM columns map to pixels. Called ADC in datasheet.
69
+ COL_NORMAL = 0b10100000
70
+ COL_REVERSE = 0b10100001
71
+ # How RAM pages map to pixels. Called Common Output Mode in datasheet.
72
+ PAGE_NORMAL = 0b11000000
73
+ PAGE_REVERSE = 0b11001000
74
+ # RAM has 132 columns. Need to start at index 4 when columns get reversed.
75
+ COL_REVERSE_COL_START = 4
76
+
77
+ def x_ram_offset
78
+ @x_ram_offset ||= 0
79
+ end
80
+
81
+ def reflect_x
82
+ @reflected_x ||= false
83
+ @reflected_x ? command([COL_NORMAL]) : command([COL_REVERSE])
84
+ @reflected_x = !@reflected_x
85
+ @x_ram_offset = @reflected_x ? COL_REVERSE_COL_START : 0
86
+ end
87
+
88
+ def reflect_y
89
+ @reflected_y ||= false
90
+ @reflected_y ? command([PAGE_NORMAL]) : command([PAGE_REVERSE])
91
+ @reflected_y = !@reflected_y
92
+ end
93
+
94
+ def rotate
95
+ reflect_x
96
+ reflect_y
97
+ end
98
+
99
+ # Control display inversion.
100
+ # White on black is OFF. Black on white ON.
101
+ INVERT_OFF = 0b10100110
102
+ INVERT_ON = 0b10100111
103
+
104
+ def invert
105
+ @inverted ||= false
106
+ if @inverted
107
+ command [INVERT_OFF]
108
+ self.resistor_ratio = 5
109
+ else
110
+ command [INVERT_ON]
111
+ self.resistor_ratio = 6
112
+ end
113
+ @inverted = !@inverted
114
+ end
115
+
116
+ after_initialize do
117
+ # Reset sequence.
118
+ reset.low if reset
119
+ sleep 0.001
120
+ reset.high if reset
121
+ command [RESET]
122
+
123
+ # Enable all power circuits:
124
+ # bit0 = voltage follower
125
+ # bit1 = voltage regulator
126
+ # bit2 = voltage booster
127
+ command [POWER_CONTROL | 0b111]
128
+ sleep 0.010
129
+
130
+ # Set LCD voltage bias ratio
131
+ command [LCD_BIAS_1_7]
132
+
133
+ # Non-inverted display by default. Set resistor ratio and volume.
134
+ self.resistor_ratio = 5
135
+ self.volume = 16
136
+
137
+ # Columns need to be reversed by default.
138
+ reflect_x
139
+ rotate if params[:rotated]
140
+
141
+ wake
142
+ end
143
+
144
+ def draw_partial(buffer, x_start, x_finish, p_start, p_finish, color=1)
145
+ x = x_start + x_ram_offset
146
+ x_lower4 = (x & 0b00001111)
147
+ x_upper4 = (x & 0b11110000) >> 4
148
+
149
+ (p_start..p_finish).each do |page|
150
+ command [RMW_WRITE]
151
+ # Set start page and column.
152
+ command [PASET | page, CASET_LOWER | x_lower4, CASET_UPPER | x_upper4]
153
+
154
+ # Get needed bytes for this page only.
155
+ src_start = (columns * page) + x_start
156
+ src_end = (columns * page) + x_finish
157
+ partial_buffer = buffer[src_start..src_end]
158
+
159
+ # Send in chunks up to maximum transfer size.
160
+ partial_buffer.each_slice(transfer_limit) { |slice| data(slice) }
161
+ command [RMW_END]
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
data/lib/denko/display.rb CHANGED
@@ -1,7 +1,44 @@
1
+ require_relative "display/font"
2
+
3
+ # Represent files to be autoloaded in CRuby as an Array.
4
+ # This allows Mruby::Build to parse and preload them instead.
5
+ DISPLAY_FILES = [
6
+ # Character Displays
7
+ [:HD44780, "hd44780"],
8
+
9
+ # Pixel display mixins and helpers
10
+ [:PixelCommon, "pixel_common"],
11
+ [:SPICommon, "spi_common"],
12
+ [:SPIEPaperCommon, "spi_epaper_common"],
13
+ [:Canvas, "canvas"],
14
+
15
+ # OLEDs
16
+ [:MonoOLED, "mono_oled"],
17
+ [:SSD1306, "ssd1306"],
18
+ [:SH1106, "sh1106"],
19
+ [:SH1107, "sh1107"],
20
+
21
+ # LCDs
22
+ [:PCD8544, "pcd8544"],
23
+ [:ST7302, "st7302"],
24
+ [:ST7565, "st7565"],
25
+
26
+ # E-paper
27
+ [:IL0373, "il0373"],
28
+ [:SSD168X, "ssd168x"],
29
+ [:SSD1680, "ssd1680"],
30
+ [:SSD1681, "ssd1681"],
31
+ ]
32
+
1
33
  module Denko
2
34
  module Display
3
- autoload :Canvas, "#{__dir__}/display/canvas"
4
- autoload :HD44780, "#{__dir__}/display/hd44780"
5
- autoload :SSD1306, "#{__dir__}/display/ssd1306"
35
+ DISPLAY_FILES.each do |file|
36
+ file_path = "#{__dir__}/display/#{file[1]}"
37
+ if file[0]
38
+ autoload file[0], file_path
39
+ else
40
+ require file_path
41
+ end
42
+ end
6
43
  end
7
44
  end
@@ -0,0 +1,67 @@
1
+ module Denko
2
+ module EEPROM
3
+ class AT24C
4
+ include I2C::Peripheral
5
+
6
+ I2C_ADDRESS = 0x50
7
+ I2C_FREQUENCY = 400_000
8
+ READ_WRITE_US = 20_000
9
+ WRITE_PAGE_SIZE = 64
10
+
11
+ def int_to_reg_array(int)
12
+ [ (int >> 8) & 0xFF, int & 0xFF ]
13
+ end
14
+
15
+ def [](loc)
16
+ if loc.class == Range
17
+ index = loc.first
18
+ count = loc.count
19
+ limit = bus.board.i2c_limit
20
+ result = []
21
+
22
+ # Chunked reads based on Board#i2c_limit.
23
+ # Reading appears to cross page borders seamlessly.
24
+ while count > 0
25
+ this_count = (count > limit) ? limit : count
26
+ result += i2c_read_raw(this_count, register: int_to_reg_array(index))
27
+ index = index + this_count
28
+ count = count - this_count
29
+ end
30
+
31
+ result
32
+ else
33
+ i2c_read_raw(1, register: int_to_reg_array(loc))
34
+ end
35
+ end
36
+
37
+ def []=(loc, value)
38
+ if value.class == Array
39
+ # Start address uses up 2 bytes.
40
+ limit = bus.board.i2c_limit - 2
41
+
42
+ remaining = value.length
43
+ src_start = 0
44
+ dst_start = loc
45
+
46
+ while remaining > 0
47
+ # Limit to lowest of: remaining page size, I2C max size, or remaining bytes.
48
+ size = WRITE_PAGE_SIZE - (dst_start % WRITE_PAGE_SIZE)
49
+ size = limit if (limit < size)
50
+ size = remaining if (remaining < size)
51
+ src_end = src_start + size - 1
52
+
53
+ i2c_write(int_to_reg_array(dst_start) + value[src_start..src_end])
54
+ micro_delay(READ_WRITE_US)
55
+
56
+ remaining -= size
57
+ src_start += size
58
+ dst_start += size
59
+ end
60
+ else
61
+ i2c_write(int_to_reg_array(loc) + [value])
62
+ micro_delay(READ_WRITE_US)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,69 @@
1
+ module Denko
2
+ module EEPROM
3
+ class Board
4
+ include Behaviors::Component
5
+ include Behaviors::Reader
6
+
7
+ def max_eeperom_txn
8
+ @max_eeeprom_txn ||= board.aux_limit - 3
9
+ end
10
+
11
+ def length
12
+ board.eeprom_length
13
+ end
14
+
15
+ def pin
16
+ 254
17
+ end
18
+
19
+ def [](loc)
20
+ if loc.class == Range
21
+ index = loc.first
22
+ remaining = loc.count
23
+ result = []
24
+
25
+ while remaining > 0
26
+ size = (max_eeperom_txn < remaining) ? max_eeperom_txn : remaining
27
+ end_address = index + size - 1
28
+ raise ArgumentError, "EEPROM address #{end_address} out of range" if (end_address >= length)
29
+
30
+ result += read_using -> { board.eeprom_read(index, size) }
31
+ index += size
32
+ remaining -= size
33
+ end
34
+ result
35
+ else
36
+ bytes = read_using -> { board.eeprom_read(loc, 1) }
37
+ bytes[0]
38
+ end
39
+ end
40
+
41
+ def []=(loc, value)
42
+ if value.class == Array
43
+ remaining = value.length
44
+ src_start = 0
45
+ dst_start = loc
46
+
47
+ while remaining > 0
48
+ size = (max_eeperom_txn < remaining) ? max_eeperom_txn : remaining
49
+ src_end = src_start + size - 1
50
+ raise ArgumentError, "EEPROM address #{src_end} out of range" if (src_end >= length)
51
+
52
+ board.eeprom_write(dst_start, value[src_start..src_end])
53
+
54
+ remaining -= size
55
+ src_start += size
56
+ dst_start += size
57
+ end
58
+ else
59
+ board.eeprom_write(loc, [value])
60
+ end
61
+ end
62
+
63
+ def pre_callback_filter(message)
64
+ # address = message.split("-", 2)[0].to_i
65
+ bytes = message.split("-", 2)[1].split(",").map(&:to_i)
66
+ end
67
+ end
68
+ end
69
+ end
data/lib/denko/eeprom.rb CHANGED
@@ -1,5 +1,19 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ EEPROM_FILES = [
4
+ [:Board, "board"],
5
+ [:AT24C, "at24c"],
6
+ ]
7
+
1
8
  module Denko
2
9
  module EEPROM
3
- autoload :BuiltIn, "#{__dir__}/eeprom/built_in"
10
+ EEPROM_FILES.each do |file|
11
+ file_path = "#{__dir__}/eeprom/#{file[1]}"
12
+ if file[0]
13
+ autoload file[0], file_path
14
+ else
15
+ require file_path
16
+ end
17
+ end
4
18
  end
5
19
  end
@@ -0,0 +1,13 @@
1
+ module Denko
2
+ def self.gil?
3
+ ["mruby", "ruby"].include? RUBY_ENGINE
4
+ end
5
+
6
+ def self.mruby?
7
+ RUBY_ENGINE == "mruby"
8
+ end
9
+
10
+ def self.in_mruby_build?
11
+ defined?(MRuby::Build)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Denko
2
+ class MutexStub
3
+ def synchronize(&block)
4
+ block.call
5
+ end
6
+
7
+ def lock
8
+ end
9
+
10
+ def unlock
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ HELPER_FILES = [
2
+ [nil, "engine_check"],
3
+ [nil, "mutex_stub"],
4
+ ]
5
+
6
+ HELPER_FILES.each { |f| require_relative "helpers/#{f[1]}"}
@@ -0,0 +1,32 @@
1
+ module Denko
2
+ module I2C
3
+ class BitBang
4
+ include Behaviors::MultiPin
5
+ include Behaviors::Lifecycle
6
+ include BusCommon
7
+
8
+ def initialize_pins(options={})
9
+ proxy_pin :scl, DigitalIO::CBitBang
10
+ proxy_pin :sda, DigitalIO::CBitBang
11
+ end
12
+
13
+ after_initialize do
14
+ # Data received for the SDA pin is really for the bus.
15
+ sda.add_callback(:bus_forwarder) { |data| self.update(data) }
16
+ board.i2c_bb_setup(pins[:scl], pins[:sda])
17
+ end
18
+
19
+ def _search
20
+ board.i2c_bb_search(pins[:scl], pins[:sda])
21
+ end
22
+
23
+ def write(address, bytes, frequency=nil, repeated_start=false)
24
+ board.i2c_bb_write(pins[:scl], pins[:sda], address, bytes, repeated_start)
25
+ end
26
+
27
+ def _read(address, register, num_bytes, frequency=nil, repeated_start=false)
28
+ board.i2c_bb_read(pins[:scl], pins[:sda], address, register, num_bytes, repeated_start)
29
+ end
30
+ end
31
+ end
32
+ end
data/lib/denko/i2c/bus.rb CHANGED
@@ -1,51 +1,23 @@
1
1
  module Denko
2
2
  module I2C
3
3
  class Bus
4
- include Behaviors::SinglePin
5
- include Behaviors::BusControllerAddressed
6
- include Behaviors::Reader
4
+ include Behaviors::Lifecycle
5
+ include BusCommon
7
6
 
8
- attr_reader :found_devices
9
-
10
- def after_initialize(options={})
11
- super(options)
12
- @found_devices = []
13
- bubble_callbacks
7
+ def i2c_index
8
+ @i2c_index ||= params[:i2c_index] || params[:index] || 0
14
9
  end
15
10
 
16
- def search
17
- addresses = read_using -> { board.i2c_search }
18
- @found_devices = addresses.split(":").map(&:to_i) if addresses
11
+ def _search
12
+ board.i2c_search(i2c_index)
19
13
  end
20
14
 
21
15
  def write(address, bytes, frequency=100000, repeated_start=false)
22
- board.i2c_write(address, bytes, frequency, repeated_start)
16
+ board.i2c_write(i2c_index, address, bytes, frequency, repeated_start)
23
17
  end
24
18
 
25
19
  def _read(address, register, num_bytes, frequency=100000, repeated_start=false)
26
- board.i2c_read(address, register, num_bytes, frequency, repeated_start)
27
- end
28
-
29
- def bubble_callbacks
30
- add_callback(:bus_controller) do |str|
31
- if str && str.match(/\A\d+-/)
32
- address, data = str.split("-", 2)
33
- address = address.to_i
34
-
35
- data = data.split(",").map(&:to_i)
36
- data = nil if data.empty?
37
-
38
- update_component(address, data)
39
- end
40
- end
41
- end
42
-
43
- def update_component(address, data)
44
- components.each do |component|
45
- if component.address == address
46
- component.update(data)
47
- end
48
- end
20
+ board.i2c_read(i2c_index, address, register, num_bytes, frequency, repeated_start)
49
21
  end
50
22
  end
51
23
  end
@@ -0,0 +1,50 @@
1
+ module Denko
2
+ module I2C
3
+ module BusCommon
4
+ include Behaviors::BusControllerAddressed
5
+ include Behaviors::Reader
6
+ include Behaviors::Lifecycle
7
+
8
+ after_initialize do
9
+ bubble_callbacks
10
+ end
11
+
12
+ def found_devices
13
+ @found_devices ||= []
14
+ end
15
+
16
+ def search
17
+ addresses = read_using -> { _search }
18
+ if addresses.class == String
19
+ @found_devices = addresses.split(":").map(&:to_i).reject{ |e| e==0 }
20
+ elsif addresses.class == Array
21
+ # 0th element being 0 (invalid address) means the array contains search results,
22
+ # instead of bytes read from a peripheral. Remove it.
23
+ @found_devices = addresses - [0]
24
+ end
25
+ end
26
+
27
+ def bubble_callbacks
28
+ add_callback(:bus_controller) do |data|
29
+ bytes = nil
30
+
31
+ # Array data from PiBoard.
32
+ if data.class == Array
33
+ address = data[0]
34
+ bytes = data[1..-1]
35
+
36
+ # String data from microcontroller.
37
+ elsif (data.class == String) && (data.match /\A\d+-/)
38
+ address, bytes = data.split("-", 2)
39
+ address = address.to_i
40
+ bytes = bytes.split(",").map(&:to_i)
41
+ bytes = nil if bytes.empty?
42
+ end
43
+
44
+ # Update components.
45
+ components.each { |c| c.update(bytes) if c.address == address } if bytes
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -3,35 +3,48 @@ module Denko
3
3
  module Peripheral
4
4
  include Behaviors::BusPeripheralAddressed
5
5
  include Behaviors::Reader
6
+ include Behaviors::Lifecycle
6
7
 
7
- def before_initialize(options={})
8
- # Allow peripherals to set @i2c_address.
9
- @address ||= @i2c_address
8
+ # Set I2C defaults for including classes by defining these constants in them.
9
+ I2C_ADDRESS = nil
10
+ I2C_FREQUENCY = 100_000
11
+ I2C_REPEATED_START = false
10
12
 
11
- # I2C defaults if peripheral does not set.
12
- @i2c_frequency ||= 100000
13
- @i2c_repeated_start ||= false
13
+ def i2c_default(sym)
14
+ const_sym = "I2C_#{sym}".upcase.to_sym
15
+ self.class.const_get(const_sym) if self.class.const_defined?(const_sym)
16
+ end
14
17
 
15
- # Override defaults if given in options.
16
- @i2c_frequency = options[:i2c_frequency] if options[:i2c_frequency]
17
- @i2c_repeated_start = options[:i2c_repeated_start] if options[:i2c_frequency]
18
+ # Use @address instead of @i2c_address for default BusPeripheral behavior.
19
+ def address
20
+ @address ||= params[:i2c_address] || params[:address] || i2c_default(:address)
21
+ end
22
+ alias :i2c_address :address
18
23
 
19
- # Allow generic :address option to be given as :i2c_address before validation.
20
- # Superclass method will hande override.
21
- options[:address] ||= options[:i2c_address]
24
+ def i2c_frequency
25
+ @i2c_frequency ||= params[:i2c_frequency] || params[:frequency] || i2c_default(:frequency)
26
+ end
22
27
 
23
- super(options)
28
+ def i2c_repeated_start
29
+ return @i2c_repeated_start unless @i2c_repeated_start.nil?
30
+ @i2c_repeated_start = params[:i2c_repeated_start] if @i2c_repeated_start.nil?
31
+ @i2c_repeated_start = params[:repeated_start] if @i2c_repeated_start.nil?
32
+ @i2c_repeated_start = i2c_default(:repeated_start) if @i2c_repeated_start.nil?
33
+ @i2c_repeated_start
24
34
  end
25
-
26
- attr_accessor :i2c_repeated_start, :i2c_frequency
27
- alias :i2c_address :address
35
+
36
+ attr_writer :i2c_frequency, :i2c_repeated_start
28
37
 
29
38
  def i2c_write(bytes=[])
30
- bus.write(address, bytes, i2c_frequency, i2c_repeated_start)
39
+ bus.write(i2c_address, bytes, i2c_frequency, i2c_repeated_start)
40
+ end
41
+
42
+ def i2c_read(num_bytes, register: nil)
43
+ bus.read_nb(i2c_address, register, num_bytes, i2c_frequency, i2c_repeated_start)
31
44
  end
32
45
 
33
- def i2c_read(register, num_bytes)
34
- bus._read(address, register, num_bytes, i2c_frequency, i2c_repeated_start)
46
+ def i2c_read_raw(num_bytes, register: nil)
47
+ read_raw -> { bus.read_nb(i2c_address, register, num_bytes, i2c_frequency, i2c_repeated_start)}
35
48
  end
36
49
  end
37
50
  end
data/lib/denko/i2c.rb CHANGED
@@ -1,6 +1,21 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ I2C_FILES = [
4
+ [:BusCommon, "bus_common"],
5
+ [:Bus, "bus"],
6
+ [:BitBang, "bit_bang"],
7
+ [:Peripheral, "peripheral"],
8
+ ]
9
+
1
10
  module Denko
2
11
  module I2C
3
- autoload :Bus, "#{__dir__}/i2c/bus"
4
- autoload :Peripheral, "#{__dir__}/i2c/peripheral"
12
+ I2C_FILES.each do |file|
13
+ file_path = "#{__dir__}/i2c/#{file[1]}"
14
+ if file[0]
15
+ autoload file[0], file_path
16
+ else
17
+ require file_path
18
+ end
19
+ end
5
20
  end
6
21
  end