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
@@ -44,17 +44,14 @@ module Denko
44
44
  def parse_search_result(result)
45
45
  address, complement = split_search_result(result)
46
46
 
47
- if (address & complement) > 0
48
- raise "OneWire device not connected or disconnected during search"
49
- end
50
-
47
+ raise "OneWire device not connected, or disconnected during search" if (address & complement) > 0
51
48
  raise "CRC error during OneWire search" unless Helper.crc(address)
52
49
 
53
50
  # Gives 0 at every discrepancy we didn't write 1 for on this search.
54
51
  new_discrepancies = address ^ complement
55
52
 
56
53
  high_discrepancy = -1
57
- (0..63).each { |i| high_discrepancy = i if new_discrepancies[i] == 0 }
54
+ (0..63).each { |i| high_discrepancy = i if ((new_discrepancies >> i) & 0b1 == 0) }
58
55
 
59
56
  # LSByte of address is product family.
60
57
  klass = family_lookup(address & 0xFF)
@@ -64,27 +61,41 @@ module Denko
64
61
 
65
62
  # Result is 16 bytes, 8 byte address and complement interleaved LSByte first.
66
63
  def split_search_result(data)
67
- address = 0
64
+ address = 0
68
65
  complement = 0
69
-
70
66
  data.reverse.each_slice(2) do |comp_byte, addr_byte|
71
- address = (address << 8) | addr_byte
67
+ address = (address << 8) | addr_byte
72
68
  complement = (complement << 8) | comp_byte
73
69
  end
74
-
75
70
  [address, complement]
76
71
  end
77
72
 
78
- #
79
- # Set FAMILY_CODE in peripheral class, and add the class to this array
80
- # for the class to be identified during search.
73
+ #
74
+ # Set FAMILY_CODE in peripheral class, then add the peripheral class
75
+ # to this array (as a String, since no autoloading on mruby).
76
+ # The class can then be identified during a bus search.
81
77
  #
82
78
  PERIPHERAL_CLASSES = [
83
- Sensor::DS18B20,
79
+ "Denko::Sensor::DS18B20",
84
80
  ]
85
81
 
82
+ def peripheral_classes
83
+ return @peripheral_classes if @peripheral_classes
84
+
85
+ @peripheral_classes = []
86
+ PERIPHERAL_CLASSES.each do |class_name|
87
+ begin
88
+ klass = Object.const_get(class_name)
89
+ rescue
90
+ next
91
+ end
92
+ @peripheral_classes << klass
93
+ end
94
+ @peripheral_classes
95
+ end
96
+
86
97
  def family_lookup(family_code)
87
- PERIPHERAL_CLASSES.each do |klass|
98
+ peripheral_classes.each do |klass|
88
99
  if (klass.const_defined? "FAMILY_CODE")
89
100
  return klass if klass::FAMILY_CODE == family_code
90
101
  end
@@ -2,7 +2,9 @@ module Denko
2
2
  module OneWire
3
3
  class Helper
4
4
  def self.address_to_bytes(address)
5
- [address].pack('Q<').split("").map(&:ord)
5
+ bytes = []
6
+ 8.times { |i| bytes[i] = address >> (8*i) & 0xFF }
7
+ bytes
6
8
  end
7
9
 
8
10
  def self.crc(data)
@@ -20,7 +22,7 @@ module Denko
20
22
  crc = 0b00000000
21
23
  bytes.take(bytes.length - 1).each do |byte|
22
24
  for bit in (0..7)
23
- xor = byte[bit] ^ crc[0]
25
+ xor = ((byte >> bit) & 0b1) ^ (crc & 0b1)
24
26
  crc = crc ^ ((xor * (2 ** 3)) | (xor * (2 ** 4)))
25
27
  crc = crc >> 1
26
28
  crc = crc | (xor * (2 ** 7))
@@ -5,9 +5,6 @@ module Denko
5
5
  include Behaviors::Poller
6
6
  include Constants
7
7
 
