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.
- checksums.yaml +4 -4
- data/.github/workflows/build_atmega_avr.yml +2 -1
- data/.github/workflows/build_atmega_megaavr.yml +2 -1
- data/.github/workflows/build_atsam3x.yml +1 -0
- data/.github/workflows/build_atsamd21.yml +2 -1
- data/.github/workflows/build_esp32.yml +4 -2
- data/.github/workflows/build_esp32c3.yml +4 -3
- data/.github/workflows/build_esp32c6.yml +4 -2
- data/.github/workflows/build_esp32h2.yml +4 -2
- data/.github/workflows/build_esp32s2.yml +4 -2
- data/.github/workflows/build_esp32s3.yml +4 -2
- data/.github/workflows/build_esp8266.yml +2 -1
- data/.github/workflows/build_ra4m1.yml +1 -0
- data/.github/workflows/build_rp2040.yml +4 -3
- data/.github/workflows/ruby.yml +1 -1
- data/CHANGELOG.md +203 -0
- data/DEPS_CLI.md +16 -16
- data/DEPS_IDE.md +31 -30
- data/MICROCONTROLLERS.md +103 -0
- data/PERIPHERALS.md +178 -0
- data/README.md +28 -21
- data/denko.gemspec +6 -1
- data/lib/denko/analog_io/ads1118.rb +5 -5
- data/lib/denko/analog_io/ads111x.rb +23 -19
- data/lib/denko/analog_io/joystick.rb +87 -0
- data/lib/denko/analog_io/potentiometer.rb +1 -5
- data/lib/denko/analog_io.rb +22 -8
- data/lib/denko/behaviors/bus_controller.rb +2 -1
- data/lib/denko/behaviors/bus_peripheral.rb +1 -1
- data/lib/denko/behaviors/callbacks.rb +18 -16
- data/lib/denko/behaviors/component.rb +0 -4
- data/lib/denko/behaviors/lifecycle.rb +1 -1
- data/lib/denko/behaviors/listener.rb +9 -3
- data/lib/denko/behaviors/multi_pin.rb +4 -6
- data/lib/denko/behaviors/poller.rb +11 -2
- data/lib/denko/behaviors/reader.rb +109 -21
- data/lib/denko/behaviors/single_pin.rb +2 -4
- data/lib/denko/behaviors/state.rb +18 -13
- data/lib/denko/behaviors/threaded.rb +19 -8
- data/lib/denko/behaviors.rb +36 -23
- data/lib/denko/board/eeprom.rb +1 -1
- data/lib/denko/board/i2c.rb +1 -1
- data/lib/denko/board/i2c_bit_bang.rb +9 -5
- data/lib/denko/board/map.rb +6 -2
- data/lib/denko/board/one_wire.rb +3 -3
- data/lib/denko/board/spi.rb +30 -30
- data/lib/denko/board/spi_bit_bang.rb +8 -11
- data/lib/denko/board.rb +6 -3
- data/lib/denko/connection/flow_control.rb +1 -1
- data/lib/denko/connection/serial.rb +5 -5
- data/lib/denko/digital_io/output.rb +12 -4
- data/lib/denko/digital_io/pcf8574.rb +114 -0
- data/lib/denko/digital_io/rotary_encoder.rb +10 -6
- data/lib/denko/digital_io.rb +24 -6
- data/lib/denko/display/canvas.rb +350 -157
- data/lib/denko/display/font/bmp_5x7.rb +142 -0
- data/lib/denko/display/font/bmp_6x8.rb +142 -0
- data/lib/denko/display/font/bmp_8x16.rb +141 -0
- data/lib/denko/display/font.rb +22 -0
- data/lib/denko/display/hd44780.rb +24 -20
- data/lib/denko/display/il0373.rb +186 -0
- data/lib/denko/display/mono_oled.rb +193 -0
- data/lib/denko/display/pcd8544.rb +154 -0
- data/lib/denko/display/pixel_common.rb +83 -0
- data/lib/denko/display/sh1106.rb +17 -21
- data/lib/denko/display/sh1107.rb +10 -0
- data/lib/denko/display/spi_common.rb +35 -0
- data/lib/denko/display/spi_epaper_common.rb +30 -0
- data/lib/denko/display/ssd1306.rb +6 -228
- data/lib/denko/display/ssd1680.rb +14 -0
- data/lib/denko/display/ssd1681.rb +8 -0
- data/lib/denko/display/ssd168x.rb +227 -0
- data/lib/denko/display/st7302.rb +207 -0
- data/lib/denko/display/st7565.rb +166 -0
- data/lib/denko/display.rb +40 -4
- data/lib/denko/eeprom/at24c.rb +67 -0
- data/lib/denko/eeprom/board.rb +69 -0
- data/lib/denko/eeprom.rb +15 -1
- data/lib/denko/helpers/engine_check.rb +13 -0
- data/lib/denko/{mutex_stub.rb → helpers/mutex_stub.rb} +6 -0
- data/lib/denko/helpers.rb +6 -0
- data/lib/denko/i2c/bit_bang.rb +1 -0
- data/lib/denko/i2c/bus_common.rb +9 -4
- data/lib/denko/i2c/peripheral.rb +5 -1
- data/lib/denko/i2c.rb +17 -4
- data/lib/denko/led/apa102.rb +1 -3
- data/lib/denko/led/base.rb +5 -0
- data/lib/denko/led/rgb.rb +16 -10
- data/lib/denko/led/seven_segment.rb +1 -1
- data/lib/denko/led.rb +17 -8
- data/lib/denko/motor/{stepper.rb → a3967.rb} +1 -1
- data/lib/denko/motor/servo.rb +16 -6
- data/lib/denko/motor.rb +16 -3
- data/lib/denko/one_wire/bus.rb +20 -16
- data/lib/denko/one_wire/bus_enumerator.rb +25 -14
- data/lib/denko/one_wire/helper.rb +4 -2
- data/lib/denko/one_wire.rb +18 -5
- data/lib/denko/pulse_io/buzzer.rb +2 -6
- data/lib/denko/pulse_io/ir_output.rb +1 -5
- data/lib/denko/pulse_io/pwm_output.rb +56 -31
- data/lib/denko/pulse_io.rb +17 -3
- data/lib/denko/rtc/ds3231.rb +4 -3
- data/lib/denko/rtc.rb +14 -1
- data/lib/denko/sensor/aht.rb +16 -20
- data/lib/denko/sensor/bme280.rb +23 -36
- data/lib/denko/sensor/bmp180.rb +8 -13
- data/lib/denko/sensor/dht.rb +17 -7
- data/lib/denko/sensor/ds18b20.rb +5 -4
- data/lib/denko/sensor/hdc1080.rb +174 -0
- data/lib/denko/sensor/htu21d.rb +17 -6
- data/lib/denko/sensor/htu31d.rb +6 -5
- data/lib/denko/sensor/jsnsr04t.rb +49 -0
- data/lib/denko/sensor/qmp6988.rb +14 -30
- data/lib/denko/sensor/rcwl9620.rb +1 -0
- data/lib/denko/sensor/sht3x.rb +6 -5
- data/lib/denko/sensor/sht4x.rb +125 -0
- data/lib/denko/sensor/vl53l0x.rb +58 -0
- data/lib/denko/sensor.rb +33 -15
- data/lib/denko/spi/base_register.rb +11 -7
- data/lib/denko/spi/bus_common.rb +12 -15
- data/lib/denko/spi/input_register.rb +6 -6
- data/lib/denko/spi/output_register.rb +13 -4
- data/lib/denko/spi/peripheral.rb +82 -84
- data/lib/denko/spi.rb +20 -10
- data/lib/denko/uart/bit_bang.rb +2 -27
- data/lib/denko/uart/common.rb +33 -0
- data/lib/denko/uart/hardware.rb +1 -26
- data/lib/denko/uart.rb +16 -2
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +22 -25
- data/lib/denko_cli/targets.rb +7 -7
- data/lib/denko_cli/targets.txt +19 -20
- data/src/lib/Denko.cpp +26 -13
- data/src/lib/Denko.h +4 -4
- data/src/lib/DenkoDefines.h +7 -26
- data/src/lib/DenkoLEDArray.cpp +1 -8
- data/src/lib/DenkoSPI.cpp +31 -29
- data/src/lib/DenkoSPIBB.cpp +12 -14
- data/test/analog_io/input_test.rb +1 -1
- data/test/analog_io/potentiometer_test.rb +2 -2
- data/test/behaviors/bus_peripheral_test.rb +4 -4
- data/test/behaviors/callbacks_test.rb +20 -10
- data/test/behaviors/component_test.rb +18 -8
- data/test/board/board_test.rb +9 -9
- data/test/board/one_wire_test.rb +25 -14
- data/test/board/spi_test.rb +31 -15
- data/test/digital_io/input_test.rb +2 -2
- data/test/display/canvas_test.rb +306 -0
- data/test/display/hd44780_test.rb +34 -7
- data/test/eeprom/board_test.rb +45 -0
- data/test/helpers/mruby_minitest.rb +95 -0
- data/test/helpers/mruby_runner.rb +13 -0
- data/test/i2c/bus_test.rb +93 -30
- data/test/i2c/peripheral_test.rb +2 -2
- data/test/led/apa102_test.rb +24 -0
- data/test/led/rgb_test.rb +4 -4
- data/test/motor/{stepper_test.rb → a3967_test.rb} +2 -2
- data/test/one_wire/bus_enumerator_test.rb +1 -1
- data/test/one_wire/bus_test.rb +42 -35
- data/test/one_wire/peripheral_test.rb +5 -17
- data/test/pulse_io/ir_output_test.rb +5 -0
- data/test/pulse_io/pwm_output_test.rb +10 -10
- data/test/rtc/ds3231_test.rb +3 -2
- data/test/sensor/dht_test.rb +11 -11
- data/test/spi/bitbang_test.rb +27 -0
- data/test/spi/bus_test.rb +19 -29
- data/test/spi/input_register_test.rb +2 -2
- data/test/spi/{peripheral_multi_pin_test.rb → peripheral_test.rb} +25 -5
- data/test/test_helper.rb +44 -124
- data/vendor/board-maps/BoardMap.h +264 -0
- data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
- data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
- data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
- data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
- data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
- data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +0 -1
- data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
- data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
- data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
- data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
- data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
- data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
- data/vendor/board-maps/yaml/ESP32C6_DEV.yml +3 -4
- data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +0 -1
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +0 -1
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +0 -1
- data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
- data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO.yml +0 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +0 -1
- data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
- data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
- data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +0 -1
- data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
- data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +1 -2
- data/vendor/board-maps/yaml/LoPy.yml +0 -1
- data/vendor/board-maps/yaml/LoPy4.yml +0 -1
- data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -1
- data/vendor/board-maps/yaml/OMGS3.yml +25 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
- data/vendor/board-maps/yaml/PYCOM_GPY.yml +0 -1
- data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +1 -1
- data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
- data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
- data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
- data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
- data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +0 -1
- data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
- data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
- data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
- data/vendor/board-maps/yaml/WIPY3.yml +0 -1
- data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
- data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
- data/vendor/board-maps/yaml/mercury.yml +20 -0
- metadata +116 -101
- data/.vscode/settings.json +0 -5
- data/.vscode/tasks.json +0 -20
- data/HARDWARE.md +0 -263
- data/benchmarks/analog_listen.rb +0 -49
- data/benchmarks/digital_write.rb +0 -28
- data/benchmarks/i2c_ssd1306_refresh.rb +0 -91
- data/examples/advanced/m5_env3.rb +0 -46
- data/examples/advanced/rotary_encoder_mac_volume.rb +0 -53
- data/examples/advanced/ssd1306_time_temp_rh.rb +0 -43
- data/examples/analog_io/ads1100.rb +0 -48
- data/examples/analog_io/ads1115.rb +0 -57
- data/examples/analog_io/ads1118.rb +0 -65
- data/examples/analog_io/dac_loopback.rb +0 -34
- data/examples/analog_io/input.rb +0 -56
- data/examples/analog_io/input_smoothing.rb +0 -27
- data/examples/analog_io/potentiometer.rb +0 -31
- data/examples/connection/binary_echo.rb +0 -34
- data/examples/connection/tcp.rb +0 -19
- data/examples/digital_io/button.rb +0 -17
- data/examples/digital_io/relay.rb +0 -17
- data/examples/digital_io/rotary_encoder.rb +0 -36
- data/examples/display/hd44780.png +0 -0
- data/examples/display/hd44780.rb +0 -47
- data/examples/display/ssd1306.rb +0 -43
- data/examples/display/ssd1306_s2_pico.rb +0 -29
- data/examples/eeprom/built_in.rb +0 -32
- data/examples/i2c/search.rb +0 -39
- data/examples/led/apa102_bounce.rb +0 -32
- data/examples/led/apa102_fade.rb +0 -44
- data/examples/led/builtin_blink.rb +0 -14
- data/examples/led/builtin_fade.rb +0 -19
- data/examples/led/rgb_led.rb +0 -31
- data/examples/led/seven_segment_char_echo.rb +0 -17
- data/examples/led/ws2812_bounce.rb +0 -30
- data/examples/led/ws2812_builtin_blink.rb +0 -22
- data/examples/led/ws2812_fade.rb +0 -43
- data/examples/motor/l298.rb +0 -45
- data/examples/motor/servo.rb +0 -17
- data/examples/motor/stepper.png +0 -0
- data/examples/motor/stepper.rb +0 -43
- data/examples/one_wire/search.rb +0 -32
- data/examples/pulse_io/buzzer.rb +0 -35
- data/examples/pulse_io/ir_output.rb +0 -51
- data/examples/pulse_io/pwm_output.rb +0 -30
- data/examples/rtc/ds3231.rb +0 -31
- data/examples/sensor/aht10.rb +0 -17
- data/examples/sensor/aht20.rb +0 -17
- data/examples/sensor/bme280.rb +0 -38
- data/examples/sensor/bmp180.rb +0 -26
- data/examples/sensor/dht.rb +0 -29
- data/examples/sensor/ds18b20.rb +0 -57
- data/examples/sensor/generic_pir.rb +0 -27
- data/examples/sensor/hcsr04.rb +0 -17
- data/examples/sensor/htu21d.rb +0 -43
- data/examples/sensor/htu31d.rb +0 -33
- data/examples/sensor/neat_tph_readings.rb +0 -32
- data/examples/sensor/qmp6988.rb +0 -51
- data/examples/sensor/rcwl9620.rb +0 -15
- data/examples/sensor/sht3x.rb +0 -32
- data/examples/spi/bitbang_loopback.rb +0 -46
- data/examples/spi/input_register.rb +0 -40
- data/examples/spi/output_register.rb +0 -41
- data/examples/spi/ssd_through_registers.rb +0 -28
- data/examples/spi/two_registers.rb +0 -40
- data/examples/uart/bit_bang_demo.rb +0 -25
- data/examples/uart/board_passthrough.rb +0 -40
- data/examples/uart/hardware_loopback.rb +0 -16
- data/lib/denko/eeprom/built_in.rb +0 -72
- data/lib/denko/fonts.rb +0 -106
- data/test/eeprom/built_in_test.rb +0 -61
- data/test/spi/peripheral_single_pin_test.rb +0 -48
- data/tutorial/01-led/led.fzz +0 -0
- data/tutorial/01-led/led.pdf +0 -0
- data/tutorial/01-led/led.rb +0 -73
- data/tutorial/02-button/button.fzz +0 -0
- data/tutorial/02-button/button.pdf +0 -0
- data/tutorial/02-button/button.rb +0 -65
- data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
- data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
- data/tutorial/03-potentiometer/potentiometer.rb +0 -66
- data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
- data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
- data/tutorial/04-pwm_led/pwm_led.rb +0 -64
- data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
- data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
- data/tutorial/05-rgb_led/rgb_led.rb +0 -58
- data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
data/lib/denko/sensor/aht.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Denko
|
2
2
|
module Sensor
|
3
|
-
class
|
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
|
-
|
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
|
-
|
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.
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
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
|
data/lib/denko/sensor/bme280.rb
CHANGED
@@ -81,7 +81,7 @@ module Denko
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def state
|
84
|
-
|
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(
|
185
|
-
|
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
|
-
|
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
|
-
#
|
297
|
-
|
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
|
-
#
|
285
|
+
# Calibration B, only on BME280.
|
300
286
|
if humidity_available?
|
301
|
-
|
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?)
|
data/lib/denko/sensor/bmp180.rb
CHANGED
@@ -38,7 +38,7 @@ module Denko
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def state
|
41
|
-
|
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
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
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
|
-
|
203
|
-
|
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)
|
data/lib/denko/sensor/dht.rb
CHANGED
@@ -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
|
-
|
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:
|
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
|
-
|
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.
|
50
|
-
|
51
|
-
|
52
|
-
|
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)
|
data/lib/denko/sensor/ds18b20.rb
CHANGED
@@ -6,7 +6,7 @@ module Denko
|
|
6
6
|
FAMILY_CODE = 0x28
|
7
7
|
|
8
8
|
def state
|
9
|
-
|
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.
|
47
|
-
|
48
|
-
|
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
|
data/lib/denko/sensor/htu21d.rb
CHANGED
@@ -27,7 +27,7 @@ module Denko
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def state
|
30
|
-
|
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: #{
|
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.
|
133
|
-
|
134
|
-
|
135
|
-
|
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
|
#
|
data/lib/denko/sensor/htu31d.rb
CHANGED
@@ -67,7 +67,7 @@ module Denko
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def state
|
70
|
-
|
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.
|
161
|
-
|
162
|
-
|
163
|
-
|
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
|
data/lib/denko/sensor/qmp6988.rb
CHANGED
@@ -90,7 +90,7 @@ module Denko
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def state
|
93
|
-
|
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
|
-
|
168
|
-
|
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
|
-
|
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.
|
227
|
-
|
228
|
-
|
229
|
-
|
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
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
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
|
-
|
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)
|