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
@@ -1,8 +1,13 @@
1
1
  module Denko
2
2
  module Sensor
3
3
  class QMP6988
4
+ include Behaviors::Lifecycle
4
5
  include I2C::Peripheral
5
6
  include Behaviors::Poller
7
+ include TemperatureHelper
8
+ include PressureHelper
9
+
10
+ I2C_ADDRESS = 0x70
6
11
 
7
12
  UPDATE_TIME = 0.020
8
13
  RESET_REGISTER = 0xE0
@@ -64,20 +69,9 @@ module Denko
64
69
  32 => 0b101, # 0b110 and 0b111 are also valid for 16.
65
70
  }
66
71
 
67
- def before_initialize(options={})
68
- @i2c_address = 0x70
69
- super(options)
70
- end
71
-
72
- def after_initialize(options={})
73
- super(options)
74
-
75
- # Avoid repeated memory allocation for callback data and state.
76
- @reading = { temperature: nil, pressure: nil }
77
- self.state = { temperature: nil, pressure: nil }
78
-
72
+ after_initialize do
79
73
  reset
80
-
74
+
81
75
  # Get 5 config registers. Copy 0xF4 to modify it for control.
82
76
  get_config_registers
83
77
  @ctrl_meas_register = @registers[:f4].dup
@@ -95,6 +89,14 @@ module Denko
95
89
  get_calibration_data
96
90
  end
97
91
 
92
+ def state
93
+ @state ||= { temperature: nil, pressure: nil }
94
+ end
95
+
96
+ def reading
97
+ @reading ||= { temperature: nil, pressure: nil }
98
+ end
99
+
98
100
  #
99
101
  # Configuration Methods
100
102
  #
@@ -128,7 +130,7 @@ module Denko
128
130
  sleep UPDATE_TIME
129
131
  end
130
132
  attr_reader :temperature_samples
131
-
133
+
132
134
  def pressure_samples=(factor)
133
135
  raise ArgumentError, "invalid oversampling factor: #{factor}" unless OVERSAMPLE_FACTORS.keys.include? factor
134
136
  @ctrl_meas_register = (@ctrl_meas_register & 0b11100011) | (OVERSAMPLE_FACTORS[factor] << 2)
@@ -162,8 +164,8 @@ module Denko
162
164
 
163
165
  def chip_id
164
166
  return @chip_id if @chip_id
165
- i2c_read(CHIP_ID_REGISTER, 1)
166
- sleep 0.001 while !@chip_id
167
+ bytes = i2c_read_raw(1, register: CHIP_ID_REGISTER)
168
+ @chip_id = bytes[0] if bytes
167
169
  @chip_id
168
170
  end
169
171
 
@@ -176,25 +178,14 @@ module Denko
176
178
  i2c_write [CTRL_MEAS_REGISTER, @ctrl_meas_register]
177
179
  sleep @measurement_time
178
180
  end
179
-
181
+
180
182
  # Read the data bytes.
181
- i2c_read(DATA_REGISTER, DATA_LENGTH)
183
+ i2c_read(DATA_LENGTH, register: DATA_REGISTER)
182
184
  end
183
185
 
184
186
  def pre_callback_filter(bytes)
185
- if bytes.length == DATA_LENGTH
186
- return process_reading(bytes)
187
- elsif bytes.length == CONFIG_LENGTH
188
- process_config(bytes)
189
- elsif bytes.length == CALIBRATION_LENGTH
190
- process_calibration(bytes)
191
- elsif bytes.length == CHIP_ID_LENGTH
192
- @chip_id = bytes[0]
193
- end
194
- return nil
195
- end
187
+ return nil unless bytes.length == DATA_LENGTH
196
188
 
197
- def process_reading(bytes)
198
189
  # Temperature and pressure are 24-bits long each, and need 2^23 subtracted.
199
190
  dt = ((bytes[3] << 16) + (bytes[4] << 8) + bytes[5]) - (0b1 << 23)
