denko 0.14.0 → 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 (344) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build_atmega_avr.yml +2 -1
  3. data/.github/workflows/build_atmega_megaavr.yml +2 -1
  4. data/.github/workflows/build_atsam3x.yml +1 -0
  5. data/.github/workflows/build_atsamd21.yml +2 -1
  6. data/.github/workflows/build_esp32.yml +4 -2
  7. data/.github/workflows/build_esp32c3.yml +4 -3
  8. data/.github/workflows/build_esp32c6.yml +4 -2
  9. data/.github/workflows/build_esp32h2.yml +4 -2
  10. data/.github/workflows/build_esp32s2.yml +4 -2
  11. data/.github/workflows/build_esp32s3.yml +4 -2
  12. data/.github/workflows/build_esp8266.yml +2 -1
  13. data/.github/workflows/build_ra4m1.yml +1 -0
  14. data/.github/workflows/build_rp2040.yml +4 -3
  15. data/.github/workflows/ruby.yml +1 -1
  16. data/CHANGELOG.md +203 -0
  17. data/DEPS_CLI.md +16 -16
  18. data/DEPS_IDE.md +31 -30
  19. data/MICROCONTROLLERS.md +103 -0
  20. data/PERIPHERALS.md +178 -0
  21. data/README.md +28 -21
  22. data/denko.gemspec +6 -1
  23. data/lib/denko/analog_io/ads1118.rb +5 -5
  24. data/lib/denko/analog_io/ads111x.rb +23 -19
  25. data/lib/denko/analog_io/joystick.rb +87 -0
  26. data/lib/denko/analog_io/potentiometer.rb +1 -5
  27. data/lib/denko/analog_io.rb +22 -8
  28. data/lib/denko/behaviors/bus_controller.rb +2 -1
  29. data/lib/denko/behaviors/bus_peripheral.rb +1 -1
  30. data/lib/denko/behaviors/callbacks.rb +18 -16
  31. data/lib/denko/behaviors/component.rb +0 -4
  32. data/lib/denko/behaviors/lifecycle.rb +1 -1
  33. data/lib/denko/behaviors/listener.rb +9 -3
  34. data/lib/denko/behaviors/multi_pin.rb +4 -6
  35. data/lib/denko/behaviors/poller.rb +11 -2
  36. data/lib/denko/behaviors/reader.rb +109 -21
  37. data/lib/denko/behaviors/single_pin.rb +2 -4
  38. data/lib/denko/behaviors/state.rb +18 -13
  39. data/lib/denko/behaviors/threaded.rb +19 -8
  40. data/lib/denko/behaviors.rb +36 -23
  41. data/lib/denko/board/eeprom.rb +1 -1
  42. data/lib/denko/board/i2c.rb +1 -1
  43. data/lib/denko/board/i2c_bit_bang.rb +9 -5
  44. data/lib/denko/board/map.rb +6 -2
  45. data/lib/denko/board/one_wire.rb +3 -3
  46. data/lib/denko/board/spi.rb +30 -30
  47. data/lib/denko/board/spi_bit_bang.rb +8 -11
  48. data/lib/denko/board.rb +6 -3
  49. data/lib/denko/connection/flow_control.rb +1 -1
  50. data/lib/denko/connection/serial.rb +5 -5
  51. data/lib/denko/digital_io/output.rb +12 -4
  52. data/lib/denko/digital_io/pcf8574.rb +114 -0
  53. data/lib/denko/digital_io/rotary_encoder.rb +10 -6
  54. data/lib/denko/digital_io.rb +24 -6
  55. data/lib/denko/display/canvas.rb +350 -157
  56. data/lib/denko/display/font/bmp_5x7.rb +142 -0
  57. data/lib/denko/display/font/bmp_6x8.rb +142 -0
  58. data/lib/denko/display/font/bmp_8x16.rb +141 -0
  59. data/lib/denko/display/font.rb +22 -0
  60. data/lib/denko/display/hd44780.rb +24 -20
  61. data/lib/denko/display/il0373.rb +186 -0
  62. data/lib/denko/display/mono_oled.rb +193 -0
  63. data/lib/denko/display/pcd8544.rb +154 -0
  64. data/lib/denko/display/pixel_common.rb +83 -0
  65. data/lib/denko/display/sh1106.rb +17 -21
  66. data/lib/denko/display/sh1107.rb +10 -0
  67. data/lib/denko/display/spi_common.rb +35 -0
  68. data/lib/denko/display/spi_epaper_common.rb +30 -0
  69. data/lib/denko/display/ssd1306.rb +6 -228
  70. data/lib/denko/display/ssd1680.rb +14 -0
  71. data/lib/denko/display/ssd1681.rb +8 -0
  72. data/lib/denko/display/ssd168x.rb +227 -0
  73. data/lib/denko/display/st7302.rb +207 -0
  74. data/lib/denko/display/st7565.rb +166 -0
  75. data/lib/denko/display.rb +40 -4
  76. data/lib/denko/eeprom/at24c.rb +67 -0
  77. data/lib/denko/eeprom/board.rb +69 -0
  78. data/lib/denko/eeprom.rb +15 -1
  79. data/lib/denko/helpers/engine_check.rb +13 -0
  80. data/lib/denko/{mutex_stub.rb → helpers/mutex_stub.rb} +6 -0
  81. data/lib/denko/helpers.rb +6 -0
  82. data/lib/denko/i2c/bit_bang.rb +1 -0
  83. data/lib/denko/i2c/bus_common.rb +9 -4
  84. data/lib/denko/i2c/peripheral.rb +5 -1
  85. data/lib/denko/i2c.rb +17 -4
  86. data/lib/denko/led/apa102.rb +1 -3
  87. data/lib/denko/led/base.rb +5 -0
  88. data/lib/denko/led/rgb.rb +16 -10
  89. data/lib/denko/led/seven_segment.rb +1 -1
  90. data/lib/denko/led.rb +17 -8
  91. data/lib/denko/motor/{stepper.rb → a3967.rb} +1 -1
  92. data/lib/denko/motor/servo.rb +16 -6
  93. data/lib/denko/motor.rb +16 -3
  94. data/lib/denko/one_wire/bus.rb +20 -16
  95. data/lib/denko/one_wire/bus_enumerator.rb +25 -14
  96. data/lib/denko/one_wire/helper.rb +4 -2
  97. data/lib/denko/one_wire.rb +18 -5
  98. data/lib/denko/pulse_io/buzzer.rb +2 -6
  99. data/lib/denko/pulse_io/ir_output.rb +1 -5
  100. data/lib/denko/pulse_io/pwm_output.rb +56 -31
  101. data/lib/denko/pulse_io.rb +17 -3
  102. data/lib/denko/rtc/ds3231.rb +4 -3
  103. data/lib/denko/rtc.rb +14 -1
  104. data/lib/denko/sensor/aht.rb +16 -20
  105. data/lib/denko/sensor/bme280.rb +23 -36
  106. data/lib/denko/sensor/bmp180.rb +8 -13
  107. data/lib/denko/sensor/dht.rb +17 -7
  108. data/lib/denko/sensor/ds18b20.rb +5 -4
  109. data/lib/denko/sensor/hdc1080.rb +174 -0
  110. data/lib/denko/sensor/htu21d.rb +17 -6
  111. data/lib/denko/sensor/htu31d.rb +6 -5
  112. data/lib/denko/sensor/jsnsr04t.rb +49 -0
  113. data/lib/denko/sensor/qmp6988.rb +14 -30
  114. data/lib/denko/sensor/rcwl9620.rb +1 -0
  115. data/lib/denko/sensor/sht3x.rb +6 -5
  116. data/lib/denko/sensor/sht4x.rb +125 -0
  117. data/lib/denko/sensor/vl53l0x.rb +58 -0
  118. data/lib/denko/sensor.rb +33 -15
  119. data/lib/denko/spi/base_register.rb +11 -7
  120. data/lib/denko/spi/bus_common.rb +12 -15
  121. data/lib/denko/spi/input_register.rb +6 -6
  122. data/lib/denko/spi/output_register.rb +13 -4
  123. data/lib/denko/spi/peripheral.rb +82 -84
  124. data/lib/denko/spi.rb +20 -10
  125. data/lib/denko/uart/bit_bang.rb +2 -27
  126. data/lib/denko/uart/common.rb +33 -0
  127. data/lib/denko/uart/hardware.rb +1 -26
  128. data/lib/denko/uart.rb +16 -2
  129. data/lib/denko/version.rb +1 -1
  130. data/lib/denko.rb +22 -25
  131. data/lib/denko_cli/targets.rb +7 -7
  132. data/lib/denko_cli/targets.txt +19 -20
  133. data/src/lib/Denko.cpp +26 -13
  134. data/src/lib/Denko.h +4 -4
  135. data/src/lib/DenkoDefines.h +7 -26
  136. data/src/lib/DenkoLEDArray.cpp +1 -8
  137. data/src/lib/DenkoSPI.cpp +31 -29
  138. data/src/lib/DenkoSPIBB.cpp +12 -14
  139. data/test/analog_io/input_test.rb +1 -1
  140. data/test/analog_io/potentiometer_test.rb +2 -2
  141. data/test/behaviors/bus_peripheral_test.rb +4 -4
  142. data/test/behaviors/callbacks_test.rb +20 -10
  143. data/test/behaviors/component_test.rb +18 -8
  144. data/test/board/board_test.rb +9 -9
  145. data/test/board/one_wire_test.rb +25 -14
  146. data/test/board/spi_test.rb +31 -15
  147. data/test/digital_io/input_test.rb +2 -2
  148. data/test/display/canvas_test.rb +306 -0
  149. data/test/display/hd44780_test.rb +34 -7
  150. data/test/eeprom/board_test.rb +45 -0
  151. data/test/helpers/mruby_minitest.rb +95 -0
  152. data/test/helpers/mruby_runner.rb +13 -0
  153. data/test/i2c/bus_test.rb +93 -30
  154. data/test/i2c/peripheral_test.rb +2 -2
  155. data/test/led/apa102_test.rb +24 -0
  156. data/test/led/rgb_test.rb +4 -4
  157. data/test/motor/{stepper_test.rb → a3967_test.rb} +2 -2
  158. data/test/one_wire/bus_enumerator_test.rb +1 -1
  159. data/test/one_wire/bus_test.rb +42 -35
  160. data/test/one_wire/peripheral_test.rb +5 -17
  161. data/test/pulse_io/ir_output_test.rb +5 -0
  162. data/test/pulse_io/pwm_output_test.rb +10 -10
  163. data/test/rtc/ds3231_test.rb +3 -2
  164. data/test/sensor/dht_test.rb +11 -11
  165. data/test/spi/bitbang_test.rb +27 -0
  166. data/test/spi/bus_test.rb +19 -29
  167. data/test/spi/input_register_test.rb +2 -2
  168. data/test/spi/{peripheral_multi_pin_test.rb → peripheral_test.rb} +25 -5
  169. data/test/test_helper.rb +44 -124
  170. data/vendor/board-maps/BoardMap.h +264 -0
  171. data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
  172. data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
  173. data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
  174. data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
  175. data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
  176. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +0 -1
  177. data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
  178. data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
  179. data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
  180. data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
  181. data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
  182. data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
  183. data/vendor/board-maps/yaml/ESP32C6_DEV.yml +3 -4
  184. data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +0 -1
  185. data/vendor/board-maps/yaml/ESP32H2_DEV.yml +0 -1
  186. data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +0 -1
  187. data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
  188. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -1
  189. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO.yml +0 -1
  190. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +0 -1
  191. data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
  192. data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
  193. data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
  194. data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +0 -1
  195. data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
  196. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
  197. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
  198. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
  199. data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
  200. data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
  201. data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
  202. data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
  203. data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
  204. data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
  205. data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
  206. data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
  207. data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +1 -2
  208. data/vendor/board-maps/yaml/LoPy.yml +0 -1
  209. data/vendor/board-maps/yaml/LoPy4.yml +0 -1
  210. data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
  211. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -1
  212. data/vendor/board-maps/yaml/OMGS3.yml +25 -0
  213. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
  214. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
  215. data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
  216. data/vendor/board-maps/yaml/PYCOM_GPY.yml +0 -1
  217. data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +1 -1
  218. data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
  219. data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
  220. data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
  221. data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
  222. data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
  223. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +0 -1
  224. data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
  225. data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
  226. data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
  227. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
  228. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
  229. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
  230. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
  231. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
  232. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
  233. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
  234. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
  235. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
  236. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
  237. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
  238. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
  239. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
  240. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
  241. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
  242. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
  243. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
  244. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
  245. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
  246. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
  247. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
  248. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
  249. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
  250. data/vendor/board-maps/yaml/WIPY3.yml +0 -1
  251. data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
  252. data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
  253. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
  254. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
  255. data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
  256. data/vendor/board-maps/yaml/mercury.yml +20 -0
  257. metadata +116 -101
  258. data/.vscode/settings.json +0 -5
  259. data/.vscode/tasks.json +0 -20
  260. data/HARDWARE.md +0 -263
  261. data/benchmarks/analog_listen.rb +0 -49
  262. data/benchmarks/digital_write.rb +0 -28
  263. data/benchmarks/i2c_ssd1306_refresh.rb +0 -91
  264. data/examples/advanced/m5_env3.rb +0 -46
  265. data/examples/advanced/rotary_encoder_mac_volume.rb +0 -53
  266. data/examples/advanced/ssd1306_time_temp_rh.rb +0 -43
  267. data/examples/analog_io/ads1100.rb +0 -48
  268. data/examples/analog_io/ads1115.rb +0 -57
  269. data/examples/analog_io/ads1118.rb +0 -65
  270. data/examples/analog_io/dac_loopback.rb +0 -34
  271. data/examples/analog_io/input.rb +0 -56
  272. data/examples/analog_io/input_smoothing.rb +0 -27
  273. data/examples/analog_io/potentiometer.rb +0 -31
  274. data/examples/connection/binary_echo.rb +0 -34
  275. data/examples/connection/tcp.rb +0 -19
  276. data/examples/digital_io/button.rb +0 -17
  277. data/examples/digital_io/relay.rb +0 -17
  278. data/examples/digital_io/rotary_encoder.rb +0 -36
  279. data/examples/display/hd44780.png +0 -0
  280. data/examples/display/hd44780.rb +0 -47
  281. data/examples/display/ssd1306.rb +0 -43
  282. data/examples/display/ssd1306_s2_pico.rb +0 -29
  283. data/examples/eeprom/built_in.rb +0 -32
  284. data/examples/i2c/search.rb +0 -39
  285. data/examples/led/apa102_bounce.rb +0 -32
  286. data/examples/led/apa102_fade.rb +0 -44
  287. data/examples/led/builtin_blink.rb +0 -14
  288. data/examples/led/builtin_fade.rb +0 -19
  289. data/examples/led/rgb_led.rb +0 -31
  290. data/examples/led/seven_segment_char_echo.rb +0 -17
  291. data/examples/led/ws2812_bounce.rb +0 -30
  292. data/examples/led/ws2812_builtin_blink.rb +0 -22
  293. data/examples/led/ws2812_fade.rb +0 -43
  294. data/examples/motor/l298.rb +0 -45
  295. data/examples/motor/servo.rb +0 -17
  296. data/examples/motor/stepper.png +0 -0
  297. data/examples/motor/stepper.rb +0 -43
  298. data/examples/one_wire/search.rb +0 -32
  299. data/examples/pulse_io/buzzer.rb +0 -35
  300. data/examples/pulse_io/ir_output.rb +0 -51
  301. data/examples/pulse_io/pwm_output.rb +0 -30
  302. data/examples/rtc/ds3231.rb +0 -31
  303. data/examples/sensor/aht10.rb +0 -17
  304. data/examples/sensor/aht20.rb +0 -17
  305. data/examples/sensor/bme280.rb +0 -38
  306. data/examples/sensor/bmp180.rb +0 -26
  307. data/examples/sensor/dht.rb +0 -29
  308. data/examples/sensor/ds18b20.rb +0 -57
  309. data/examples/sensor/generic_pir.rb +0 -27
  310. data/examples/sensor/hcsr04.rb +0 -17
  311. data/examples/sensor/htu21d.rb +0 -43
  312. data/examples/sensor/htu31d.rb +0 -33
  313. data/examples/sensor/neat_tph_readings.rb +0 -32
  314. data/examples/sensor/qmp6988.rb +0 -51
  315. data/examples/sensor/rcwl9620.rb +0 -15
  316. data/examples/sensor/sht3x.rb +0 -32
  317. data/examples/spi/bitbang_loopback.rb +0 -46
  318. data/examples/spi/input_register.rb +0 -40
  319. data/examples/spi/output_register.rb +0 -41
  320. data/examples/spi/ssd_through_registers.rb +0 -28
  321. data/examples/spi/two_registers.rb +0 -40
  322. data/examples/uart/bit_bang_demo.rb +0 -25
  323. data/examples/uart/board_passthrough.rb +0 -40
  324. data/examples/uart/hardware_loopback.rb +0 -16
  325. data/lib/denko/eeprom/built_in.rb +0 -72
  326. data/lib/denko/fonts.rb +0 -106
  327. data/test/eeprom/built_in_test.rb +0 -61
  328. data/test/spi/peripheral_single_pin_test.rb +0 -48
  329. data/tutorial/01-led/led.fzz +0 -0
  330. data/tutorial/01-led/led.pdf +0 -0
  331. data/tutorial/01-led/led.rb +0 -73
  332. data/tutorial/02-button/button.fzz +0 -0
  333. data/tutorial/02-button/button.pdf +0 -0
  334. data/tutorial/02-button/button.rb +0 -65
  335. data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
  336. data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
  337. data/tutorial/03-potentiometer/potentiometer.rb +0 -66
  338. data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
  339. data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
  340. data/tutorial/04-pwm_led/pwm_led.rb +0 -64
  341. data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
  342. data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
  343. data/tutorial/05-rgb_led/rgb_led.rb +0 -58
  344. data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