8
- attr_reader :address
9
- alias :bus :board
10
-
11
8
  def read_scratch(num_bytes, &block)
12
9
  atomically do
13
10
  bus.add_callback(:read, &block) if block_given?
@@ -1,9 +1,22 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ ONE_WIRE_FILES = [
4
+ [:Constants, "constants"],
5
+ [:Helper, "helper"],
6
+ [:BusEnumerator, "bus_enumerator"],
7
+ [:Bus, "bus"],
8
+ [:Peripheral, "peripheral"],
9
+ ]
10
+
1
11
  module Denko
2
12
  module OneWire
3
- autoload :Constants, "#{__dir__}/one_wire/constants"
4
- autoload :Helper, "#{__dir__}/one_wire/helper"
5
- autoload :BusEnumerator, "#{__dir__}/one_wire/bus_enumerator"
6
- autoload :Bus, "#{__dir__}/one_wire/bus"
7
- autoload :Peripheral, "#{__dir__}/one_wire/peripheral"
13
+ ONE_WIRE_FILES.each do |file|
14
+ file_path = "#{__dir__}/one_wire/#{file[1]}"
15
+ if file[0]
16
+ autoload file[0], file_path
17
+ else
18
+ require file_path
19
+ end
20
+ end
8
21
  end
9
22
  end
@@ -1,8 +1,14 @@
1
1
  module Denko
2
2
  module PulseIO
3
3
  class Buzzer < PWMOutput
4
- def after_initialize(options={})
5
- low
4
+ include Behaviors::Lifecycle
5
+
6
+ before_initialize do
7
+ params[:mode] ||= :output_pwm
8
+ end
9
+
10
+ after_initialize do
11
+ board.no_tone(pin)
6
12
  end
7
13
 
8
14
  # Duration is in mills
@@ -13,13 +19,9 @@ module Denko
13
19
  def no_tone
14
20
  board.no_tone(pin)
15
21
  end
16
-
17
- # Kill the thread if running, and send no_tone.
18
- def stop
19
- stop_thread
20
- board.no_tone(pin)
21
- end
22
- alias :off :stop
22
+
23
+ alias :stop :no_tone
24
+ alias :off :no_tone
23
25
  end
24
26
  end
25
27
  end
@@ -1,11 +1,12 @@
1
1
  module Denko
2
2
  module PulseIO
3
- class IRTransmitter
4
- include Behaviors::OutputPin
3
+ class IROutput
4
+ include Behaviors::SinglePin
5
+ include Behaviors::Lifecycle
5
6
 
6
- def emit(pulses=[], frequency: 38)
7
- if pulses.length > 256 || pulses.length < 1
8
- raise ArgumentError, 'wrong number of IR pulses (expected 1 to 256)'
7
+ def write(pulses=[], frequency: 38)
8
+ if pulses.length > 255 || pulses.length < 1
9
+ raise ArgumentError, 'wrong number of IR pulses (expected 1 to 255)'
9
10
  end
10
11
 
11
12
  pulses.each_with_index do |pulse, index|
@@ -1,33 +1,112 @@
1
1
  module Denko
2
2
  module PulseIO
3
3
  class PWMOutput < DigitalIO::Output
4
- interrupt_with :write
5
-
6
- def initialize_pins(options={})
7
- super(options)
4
+ include Behaviors::Lifecycle
5
+
6
+ interrupt_with :write, :pwm_write, :digital_write, :duty=
7
+
8
+ # Avoid setting :output mode if on PWM pin, and on a platform that muxes externally.
9
+ before_initialize do
10
+ b = params[:board]
11
+ p = params[:pin]
12
+ params[:mode] = :output_pwm if b.platform != :arduino && b.pin_is_pwm?(p)
13
+ end
14
+
15
+ # Call #pwm_enable immediately if params[:mode] was overriden to :output_pwm.
16
+ after_initialize do
17
+ pwm_enable if params[:mode] == :output_pwm
18
+ end
19
+
20
+ def duty=(percent)
21
+ if board.platform == :arduino
22
+ pwm_write((percent / 100.0 * pwm_high).round)
23
+ else
24
+ pwm_write((percent / 100.0 * period).round)
25
+ end
8
26
  end