200
191
  dp = ((bytes[0] << 16) + (bytes[1] << 8) + bytes[2]) - (0b1 << 23)
@@ -203,10 +194,10 @@ module Denko
203
194
  tr = @calibration[:a0] +
204
195
  @calibration[:a1] * dt +
205
196
  @calibration[:a2] * (dt ** 2)
206
- @reading[:temperature] = tr / 256.0
197
+ reading[:temperature] = tr / 256.0
207
198
 
208
199
  # Compensated pressure calculated in Pascals.
209
- @reading[:pressure] = @calibration[:b00] +
200
+ reading[:pressure] = @calibration[:b00] +
210
201
  @calibration[:bt1] * tr +
211
202
  @calibration[:bp1] * dp +
212
203
  @calibration[:b11] * (tr * dp) +
@@ -217,25 +208,22 @@ module Denko
217
208
  @calibration[:bp3] * (dp ** 3)
218
209
 
219
210
  # Return reading for callbacks.
220
- @reading
211
+ reading
221
212
  end
222
213
 
223
214
  def update_state(reading)
224
- @state_mutex.synchronize do
225
- @state[:temperature] = reading[:temperature]
226
- @state[:pressure] = reading[:pressure]
227
- end
215
+ @state_mutex.lock
216
+ @state[:temperature] = reading[:temperature]
217
+ @state[:pressure] = reading[:pressure]
218
+ @state_mutex.unlock
219
+ @state
228
220
  end
229
221
 
230
222
  def get_config_registers
231
- @registers = {}
232
- i2c_read(IIR_REGISTER, CONFIG_LENGTH)
233
- sleep 0.001 while @registers.empty?
234
- @registers
235
- end
236
-
237
- def process_config(bytes)
238
- @registers = { f1: bytes[0], f2: bytes[1], f3: bytes[2], f4: bytes[3], f5: bytes[4] }
223
+ bytes = i2c_read_raw(CONFIG_LENGTH, register: IIR_REGISTER)
224
+ if bytes
225
+ @registers = { f1: bytes[0], f2: bytes[1], f3: bytes[2], f4: bytes[3], f5: bytes[4] }
226
+ end
239
227
  end
240
228
  attr_reader :registers
241
229
 
@@ -260,10 +248,8 @@ module Denko
260
248
  }
261
249
 
262
250
  def get_calibration_data
263
- i2c_read(CALIBRATION_REGISTER, CALIBRATION_LENGTH)
264
- end
251
+ bytes = i2c_read_raw(CALIBRATION_LENGTH, register: CALIBRATION_REGISTER)
265
252
 
266
- def process_calibration(bytes)
267
253
  if bytes
268
254
  # These 2 values are 20-bit instead of 16-bit, so can't combine them with #pack.
269
255
  a0_unsigned = (bytes[18] << 12) + (bytes[19] << 4) + (bytes[24] & 0b00001111)
@@ -4,15 +4,13 @@ module Denko
4
4
  include I2C::Peripheral
5
5
  include Behaviors::Poller
6
6
 
7
- def before_initialize(options={})
8
- @i2c_address = 0x57
9
- super(options)
10
- end
7
+ I2C_ADDRESS = 0x57
11
8
 
12
9
  def _read
10
+ i2c_write(0x01)
13
11
  i2c_write(0x01)
14
12
  sleep(0.120)
15
- i2c_read(nil, 3)
13
+ i2c_read(3)
16
14
  end
17
15
 
18
16
  def pre_callback_filter(bytes)
@@ -3,6 +3,11 @@ module Denko
3
3
  class SHT3X
4
4
  include I2C::Peripheral
5
5
  include Behaviors::Poller
6
+ include Behaviors::Lifecycle
7
+ include TemperatureHelper
8
+ include HumidityHelper
9
+
10
+ I2C_ADDRESS = 0x44
6
11
 
7
12
  RESET = 0x30A2
8
13
  RESET_TIME = 0.002