@@ -1,6 +1,6 @@
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
6
  include Behaviors::Lifecycle
@@ -40,7 +40,7 @@ module Denko
40
40
  end
41
41
 
42
42
  def state
43
- state_mutex.synchronize { @state = { temperature: nil, humidity: nil } }
43
+ @state ||= { temperature: nil, humidity: nil }
44
44
  end
45
45
 
46
46
  def reading
@@ -69,7 +69,8 @@ module Denko
69
69
  end
70
70
 
71
71
  def read_status_register
72
- read_using -> { i2c_read(1, register: READ_STATUS_REGISTER) }
72
+ bytes = i2c_read_raw(1, register: READ_STATUS_REGISTER)
73
+ @status_register = bytes[0] if bytes
73
74
  sleep(COMMAND_DELAY)
74
75
  end
75
76
 
@@ -80,12 +81,6 @@ module Denko
80
81
  end
81
82
 
82
83
  def pre_callback_filter(bytes)
83
- # Handle reading status byte only.
84
- if bytes.length == 1
85
- @status_register = bytes[0]
86
- return nil
87
- end
88
-
89
84
  # Normal readings are 6 bytes given as:
90
85
  # [STATUS, H19-H12, H11-H4, H3-H0+T19-T16, T15-T8, T7-T0]