9
27
 
10
- def write(value)
11
- if value == board.low
12
- digital_write(board.low)
13
- elsif value == board.pwm_high
14
- digital_write(board.high)
28
+ def digital_write(value)
29
+ # Use regular #digital_write for speed until a PWM method is called.
30
+ unless pwm_enabled?
31
+ super(value)
15
32
  else
16
- pwm_write(value)
33
+ # On Arduinos, disable PWM and switch back to regular #digital_write.
34
+ if board.platform == :arduino
35
+ pwm_disable
36
+ super(value)
37
+ # Can't do that on Linux, so mimic DigitalIO.
38
+ else
39
+ if value == 1
40
+ pwm_write(period)
41
+ else
42
+ pwm_write(0)
43
+ end
44
+ end
17
45
  end
18
46
  end
19
47
 
48
+ # Raw write. Takes nanoseconds on Linux, 0..pwm_high on Arduino.
20
49
  def pwm_write(value)
50
+ pwm_enable unless pwm_enabled?
51
+ board.pwm_write(pin, value)
52
+ self.state = value
53
+ end
54
+ alias :write :pwm_write
55
+
56
+ def frequency
57
+ @frequency ||= params[:frequency] || 1000
58
+ end
59
+
60
+ def period
61
+ @period ||= (1_000_000_000.0 / frequency).round
62
+ end
63
+
64
+ def resolution
65
+ @resolution ||= params[:resolution] || board.analog_write_resolution
66
+ end
67
+
68
+ def pwm_high
69
+ @pwm_high ||= (2**resolution-1)
70
+ end
71
+
72
+ def _frequency=(value)
73
+ @frequency = value
74
+ @period = nil
75
+ end
76
+
77
+ def _resolution=(value)
78
+ @resolution = value
79
+ @pwm_high = nil
80
+ end
81
+
82
+ def frequency=(value)
83
+ self._frequency = value
21
84
  pwm_enable
22
- board.pwm_write(pin, @state = value)
23
85
  end
24
86
 
25
- def pwm_enable
26
- self.mode = :output_pwm unless mode == :output_pwm
87
+ def resolution=(value)
88
+ self._resolution = value
89
+ pwm_enable
27
90
  end
28
-
91
+
92
+ def pwm_settings_hash
93
+ { frequency: frequency, period: period, resolution: resolution }
94
+ end
95
+
96
+ def pwm_enable(frequency: nil, resolution: nil)
97
+ self._frequency = frequency if frequency
98
+ self._resolution = resolution if resolution
99
+
100
+ board.set_pin_mode(pin, :output_pwm, pwm_settings_hash)
101
+ @mode = :output_pwm
102
+ end
103
+
29
104
  def pwm_disable
30
- self.mode = :output
105
+ self.mode = :output if board.platform == :arduino
106
+ end
107
+
108
+ def pwm_enabled?
109
+ self.mode == :output_pwm
31
110
  end
32
111
  end
33
112
  end
@@ -1,7 +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
+ PULSE_IO_FILES = [
4
+ # Pin and component setup stuff
5
+ [:PWMOutput, "pwm_output"],
6
+ [:Buzzer, "buzzer"],
7
+ [:IROutput, "ir_output"],
8
+ ]
9
+
1
10
  module Denko
2
11
  module PulseIO
3
- autoload :PWMOutput, "#{__dir__}/pulse_io/pwm_output"
4
- autoload :Buzzer, "#{__dir__}/pulse_io/buzzer"
5
- autoload :IRTransmitter, "#{__dir__}/pulse_io/ir_transmitter"
12
+ PULSE_IO_FILES.each do |file|
13
+ file_path = "#{__dir__}/pulse_io/#{file[1]}"
14
+ if file[0]
15
+ autoload file[0], file_path
16
+ else
17
+ require file_path
18
+ end
19
+ end
6
20
  end