@@ -14,27 +19,24 @@ module Denko
14
19
  medium: { lsb: 0x0B, measurement_time: 0.007 },
15
20
  low: { lsb: 0x16, measurement_time: 0.005 },
16
21
  }
17
-
22
+
18
23
  # Unused
19
24
  READ_STATUS_REGISTER = 0xF32D
20
25
  CLEAR_STATUS_REGISTER = 0x3041
21
26
  BREAK = 0x3093
22
27
  ART = 0x2B32
23
28
 
24
- def before_initialize(options={})
25
- @i2c_address = 0x44
26
- super(options)
29
+ after_initialize do
30
+ reset
31
+ self.repeatability = :high
27
32
  end
28
33
 
29
- def after_initialize(options={})
30
- super(options)
31
-
32
- # Avoid repeated memory allocation for callback data and state.
33
- @reading = { temperature: nil, humidity: nil }
34
- self.state = { temperature: nil, humidity: nil }
34
+ def state
35
+ @state ||= { temperature: nil, humidity: nil }
36
+ end
35
37
 
36
- reset
37
- self.repeatability = :high
38
+ def reading
39
+ @reading ||= { temperature: nil, humidity: nil }
38
40
  end
39
41
 
40
42
  def repeatability=(key)
@@ -46,34 +48,35 @@ module Denko
46
48
  def _read
47
49
  i2c_write [0x24, @measurement_lsb]
48
50
  sleep(@measurement_time)
49
- i2c_read(FETCH_DATA, 6)
51
+ i2c_read(6, register: FETCH_DATA)
50
52
  end
51
53
 
52
54
  def pre_callback_filter(bytes)
53
55
  # Temperature is bytes 0 to 2: MSB, LSB, CRC
54
56
  if calculate_crc(bytes[0..2]) == bytes[2]
55
57
  t_raw = (bytes[0] << 8) | bytes[1]
56
- @reading[:temperature] = (175 * t_raw / 65535.0) - 45
58
+ reading[:temperature] = (175 * t_raw / 65535.0) - 45
57
59
  else
58
- @reading[:temperature] = nil
60
+ reading[:temperature] = nil
59
61
  end
60
62
 
61
63
  # Humidity is bytes 3 to 5: MSB, LSB, CRC
62
64
  if calculate_crc(bytes[3..5]) == bytes[5]
63
65
  h_raw = (bytes[3] << 8) | bytes[4]
64
- @reading[:humidity] = 100 * h_raw / 65535.0
66
+ reading[:humidity] = 100 * h_raw / 65535.0
65
67
  else
66
- @reading[:humidity] = nil
68
+ reading[:humidity] = nil
67
69
  end
68
70
 
69
- @reading
71
+ reading
70
72
  end
71
73
 
72
74
  def update_state(reading)
73
- @state_mutex.synchronize do
74
- @state[:temperature] = reading[:temperature]
75
- @state[:humidity] = reading[:humidity]
76
- end
75
+ @state_mutex.lock
76
+ @state[:temperature] = reading[:temperature]
77
+ @state[:humidity] = reading[:humidity]
78
+ @state_mutex.unlock
79
+ @state
77
80
  end
78
81
 
79
82
  def reset
@@ -89,7 +92,7 @@ module Denko
89
92
  def heater_off?
90
93
  !@heater_on
91
94
  end
92
-
95
+
93
96
  def heater_on
94
97
  i2c_write [HEATER_ON]
95
98
  @heater_on = true
@@ -119,7 +122,7 @@ module Denko
119
122
  end
120
123
  end
121
124
  end
122
-
125
+
123
126
  # Limit CRC size to 8 bits.
124
127
  crc = crc & 0xFF
125
128
  end