91
86
  @status_register = bytes[0]
@@ -102,20 +97,15 @@ module Denko
102
97
  end
103
98
 
104
99
  def update_state(reading)
105
- state_mutex.synchronize do
106
- @state[:temperature] = reading[:temperature]
107
- @state[:humidity] = reading[:humidity]
108
- end
100
+ @state_mutex.lock
101
+ @state[:temperature] = reading[:temperature]
102
+ @state[:humidity] = reading[:humidity]
103
+ @state_mutex.unlock
104
+ @state
109
105
  end
110
106
  end
111
- end
112
- end
113
107
 
114
- module Denko
115
- module Sensor
116
- class AHT20 < AHT10
117
- include I2C::Peripheral
118
- include Behaviors::Poller
108
+ class AHT2X < AHT1X
119
109
  #
120
110
  # Changed constants compared to AHT10. Always access with self.class::CONSTANT_NAME
121
111
  # in shared methods coming from the superclass.
@@ -162,5 +152,11 @@ module Denko
162
152
  crc = crc & 0xFF
163
153
  end
164
154
  end
155
+
156
+ #
157
+ # AHT3X and AHT2X have different specs, but work the same.
158
+ #
159
+ class AHT3X < AHT2X
160
+ end
165
161
  end
166
162
  end
@@ -81,7 +81,7 @@ module Denko
81
81
  end