7
21
  end
@@ -2,42 +2,41 @@ module Denko
2
2
  module RTC
3
3
  class DS3231
4
4
  include I2C::Peripheral
5
- require 'bcd'
6
5
 
7
- def before_initialize(options={})
8
- @i2c_address = 0x68
9
- super(options)
10
- end
11
-
6
+ I2C_ADDRESS = 0x68
7
+
12
8
  # Write start register 0x00, then bytes to set time.
13
9
  def time=(time)
14
- i2c_write [0, time_to_bcd(time)]
10
+ i2c_write [0] + time_to_bcd(time)
15
11
  time
16
12
  end
17
-
13
+
18
14
  # Do a blocking read when #time is called.
19
15
  alias :time :read
20
-
16
+
21
17
  # Time data starts at register 0 and is 7 bytes long.
22
18
  def _read
23
- i2c_read(0, 7)
19
+ i2c_read(7, register: 0)
24
20
  end
25
-
21
+
26
22
  def pre_callback_filter(bytes)
27
23
  bcd_to_time(bytes)
28
24
  end
29
-
25
+
30
26
  # Convert Time object to 7 byte BCD sequence.
31
27
  def time_to_bcd(time)
28
+ wday = time.wday
29
+ wday = 7 if wday == 0
30
+
32
31
  [ BCD.decode(time.sec),
33
32
  BCD.decode(time.min),
34
33
  BCD.decode(time.hour),
35
- BCD.decode(time.strftime('%u').to_i),
34
+ BCD.decode(wday),
36
35
  BCD.decode(time.day),
37
36
  BCD.decode(time.month),
38
37
  BCD.decode(time.year - 1970) ]
39
38
  end
40
-
39
+
41
40
  # Convert 7 byte BCD sequence to Time object.
42
41
  def bcd_to_time(bytes)
43
42
  t = bytes.map { |b| BCD.encode(b) }
data/lib/denko/rtc.rb CHANGED
@@ -1,5 +1,18 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ RTC_FILES = [
4
+ [:DS3231, "ds3231"],
5
+ ]
6
+
1
7
  module Denko
2
8
  module RTC
3
- autoload :DS3231, "#{__dir__}/rtc/ds3231"
9
+ RTC_FILES.each do |file|
10
+ file_path = "#{__dir__}/rtc/#{file[1]}"
11
+ if file[0]
12
+ autoload file[0], file_path
13
+ else
14
+ require file_path
15
+ end
16
+ end
4
17
  end
5
18
  end
@@ -1,11 +1,15 @@
1
1
  module Denko
2
2
  module Sensor
3
- class AHT10
3
+ class AHT1X
4
4
  include I2C::Peripheral
5
5
  include Behaviors::Poller
6
+ include Behaviors::Lifecycle
7
+ include TemperatureHelper
8
+
9
+ I2C_ADDRESS = 0x38
6
10
 
7
11
  # Commands
8
- INIT_AND_CALIBRATE = [0xE1, 0x08, 0x00]
12
+ INIT_AND_CALIBRATE = [0xE1, 0x08, 0x00]
9
13
  READ_STATUS_REGISTER = [0x71]
10
14
  START_MEASUREMENT = [0xAC, 0x33, 0x00]
11
15
  SOFT_RESET = [0xBA]
@@ -28,24 +32,21 @@ module Denko
28
32
  # Number of bytes in each reading.
29
33
  DATA_LENGTH = 6
30
34
 
31
- def before_initialize(options={})
32
- @i2c_address = 0x38
33
- super(options)
34
- end
35
-
36
- def after_initialize(options={})
37
- super(options)
38
-
39
- # Avoid repeated memory allocation for callback data and state.
40
- @reading = { temperature: nil, humidity: nil }
41
- self.state = { temperature: nil, humidity: nil }
35
+ after_initialize do
42
36
  @status_register = 0x00
43
-
44
37
  sleep(self.class::POWER_ON_DELAY)
45
38
  reset
46
39
  calibrate
47
40
  end