@@ -0,0 +1,125 @@
1
+ module Denko
2
+ module Sensor
3
+ class SHT4X
4
+ include I2C::Peripheral
5
+ include Behaviors::Poller
6
+ include Behaviors::Lifecycle
7
+ include TemperatureHelper
8
+ include HumidityHelper
9
+
10
+ I2C_ADDRESS = 0x44
11
+
12
+ RESET = 0x94
13
+ RESET_TIME = 0.001
14
+ READ_SERIAL_NUMBER = 0x89
15
+
16
+ REPEATABILITIES = {
17
+ high: {command: 0xFD, time: 0.010},
18
+ medium: {command: 0xF6, time: 0.005},
19
+ low: {command: 0xE0, time: 0.003},
20
+ }
21
+
22
+ after_initialize do
23
+ reset
24
+ self.repeatability = :high
25
+ end
26
+
27
+ def state
28
+ @state ||= { temperature: nil, humidity: nil }
29
+ end
30
+
31
+ def reading
32
+ @reading ||= { temperature: nil, humidity: nil }
33
+ end
34
+
35
+ def repeatability=(key)
36
+ raise ArgumentError, "invalid repeatability setting: #{key}" unless REPEATABILITIES.keys.include? key
37
+ @measurement_command = REPEATABILITIES[key][:command]
38
+ @measurement_time = REPEATABILITIES[key][:time]
39
+ end
40
+
41
+ def _read
42
+ i2c_write [@measurement_command]
43
+ sleep(@measurement_time)
44
+ i2c_read(6)
45
+ end
46
+
47
+ def pre_callback_filter(bytes)
48
+ # Temperature is bytes 0 to 2: MSB, LSB, CRC
49
+ if calculate_crc(bytes[0..2]) == bytes[2]
50
+ t_raw = (bytes[0] << 8) | bytes[1]
51
+ reading[:temperature] = (175 * t_raw / 65535.0) - 45
52
+ else
53
+ reading[:temperature] = nil
54
+ end
55
+
56
+ # Humidity is bytes 3 to 5: MSB, LSB, CRC
57
+ if calculate_crc(bytes[3..5]) == bytes[5]
58
+ h_raw = (bytes[3] << 8) | bytes[4]
59
+ reading[:humidity] = 100 * h_raw / 65535.0
60
+ else
61
+ reading[:humidity] = nil
62
+ end
63
+
64
+ reading
65
+ end
66
+
67
+ def update_state(reading)
68
+ @state_mutex.lock
69
+ @state[:temperature] = reading[:temperature]
70
+ @state[:humidity] = reading[:humidity]
71
+ @state_mutex.unlock
72
+ @state
73
+ end
74
+
75
+ def reset
76
+ i2c_write [RESET]
77
+ sleep RESET_TIME
78
+ end
79
+
80
+ def serial
81
+ @serial ||= read_serial
82
+ end
83
+
84
+ def read_serial
85
+ i2c_write [READ_SERIAL_NUMBER]
86
+ sleep RESET_TIME
87
+ bytes = i2c_read_raw(6)
88
+ parse_serial(bytes)
89
+ end
90
+
91
+ def parse_serial(bytes)
92
+ # Serial bytes are laid out as [b0, b1, crc0+1, b2, b3, crc2+3]
93
+ if calculate_crc(bytes[0..2]) == bytes[2] && calculate_crc(bytes[3..5]) == bytes[5]
94
+ @serial = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[3] << 8) | bytes[4]
95
+ else
96
+ @serial = nil
97
+ end
98
+ end
99
+
100
+ # CRC is same as AHT20 sensor. Copied from that file.
101
+ CRC_INITIAL_VALUE = 0xFF
102
+ CRC_POLYNOMIAL = 0x31
103
+ MSBIT_MASK = 0x80
104
+
105
+ def calculate_crc(bytes)
106
+ crc = CRC_INITIAL_VALUE
107
+
108
+ # Ignore last byte. That's the CRC value to compare with.
109
+ bytes.take(bytes.length - 1).each do |byte|
110
+ crc = crc ^ byte
111
+ 8.times do
112
+ if (crc & MSBIT_MASK) > 0
113
+ crc = (crc << 1) ^ CRC_POLYNOMIAL
114
+ else
115
+ crc = crc << 1
116
+ end
117
+ end
118
+ end
119
+
120
+ # Limit CRC size to 8 bits.
121
+ crc = crc & 0xFF
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,58 @@
1
+ module Denko
2
+ module Sensor
3
+ class VL53L0X
4
+ include I2C::Peripheral
5
+ include Behaviors::Poller
6
+ include Behaviors::Lifecycle
7
+ include Denko::AnalogIO::InputHelper
8
+
9
+ I2C_ADDRESS = 0x29
10
+
11
+ REFERENCE_REGISTER_START = 0xC0
12
+ REFERENCE_VALUES = [0xEE, 0xAA, 0x10]
13
+
14
+ SYSRANGE_START = 0x00
15
+ POWER_MANAGEMENT_GO1_POWER_FORCE = 0x80
16
+ INTERNAL_TUNING_1 = 0x91
17
+ INTERNAL_TUNING_2 = 0xFF
18
+ RESULT_RANGE_STATUS = 0x14
19
+
20
+ attr_reader :stop_variable
21
+ attr_accessor :correction_offset
22
+
23
+ after_initialize do
24
+ # Verify reference registerrs
25
+ reference_regs = i2c_read_raw(REFERENCE_VALUES.length, register: REFERENCE_REGISTER_START)
26
+ raise "reference registers do not match. May not be VL53L0X" unless reference_regs == REFERENCE_VALUES
27
+
28
+ # Initialization sequence
29
+ @stop_variable = i2c_read_raw(1, register: INTERNAL_TUNING_1)[0]
30
+ i2c_write [POWER_MANAGEMENT_GO1_POWER_FORCE, 0x01]
31
+ i2c_write [INTERNAL_TUNING_2, 0x01]
32
+ i2c_write [SYSRANGE_START, 0x00]
33
+ i2c_write [INTERNAL_TUNING_1, stop_variable]
34
+ i2c_write [SYSRANGE_START, 0x01]
35
+ i2c_write [INTERNAL_TUNING_2, 0x00]
36
+ i2c_write [POWER_MANAGEMENT_GO1_POWER_FORCE, 0x00]
37
+
38
+ # Wait for initialization to complete.
39
+ sleep 0.010 while (i2c_read_raw(1, register: SYSRANGE_START)[0] & 0b01 > 0)
40
+
41
+ # Go into continuous mode.
42
+ i2c_write [SYSRANGE_START, 0x02]
43
+ end
44
+
45
+ def _read
46
+ i2c_read(2, register: RESULT_RANGE_STATUS + 10)
47
+ end
48
+
49
+ def pre_callback_filter(bytes)
50
+ # Distance is 2 bytes, big-endian.
51
+ mm = (bytes[0] << 8) | bytes[1]
52
+ mm = mm + correction_offset if correction_offset
53
+ # super handles smoothing if enabled.
54
+ return (mm > 0) ? super(mm) : nil
55
+ end
56
+ end
57
+ end
58
+ end
data/lib/denko/sensor.rb CHANGED
@@ -1,20 +1,37 @@
1
+ # Represent files to be autoloaded in CRuby as an Array.
2
+ # This allows Mruby::Build to parse and preload them instead.
3
+ SENSOR_FILES = [
4
+ [nil, "helper"],
5
+ [:DHT, "dht"],
6
+ [:DS18B20, "ds18b20"],
7
+ [:BMP180, "bmp180"],
8
+ [:BME280, "bme280"],
9
+ [:BMP280, "bme280"],
10
+ [:HDC1080, "hdc1080"],
11
+ [:HTU21D, "htu21d"],
12
+ [:HTU31D, "htu31d"],
13
+ [:AHT1X, "aht"],
14
+ [:AHT2X, "aht"],
15
+ [:AHT3X, "aht"],
16
+ [:SHT3X, "sht3x"],
17
+ [:SHT4X, "sht4x"],
18
+ [:QMP6988, "qmp6988"],
19
+ [:RCWL9620, "rcwl9620"],
20
+ [:HCSR04, "hcsr04"],
21
+ [:JSNSR04T, "jsnsr04t"],
22
+ [:GenericPIR, "generic_pir"],
23
+ [:VL53L0X, "vl53l0x"],
24
+ ]
25
+
1
26
  module Denko