82
82
 
83
83
  def state
84
- state_mutex.synchronize { @state = { temperature: nil, humidity: nil, pressure: nil } }
84
+ @state ||= { temperature: nil, humidity: nil, pressure: nil }
85
85
  end
86
86
 
87
87
  def reading
@@ -165,7 +165,7 @@ module Denko
165
165
  end
166
166
 
167
167
  def config_register_bits
168
- str = ""
168
+ str = String.new
169
169
  @registers.each_key do |key|
170
170
  str << "0x#{key.upcase}: #{@registers[key].to_s(2).rjust(8, '0')}\n"
171
171
  end
@@ -181,36 +181,9 @@ module Denko
181
181
  i2c_read 8, register: 0xF7
182
182
  end
183
183
 
184
- def pre_callback_filter(data)
185
- if data.length == 8
186
- return decode_reading(data)
187
- elsif data.length == 26
188
- process_calibration_a(data)
189
- return nil
190
- elsif data.length == 7
191
- process_calibration_b(data)
192
- return nil
193
- else
194
- # Ignores readings that aren't 8 bytes.
195
- return nil
196
- end
197
- end
198
-
199
- def update_state(reading)
200
- # Checking for Hash ignores calibration data and nil.
201
- if reading.class == Hash
202
- state_mutex.synchronize do
203
- @state[:temperature] = reading[:temperature]
204
- @state[:pressure] = reading[:pressure]
205
- @state[:humidity] = reading[:humidity]
206
- end
207
- end
208
- end
184
+ def pre_callback_filter(bytes)
185
+ return nil unless bytes.length == 8
209
186
 