48
41
 
42
+ def state
43
+ @state ||= { temperature: nil, humidity: nil }
44
+ end
45
+
46
+ def reading
47
+ @reading ||= { temperature: nil, humidity: nil }
48
+ end
49
+
49
50
  def reset
50
51
  i2c_write(SOFT_RESET)
51
52
  sleep(RESET_DELAY)
@@ -68,58 +69,48 @@ module Denko
68
69
  end
69
70
 
70
71
  def read_status_register
71
- read_using -> { i2c_read(READ_STATUS_REGISTER, 1) }
72
+ bytes = i2c_read_raw(1, register: READ_STATUS_REGISTER)
73
+ @status_register = bytes[0] if bytes
72
74
  sleep(COMMAND_DELAY)
73
75
  end
74
76
 
75
77
  def _read
76
78
  i2c_write(START_MEASUREMENT)
77
79
  sleep(MEASURE_DELAY)
78
- i2c_read(nil, self.class::DATA_LENGTH)
80
+ i2c_read(self.class::DATA_LENGTH)
79
81
  end
80
82
 
81
83
  def pre_callback_filter(bytes)
82
- # Handle reading status byte only.
83
- if bytes.length == 1
84
- @status_register = bytes[0]
85
- return nil
86
- end
87
-
88
84
  # Normal readings are 6 bytes given as:
89
85
  # [STATUS, H19-H12, H11-H4, H3-H0+T19-T16, T15-T8, T7-T0]
90
86
  @status_register = bytes[0]
91
87
 
92
88
  # Humidity uses the upper 4 bits of the shared byte as its lowest 4 bits.
93
89
  h_raw = ((bytes[1] << 16) | (bytes[2] << 8) | (bytes[3])) >> 4
94
- @reading[:humidity] = (h_raw.to_f / 2**20) * 100
90
+ reading[:humidity] = (h_raw.to_f / 2**20) * 100
95
91
 
96
92
  # Temperature uses the lower 4 bits of the shared byte as its highest 4 bits.
97
93
  t_raw = ((bytes[3] & 0x0F) << 16) | (bytes[4] << 8) | bytes[5]
98
- @reading[:temperature] = (t_raw.to_f / 2**20) * 200 - 50
94
+ reading[:temperature] = (t_raw.to_f / 2**20) * 200 - 50
99
95
 
100
- @reading
96
+ reading
101
97
  end
102
98
 
103
99
  def update_state(reading)
104
- @state_mutex.synchronize do
105
- @state[:temperature] = reading[:temperature]
106
- @state[:humidity] = reading[:humidity]
107
- end
100
+ @state_mutex.lock
101
+ @state[:temperature] = reading[:temperature]
102
+ @state[:humidity] = reading[:humidity]
103
+ @state_mutex.unlock
104
+ @state
108
105
  end
109
106
  end
110
- end
111
- end
112
107
 
113
- module Denko
114
- module Sensor
115
- class AHT20 < AHT10
116
- include I2C::Peripheral
117
- include Behaviors::Poller
108
+ class AHT2X < AHT1X
118
109
  #
119
110
  # Changed constants compared to AHT10. Always access with self.class::CONSTANT_NAME
120
111
  # in shared methods coming from the superclass.
121
112
  #
122
- INIT_AND_CALIBRATE = [0xBE, 0x08, 0x00]
113
+ INIT_AND_CALIBRATE = [0xBE, 0x08, 0x00]
123
114
  POWER_ON_DELAY = 0.100
124
115
  DATA_LENGTH = 7
125
116
 
@@ -156,10 +147,16 @@ module Denko
156
147
  end
157
148
  end
158
149
  end
159
-
150
+
160
151
  # Limit CRC size to 8 bits.
161
152
  crc = crc & 0xFF
162
153
  end
163
154
  end
155
+
156
+ #
157
+ # AHT3X and AHT2X have different specs, but work the same.
158
+ #
159
+ class AHT3X < AHT2X
160
+ end
164
161
  end
165
162
  end