2
27
  module Sensor
3
- autoload :Temperature, "#{__dir__}/sensor/virtual"
4
- autoload :Humidity, "#{__dir__}/sensor/virtual"
5
- autoload :DHT, "#{__dir__}/sensor/dht"
6
- autoload :DS18B20, "#{__dir__}/sensor/ds18b20"
7
- autoload :BMP180, "#{__dir__}/sensor/bmp180"
8
- autoload :BME280, "#{__dir__}/sensor/bme280"
9
- autoload :BMP280, "#{__dir__}/sensor/bme280"
10
- autoload :HTU21D, "#{__dir__}/sensor/htu21d"
11
- autoload :HTU31D, "#{__dir__}/sensor/htu31d"
12
- autoload :AHT10, "#{__dir__}/sensor/aht"
13
- autoload :AHT20, "#{__dir__}/sensor/aht"
14
- autoload :SHT3X, "#{__dir__}/sensor/sht3x"
15
- autoload :QMP6988, "#{__dir__}/sensor/qmp6988"
16
- autoload :RCWL9620, "#{__dir__}/sensor/rcwl9620"
17
- autoload :HCSR04, "#{__dir__}/sensor/hcsr04"
18
- autoload :GenericPIR, "#{__dir__}/sensor/generic_pir"
28
+ SENSOR_FILES.each do |file|
29
+ file_path = "#{__dir__}/sensor/#{file[1]}"
30
+ if file[0]
31
+ autoload file[0], file_path
32
+ else
33
+ require file_path
34
+ end
35
+ end
19
36
  end