210
- #
211
- # Decoding Methods
212
- #
213
- def decode_reading(bytes)
214
187
  # Always read temperature since t_fine is needed to calibrate other values.
215
188
  temperature, t_fine = decode_temperature(bytes)
216
189
  reading[:temperature] = temperature
@@ -222,6 +195,18 @@ module Denko
222
195
  reading
223
196
  end
224
197
 
198
+ def update_state(reading)
199
+ @state_mutex.lock
200
+ @state[:temperature] = reading[:temperature]
201
+ @state[:pressure] = reading[:pressure]
202
+ @state[:humidity] = reading[:humidity]
203
+ @state_mutex.unlock
204
+ @state
205
+ end
206
+
207
+ #
208
+ # Decoding Methods
209
+ #
225
210
  def decode_temperature(bytes)
226
211
  # Reformat raw temeprature bytes (20-bits in 24) to uint32.
227
212
  adc_t = ((bytes[3] << 16) | (bytes[4] << 8) | (bytes[5])) >> 4
@@ -284,7 +269,7 @@ module Denko
284
269
 
285
270
  # No humidity on the BMP280.
286
271
  def humidity_available?
287
- !self.class.to_s.match(/bmp/i)
272
+ self.class.name.split('::').last.downcase.start_with? "bme"
288
273
  end
289
274
 
290
275
  #
@@ -293,12 +278,14 @@ module Denko
293
278
  attr_reader :calibration_data_loaded
294
279
 
295
280
  def get_calibration_data
296
- # First group of calibration bytes, sent to #process_calibration_a.
297
- read_using -> { i2c_read(26, register: 0x88) }
281
+ # Calibration A
282
+ cal_a_bytes = i2c_read_raw(26, register: 0x88)
283
+ process_calibration_a(cal_a_bytes) if cal_a_bytes
298
284
 
299
- # Second group of calibration bytes, only on BME280, sent to #process_calibration_b.
285
+ # Calibration B, only on BME280.
300
286
  if humidity_available?
301
- read_using -> { i2c_read(7, register: 0xE1) }
287
+ cal_b_bytes = i2c_read_raw(7, register: 0xE1)
288
+ process_calibration_b(cal_b_bytes) if cal_b_bytes
302
289
  end
303
290
 
304
291
  if (@calibration[:cal_a] && @calibration[:cal_b]) || (@calibration[:cal_a] && !humidity_available?)
@@ -38,7 +38,7 @@ module Denko
38
38
  end
39
39
 
40
40
  def state
41
- state_mutex.synchronize { @state ||= { temperature: nil, pressure: nil } }
41
+ @state ||= { temperature: nil, pressure: nil }
42
42
  end
43
43
 
44
44
  def reading
@@ -120,9 +120,6 @@ module Denko
120
120
  @raw_bytes[3] = data[1]
121
121
  @raw_bytes[4] = data[2]
122
122
  return decode_reading(@raw_bytes)
123
- # Calibration data is 22 bytes.
124
- elsif data.length == 22
125
- process_calibration(data)
126
123
  end
127
124
 
128
125
  # Anything other than pressure avoids callbacks.
@@ -130,13 +127,11 @@ module Denko
130
127
  end
131
128
 
132
129
  def update_state(reading)
133
- # Checking for Hash ignores calibration data and nil.
134
- if reading.class == Hash
135
- state_mutex.synchronize do
136
- @state[:temperature] = reading[:temperature]
137
- @state[:pressure] = reading[:pressure]
138
- end
139
- end
130
+ @state_mutex.lock
131
+ @state[:temperature] = reading[:temperature]
132
+ @state[:pressure] = reading[:pressure]
133
+ @state_mutex.unlock
134
+ @state
140
135
  end
141
136
 
142
137
  #
@@ -199,8 +194,8 @@ module Denko
199
194
  attr_reader :calibration_data_loaded
200
195
 
201
196
  def get_calibration_data
202
- # Calibration data is 22 bytes starting at address 0xAA.
203
- read_using -> { i2c_read(22, register: 0xAA) }
197
+ bytes = i2c_read_raw(22, register: 0xAA)
198
+ process_calibration(bytes) if bytes
204
199
  end
205
200
 
206
201
  def process_calibration(bytes)
@@ -7,8 +7,13 @@ module Denko
7
7
  include TemperatureHelper
8
8
  include HumidityHelper
9
9
 
10
+ after_initialize do
11
+ # Small delay on startup to prevent Linux from reading too early.
12
+ sleep 0.100
13
+ end
14
+
10
15
  def state
11
- state_mutex.synchronize { @state ||= { temperature: nil, humidity: nil } }
16
+ @state ||= { temperature: nil, humidity: nil }
12
17
  end
13
18
 
14
19
  def reading
@@ -16,11 +21,15 @@ module Denko
16
21
  end
17
22
 
18
23
  def _read
