denko 0.13.6 → 0.14.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_avr.yml → build_atmega_avr.yml} +18 -18
- data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +18 -18
- data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +17 -17
- data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +18 -18
- data/.github/workflows/build_esp32.yml +17 -18
- data/.github/workflows/build_esp32c3.yml +57 -0
- data/.github/workflows/build_esp32c6.yml +57 -0
- data/.github/workflows/build_esp32h2.yml +56 -0
- data/.github/workflows/build_esp32s2.yml +57 -0
- data/.github/workflows/build_esp32s3.yml +57 -0
- data/.github/workflows/build_esp8266.yml +15 -15
- data/.github/workflows/build_ra4m1.yml +16 -16
- data/.github/workflows/build_rp2040.yml +17 -16
- data/.github/workflows/ruby.yml +20 -20
- data/CHANGELOG.md +195 -11
- data/DEPS_CLI.md +9 -9
- data/DEPS_IDE.md +17 -18
- data/HARDWARE.md +50 -51
- data/README.md +61 -53
- data/Rakefile +1 -1
- data/benchmarks/analog_listen.rb +49 -0
- data/benchmarks/digital_write.rb +28 -0
- data/benchmarks/i2c_ssd1306_refresh.rb +13 -6
- data/build +1 -1
- data/denko.gemspec +5 -2
- data/examples/advanced/{m5_env.rb → m5_env3.rb} +12 -14
- data/examples/advanced/rotary_encoder_mac_volume.rb +18 -13
- data/examples/advanced/ssd1306_time_temp_rh.rb +8 -13
- data/examples/analog_io/ads1100.rb +48 -0
- data/examples/analog_io/ads1115.rb +2 -2
- data/examples/analog_io/ads1118.rb +3 -11
- data/examples/analog_io/input.rb +17 -16
- data/examples/analog_io/input_smoothing.rb +27 -0
- data/examples/analog_io/potentiometer.rb +31 -0
- data/examples/connection/binary_echo.rb +34 -0
- data/examples/connection/tcp.rb +12 -27
- data/examples/digital_io/button.rb +7 -3
- data/examples/digital_io/relay.rb +17 -0
- data/examples/digital_io/rotary_encoder.rb +21 -11
- data/examples/display/hd44780.rb +13 -5
- data/examples/display/ssd1306.rb +20 -17
- data/examples/display/ssd1306_s2_pico.rb +2 -2
- data/examples/i2c/search.rb +10 -26
- data/examples/led/apa102_bounce.rb +3 -4
- data/examples/led/apa102_fade.rb +44 -0
- data/examples/led/builtin_blink.rb +3 -1
- data/examples/led/builtin_fade.rb +19 -0
- data/examples/led/rgb_led.rb +31 -0
- data/examples/led/seven_segment_char_echo.rb +4 -2
- data/examples/led/ws2812_bounce.rb +5 -7
- data/examples/led/ws2812_builtin_blink.rb +3 -2
- data/examples/led/ws2812_fade.rb +43 -0
- data/examples/motor/l298.rb +10 -8
- data/examples/motor/servo.rb +4 -3
- data/examples/motor/stepper.rb +13 -13
- data/examples/one_wire/search.rb +32 -0
- data/examples/pulse_io/buzzer.rb +8 -3
- data/examples/pulse_io/ir_output.rb +51 -0
- data/examples/pulse_io/pwm_output.rb +30 -0
- data/examples/rtc/ds3231.rb +18 -35
- data/examples/sensor/aht10.rb +4 -6
- data/examples/sensor/aht20.rb +4 -6
- data/examples/sensor/bme280.rb +4 -4
- data/examples/sensor/bmp180.rb +9 -5
- data/examples/sensor/dht.rb +20 -15
- data/examples/sensor/ds18b20.rb +20 -21
- data/examples/sensor/generic_pir.rb +4 -2
- data/examples/sensor/hcsr04.rb +5 -2
- data/examples/sensor/htu21d.rb +9 -20
- data/examples/sensor/htu31d.rb +7 -9
- data/examples/sensor/neat_tph_readings.rb +15 -9
- data/examples/sensor/qmp6988.rb +5 -7
- data/examples/sensor/rcwl9620.rb +3 -3
- data/examples/sensor/sht3x.rb +4 -6
- data/examples/spi/bitbang_loopback.rb +46 -0
- data/examples/spi/input_register.rb +9 -19
- data/examples/spi/output_register.rb +9 -17
- data/examples/spi/ssd_through_registers.rb +28 -0
- data/examples/spi/two_registers.rb +18 -24
- data/examples/uart/bit_bang_demo.rb +25 -0
- data/examples/uart/board_passthrough.rb +19 -13
- data/examples/uart/hardware_loopback.rb +1 -1
- data/lib/denko/analog_io/ads1100.rb +127 -0
- data/lib/denko/analog_io/ads1115.rb +8 -25
- data/lib/denko/analog_io/ads1118.rb +10 -25
- data/lib/denko/analog_io/ads111x.rb +25 -11
- data/lib/denko/analog_io/input.rb +29 -55
- data/lib/denko/analog_io/input_helper.rb +42 -0
- data/lib/denko/analog_io/output.rb +5 -5
- data/lib/denko/analog_io/potentiometer.rb +6 -8
- data/lib/denko/analog_io.rb +2 -1
- data/lib/denko/behaviors/board_proxy.rb +13 -1
- data/lib/denko/behaviors/bus_controller.rb +1 -0
- data/lib/denko/behaviors/bus_controller_addressed.rb +1 -0
- data/lib/denko/behaviors/bus_peripheral.rb +3 -4
- data/lib/denko/behaviors/bus_peripheral_addressed.rb +8 -6
- data/lib/denko/behaviors/callbacks.rb +9 -7
- data/lib/denko/behaviors/component.rb +16 -14
- data/lib/denko/behaviors/input_pin.rb +14 -15
- data/lib/denko/behaviors/lifecycle.rb +51 -0
- data/lib/denko/behaviors/multi_pin.rb +22 -18
- data/lib/denko/behaviors/output_pin.rb +9 -4
- data/lib/denko/behaviors/single_pin.rb +1 -0
- data/lib/denko/behaviors/state.rb +15 -9
- data/lib/denko/behaviors/subcomponents.rb +72 -12
- data/lib/denko/behaviors.rb +2 -1
- data/lib/denko/board/core.rb +36 -18
- data/lib/denko/board/i2c.rb +14 -14
- data/lib/denko/board/i2c_bit_bang.rb +49 -0
- data/lib/denko/board/infrared.rb +6 -6
- data/lib/denko/board/led_array.rb +6 -5
- data/lib/denko/board/spi.rb +15 -10
- data/lib/denko/board/spi_bit_bang.rb +9 -7
- data/lib/denko/board.rb +35 -33
- data/lib/denko/connection/binary_echo.rb +17 -0
- data/lib/denko/connection/flow_control.rb +11 -15
- data/lib/denko/connection/handshake.rb +2 -0
- data/lib/denko/digital_io/button.rb +4 -0
- data/lib/denko/digital_io/c_bit_bang.rb +15 -0
- data/lib/denko/digital_io/input.rb +4 -5
- data/lib/denko/digital_io/output.rb +7 -6
- data/lib/denko/digital_io/relay.rb +2 -0
- data/lib/denko/digital_io/rotary_encoder.rb +78 -60
- data/lib/denko/digital_io.rb +1 -0
- data/lib/denko/display/hd44780.rb +136 -93
- data/lib/denko/display/sh1106.rb +42 -0
- data/lib/denko/display/ssd1306.rb +105 -45
- data/lib/denko/display.rb +1 -0
- data/lib/denko/eeprom/built_in.rb +19 -16
- data/lib/denko/i2c/bit_bang.rb +31 -0
- data/lib/denko/i2c/bus.rb +8 -36
- data/lib/denko/i2c/bus_common.rb +45 -0
- data/lib/denko/i2c/peripheral.rb +28 -19
- data/lib/denko/i2c.rb +2 -0
- data/lib/denko/led/apa102.rb +43 -29
- data/lib/denko/led/base.rb +8 -2
- data/lib/denko/led/rgb.rb +5 -7
- data/lib/denko/led/seven_segment.rb +24 -9
- data/lib/denko/led/ws2812.rb +10 -7
- data/lib/denko/message.rb +5 -0
- data/lib/denko/motor/l298.rb +11 -10
- data/lib/denko/motor/servo.rb +22 -10
- data/lib/denko/motor/stepper.rb +11 -14
- data/lib/denko/mutex_stub.rb +7 -0
- data/lib/denko/one_wire/bus.rb +9 -5
- data/lib/denko/one_wire/peripheral.rb +0 -3
- data/lib/denko/pulse_io/buzzer.rb +9 -3
- data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +9 -4
- data/lib/denko/pulse_io/pwm_output.rb +69 -15
- data/lib/denko/pulse_io.rb +3 -3
- data/lib/denko/rtc/ds3231.rb +11 -13
- data/lib/denko/sensor/aht.rb +22 -21
- data/lib/denko/sensor/bme280.rb +60 -63
- data/lib/denko/sensor/bmp180.rb +41 -38
- data/lib/denko/sensor/dht.rb +22 -5
- data/lib/denko/sensor/ds18b20.rb +40 -34
- data/lib/denko/sensor/hcsr04.rb +7 -5
- data/lib/denko/sensor/helper.rb +37 -0
- data/lib/denko/sensor/htu21d.rb +44 -55
- data/lib/denko/sensor/htu31d.rb +32 -33
- data/lib/denko/sensor/qmp6988.rb +25 -23
- data/lib/denko/sensor/rcwl9620.rb +2 -5
- data/lib/denko/sensor/sht3x.rb +23 -21
- data/lib/denko/sensor.rb +1 -2
- data/lib/denko/spi/base_register.rb +22 -22
- data/lib/denko/spi/bit_bang.rb +17 -51
- data/lib/denko/spi/bus.rb +15 -29
- data/lib/denko/spi/bus_common.rb +36 -0
- data/lib/denko/spi/input_register.rb +36 -30
- data/lib/denko/spi/output_register.rb +25 -40
- data/lib/denko/spi/peripheral.rb +93 -24
- data/lib/denko/spi.rb +6 -1
- data/lib/denko/uart/bit_bang.rb +5 -3
- data/lib/denko/uart/hardware.rb +9 -8
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +10 -0
- data/lib/denko_cli/generator.rb +2 -2
- data/lib/denko_cli/packages.rb +8 -10
- data/lib/denko_cli/targets.rb +8 -8
- data/lib/denko_cli/targets.txt +4 -4
- data/lib/denko_cli/usage.txt +1 -1
- data/src/denko_ethernet.ino +0 -14
- data/src/denko_serial.ino +0 -14
- data/src/denko_wifi.ino +6 -15
- data/src/lib/Denko.cpp +39 -3
- data/src/lib/Denko.h +42 -26
- data/src/lib/DenkoCoreIO.cpp +57 -102
- data/src/lib/DenkoDefines.h +36 -31
- data/src/lib/DenkoI2C.cpp +54 -45
- data/src/lib/DenkoI2CBB.cpp +238 -0
- data/src/lib/DenkoIROut.cpp +12 -7
- data/src/lib/DenkoLEDArray.cpp +36 -13
- data/src/lib/DenkoSPI.cpp +6 -5
- data/src/lib/DenkoSPIBB.cpp +7 -6
- data/target.yml +37 -2
- data/test/analog_io/potentiometer_test.rb +10 -10
- data/test/behaviors/board_proxy_test.rb +1 -1
- data/test/behaviors/callbacks_test.rb +11 -3
- data/test/behaviors/component_test.rb +17 -9
- data/test/behaviors/input_pin_test.rb +14 -9
- data/test/behaviors/multi_pin_test.rb +14 -4
- data/test/behaviors/output_pin_test.rb +11 -8
- data/test/behaviors/poller_test.rb +1 -0
- data/test/behaviors/reader_test.rb +3 -2
- data/test/behaviors/subcomponents_test.rb +22 -2
- data/test/board/core_test.rb +15 -11
- data/test/board/i2c_test.rb +39 -33
- data/test/board/infrared_test.rb +1 -1
- data/test/board/message_test.rb +17 -11
- data/test/board/spi_test.rb +21 -21
- data/test/digital_io/button_test.rb +15 -0
- data/test/digital_io/relay_test.rb +18 -0
- data/test/digital_io/rotary_encoder_test.rb +80 -60
- data/test/eeprom/built_in_test.rb +9 -9
- data/test/i2c/bus_test.rb +30 -14
- data/test/i2c/peripheral_test.rb +36 -17
- data/test/led/base_test.rb +2 -1
- data/test/led/rgb_test.rb +6 -6
- data/test/led/seven_segment_test.rb +7 -7
- data/test/motor/servo_test.rb +1 -1
- data/test/motor/stepper_test.rb +2 -2
- data/test/one_wire/bus_test.rb +1 -0
- data/test/pulse_io/buzzer_test.rb +7 -4
- data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +10 -10
- data/test/pulse_io/pwm_output_test.rb +74 -18
- data/test/rtc/ds3231_test.rb +11 -13
- data/test/sensor/dht_test.rb +1 -1
- data/test/sensor/ds18b20_test.rb +4 -8
- data/test/spi/bus_test.rb +7 -7
- data/test/spi/input_register_test.rb +15 -15
- data/test/spi/output_register_test.rb +10 -28
- data/test/spi/peripheral_multi_pin_test.rb +53 -0
- data/test/spi/peripheral_single_pin_test.rb +48 -0
- data/test/test_helper.rb +36 -33
- data/tutorial/02-button/button.rb +5 -4
- data/tutorial/03-potentiometer/potentiometer.rb +9 -5
- data/tutorial/04-pwm_led/pwm_led.rb +14 -16
- data/tutorial/05-rgb_led/rgb_led.rb +6 -6
- data/tutorial/05-rgb_led/rgb_mapping.rb +11 -11
- data/vendor/board-maps/BoardMap.h +416 -56
- data/vendor/board-maps/lib/header_parser.rb +12 -2
- data/vendor/board-maps/yaml/ADAFRUIT_CAMERA_ESP32S3.yml +2 -2
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32C6.yml +15 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +1 -1
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_ADALOGGER.yml +44 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +1 -0
- data/vendor/board-maps/yaml/AMKEN_BB.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_ES.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_REVELOP.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_REVELOP_PLUS.yml +48 -0
- data/vendor/board-maps/yaml/ASL_CAN_X2.yml +41 -0
- data/vendor/board-maps/yaml/BLING.yml +25 -0
- data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +1 -0
- data/vendor/board-maps/yaml/BRIDGETEK_IDM2040_7A.yml +48 -0
- data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +13 -1
- data/vendor/board-maps/yaml/Breadstick_Raspberry.yml +31 -0
- data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32C6.yml +8 -0
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32C6.yml +20 -0
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_ESP32.yml +46 -0
- data/vendor/board-maps/yaml/DPTECHNICS_WALTER.yml +39 -0
- data/vendor/board-maps/yaml/ELECROW_CROWPANEL_7.yml +8 -0
- data/vendor/board-maps/yaml/ESP32C2_DEV.yml +12 -0
- data/vendor/board-maps/yaml/ESP32C3_DEVKIT_LIPO.yml +14 -0
- data/vendor/board-maps/yaml/ESP32C6_DEV.yml +15 -0
- data/vendor/board-maps/yaml/ESP32C6_EVB.yml +15 -0
- data/vendor/board-maps/yaml/ESP32C6_QWIIC_POCKET.yml +15 -0
- data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +15 -0
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +13 -0
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +13 -0
- data/vendor/board-maps/yaml/ESP32S2_DEV.yml +1 -0
- data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +2 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +44 -0
- data/vendor/board-maps/yaml/ESP32S3_DEVKIT_LIPO.yml +42 -0
- data/vendor/board-maps/yaml/ESP32S3_POWERFEATHER.yml +22 -0
- data/vendor/board-maps/yaml/ESP32_SBC_FABGL.yml +35 -0
- data/vendor/board-maps/yaml/EVN_ALPHA.yml +48 -0
- data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +14 -0
- data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -0
- data/vendor/board-maps/yaml/HELTEC_WIFI_LORA_32_V3.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_BRIDGE.yml +8 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_MINI_SHELL.yml +13 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_PAPER.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_SHELL_V3.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_STICK_LITE_V3.yml +30 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_TRACKER.yml +41 -0
- data/vendor/board-maps/yaml/HT_DE01.yml +42 -0
- data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
- data/vendor/board-maps/yaml/LILYGO_T3S3_LR1121.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1262.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1276.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1278.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280PA.yml +8 -0
- data/vendor/board-maps/yaml/LILYGO_T_ETH_LITE.yml +21 -0
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +14 -0
- data/vendor/board-maps/yaml/LOLIN_S3.yml +1 -0
- data/vendor/board-maps/yaml/LOLIN_S3_MINI_PRO.yml +40 -0
- data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -2
- data/vendor/board-maps/yaml/LoPy.yml +1 -0
- data/vendor/board-maps/yaml/LoPy4.yml +1 -0
- data/vendor/board-maps/yaml/M5STACK_CAPSULE.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_CARDPUTER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_DIAL.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +0 -1
- data/vendor/board-maps/yaml/M5STACK_NANOC6.yml +17 -0
- data/vendor/board-maps/yaml/M5STACK_PAPER.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_POE_CAM.yml +5 -0
- data/vendor/board-maps/yaml/M5STACK_STAMP_C3.yml +13 -0
- data/vendor/board-maps/yaml/M5STACK_STAMP_S3.yml +4 -0
- data/vendor/board-maps/yaml/{M5Stick_C.yml → M5STACK_STICKC.yml} +0 -1
- data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS2.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_TOUGH.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_UNIT_CAM.yml +10 -0
- data/vendor/board-maps/yaml/M5STACK_UNIT_CAMS3.yml +4 -0
- data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -1
- data/vendor/board-maps/yaml/MAKERGO_C3_SUPERMINI.yml +14 -0
- data/vendor/board-maps/yaml/MARBLE_PICO.yml +48 -0
- data/vendor/board-maps/yaml/METEHOCA_AKANA_R1.yml +46 -0
- data/vendor/board-maps/yaml/NAMINO_BIANCO.yml +13 -0
- data/vendor/board-maps/yaml/NEBULAS3.yml +0 -1
- data/vendor/board-maps/yaml/NEWSAN_ARCHI.yml +48 -0
- data/vendor/board-maps/yaml/NOLOGO_ESP32C3_SUPER_MINI.yml +14 -0
- data/vendor/board-maps/yaml/NOLOGO_ESP32S3_PICO.yml +12 -0
- data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_16MB.yml +48 -0
- data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_2MB.yml +48 -0
- data/vendor/board-maps/yaml/OPTA_ANALOG.yml +7 -0
- data/vendor/board-maps/yaml/OPTA_DIGITAL.yml +5 -0
- data/vendor/board-maps/yaml/PINTRONIX_PINMAX.yml +42 -0
- data/vendor/board-maps/yaml/PYCOM_GPY.yml +1 -0
- data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -1
- data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +12 -0
- data/vendor/board-maps/yaml/SPARKFUN_MICROMOD_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/SPARKFUN_PRO_MICRO_ESP32C3.yml +24 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER.yml +31 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +15 -0
- data/vendor/board-maps/yaml/TINYC6.yml +25 -0
- data/vendor/board-maps/yaml/UPESY_EDU_ESP32.yml +28 -0
- data/vendor/board-maps/yaml/UPESY_ESP32C3_BASIC.yml +13 -0
- data/vendor/board-maps/yaml/UPESY_ESP32C3_MINI.yml +12 -0
- data/vendor/board-maps/yaml/UPESY_ESP32S3_BASIC.yml +42 -0
- data/vendor/board-maps/yaml/VIRALINK_GATE32_01.yml +6 -0
- data/vendor/board-maps/yaml/VIRALINK_GATE32_11.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32S3_TOUCH_LCD_128.yml +8 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_MATRIX.yml +48 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +1 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_PIZERO.yml +47 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +1 -0
- data/vendor/board-maps/yaml/WEACT_STUDIO_ESP32C3.yml +14 -0
- data/vendor/board-maps/yaml/WIPY3.yml +1 -0
- data/vendor/board-maps/yaml/WT32_SC01_PLUS.yml +7 -0
- data/vendor/board-maps/yaml/WiFiduinoV2.yml +1 -0
- data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -1
- data/vendor/board-maps/yaml/XIAO_ESP32C6.yml +22 -0
- data/vendor/board-maps/yaml/unphone9.yml +8 -0
- metadata +169 -30
- data/examples/led/apa102_breathe.rb +0 -45
- data/examples/pulse_io/ir_transmitter.rb +0 -55
- data/examples/spi/ssd_through_register.rb +0 -40
- data/examples/uart/bit_bang_read.rb +0 -16
- data/examples/uart/bit_bang_write.rb +0 -16
- data/lib/denko/analog_io/sensor.rb +0 -6
- data/lib/denko/sensor/virtual.rb +0 -42
- data/src/lib/DenkoIROutESP.cpp +0 -26
- data/vendor/board-maps/yaml/STAMP_S3.yml +0 -8
- /data/vendor/board-maps/yaml/{BRIDGETEK_IDM2040-7A.yml → BRIDGETEK_IDM2040_43A.yml} +0 -0
- /data/vendor/board-maps/yaml/{heltec_wifi_32_lora_V3.yml → HELTEC_WIRELESS_STICK_V3.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stack_Core_ESP32.yml → M5STACK_CORE.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stamp_Pico.yml → M5STACK_STAMP_PICO.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stack-Timer-CAM.yml → M5STACK_TIMER_CAM.yml} +0 -0
data/lib/denko/led/rgb.rb
CHANGED
@@ -21,17 +21,15 @@ module Denko
|
|
21
21
|
off: [000, 000, 000]
|
22
22
|
}
|
23
23
|
|
24
|
-
def write(
|
25
|
-
red.write
|
26
|
-
green.write
|
27
|
-
blue.write
|
24
|
+
def write(r, g, b)
|
25
|
+
red.write(r)
|
26
|
+
green.write(g)
|
27
|
+
blue.write(b)
|
28
28
|
end
|
29
29
|
|
30
30
|
def color=(color)
|
31
|
-
return write(color) if color.class == Array
|
32
|
-
|
33
31
|
color = color.to_sym
|
34
|
-
write(COLORS[color]) if COLORS.include? color
|
32
|
+
write(*COLORS[color]) if COLORS.include? color
|
35
33
|
end
|
36
34
|
end
|
37
35
|
end
|
@@ -2,7 +2,8 @@ module Denko
|
|
2
2
|
module LED
|
3
3
|
class SevenSegment
|
4
4
|
include Behaviors::MultiPin
|
5
|
-
|
5
|
+
include Behaviors::Lifecycle
|
6
|
+
|
6
7
|
ALL_OFF = [0,0,0,0,0,0,0]
|
7
8
|
BLANK = " "
|
8
9
|
|
@@ -14,13 +15,15 @@ module Denko
|
|
14
15
|
proxy_pin :cathode, DigitalIO::Output, optional: true
|
15
16
|
proxy_pin :anode, DigitalIO::Output, optional: true
|
16
17
|
end
|
17
|
-
|
18
|
-
def
|
19
|
-
@segments
|
20
|
-
clear; on
|
18
|
+
|
19
|
+
def segments
|
20
|
+
@segments ||= [a,b,c,d,e,f,g]
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
after_initialize do
|
24
|
+
clear
|
25
|
+
on
|
26
|
+
end
|
24
27
|
|
25
28
|
def clear
|
26
29
|
write(BLANK)
|
@@ -46,7 +49,7 @@ module Denko
|
|
46
49
|
|
47
50
|
def on?; @on; end
|
48
51
|
def off?; !@on; end
|
49
|
-
|
52
|
+
|
50
53
|
CHARACTERS = {
|
51
54
|
'0' => [1,1,1,1,1,1,0],
|
52
55
|
'1' => [0,1,1,0,0,0,0],
|
@@ -93,9 +96,21 @@ module Denko
|
|
93
96
|
|
94
97
|
def write(char)
|
95
98
|
bits = CHARACTERS[char] || ALL_OFF
|
99
|
+
bits = bits.map { |b| 1^b } if anode
|
100
|
+
|
96
101
|
bits.each_with_index do |bit, index|
|
97
|
-
|
98
|
-
|
102
|
+
if board_is_register?
|
103
|
+
# On a register, use #bit_set except for the last bit. This changes state in memory.
|
104
|
+
# #digital_write on the last bit causes the register to write to its parallel out.
|
105
|
+
if (index == bits.length-1)
|
106
|
+
segments[index].digital_write(bit)
|
107
|
+
else
|
108
|
+
board.bit_set(segments[index].pin, bit)
|
109
|
+
end
|
110
|
+
else
|
111
|
+
# On a board, only set bits if changed.
|
112
|
+
segments[index].digital_write(bit) unless (segments[index].state == bit)
|
113
|
+
end
|
99
114
|
end
|
100
115
|
end
|
101
116
|
|
data/lib/denko/led/ws2812.rb
CHANGED
@@ -2,16 +2,19 @@ module Denko
|
|
2
2
|
module LED
|
3
3
|
class WS2812
|
4
4
|
include Behaviors::SinglePin
|
5
|
+
include Behaviors::Lifecycle
|
5
6
|
|
6
|
-
|
7
|
+
def length
|
8
|
+
@length ||= params[:length] || 1
|
9
|
+
end
|
10
|
+
|
11
|
+
def bpp
|
12
|
+
@bpp ||= params[:bpp] || 3
|
13
|
+
end
|
7
14
|
|
8
|
-
|
9
|
-
super(options)
|
10
|
-
raise ArgumentError, "no length given for WS2812 array" unless options[:length]
|
11
|
-
@length = options[:length]
|
15
|
+
attr_writer :length, :bpp
|
12
16
|
|
13
|
-
|
14
|
-
@bpp = 3
|
17
|
+
after_initialize do
|
15
18
|
off
|
16
19
|
end
|
17
20
|
|
data/lib/denko/message.rb
CHANGED
@@ -5,6 +5,11 @@ module Denko
|
|
5
5
|
VAL_MAX = 9999
|
6
6
|
|
7
7
|
def self.encode(command: nil, pin: nil, value: nil, aux_message: nil)
|
8
|
+
# Optimized single byte binary message for digital write on pins 0..63.
|
9
|
+
if (command == 1) && (pin < 64) && (value == 1 || value == 0)
|
10
|
+
return (pin | 0b10000000 | (value << 6)).chr
|
11
|
+
end
|
12
|
+
|
8
13
|
# Start building message backwards with aux_message first.
|
9
14
|
if aux_message
|
10
15
|
# Convert it to String.
|
data/lib/denko/motor/l298.rb
CHANGED
@@ -2,47 +2,48 @@ module Denko
|
|
2
2
|
module Motor
|
3
3
|
class L298
|
4
4
|
include Behaviors::MultiPin
|
5
|
+
include Behaviors::Lifecycle
|
5
6
|
|
6
7
|
attr_reader :speed
|
7
|
-
|
8
|
+
|
8
9
|
def initialize_pins(options={})
|
9
10
|
proxy_pin :direction1, DigitalIO::Output
|
10
11
|
proxy_pin :direction2, DigitalIO::Output
|
11
|
-
proxy_pin :enable, PulseIO::PWMOutput
|
12
|
+
proxy_pin :enable, PulseIO::PWMOutput
|
12
13
|
end
|
13
|
-
|
14
|
-
|
14
|
+
|
15
|
+
after_initialize do
|
15
16
|
off
|
16
17
|
end
|
17
18
|
|
18
19
|
def speed=(value)
|
19
|
-
enable.
|
20
|
+
enable.duty = value
|
20
21
|
@speed = value
|
21
22
|
end
|
22
|
-
|
23
|
+
|
23
24
|
def forward(value=nil)
|
24
25
|
direction1.high
|
25
26
|
direction2.low
|
26
27
|
self.speed = value if value
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
def reverse(value=nil)
|
30
31
|
direction1.low
|
31
32
|
direction2.high
|
32
33
|
self.speed = value if value
|
33
34
|
end
|
34
|
-
|
35
|
+
|
35
36
|
def idle
|
36
37
|
direction1.low
|
37
38
|
direction2.low
|
38
39
|
self.speed = 0
|
39
40
|
end
|
40
41
|
alias :off :idle
|
41
|
-
|
42
|
+
|
42
43
|
def brake
|
43
44
|
direction1.high
|
44
45
|
direction2.high
|
45
|
-
self.speed =
|
46
|
+
self.speed = 100
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
data/lib/denko/motor/servo.rb
CHANGED
@@ -3,16 +3,28 @@ module Denko
|
|
3
3
|
class Servo
|
4
4
|
include Behaviors::SinglePin
|
5
5
|
include Behaviors::Threaded
|
6
|
+
include Behaviors::Lifecycle
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
before_initialize do
|
9
|
+
params[:mode] = :output_pwm
|
10
|
+
end
|
11
|
+
|
12
|
+
after_initialize do
|
11
13
|
attach
|
12
14
|
end
|
13
15
|
|
16
|
+
def min
|
17
|
+
@min ||= params[:min] || 500
|
18
|
+
end
|
19
|
+
|
20
|
+
def max
|
21
|
+
@max ||= params[:max] || 2500
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_writer :min, :max
|
25
|
+
|
14
26
|
def attach
|
15
|
-
board.servo_toggle(pin, :on, min:
|
27
|
+
board.servo_toggle(pin, :on, min: min, max: max)
|
16
28
|
end
|
17
29
|
|
18
30
|
def detach
|
@@ -22,19 +34,19 @@ module Denko
|
|
22
34
|
def position=(value)
|
23
35
|
value = value % 180 unless value == 180
|
24
36
|
|
25
|
-
microseconds = ((value.to_f / 180) * (
|
37
|
+
microseconds = ((value.to_f / 180) * (max - min)) + min
|
26
38
|
board.servo_write(pin, microseconds.round)
|
27
39
|
|
28
|
-
|
40
|
+
self.state = value
|
29
41
|
end
|
30
42
|
|
31
43
|
def speed=(value)
|
32
44
|
raise 'invalid speed value' if value > 100 || value < -100
|
33
45
|
|
34
|
-
microseconds = (((value.to_f + 100) / 200) * (
|
46
|
+
microseconds = (((value.to_f + 100) / 200) * (max - min)) + min
|
35
47
|
board.servo_write(pin, microseconds.round)
|
36
48
|
|
37
|
-
|
49
|
+
self.state = value
|
38
50
|
end
|
39
51
|
|
40
52
|
alias :angle= :position=
|
@@ -43,7 +55,7 @@ module Denko
|
|
43
55
|
alias :speed :state
|
44
56
|
|
45
57
|
def write_microseconds(value)
|
46
|
-
raise 'invalid microsecond value' if value >
|
58
|
+
raise 'invalid microsecond value' if value > max || value < min
|
47
59
|
board.servo_write(pin, value)
|
48
60
|
end
|
49
61
|
end
|
data/lib/denko/motor/stepper.rb
CHANGED
@@ -2,25 +2,24 @@ module Denko
|
|
2
2
|
module Motor
|
3
3
|
class Stepper
|
4
4
|
include Behaviors::MultiPin
|
5
|
-
|
5
|
+
include Behaviors::Lifecycle
|
6
|
+
|
6
7
|
def initialize_pins(options={})
|
7
8
|
proxy_pin :step, DigitalIO::Output
|
8
9
|
proxy_pin :direction, DigitalIO::Output
|
9
|
-
|
10
|
+
|
10
11
|
proxy_pin :ms1, DigitalIO::Output, optional: true
|
11
12
|
proxy_pin :ms2, DigitalIO::Output, optional: true
|
12
13
|
proxy_pin :enable, DigitalIO::Output, optional: true
|
13
|
-
proxy_pin :slp, DigitalIO::Output, optional: true
|
14
|
+
proxy_pin :slp, DigitalIO::Output, optional: true
|
14
15
|
end
|
15
|
-
|
16
|
+
|
16
17
|
attr_reader :microsteps
|
17
|
-
|
18
|
-
|
19
|
-
wake
|
20
|
-
|
21
|
-
if (ms1 && ms2)
|
22
|
-
self.microsteps = 8
|
23
|
-
end
|
18
|
+
|
19
|
+
after_initialize do
|
20
|
+
wake
|
21
|
+
on
|
22
|
+
self.microsteps = 8 if (ms1 && ms2)
|
24
23
|
end
|
25
24
|
|
26
25
|
def sleep
|
@@ -53,7 +52,7 @@ module Denko
|
|
53
52
|
@microsteps = steps
|
54
53
|
end
|
55
54
|
|
56
|
-
def
|
55
|
+
def step_ccw
|
57
56
|
direction.high unless direction.high?
|
58
57
|
step.high
|
59
58
|
step.low
|
@@ -64,8 +63,6 @@ module Denko
|
|
64
63
|
step.high
|
65
64
|
step.low
|
66
65
|
end
|
67
|
-
|
68
|
-
alias :step_ccw :step_cc
|
69
66
|
end
|
70
67
|
end
|
71
68
|
end
|
data/lib/denko/one_wire/bus.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
module Denko
|
2
2
|
module OneWire
|
3
|
-
class Bus
|
4
|
-
include Behaviors::SinglePin
|
3
|
+
class Bus < DigitalIO::CBitBang
|
5
4
|
include Behaviors::BusControllerAddressed
|
6
5
|
include Behaviors::Reader
|
6
|
+
include Behaviors::Lifecycle
|
7
7
|
include BusEnumerator
|
8
8
|
include Constants
|
9
9
|
|
10
10
|
attr_reader :parasite_power
|
11
11
|
|
12
|
-
|
13
|
-
super(options)
|
12
|
+
after_initialize do
|
14
13
|
read_power_supply
|
15
14
|
end
|
16
15
|
|
@@ -53,7 +52,12 @@ module Denko
|
|
53
52
|
end
|
54
53
|
|
55
54
|
def pre_callback_filter(bytes)
|
56
|
-
|
55
|
+
# C extensions respond with Ruby array
|
56
|
+
# External Board responds with comma delimited String
|
57
|
+
unless bytes.class == Array
|
58
|
+
bytes = bytes.split(",").map(&:to_i)
|
59
|
+
end
|
60
|
+
|
57
61
|
bytes.length > 1 ? bytes : bytes[0]
|
58
62
|
end
|
59
63
|
end
|
@@ -1,8 +1,14 @@
|
|
1
1
|
module Denko
|
2
2
|
module PulseIO
|
3
3
|
class Buzzer < PWMOutput
|
4
|
-
|
5
|
-
|
4
|
+
include Behaviors::Lifecycle
|
5
|
+
|
6
|
+
before_initialize do
|
7
|
+
params[:mode] ||= :output_pwm
|
8
|
+
end
|
9
|
+
|
10
|
+
after_initialize do
|
11
|
+
board.no_tone(pin)
|
6
12
|
end
|
7
13
|
|
8
14
|
# Duration is in mills
|
@@ -13,7 +19,7 @@ module Denko
|
|
13
19
|
def no_tone
|
14
20
|
board.no_tone(pin)
|
15
21
|
end
|
16
|
-
|
22
|
+
|
17
23
|
# Kill the thread if running, and send no_tone.
|
18
24
|
def stop
|
19
25
|
stop_thread
|
@@ -1,11 +1,16 @@
|
|
1
1
|
module Denko
|
2
2
|
module PulseIO
|
3
|
-
class
|
3
|
+
class IROutput
|
4
4
|
include Behaviors::OutputPin
|
5
|
+
include Behaviors::Lifecycle
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
before_initialize do
|
8
|
+
params[:mode] = :output_pwm
|
9
|
+
end
|
10
|
+
|
11
|
+
def write(pulses=[], frequency: 38)
|
12
|
+
if pulses.length > 255 || pulses.length < 1
|
13
|
+
raise ArgumentError, 'wrong number of IR pulses (expected 1 to 255)'
|
9
14
|
end
|
10
15
|
|
11
16
|
pulses.each_with_index do |pulse, index|
|
@@ -1,34 +1,88 @@
|
|
1
1
|
module Denko
|
2
2
|
module PulseIO
|
3
3
|
class PWMOutput < DigitalIO::Output
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
super(options)
|
8
|
-
end
|
4
|
+
include Behaviors::Lifecycle
|
5
|
+
|
6
|
+
interrupt_with :write, :pwm_write, :digital_write, :duty=
|
9
7
|
|
10
|
-
def
|
11
|
-
if
|
12
|
-
|
13
|
-
elsif value == board.pwm_high
|
14
|
-
digital_write(board.high)
|
8
|
+
def duty=(percent)
|
9
|
+
if board_is_piboard
|
10
|
+
pwm_write(percent)
|
15
11
|
else
|
16
|
-
pwm_write(
|
12
|
+
pwm_write(((percent * pwm_high) / 100.0).round)
|
17
13
|
end
|
18
14
|
end
|
19
15
|
|
16
|
+
def digital_write(value)
|
17
|
+
pwm_disable if pwm_enabled
|
18
|
+
super(value)
|
19
|
+
end
|
20
|
+
|
20
21
|
def pwm_write(value)
|
22
|
+
pwm_enable unless pwm_enabled
|
23
|
+
board.pwm_write(pin, value)
|
24
|
+
self.state = value
|
25
|
+
end
|
26
|
+
alias :write :pwm_write
|
27
|
+
|
28
|
+
def frequency
|
29
|
+
@frequency ||= params[:frequency] || 1000
|
30
|
+
end
|
31
|
+
|
32
|
+
def resolution
|
33
|
+
@resolution ||= params[:resolution] || board.analog_write_resolution
|
34
|
+
end
|
35
|
+
|
36
|
+
def pwm_high
|
37
|
+
@pwm_high ||= (2**resolution-1)
|
38
|
+
end
|
39
|
+
|
40
|
+
def frequency=(value)
|
41
|
+
@frequency = value
|
21
42
|
pwm_enable
|
22
|
-
board.pwm_write(pin, @state = value)
|
23
43
|
end
|
24
44
|
|
25
|
-
def
|
26
|
-
|
45
|
+
def resolution=(value)
|
46
|
+
@resolution = value
|
47
|
+
@pwm_high = (2**value-1)
|
48
|
+
pwm_enable
|
27
49
|
end
|
28
|
-
|
50
|
+
|
51
|
+
def pwm_settings_hash
|
52
|
+
{ frequency: frequency, resolution: resolution }
|
53
|
+
end
|
54
|
+
|
55
|
+
def pwm_enable(frequency: nil, resolution: nil)
|
56
|
+
@frequency = frequency if frequency
|
57
|
+
if resolution
|
58
|
+
@resolution = resolution
|
59
|
+
@pwm_high = (2**resolution-1)
|
60
|
+
end
|
61
|
+
|
62
|
+
board.set_pin_mode(pin, :output_pwm, pwm_settings_hash)
|
63
|
+
@mode = :output_pwm
|
64
|
+
end
|
65
|
+
|
29
66
|
def pwm_disable
|
30
67
|
self.mode = :output
|
31
68
|
end
|
69
|
+
|
70
|
+
def pwm_enabled
|
71
|
+
mode == :output_pwm
|
72
|
+
end
|
73
|
+
|
74
|
+
def board_is_piboard
|
75
|
+
@board_is_piboard ||= piboard_check
|
76
|
+
end
|
77
|
+
|
78
|
+
def piboard_check
|
79
|
+
if Object.const_defined?("Denko::PiBoard")
|
80
|
+
if board.class.ancestors.include?(Denko::PiBoard)
|
81
|
+
return true
|
82
|
+
end
|
83
|
+
end
|
84
|
+
false
|
85
|
+
end
|
32
86
|
end
|
33
87
|
end
|
34
88
|
end
|
data/lib/denko/pulse_io.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Denko
|
2
2
|
module PulseIO
|
3
|
-
autoload :PWMOutput,
|
4
|
-
autoload :Buzzer,
|
5
|
-
autoload :
|
3
|
+
autoload :PWMOutput, "#{__dir__}/pulse_io/pwm_output"
|
4
|
+
autoload :Buzzer, "#{__dir__}/pulse_io/buzzer"
|
5
|
+
autoload :IROutput, "#{__dir__}/pulse_io/ir_output"
|
6
6
|
end
|
7
7
|
end
|
data/lib/denko/rtc/ds3231.rb
CHANGED
@@ -1,32 +1,30 @@
|
|
1
|
+
require 'bcd'
|
2
|
+
|
1
3
|
module Denko
|
2
4
|
module RTC
|
3
5
|
class DS3231
|
4
6
|
include I2C::Peripheral
|
5
|
-
require 'bcd'
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
super(options)
|
10
|
-
end
|
11
|
-
|
8
|
+
I2C_ADDRESS = 0x68
|
9
|
+
|
12
10
|
# Write start register 0x00, then bytes to set time.
|
13
11
|
def time=(time)
|
14
|
-
i2c_write [0
|
12
|
+
i2c_write [0] + time_to_bcd(time)
|
15
13
|
time
|
16
14
|
end
|
17
|
-
|
15
|
+
|
18
16
|
# Do a blocking read when #time is called.
|
19
17
|
alias :time :read
|
20
|
-
|
18
|
+
|
21
19
|
# Time data starts at register 0 and is 7 bytes long.
|
22
20
|
def _read
|
23
|
-
i2c_read(
|
21
|
+
i2c_read(7, register: 0)
|
24
22
|
end
|
25
|
-
|
23
|
+
|
26
24
|
def pre_callback_filter(bytes)
|
27
25
|
bcd_to_time(bytes)
|
28
26
|
end
|
29
|
-
|
27
|
+
|
30
28
|
# Convert Time object to 7 byte BCD sequence.
|
31
29
|
def time_to_bcd(time)
|
32
30
|
[ BCD.decode(time.sec),
|
@@ -37,7 +35,7 @@ module Denko
|
|
37
35
|
BCD.decode(time.month),
|
38
36
|
BCD.decode(time.year - 1970) ]
|
39
37
|
end
|
40
|
-
|
38
|
+
|
41
39
|
# Convert 7 byte BCD sequence to Time object.
|
42
40
|
def bcd_to_time(bytes)
|
43
41
|
t = bytes.map { |b| BCD.encode(b) }
|
data/lib/denko/sensor/aht.rb
CHANGED
@@ -3,9 +3,13 @@ module Denko
|
|
3
3
|
class AHT10
|
4
4
|
include I2C::Peripheral
|
5
5
|
include Behaviors::Poller
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include TemperatureHelper
|
8
|
+
|
9
|
+
I2C_ADDRESS = 0x38
|
6
10
|
|
7
11
|
# Commands
|
8
|
-
INIT_AND_CALIBRATE = [0xE1, 0x08, 0x00]
|
12
|
+
INIT_AND_CALIBRATE = [0xE1, 0x08, 0x00]
|
9
13
|
READ_STATUS_REGISTER = [0x71]
|
10
14
|
START_MEASUREMENT = [0xAC, 0x33, 0x00]
|
11
15
|
SOFT_RESET = [0xBA]
|
@@ -28,24 +32,21 @@ module Denko
|
|
28
32
|
# Number of bytes in each reading.
|
29
33
|
DATA_LENGTH = 6
|
30
34
|
|
31
|
-
|
32
|
-
@i2c_address = 0x38
|
33
|
-
super(options)
|
34
|
-
end
|
35
|
-
|
36
|
-
def after_initialize(options={})
|
37
|
-
super(options)
|
38
|
-
|
39
|
-
# Avoid repeated memory allocation for callback data and state.
|
40
|
-
@reading = { temperature: nil, humidity: nil }
|
41
|
-
self.state = { temperature: nil, humidity: nil }
|
35
|
+
after_initialize do
|
42
36
|
@status_register = 0x00
|
43
|
-
|
44
37
|
sleep(self.class::POWER_ON_DELAY)
|
45
38
|
reset
|
46
39
|
calibrate
|
47
40
|
end
|
48
41
|
|
42
|
+
def state
|
43
|
+
state_mutex.synchronize { @state = { temperature: nil, humidity: nil } }
|
44
|
+
end
|
45
|
+
|
46
|
+
def reading
|
47
|
+
@reading ||= { temperature: nil, humidity: nil }
|
48
|
+
end
|
49
|
+
|
49
50
|
def reset
|
50
51
|
i2c_write(SOFT_RESET)
|
51
52
|
sleep(RESET_DELAY)
|
@@ -68,14 +69,14 @@ module Denko
|
|
68
69
|
end
|
69
70
|
|
70
71
|
def read_status_register
|
71
|
-
read_using -> { i2c_read(
|
72
|
+
read_using -> { i2c_read(1, register: READ_STATUS_REGISTER) }
|
72
73
|
sleep(COMMAND_DELAY)
|
73
74
|
end
|
74
75
|
|
75
76
|
def _read
|
76
77
|
i2c_write(START_MEASUREMENT)
|
77
78
|
sleep(MEASURE_DELAY)
|
78
|
-
i2c_read(
|
79
|
+
i2c_read(self.class::DATA_LENGTH)
|
79
80
|
end
|
80
81
|
|
81
82
|
def pre_callback_filter(bytes)
|
@@ -91,17 +92,17 @@ module Denko
|
|
91
92
|
|
92
93
|
# Humidity uses the upper 4 bits of the shared byte as its lowest 4 bits.
|
93
94
|
h_raw = ((bytes[1] << 16) | (bytes[2] << 8) | (bytes[3])) >> 4
|
94
|
-
|
95
|
+
reading[:humidity] = (h_raw.to_f / 2**20) * 100
|
95
96
|
|
96
97
|
# Temperature uses the lower 4 bits of the shared byte as its highest 4 bits.
|
97
98
|
t_raw = ((bytes[3] & 0x0F) << 16) | (bytes[4] << 8) | bytes[5]
|
98
|
-
|
99
|
+
reading[:temperature] = (t_raw.to_f / 2**20) * 200 - 50
|
99
100
|
|
100
|
-
|
101
|
+
reading
|
101
102
|
end
|
102
103
|
|
103
104
|
def update_state(reading)
|
104
|
-
|
105
|
+
state_mutex.synchronize do
|
105
106
|
@state[:temperature] = reading[:temperature]
|
106
107
|
@state[:humidity] = reading[:humidity]
|
107
108
|
end
|
@@ -119,7 +120,7 @@ module Denko
|
|
119
120
|
# Changed constants compared to AHT10. Always access with self.class::CONSTANT_NAME
|
120
121
|
# in shared methods coming from the superclass.
|
121
122
|
#
|
122
|
-
INIT_AND_CALIBRATE = [0xBE, 0x08, 0x00]
|
123
|
+
INIT_AND_CALIBRATE = [0xBE, 0x08, 0x00]
|
123
124
|
POWER_ON_DELAY = 0.100
|
124
125
|
DATA_LENGTH = 7
|
125
126
|
|
@@ -156,7 +157,7 @@ module Denko
|
|
156
157
|
end
|
157
158
|
end
|
158
159
|
end
|
159
|
-
|
160
|
+
|
160
161
|
# Limit CRC size to 8 bits.
|
161
162
|
crc = crc & 0xFF
|
162
163
|
end
|