20
37
  end
@@ -1,37 +1,41 @@
1
1
  module Denko
2
2
  module SPI
3
3
  class BaseRegister
4
- include Peripheral
4
+ include SPI::Peripheral
5
+ include Behaviors::Lifecycle
5
6
  #
6
- # Registers act as a Board for components that need only digital pins in
7
- # in their I/O direction. Give the register as a 'board' when initializing a
8
- # new component, and pin numbers that map onto the registers parallel output pins.
7
+ # Registers can be a BoardProxy for components needing digital pins.
8
+ # Give the Register as board: and pin: is the Register's parallel pin number.
9
9
  #
10
10
  include Behaviors::BoardProxy
11
11
 
12
- attr_reader :bytes
12
+ def platform
13
+ :spi_register
14
+ end
13
15
 
14
- def before_initialize(options={})
15
- super(options)
16
- #
17
- # To use the register as a board proxy, we need to know how many
18
- # bytes there are and map each bit to a virtual pin.
19
- # Defaults to 1 byte. Ignore if writing to the register directly.
20
- #
21
- @bytes = options[:bytes] || 1
22
- #
23
- # When used as a board proxy, store the state of each register
24
- # pin as a 0 or 1 in an array that is (@bytes * 8) long. Zero out to start.
25
- #
26
- @state = Array.new(@bytes*8) { 0 }
16
+ def is_a_register?
17
+ true
27
18
  end
28
19
 
29
- def after_initialize(options={})
30
- super(options)
20
+ # Default registers to 1 byte, or 8 pins when used as Board Proxy.
21
+ # Can be ignored if reading / writing the register directly.
22
+ def bytes
23
+ @bytes = params[:bytes] || 1
24
+ end
25
+ attr_writer :bytes
31
26
 
32
- # Drive select pin high by default.
27
+ # Select pin is active-low. Disable.
28
+ after_initialize do
33
29
  self.high
34
30
  end
31
+
32
+ #
33
+ # When used as BoardProxy, store the state of each register
34
+ # pin as a 0 or 1 in an array that is (@bytes * 8) long.
35
+ #
36
+ def state
37
+ @state ||= Array.new(bytes*8) { 0 }
38
+ end
35
39
  end