19
- board.pulse_read(pin, reset: board.low, reset_time: 20000, pulse_limit: 84, timeout: 100)
24
+ board.pulse_read(pin, reset: board.low, reset_time: 10_000, pulse_limit: 84, timeout: 100)
20
25
  end
21
26
 
22
27
  def pre_callback_filter(data)
23
- decode(data.split(",").map(&:to_i))
28
+ if data.class == String
29
+ decode(data.split(",").map(&:to_i))
30
+ else
31
+ decode(data)
32
+ end
24
33
  end
25
34
 
26
35
  def decode(data)
@@ -46,10 +55,11 @@ module Denko
46
55
  end
47
56
 
48
57
  def update_state(reading)
49
- state_mutex.synchronize do
50
- @state[:temperature] = reading[:temperature]
51
- @state[:humidity] = reading[:humidity]
52
- end
58
+ @state_mutex.lock
59
+ @state[:temperature] = reading[:temperature]
60
+ @state[:humidity] = reading[:humidity]
61
+ @state_mutex.unlock
62
+ @state
53
63
  end
54
64
 
55
65
  def crc(bytes)
@@ -6,7 +6,7 @@ module Denko
6
6
  FAMILY_CODE = 0x28
7
7
 
8
8
  def state
9
- state_mutex.synchronize { @state ||= { temperature: nil } }
9
+ @state ||= { temperature: nil }
10
10
  end
11
11
 
12
12
  def reading
@@ -43,9 +43,10 @@ module Denko
43
43
  end
44
44
 
45
45
  def update_state(reading)
46
- state_mutex.synchronize do
47
- @state[:temperature] = reading[:temperature]
48
- end
46
+ @state_mutex.lock
47
+ @state[:temperature] = reading[:temperature]
48
+ @state_mutex.unlock
49
+ @state
49
50
  end
50
51
 
51
52
  def decode_resolution(bytes)
@@ -0,0 +1,174 @@
1
+ module Denko
2
+ module Sensor
3
+ class HDC1080
4
+ include I2C::Peripheral
5
+ include Behaviors::Poller
6
+ include Behaviors::Lifecycle
7
+ include TemperatureHelper
8
+ include HumidityHelper
9
+
10
+ I2C_ADDRESS = 0x40
11
+
12
+ # Config Register
13
+ CONFIG_ADDRESS = 0x02
14
+ CONFIG_DEFAULT = 0x10
15
+ RESET_MASK = 0b10000000
16
+ HEATER_MASK = 0b00100000
17
+ BATTERY_MASK = 0b00001000
18
+
19
+ # Reading registers
20
+ TEMPERATURE_ADDRESS = 0x00
21
+ HUMIDITY_ADDRESS = 0x01
22
+
23
+ def state
24
+ @state ||= { temperature: nil, humidity: nil }
25
+ end
26
+
27
+ def reading
28
+ @reading ||= { temperature: nil, humidity: nil }
29
+ end
30
+
31
+ after_initialize do
32
+ reset
33
+ end
34
+
35
+ def reset
36
+ @config = CONFIG_DEFAULT
37
+ @temperature_resolution = 14
38
+ @humidity_resolution = 14
39
+ write_config(@config | RESET_MASK)
40
+ sleep 0.010
41
+ end
42
+
43
+ def write_config(config=@config)
44
+ # Actually 2 bytes, but 2nd byte is reserved and 0, so ignore it.
45
+ i2c_write [CONFIG_ADDRESS, config, 0]
46
+ end
47
+
48
+ def heater_on?
49
+ (@config & HEATER_MASK) > 0
50
+ end
51
+
52
+ def heater_off?
53
+ !heater_on?
54
+ end
55
+
56
+ def heater_on
57
+ @config |= HEATER_MASK
58
+ write_config
59
+ end
60
+
61
+ def heater_off
62
+ @config &= ~HEATER_MASK
63
+ write_config
64
+ end
65
+
66
+ def battery_low?
67
+ config = i2c_read_raw(2, register: CONFIG_ADDRESS)
68
+ (config[0] & BATTERY_MASK) > 0
69
+ end
70
+
71
+ # Conversion times from datasheet, but not really used.
72
+ TEMPERATURE_RESOLUTION_MASK = 0b00000100
73
+ TEMPERATURE_RESOLUTIONS = {
74
+ 14 => { bits: 0b0, conversion_time: 0.007 },
75
+ 11 => { bits: 0b1, conversion_time: 0.004 },
76
+ }
77
+
78
+ HUMIDITY_RESOLUTION_MASK = 0b00000011
79
+ HUMIDITY_RESOLUTIONS = {
80
+ 14 => { bits: 0b00, conversion_time: 0.007 },
81
+ 11 => { bits: 0b01, conversion_time: 0.004 },
82
+ 8 => { bits: 0b10, conversion_time: 0.003 },
83
+ }
84
+
85
+ attr_reader :temperature_resolution, :humidity_resolution
86
+
87
+ def temperature_resolution=(res)
88
+ raise ArgumentError, "wrong temperature resolution given: #{res}" unless TEMPERATURE_RESOLUTIONS.keys.include? res
89
+ @config &= ~TEMPERATURE_RESOLUTION_MASK
90
+ @config |= (TEMPERATURE_RESOLUTIONS[res][:bits] << 2)
91
+ write_config
92
+ @temperature_resolution = res
93
+ end
94
+
95
+ def humidity_resolution=(res)
96
+ raise ArgumentError, "wrong humidity resolution given: #{res}" unless HUMIDITY_RESOLUTIONS.keys.include? res
97
+ @config &= ~HUMIDITY_RESOLUTION_MASK
98
+ @config |= HUMIDITY_RESOLUTIONS[res][:bits]
99
+ write_config
100
+ @humidity_resolution = res
101
+ end
102
+
103
+ def serial_number
104
+ device_info[:serial_number]
105
+ end
106
+
107
+ def manufacturer_id
108
+ device_info[:manufacturer_id]
109
+ end
110
+
111
+ def device_id
112
+ device_info[:device_id]
113
+ end
114
+
115
+ def device_info
116
+ return @device_info if @device_info
117
+
118
+ man_id_bytes = i2c_read_raw(2, register: 0xFE)
119
+ dev_id_bytes = i2c_read_raw(2, register: 0xFF)
120
+ serial_l = i2c_read_raw(2, register: 0xFD)
121
+ serial_m = i2c_read_raw(2, register: 0xFC)
122
+ serial_h = i2c_read_raw(2, register: 0xFB)
123
+
124
+ @device_info = {
125
+ manufacturer_id: man_id_bytes[0] << 8 | man_id_bytes[1],
126
+ device_id: dev_id_bytes[0] << 8 | dev_id_bytes[1],
127
+ serial_number: serial_h[0] << 32 | serial_h[1] << 24 | serial_m[0] << 16 | serial_m[1] << 8 | serial_l[0],
128
+ }
129
+ end
130
+
131
+ def _read
132
+ _start_conversion
133
+ # This is way more than given conversion times, but unreliable without.
134
+ sleep 0.200
135
+ _read_values
136
+ end
137
+
138
+ def _start_conversion
139
+ # Writing to temperature register triggers both reads.
140
+ i2c_write [TEMPERATURE_ADDRESS]
141
+ end
142
+
143
+ def _read_values
144
+ # Read 2 bytes each for temperature and humidity.
145
+ i2c_read(4)
146
+ end
147
+
148
+ def pre_callback_filter(bytes)
149
+ raw_t = bytes[0] << 8 | bytes[1]
150
+ raw_h = bytes[2] << 8 | bytes[3]
151
+
152
+ reading[:temperature] = ((raw_t.to_f / 2 ** 16) * 165) - 40
153
+ reading[:humidity] = (raw_h.to_f / 2 ** 16) * 100
154
+
155
+ return nil unless (reading[:temperature] && reading[:humidity])
156
+
157
+ reading
158
+ end
159
+
160
+ def update_state(reading)
161
+ @state_mutex.lock
162
+ @state[:temperature] = reading[:temperature]
163
+ @state[:humidity] = reading[:humidity]
164
+ @state_mutex.unlock
165
+
166
+ # Reset so pre_callback_filter can check for both values.
167
+ reading[:temperature] = nil
168
+ reading[:humidity] = nil
169
+
170
+ @state
171
+ end
172
+ end
173
+ end
174
+ end
@@ -27,7 +27,7 @@ module Denko
27
27
  end
