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/sht3x.rb
CHANGED
@@ -32,7 +32,7 @@ module Denko
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def state
|
35
|
-
|
35
|
+
@state ||= { temperature: nil, humidity: nil }
|
36
36
|
end
|
37
37
|
|
38
38
|
def reading
|
@@ -72,10 +72,11 @@ module Denko
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def update_state(reading)
|
75
|
-
state_mutex.
|
76
|
-
|
77
|
-
|
78
|
-
|
75
|
+
@state_mutex.lock
|
76
|
+
@state[:temperature] = reading[:temperature]
|
77
|
+
@state[:humidity] = reading[:humidity]
|
78
|
+
@state_mutex.unlock
|
79
|
+
@state
|
79
80
|
end
|
80
81
|
|
81
82
|
def reset
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module Denko
|
2
|
+
module Sensor
|
3
|
+
class SHT4X
|
4
|
+
include I2C::Peripheral
|
5
|
+
include Behaviors::Poller
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include TemperatureHelper
|
8
|
+
include HumidityHelper
|
9
|
+
|
10
|
+
I2C_ADDRESS = 0x44
|
11
|
+
|
12
|
+
RESET = 0x94
|
13
|
+
RESET_TIME = 0.001
|
14
|
+
READ_SERIAL_NUMBER = 0x89
|
15
|
+
|
16
|
+
REPEATABILITIES = {
|
17
|
+
high: {command: 0xFD, time: 0.010},
|
18
|
+
medium: {command: 0xF6, time: 0.005},
|
19
|
+
low: {command: 0xE0, time: 0.003},
|
20
|
+
}
|
21
|
+
|
22
|
+
after_initialize do
|
23
|
+
reset
|
24
|
+
self.repeatability = :high
|
25
|
+
end
|
26
|
+
|
27
|
+
def state
|
28
|
+
@state ||= { temperature: nil, humidity: nil }
|
29
|
+
end
|
30
|
+
|
31
|
+
def reading
|
32
|
+
@reading ||= { temperature: nil, humidity: nil }
|
33
|
+
end
|
34
|
+
|
35
|
+
def repeatability=(key)
|
36
|
+
raise ArgumentError, "invalid repeatability setting: #{key}" unless REPEATABILITIES.keys.include? key
|
37
|
+
@measurement_command = REPEATABILITIES[key][:command]
|
38
|
+
@measurement_time = REPEATABILITIES[key][:time]
|
39
|
+
end
|
40
|
+
|
41
|
+
def _read
|
42
|
+
i2c_write [@measurement_command]
|
43
|
+
sleep(@measurement_time)
|
44
|
+
i2c_read(6)
|
45
|
+
end
|
46
|
+
|
47
|
+
def pre_callback_filter(bytes)
|
48
|
+
# Temperature is bytes 0 to 2: MSB, LSB, CRC
|
49
|
+
if calculate_crc(bytes[0..2]) == bytes[2]
|
50
|
+
t_raw = (bytes[0] << 8) | bytes[1]
|
51
|
+
reading[:temperature] = (175 * t_raw / 65535.0) - 45
|
52
|
+
else
|
53
|
+
reading[:temperature] = nil
|
54
|
+
end
|
55
|
+
|
56
|
+
# Humidity is bytes 3 to 5: MSB, LSB, CRC
|
57
|
+
if calculate_crc(bytes[3..5]) == bytes[5]
|
58
|
+
h_raw = (bytes[3] << 8) | bytes[4]
|
59
|
+
reading[:humidity] = 100 * h_raw / 65535.0
|
60
|
+
else
|
61
|
+
reading[:humidity] = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
reading
|
65
|
+
end
|
66
|
+
|
67
|
+
def update_state(reading)
|
68
|
+
@state_mutex.lock
|
69
|
+
@state[:temperature] = reading[:temperature]
|
70
|
+
@state[:humidity] = reading[:humidity]
|
71
|
+
@state_mutex.unlock
|
72
|
+
@state
|
73
|
+
end
|
74
|
+
|
75
|
+
def reset
|
76
|
+
i2c_write [RESET]
|
77
|
+
sleep RESET_TIME
|
78
|
+
end
|
79
|
+
|
80
|
+
def serial
|
81
|
+
@serial ||= read_serial
|
82
|
+
end
|
83
|
+
|
84
|
+
def read_serial
|
85
|
+
i2c_write [READ_SERIAL_NUMBER]
|
86
|
+
sleep RESET_TIME
|
87
|
+
bytes = i2c_read_raw(6)
|
88
|
+
parse_serial(bytes)
|
89
|
+
end
|
90
|
+
|
91
|
+
def parse_serial(bytes)
|
92
|
+
# Serial bytes are laid out as [b0, b1, crc0+1, b2, b3, crc2+3]
|
93
|
+
if calculate_crc(bytes[0..2]) == bytes[2] && calculate_crc(bytes[3..5]) == bytes[5]
|
94
|
+
@serial = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[3] << 8) | bytes[4]
|
95
|
+
else
|
96
|
+
@serial = nil
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# CRC is same as AHT20 sensor. Copied from that file.
|
101
|
+
CRC_INITIAL_VALUE = 0xFF
|
102
|
+
CRC_POLYNOMIAL = 0x31
|
103
|
+
MSBIT_MASK = 0x80
|
104
|
+
|
105
|
+
def calculate_crc(bytes)
|
106
|
+
crc = CRC_INITIAL_VALUE
|
107
|
+
|
108
|
+
# Ignore last byte. That's the CRC value to compare with.
|
109
|
+
bytes.take(bytes.length - 1).each do |byte|
|
110
|
+
crc = crc ^ byte
|
111
|
+
8.times do
|
112
|
+
if (crc & MSBIT_MASK) > 0
|
113
|
+
crc = (crc << 1) ^ CRC_POLYNOMIAL
|
114
|
+
else
|
115
|
+
crc = crc << 1
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Limit CRC size to 8 bits.
|
121
|
+
crc = crc & 0xFF
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Denko
|
2
|
+
module Sensor
|
3
|
+
class VL53L0X
|
4
|
+
include I2C::Peripheral
|
5
|
+
include Behaviors::Poller
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include Denko::AnalogIO::InputHelper
|
8
|
+
|
9
|
+
I2C_ADDRESS = 0x29
|
10
|
+
|
11
|
+
REFERENCE_REGISTER_START = 0xC0
|
12
|
+
REFERENCE_VALUES = [0xEE, 0xAA, 0x10]
|
13
|
+
|
14
|
+
SYSRANGE_START = 0x00
|
15
|
+
POWER_MANAGEMENT_GO1_POWER_FORCE = 0x80
|
16
|
+
INTERNAL_TUNING_1 = 0x91
|
17
|
+
INTERNAL_TUNING_2 = 0xFF
|
18
|
+
RESULT_RANGE_STATUS = 0x14
|
19
|
+
|
20
|
+
attr_reader :stop_variable
|
21
|
+
attr_accessor :correction_offset
|
22
|
+
|
23
|
+
after_initialize do
|
24
|
+
# Verify reference registerrs
|
25
|
+
reference_regs = i2c_read_raw(REFERENCE_VALUES.length, register: REFERENCE_REGISTER_START)
|
26
|
+
raise "reference registers do not match. May not be VL53L0X" unless reference_regs == REFERENCE_VALUES
|
27
|
+
|
28
|
+
# Initialization sequence
|
29
|
+
@stop_variable = i2c_read_raw(1, register: INTERNAL_TUNING_1)[0]
|
30
|
+
i2c_write [POWER_MANAGEMENT_GO1_POWER_FORCE, 0x01]
|
31
|
+
i2c_write [INTERNAL_TUNING_2, 0x01]
|
32
|
+
i2c_write [SYSRANGE_START, 0x00]
|
33
|
+
i2c_write [INTERNAL_TUNING_1, stop_variable]
|
34
|
+
i2c_write [SYSRANGE_START, 0x01]
|
35
|
+
i2c_write [INTERNAL_TUNING_2, 0x00]
|
36
|
+
i2c_write [POWER_MANAGEMENT_GO1_POWER_FORCE, 0x00]
|
37
|
+
|
38
|
+
# Wait for initialization to complete.
|
39
|
+
sleep 0.010 while (i2c_read_raw(1, register: SYSRANGE_START)[0] & 0b01 > 0)
|
40
|
+
|
41
|
+
# Go into continuous mode.
|
42
|
+
i2c_write [SYSRANGE_START, 0x02]
|
43
|
+
end
|
44
|
+
|
45
|
+
def _read
|
46
|
+
i2c_read(2, register: RESULT_RANGE_STATUS + 10)
|
47
|
+
end
|
48
|
+
|
49
|
+
def pre_callback_filter(bytes)
|
50
|
+
# Distance is 2 bytes, big-endian.
|
51
|
+
mm = (bytes[0] << 8) | bytes[1]
|
52
|
+
mm = mm + correction_offset if correction_offset
|
53
|
+
# super handles smoothing if enabled.
|
54
|
+
return (mm > 0) ? super(mm) : nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/denko/sensor.rb
CHANGED
@@ -1,19 +1,37 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
SENSOR_FILES = [
|
4
|
+
[nil, "helper"],
|
5
|
+
[:DHT, "dht"],
|
6
|
+
[:DS18B20, "ds18b20"],
|
7
|
+
[:BMP180, "bmp180"],
|
8
|
+
[:BME280, "bme280"],
|
9
|
+
[:BMP280, "bme280"],
|
10
|
+
[:HDC1080, "hdc1080"],
|
11
|
+
[:HTU21D, "htu21d"],
|
12
|
+
[:HTU31D, "htu31d"],
|
13
|
+
[:AHT1X, "aht"],
|
14
|
+
[:AHT2X, "aht"],
|
15
|
+
[:AHT3X, "aht"],
|
16
|
+
[:SHT3X, "sht3x"],
|
17
|
+
[:SHT4X, "sht4x"],
|
18
|
+
[:QMP6988, "qmp6988"],
|
19
|
+
[:RCWL9620, "rcwl9620"],
|
20
|
+
[:HCSR04, "hcsr04"],
|
21
|
+
[:JSNSR04T, "jsnsr04t"],
|
22
|
+
[:GenericPIR, "generic_pir"],
|
23
|
+
[:VL53L0X, "vl53l0x"],
|
24
|
+
]
|
25
|
+
|
1
26
|
module Denko
|
2
27
|
module Sensor
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
autoload :AHT10, "#{__dir__}/sensor/aht"
|
12
|
-
autoload :AHT20, "#{__dir__}/sensor/aht"
|
13
|
-
autoload :SHT3X, "#{__dir__}/sensor/sht3x"
|
14
|
-
autoload :QMP6988, "#{__dir__}/sensor/qmp6988"
|
15
|
-
autoload :RCWL9620, "#{__dir__}/sensor/rcwl9620"
|
16
|
-
autoload :HCSR04, "#{__dir__}/sensor/hcsr04"
|
17
|
-
autoload :GenericPIR, "#{__dir__}/sensor/generic_pir"
|
28
|
+
SENSOR_FILES.each do |file|
|
29
|
+
file_path = "#{__dir__}/sensor/#{file[1]}"
|
30
|
+
if file[0]
|
31
|
+
autoload file[0], file_path
|
32
|
+
else
|
33
|
+
require file_path
|
34
|
+
end
|
35
|
+
end
|
18
36
|
end
|
19
37
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Denko
|
2
2
|
module SPI
|
3
3
|
class BaseRegister
|
4
|
-
include SPI::Peripheral
|
4
|
+
include SPI::Peripheral
|
5
5
|
include Behaviors::Lifecycle
|
6
6
|
#
|
7
7
|
# Registers can be a BoardProxy for components needing digital pins.
|
@@ -9,17 +9,21 @@ module Denko
|
|
9
9
|
#
|
10
10
|
include Behaviors::BoardProxy
|
11
11
|
|
12
|
+
def platform
|
13
|
+
:spi_register
|
14
|
+
end
|
15
|
+
|
16
|
+
def is_a_register?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
12
20
|
# Default registers to 1 byte, or 8 pins when used as Board Proxy.
|
13
21
|
# Can be ignored if reading / writing the register directly.
|
14
22
|
def bytes
|
15
|
-
@bytes
|
23
|
+
@bytes = params[:bytes] || 1
|
16
24
|
end
|
17
25
|
attr_writer :bytes
|
18
26
|
|
19
|
-
before_initialize do
|
20
|
-
self.bytes = params[:bytes] if params[:bytes]
|
21
|
-
end
|
22
|
-
|
23
27
|
# Select pin is active-low. Disable.
|
24
28
|
after_initialize do
|
25
29
|
self.high
|
@@ -30,7 +34,7 @@ module Denko
|
|
30
34
|
# pin as a 0 or 1 in an array that is (@bytes * 8) long.
|
31
35
|
#
|
32
36
|
def state
|
33
|
-
|
37
|
+
@state ||= Array.new(bytes*8) { 0 }
|
34
38
|
end
|
35
39
|
end
|
36
40
|
end
|
data/lib/denko/spi/bus_common.rb
CHANGED
@@ -3,34 +3,31 @@ module Denko
|
|
3
3
|
module BusCommon
|
4
4
|
include Behaviors::BusController
|
5
5
|
include Behaviors::Reader
|
6
|
-
extend Forwardable
|
7
6
|
|
8
7
|
# Add peripheral to self and the board. It gets callbacks directly from the board.
|
9
8
|
def add_component(component)
|
10
|
-
#
|
11
|
-
return unless component.pin
|
12
|
-
|
13
|
-
pins = components.map { |c| c.pin }
|
14
|
-
if pins.include? component.pin
|
15
|
-
raise ArgumentError, "duplicate select pin for #{component}"
|
16
|
-
end
|
17
|
-
|
9
|
+
# Don't check for select pin uniqueness. Board handles that.
|
18
10
|
components << component
|
19
|
-
board.add_component(component)
|
20
11
|
end
|
21
12
|
|
22
13
|
# Remove peripheral from self and the board.
|
23
14
|
def remove_component(component)
|
24
15
|
components.delete(component)
|
25
|
-
board.remove_component(component)
|
26
16
|
end
|
27
17
|
|
28
|
-
#
|
29
|
-
|
30
|
-
|
18
|
+
# Pass through to the real board for converting select/other pins.
|
19
|
+
def convert_pin(*args, **kwargs)
|
20
|
+
board.convert_pin(*args, **kwargs)
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_pin_mode(*args, **kwargs)
|
24
|
+
board.set_pin_mode(*args, **kwargs)
|
25
|
+
end
|
31
26
|
|
32
27
|
# If a component calls #stop, that's just a call to Board#spi_stop giving its select pin.
|
33
|
-
|
28
|
+
def stop(*args, **kwargs)
|
29
|
+
board.spi_stop(*args, **kwargs)
|
30
|
+
end
|
34
31
|
end
|
35
32
|
end
|
36
33
|
end
|
@@ -84,10 +84,8 @@ module Denko
|
|
84
84
|
|
85
85
|
bits = byte_array_to_bit_array(byte_array)
|
86
86
|
|
87
|
-
callback_mutex.
|
88
|
-
|
89
|
-
break if @callbacks.empty?
|
90
|
-
|
87
|
+
@callback_mutex.lock
|
88
|
+
if @callbacks && !@callbacks.empty?
|
91
89
|
# Arduino doesn't de-duplicate state. Do it, but honor :force_update callbacks.
|
92
90
|
if (bits != state) || @callbacks[:force_update]
|
93
91
|
@callbacks.each_value do |array|
|
@@ -98,7 +96,9 @@ module Denko
|
|
98
96
|
# Remove both :read and :force update while inside the lock.
|
99
97
|
@callbacks.delete(:read)
|
100
98
|
@callbacks.delete(:force_update)
|
101
|
-
|
99
|
+
end
|
100
|
+
@callback_mutex.unlock
|
101
|
+
|
102
102
|
self.state = bits
|
103
103
|
end
|
104
104
|
|
@@ -107,7 +107,7 @@ module Denko
|
|
107
107
|
if listening_pins[pin] && (value != state[pin])
|
108
108
|
part.update(value)
|
109
109
|
# Also update if the component forced a read.
|
110
|
-
# Always called inside callback_mutex, so @callbacks, not callbacks
|
110
|
+
# Always called inside @callback_mutex, so @callbacks, not callbacks
|
111
111
|
elsif reading_pins[pin] && @callbacks[:force_update]
|
112
112
|
part.update(value)
|
113
113
|
end
|
@@ -14,8 +14,8 @@ module Denko
|
|
14
14
|
#
|
15
15
|
def write
|
16
16
|
bytes = []
|
17
|
-
state_mutex.
|
18
|
-
|
17
|
+
@state_mutex.lock
|
18
|
+
if @state != @previous_state
|
19
19
|
@state.each_slice(8) do |slice|
|
20
20
|
# Convert nils in the slice to zero.
|
21
21
|
zeroed = slice.map { |bit| bit.to_i }
|
@@ -27,9 +27,11 @@ module Denko
|
|
27
27
|
# Pack bytes in reverse order.
|
28
28
|
bytes.unshift byte
|
29
29
|
end
|
30
|
+
spi_write(bytes)
|
30
31
|
@previous_state = @state.dup
|
31
32
|
end
|
32
|
-
|
33
|
+
@state_mutex.unlock
|
34
|
+
@state
|
33
35
|
end
|
34
36
|
|
35
37
|
#
|
@@ -41,12 +43,19 @@ module Denko
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def bit_set(pin, value)
|
44
|
-
state_mutex.
|
46
|
+
@state_mutex.lock
|
47
|
+
@state[pin] = value
|
48
|
+
@state_mutex.unlock
|
49
|
+
value
|
45
50
|
end
|
46
51
|
|
47
52
|
def digital_read(pin)
|
48
53
|
state[pin]
|
49
54
|
end
|
55
|
+
|
56
|
+
def pin_is_pwm?(pin)
|
57
|
+
false
|
58
|
+
end
|
50
59
|
end
|
51
60
|
end
|
52
61
|
end
|
data/lib/denko/spi/peripheral.rb
CHANGED
@@ -1,111 +1,109 @@
|
|
1
1
|
module Denko
|
2
2
|
module SPI
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
3
|
+
class ChipSelect
|
4
|
+
include Behaviors::SinglePin
|
5
|
+
include Behaviors::Callbacks
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
|
8
|
+
before_initialize do
|
9
|
+
# It actually functions as an output.
|
10
|
+
params[:mode] = :output
|
11
|
+
|
12
|
+
# But we can't claim it on Linux (the SPI hardware handles it), so don't.
|
13
|
+
if !Denko.mruby? && Object.const_defined?("Denko::PiBoard")
|
14
|
+
board = params[:board]
|
15
|
+
if board.class.ancestors.include?(Denko::PiBoard)
|
16
|
+
params[:mode] = nil
|
17
|
+
end
|
18
18
|
end
|
19
|
+
end
|
20
|
+
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
module Peripheral
|
23
|
+
include Behaviors::MultiPin
|
24
|
+
include Behaviors::BusPeripheral
|
25
|
+
include Behaviors::Callbacks
|
26
|
+
include Behaviors::Lifecycle
|
27
|
+
|
28
|
+
# We have the SPI bus set as our board, but the select pin,
|
29
|
+
# and any other pins, need to attach to the underlying board.
|
30
|
+
def proxy_pin(*args, **kwargs)
|
31
|
+
kwargs[:board] = bus.board
|
32
|
+
super(*args, **kwargs)
|
33
|
+
end
|
28
34
|
|
29
|
-
|
30
|
-
|
35
|
+
# If given just one value in pin:, treat that as the select pin.
|
36
|
+
before_initialize do
|
37
|
+
if (params[:pin].class != Hash) && (!params[:pins])
|
38
|
+
params[:pins] = { select: params[:pin] }
|
39
|
+
params[:pin] = nil
|
31
40
|
end
|
41
|
+
end
|
32
42
|
|
33
|
-
|
34
|
-
|
35
|
-
|
43
|
+
# Chip select pin is always treated as a subcomponent
|
44
|
+
def initialize_pins(params={})
|
45
|
+
super(params)
|
46
|
+
proxy_pin :select, ChipSelect, mode: :output
|
47
|
+
end
|
36
48
|
|
37
|
-
|
38
|
-
|
39
|
-
|
49
|
+
# SelectPin is a separate component that receives updates from Board.
|
50
|
+
# Forward them to the Peripheral
|
51
|
+
after_initialize do
|
52
|
+
select.add_callback(:peripheral_forwarder) { |data| self.update(data) }
|
53
|
+
end
|
40
54
|
|
41
|
-
|
42
|
-
|
55
|
+
def ensure_byte_array(message)
|
56
|
+
if message.class == Array
|
57
|
+
# Byte array coming from PiBoard.
|
58
|
+
return message
|
59
|
+
else
|
60
|
+
# Split up comma delimited bytes coming from a microcontroller.
|
61
|
+
return message.split(",").map { |b| b.to_i }
|
43
62
|
end
|
63
|
+
end
|
44
64
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
return message
|
49
|
-
else
|
50
|
-
# Split up comma delimited bytes coming from a microcontroller.
|
51
|
-
return message.split(",").map { |b| b.to_i }
|
52
|
-
end
|
53
|
-
end
|
65
|
+
def update(message)
|
66
|
+
super(ensure_byte_array(message))
|
67
|
+
end
|
54
68
|
|
55
|
-
|
56
|
-
|
57
|
-
|
69
|
+
#
|
70
|
+
# SPI Properties
|
71
|
+
#
|
72
|
+
def spi_frequency
|
73
|
+
@spi_frequency ||= params[:spi_frequency] || 1_000_000
|
58
74
|
end
|
59
75
|
|
60
|
-
|
61
|
-
|
62
|
-
include Behaviors::Callbacks
|
63
|
-
include Behaviors::Lifecycle
|
64
|
-
|
65
|
-
before_initialize do
|
66
|
-
# It actually functions as an output.
|
67
|
-
params[:mode] = :output
|
68
|
-
|
69
|
-
# But we can't claim it on Linux (the SPI hardware handles it), so don't.
|
70
|
-
if Object.const_defined?("Denko::PiBoard")
|
71
|
-
bus = params[:bus] || params[:board]
|
72
|
-
if bus.board.class.ancestors.include?(Denko::PiBoard)
|
73
|
-
params[:mode] = nil
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
76
|
+
def spi_mode
|
77
|
+
@spi_mode ||= params[:spi_mode] || 0
|
77
78
|
end
|
78
79
|
|
79
|
-
|
80
|
-
|
80
|
+
def spi_bit_order
|
81
|
+
@spi_bit_order ||= params[:spi_bit_order] || :msbfirst
|
81
82
|
end
|
82
83
|
|
83
|
-
|
84
|
-
include Core
|
85
|
-
include ChipSelectBehavior
|
84
|
+
attr_writer :spi_frequency, :spi_mode, :spi_bit_order
|
86
85
|
|
87
|
-
|
88
|
-
|
89
|
-
|
86
|
+
#
|
87
|
+
# Delegate methods to the bus.
|
88
|
+
#
|
89
|
+
def spi_transfer(write: [], read: 0)
|
90
|
+
bus.transfer(select.pin, write: write, read: read, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
|
90
91
|
end
|
91
92
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
include Behaviors::Lifecycle
|
93
|
+
def spi_write(byte_array)
|
94
|
+
bus.transfer(select.pin, write: byte_array, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
|
95
|
+
end
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
97
|
+
def spi_read(num_bytes)
|
98
|
+
bus.transfer(select.pin, read: num_bytes, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
|
99
|
+
end
|
100
100
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
end
|
101
|
+
def spi_listen(num_bytes)
|
102
|
+
bus.listen(select.pin, read: num_bytes, frequency: spi_frequency, mode: spi_mode, bit_order: spi_bit_order)
|
103
|
+
end
|
105
104
|
|
106
|
-
|
107
|
-
|
108
|
-
end
|
105
|
+
def spi_stop
|
106
|
+
bus.stop(select.pin)
|
109
107
|
end
|
110
108
|
end
|
111
109
|
end
|
data/lib/denko/spi.rb
CHANGED
@@ -1,15 +1,25 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
SPI_FILES = [
|
4
|
+
[:BusCommon, "bus_common"],
|
5
|
+
[:Bus, "bus"],
|
6
|
+
[:BitBang, "bit_bang"],
|
7
|
+
[:ChipSelect, "peripheral"],
|
8
|
+
[:Peripheral, "peripheral"],
|
9
|
+
[:BaseRegister, "base_register"],
|
10
|
+
[:InputRegister, "input_register"],
|
11
|
+
[:OutputRegister, "output_register"],
|
12
|
+
]
|
13
|
+
|
1
14
|
module Denko
|
2
15
|
module SPI
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
16
|
+
SPI_FILES.each do |file|
|
17
|
+
file_path = "#{__dir__}/spi/#{file[1]}"
|
18
|
+
if file[0]
|
19
|
+
autoload file[0], file_path
|
20
|
+
else
|
21
|
+
require file_path
|
22
|
+
end
|
10
23
|
end
|
11
|
-
autoload :BaseRegister, "#{__dir__}/spi/base_register"
|
12
|
-
autoload :InputRegister, "#{__dir__}/spi/input_register"
|
13
|
-
autoload :OutputRegister, "#{__dir__}/spi/output_register"
|
14
24
|
end
|
15
25
|
end
|