36
40
  end
37
41
  end
@@ -2,28 +2,28 @@ module Denko
2
2
  module SPI
3
3
  class BitBang
4
4
  include Behaviors::MultiPin
5
- include Behaviors::BusController
6
- include Behaviors::Reader
5
+ include Behaviors::Lifecycle
6
+ include BusCommon
7
7
 
8
- def initialize_pins(options={})
8
+ before_initialize do
9
+ param_pins = params[:pins]
9
10
  # Allow pin aliases.
10
- pins[:input] = pins[:input] || pins[:poci] || pins[:miso]
11
- pins[:output] = pins[:output] || pins[:pico] || pins[:mosi]
12
- pins[:clock] = pins[:clock] || pins[:sck] || pins[:clk]
13
-
14
- # Clean up the pins hash.
15
- [:poci, :miso, :pico, :mosi, :sck, :clk].each { |key| pins.delete(key) }
11
+ param_pins[:input] = param_pins[:input] || param_pins[:poci] || param_pins[:miso]
12
+ param_pins[:output] = param_pins[:output] || param_pins[:pico] || param_pins[:mosi]
13
+ param_pins[:clock] = param_pins[:clock] || param_pins[:sck] || param_pins[:clk]
16
14
 
17
- # Validate input or output pin.
18
- unless pins[:input] || pins[:output]
19
- raise ArgumentError, "no input or output pin given. Require either or both"
20
- end
15
+ # Clean up the params hash.
16
+ [:poci, :miso, :pico, :mosi, :sck, :clk].each { |key| param_pins.delete(key) }
21
17
 
22
- # If only output or input, set the other 255 for a one-directional bus.
23
- pins[:input] = 255 if pins[:output] && !pins[:input]
24
- pins[:output] = 255 if pins[:input] && !pins[:output]
18
+ # Validate param_pins.
19
+ raise ArgumentError, "either output or input pin required" unless param_pins[:input] || param_pins[:output]
20
+ raise ArgumentError, "clock pin required" unless param_pins[:clock]
21
+ end
25
22
 
26
- require_pins(:clock, :input, :output)
23
+ def initialize_pins(options={})
24
+ proxy_pin :clock, DigitalIO::CBitBang
25
+ proxy_pin :output, DigitalIO::CBitBang if pins[:output]
26
+ proxy_pin :input, DigitalIO::CBitBang if pins[:input]
27
27
  end
28
28
 
29
29
  def transfer(select_pin, write: [], read: 0, frequency: nil, mode: 0, bit_order: :msbfirst)
@@ -35,40 +35,6 @@ module Denko
35
35
  board.spi_bb_listen select_pin, clock: pins[:clock], input: pins[:input],
36
36
  read: read, mode: mode, bit_order: bit_order
37
37
  end
38
-
39
- # Uses regular Board#spi_stop since listeners are shared.
40
- def stop(pin)
41
- board.spi_stop(pin)
42
- end
43
-
44
- # Delegate this to board so peripherals can initialize their select pins.
45
- def set_pin_mode(*args)
46
- board.set_pin_mode(*args)
47
- end
48
-
49
- def convert_pin(pin)
50
- board.convert_pin(pin)
51
- end
52
-
53
- # Add peripheral to self and the board. It gets callbacks directly from the board.
54
- def add_component(component)
55
- # Treat pin 255 as the component having no select pin. Mostly for APA102.
56
- return if component.pin == 255
57
-
58
- pins = components.map { |c| c.pin }
59
- if pins.include? component.pin
60
- raise ArgumentError, "duplicate select pin for #{component}"
61
- end
62
-
63
- components << component
64
- board.add_component(component)
65
- end
66
-
67
- # Remove peripheral from self and the board.
68
- def remove_component(component)
69
- components.delete(component)
70
- board.remove_component(component)
71
- end
72
38
  end
73
39
  end
74
40
  end