28
28
 
29
29
  def state
30
- state_mutex.synchronize { @state ||= { temperature: nil, humidity: nil } }
30
+ @state ||= { temperature: nil, humidity: nil }
31
31
  end
32
32
 
33
33
  def reading
@@ -73,7 +73,7 @@ module Denko
73
73
  }
74
74
 
75
75
  def resolution=(setting)
76
- raise ArgumentError, "wrong resolution setting given: #{mask}" unless RESOLUTIONS.keys.include? setting
76
+ raise ArgumentError, "wrong resolution setting given: #{setting}" unless RESOLUTIONS.keys.include? setting
77
77
  @config &= ~RESOLUTION_MASK
78
78
  @config |= setting
79
79
  write_config
@@ -85,6 +85,14 @@ module Denko
85
85
  RESOLUTIONS[resolution_bits]
86
86
  end
87
87
 
88
+ def temperature_resolution
89
+ resolution[:temperature]
90
+ end
91
+
92
+ def humidity_resolution
93
+ resolution[:humidity]
94
+ end
95
+
88
96
  # Workaround for :read callbacks getting automatically removed on first reading.
89
97
  def read(*args, **kwargs, &block)
90
98
  read_using(self.method(:_read_temperature), *args, **kwargs)
@@ -129,13 +137,16 @@ module Denko
129
137
  end
130
138
 
131
139
  def update_state(reading)
132
- state_mutex.synchronize do
133
- @state[:temperature] = reading[:temperature]
134
- @state[:humidity] = reading[:humidity]
135
- end
140
+ @state_mutex.lock
141
+ @state[:temperature] = reading[:temperature]
142
+ @state[:humidity] = reading[:humidity]
143
+ @state_mutex.unlock
144
+
136
145
  # Reset so pre_callback_filter can check for both values.
137
146
  reading[:temperature] = nil
138
147
  reading[:humidity] = nil
148
+
149
+ @state
139
150
  end
140
151
 
141
152
  #
@@ -67,7 +67,7 @@ module Denko
67
67
  end
68
68
 
69
69
  def state
70
- state_mutex.synchronize { @state = { temperature: nil, humidity: nil } }
70
+ @state ||= { temperature: nil, humidity: nil }
71
71
  end
72
72
 
73
73
  def reading
@@ -157,10 +157,11 @@ module Denko
157
157
  end
158
158
 
159
159
  def update_state(reading)
160
- state_mutex.synchronize do
161
- @state[:temperature] = reading[:temperature]
162
- @state[:humidity] = reading[:humidity]
163
- end
160
+ @state_mutex.lock
161
+ @state[:temperature] = reading[:temperature]
162
+ @state[:humidity] = reading[:humidity]
163
+ @state_mutex.unlock
164
+ @state
164
165
  end
165
166
 
166
167
  #
@@ -0,0 +1,49 @@
1
+ module Denko
2
+ module Sensor
3
+ #
4
+ # For JSN-SR04T sensor in mode 2 ONLY.
5
+ #
6
+ class JSNSR04T
7
+ include Behaviors::Component
8
+ include Behaviors::Lifecycle
9
+ include Behaviors::Poller
10
+
11
+ UART_CLASSES = [Denko::UART::Hardware, Denko::UART::BitBang]
12
+ TIMEOUT = 0.500
13
+
14
+ attr_reader :uart
15
+
16
+ after_initialize do
17
+ unless params[:uart] && UART_CLASSES.include?(params[:uart].class)
18
+ raise ArgumentError, "JSN-SR04T driver only works in mode 2, and expects a UART in the :uart key"
19
+ end
20
+
21
+ raise StandardError, "UART baud must be 9600 for JSN-SR04T" unless params[:uart].baud == 9600
22
+
23
+ @uart = params[:uart]
24
+ end
25
+
26
+ def _read
27
+ # Trigger read
28
+ uart.write("U")
29
+
30
+ # Get line from UART
31
+ start = Time.now
32
+ line = nil
33
+ until line || (Time.now - start > TIMEOUT)
34
+ line = uart.gets
35
+ sleep 0.010
36
+ end
37
+
38
+ # Extract mm as integer
39
+ if line && line.strip.end_with?("mm")
40
+ value = line.gsub("mm").strip.to_i
41
+ self.update(value)
42
+ return value
43
+ end
44
+
45
+ return nil
46
+ end
47
+ end
48
+ end
49
+ end
@@ -90,7 +90,7 @@ module Denko
90
90
  end
91
91
 
92
92
  def state
93
- state_mutex.synchronize { @state ||= { temperature: nil, pressure: nil } }
93
+ @state ||= { temperature: nil, pressure: nil }
94
94
  end
95
95
 
96
96
  def reading
@@ -164,8 +164,8 @@ module Denko
164
164
 
165
165
  def chip_id
166
166
  return @chip_id if @chip_id
167
- i2c_read(1, register: CHIP_ID_REGISTER)
168
- sleep 0.001 while !@chip_id
167
+ bytes = i2c_read_raw(1, register: CHIP_ID_REGISTER)
168
+ @chip_id = bytes[0] if bytes
169
169
  @chip_id
170
170
  end
171
171
 
@@ -184,19 +184,8 @@ module Denko
184
184
  end
185
185
 
186
186
  def pre_callback_filter(bytes)
187
- if bytes.length == DATA_LENGTH
188
- return process_reading(bytes)
189
- elsif bytes.length == CONFIG_LENGTH
190
- process_config(bytes)
191
- elsif bytes.length == CALIBRATION_LENGTH
192
- process_calibration(bytes)
193
- elsif bytes.length == CHIP_ID_LENGTH
194
- @chip_id = bytes[0]
195
- end
196
- return nil
197
- end
187
+ return nil unless bytes.length == DATA_LENGTH
198
188
 
199
- def process_reading(bytes)
200
189
  # Temperature and pressure are 24-bits long each, and need 2^23 subtracted.
201
190
  dt = ((bytes[3] << 16) + (bytes[4] << 8) + bytes[5]) - (0b1 << 23)
202
191
  dp = ((bytes[0] << 16) + (bytes[1] << 8) + bytes[2]) - (0b1 << 23)
@@ -223,21 +212,18 @@ module Denko
223
212
  end
224
213
 
225
214
  def update_state(reading)
226
- state_mutex.synchronize do
227
- @state[:temperature] = reading[:temperature]
228
- @state[:pressure] = reading[:pressure]
229
- end
215
+ @state_mutex.lock
216
+ @state[:temperature] = reading[:temperature]
217
+ @state[:pressure] = reading[:pressure]
218
+ @state_mutex.unlock
219
+ @state
230
220
  end
231
221
 
232
222
  def get_config_registers
233
- @registers = {}
234
- i2c_read(CONFIG_LENGTH, register: IIR_REGISTER)
235
- sleep 0.001 while @registers.empty?
236
- @registers
237
- end
238
-
239
- def process_config(bytes)
240
- @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
241
227
  end
242
228
  attr_reader :registers
243
229
 
@@ -262,10 +248,8 @@ module Denko
262
248
  }
263
249
 
264
250
  def get_calibration_data
265
- i2c_read(CALIBRATION_LENGTH, register: CALIBRATION_REGISTER)
266
- end
251
+ bytes = i2c_read_raw(CALIBRATION_LENGTH, register: CALIBRATION_REGISTER)
267
252
 
268
- def process_calibration(bytes)
269
253
  if bytes
270
254
  # These 2 values are 20-bit instead of 16-bit, so can't combine them with #pack.
271
255
  a0_unsigned = (bytes[18] << 12) + (bytes[19] << 4) + (bytes[24] & 0b00001111)
@@ -7,6 +7,7 @@ module Denko
7
7
  I2C_ADDRESS = 0x57
8
8
 
9
9
  def _read
10
+ i2c_write(0x01)
10
11
  i2c_write(0x01)
11
12
  sleep(0.120)
12
13
  i2c_read(3)