denko 0.13.6 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/{build_avr.yml → build_atmega_avr.yml} +19 -18
- data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +19 -18
- data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +18 -17
- data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +19 -18
- data/.github/workflows/build_esp32.yml +19 -18
- data/.github/workflows/build_esp32c3.yml +58 -0
- data/.github/workflows/build_esp32c6.yml +59 -0
- data/.github/workflows/build_esp32h2.yml +58 -0
- data/.github/workflows/build_esp32s2.yml +59 -0
- data/.github/workflows/build_esp32s3.yml +59 -0
- data/.github/workflows/build_esp8266.yml +16 -15
- data/.github/workflows/build_ra4m1.yml +17 -16
- data/.github/workflows/build_rp2040.yml +19 -17
- data/.github/workflows/ruby.yml +20 -20
- data/CHANGELOG.md +398 -11
- data/DEPS_CLI.md +16 -16
- data/DEPS_IDE.md +39 -39
- data/MICROCONTROLLERS.md +103 -0
- data/PERIPHERALS.md +178 -0
- data/README.md +73 -58
- data/Rakefile +1 -1
- data/build +1 -1
- data/denko.gemspec +11 -3
- 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 +12 -27
- data/lib/denko/analog_io/ads111x.rb +39 -21
- data/lib/denko/analog_io/input.rb +29 -55
- data/lib/denko/analog_io/input_helper.rb +42 -0
- data/lib/denko/analog_io/joystick.rb +87 -0
- data/lib/denko/analog_io/output.rb +5 -5
- data/lib/denko/analog_io/potentiometer.rb +3 -9
- data/lib/denko/analog_io.rb +22 -7
- data/lib/denko/behaviors/board_proxy.rb +13 -1
- data/lib/denko/behaviors/bus_controller.rb +3 -1
- 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 +18 -14
- data/lib/denko/behaviors/component.rb +12 -14
- data/lib/denko/behaviors/input_pin.rb +14 -15
- data/lib/denko/behaviors/lifecycle.rb +51 -0
- data/lib/denko/behaviors/listener.rb +9 -3
- data/lib/denko/behaviors/multi_pin.rb +22 -20
- data/lib/denko/behaviors/output_pin.rb +9 -4
- data/lib/denko/behaviors/poller.rb +11 -2
- data/lib/denko/behaviors/reader.rb +109 -21
- data/lib/denko/behaviors/single_pin.rb +3 -4
- data/lib/denko/behaviors/state.rb +24 -13
- data/lib/denko/behaviors/subcomponents.rb +72 -12
- data/lib/denko/behaviors/threaded.rb +19 -8
- data/lib/denko/behaviors.rb +36 -22
- data/lib/denko/board/core.rb +36 -18
- data/lib/denko/board/eeprom.rb +1 -1
- data/lib/denko/board/i2c.rb +15 -15
- data/lib/denko/board/i2c_bit_bang.rb +53 -0
- data/lib/denko/board/infrared.rb +6 -6
- data/lib/denko/board/led_array.rb +6 -5
- data/lib/denko/board/map.rb +6 -2
- data/lib/denko/board/one_wire.rb +3 -3
- data/lib/denko/board/spi.rb +35 -30
- data/lib/denko/board/spi_bit_bang.rb +14 -15
- data/lib/denko/board.rb +41 -36
- data/lib/denko/connection/binary_echo.rb +17 -0
- data/lib/denko/connection/flow_control.rb +12 -16
- data/lib/denko/connection/handshake.rb +2 -0
- data/lib/denko/connection/serial.rb +5 -5
- 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 +19 -10
- data/lib/denko/digital_io/pcf8574.rb +114 -0
- data/lib/denko/digital_io/relay.rb +2 -0
- data/lib/denko/digital_io/rotary_encoder.rb +83 -61
- data/lib/denko/digital_io.rb +24 -5
- 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 +152 -105
- 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 +38 -0
- 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 -168
- 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 -3
- 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/helpers/mutex_stub.rb +13 -0
- data/lib/denko/helpers.rb +6 -0
- data/lib/denko/i2c/bit_bang.rb +32 -0
- data/lib/denko/i2c/bus.rb +8 -36
- data/lib/denko/i2c/bus_common.rb +50 -0
- data/lib/denko/i2c/peripheral.rb +32 -19
- data/lib/denko/i2c.rb +17 -2
- data/lib/denko/led/apa102.rb +42 -30
- data/lib/denko/led/base.rb +13 -2
- data/lib/denko/led/rgb.rb +18 -14
- data/lib/denko/led/seven_segment.rb +24 -9
- data/lib/denko/led/ws2812.rb +10 -7
- data/lib/denko/led.rb +17 -8
- data/lib/denko/message.rb +5 -0
- data/lib/denko/motor/{stepper.rb → a3967.rb} +12 -15
- data/lib/denko/motor/l298.rb +11 -10
- data/lib/denko/motor/servo.rb +37 -15
- data/lib/denko/motor.rb +16 -3
- data/lib/denko/one_wire/bus.rb +31 -23
- data/lib/denko/one_wire/bus_enumerator.rb +25 -14
- data/lib/denko/one_wire/helper.rb +4 -2
- data/lib/denko/one_wire/peripheral.rb +0 -3
- data/lib/denko/one_wire.rb +18 -5
- data/lib/denko/pulse_io/buzzer.rb +11 -9
- data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +6 -5
- data/lib/denko/pulse_io/pwm_output.rb +94 -15
- data/lib/denko/pulse_io.rb +17 -3
- data/lib/denko/rtc/ds3231.rb +13 -14
- data/lib/denko/rtc.rb +14 -1
- data/lib/denko/sensor/aht.rb +35 -38
- data/lib/denko/sensor/bme280.rb +76 -92
- data/lib/denko/sensor/bmp180.rb +46 -48
- data/lib/denko/sensor/dht.rb +34 -7
- data/lib/denko/sensor/ds18b20.rb +41 -34
- data/lib/denko/sensor/hcsr04.rb +7 -5
- data/lib/denko/sensor/hdc1080.rb +174 -0
- data/lib/denko/sensor/helper.rb +37 -0
- data/lib/denko/sensor/htu21d.rb +57 -57
- data/lib/denko/sensor/htu31d.rb +36 -36
- data/lib/denko/sensor/jsnsr04t.rb +49 -0
- data/lib/denko/sensor/qmp6988.rb +34 -48
- data/lib/denko/sensor/rcwl9620.rb +3 -5
- data/lib/denko/sensor/sht3x.rb +27 -24
- data/lib/denko/sensor/sht4x.rb +125 -0
- data/lib/denko/sensor/vl53l0x.rb +58 -0
- data/lib/denko/sensor.rb +33 -16
- data/lib/denko/spi/base_register.rb +25 -21
- data/lib/denko/spi/bit_bang.rb +17 -51
- data/lib/denko/spi/bus.rb +15 -29
- data/lib/denko/spi/bus_common.rb +33 -0
- data/lib/denko/spi/input_register.rb +37 -31
- data/lib/denko/spi/output_register.rb +33 -39
- data/lib/denko/spi/peripheral.rb +81 -14
- data/lib/denko/spi.rb +21 -6
- data/lib/denko/uart/bit_bang.rb +7 -30
- data/lib/denko/uart/common.rb +33 -0
- data/lib/denko/uart/hardware.rb +10 -34
- data/lib/denko/uart.rb +16 -2
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +23 -16
- data/lib/denko_cli/generator.rb +2 -2
- data/lib/denko_cli/packages.rb +8 -10
- data/lib/denko_cli/targets.rb +13 -13
- data/lib/denko_cli/targets.txt +23 -24
- 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 +65 -16
- data/src/lib/Denko.h +46 -30
- data/src/lib/DenkoCoreIO.cpp +57 -102
- data/src/lib/DenkoDefines.h +32 -46
- 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 +29 -13
- data/src/lib/DenkoSPI.cpp +36 -33
- data/src/lib/DenkoSPIBB.cpp +19 -20
- data/target.yml +37 -2
- data/test/analog_io/input_test.rb +1 -1
- data/test/analog_io/potentiometer_test.rb +12 -12
- data/test/behaviors/board_proxy_test.rb +1 -1
- data/test/behaviors/bus_peripheral_test.rb +4 -4
- data/test/behaviors/callbacks_test.rb +28 -10
- data/test/behaviors/component_test.rb +32 -14
- 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/board_test.rb +9 -9
- 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/one_wire_test.rb +25 -14
- data/test/board/spi_test.rb +45 -29
- data/test/digital_io/button_test.rb +15 -0
- data/test/digital_io/input_test.rb +2 -2
- data/test/digital_io/relay_test.rb +18 -0
- data/test/digital_io/rotary_encoder_test.rb +80 -60
- 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 +108 -29
- data/test/i2c/peripheral_test.rb +38 -19
- data/test/led/apa102_test.rb +24 -0
- data/test/led/base_test.rb +2 -1
- data/test/led/rgb_test.rb +9 -9
- data/test/led/seven_segment_test.rb +7 -7
- data/test/motor/{stepper_test.rb → a3967_test.rb} +4 -4
- data/test/motor/servo_test.rb +1 -1
- data/test/one_wire/bus_enumerator_test.rb +1 -1
- data/test/one_wire/bus_test.rb +43 -35
- data/test/one_wire/peripheral_test.rb +5 -17
- data/test/pulse_io/buzzer_test.rb +7 -4
- data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +15 -10
- data/test/pulse_io/pwm_output_test.rb +74 -18
- data/test/rtc/ds3231_test.rb +13 -14
- data/test/sensor/dht_test.rb +12 -12
- data/test/sensor/ds18b20_test.rb +4 -8
- data/test/spi/bitbang_test.rb +27 -0
- data/test/spi/bus_test.rb +24 -34
- data/test/spi/input_register_test.rb +17 -17
- data/test/spi/output_register_test.rb +10 -28
- data/test/spi/peripheral_test.rb +73 -0
- data/test/test_helper.rb +44 -121
- data/vendor/board-maps/BoardMap.h +678 -54
- 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/ALFREDO_NOU3.yml +2 -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/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/BLING.yml +25 -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/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/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/EDGES3D.yml +25 -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 +14 -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 +14 -0
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +12 -0
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +12 -0
- data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
- data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +1 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +43 -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_2432S028R.yml +14 -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/FEATHERS3.yml +1 -1
- data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
- data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +13 -0
- data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
- data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -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/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/HUIDU_HD_WF2.yml +5 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
- data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
- 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/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_MINI.yml +0 -1
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +13 -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/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_DINMETER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -2
- 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/OMGS3.yml +25 -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/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/PINTRONIX_PINMAX.yml +42 -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_ESP32S3_THING_PLUS.yml +13 -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/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.yml +31 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +14 -0
- data/vendor/board-maps/yaml/TINYC6.yml +25 -0
- 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/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_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/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/WS_ESP32_S3_MATRIX.yml +38 -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/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
- data/vendor/board-maps/yaml/unphone9.yml +8 -0
- metadata +259 -105
- data/.vscode/settings.json +0 -5
- data/.vscode/tasks.json +0 -20
- data/HARDWARE.md +0 -264
- data/benchmarks/i2c_ssd1306_refresh.rb +0 -84
- data/examples/advanced/m5_env.rb +0 -48
- data/examples/advanced/rotary_encoder_mac_volume.rb +0 -48
- data/examples/advanced/ssd1306_time_temp_rh.rb +0 -48
- data/examples/analog_io/ads1115.rb +0 -57
- data/examples/analog_io/ads1118.rb +0 -73
- data/examples/analog_io/dac_loopback.rb +0 -34
- data/examples/analog_io/input.rb +0 -55
- data/examples/connection/tcp.rb +0 -34
- data/examples/digital_io/button.rb +0 -13
- data/examples/digital_io/rotary_encoder.rb +0 -26
- data/examples/display/hd44780.png +0 -0
- data/examples/display/hd44780.rb +0 -39
- data/examples/display/ssd1306.rb +0 -40
- data/examples/display/ssd1306_s2_pico.rb +0 -29
- data/examples/eeprom/built_in.rb +0 -32
- data/examples/i2c/search.rb +0 -55
- data/examples/led/apa102_bounce.rb +0 -33
- data/examples/led/apa102_breathe.rb +0 -45
- data/examples/led/builtin_blink.rb +0 -12
- data/examples/led/seven_segment_char_echo.rb +0 -15
- data/examples/led/ws2812_bounce.rb +0 -32
- data/examples/led/ws2812_builtin_blink.rb +0 -21
- data/examples/motor/l298.rb +0 -43
- data/examples/motor/servo.rb +0 -16
- data/examples/motor/stepper.png +0 -0
- data/examples/motor/stepper.rb +0 -43
- data/examples/pulse_io/buzzer.rb +0 -30
- data/examples/pulse_io/ir_transmitter.rb +0 -55
- data/examples/rtc/ds3231.rb +0 -48
- data/examples/sensor/aht10.rb +0 -19
- data/examples/sensor/aht20.rb +0 -19
- data/examples/sensor/bme280.rb +0 -38
- data/examples/sensor/bmp180.rb +0 -22
- data/examples/sensor/dht.rb +0 -24
- data/examples/sensor/ds18b20.rb +0 -58
- data/examples/sensor/generic_pir.rb +0 -25
- data/examples/sensor/hcsr04.rb +0 -14
- data/examples/sensor/htu21d.rb +0 -54
- data/examples/sensor/htu31d.rb +0 -35
- data/examples/sensor/neat_tph_readings.rb +0 -26
- data/examples/sensor/qmp6988.rb +0 -53
- data/examples/sensor/rcwl9620.rb +0 -15
- data/examples/sensor/sht3x.rb +0 -34
- data/examples/spi/input_register.rb +0 -50
- data/examples/spi/output_register.rb +0 -49
- data/examples/spi/ssd_through_register.rb +0 -40
- data/examples/spi/two_registers.rb +0 -46
- data/examples/uart/bit_bang_read.rb +0 -16
- data/examples/uart/bit_bang_write.rb +0 -16
- data/examples/uart/board_passthrough.rb +0 -34
- data/examples/uart/hardware_loopback.rb +0 -16
- data/lib/denko/analog_io/sensor.rb +0 -6
- data/lib/denko/eeprom/built_in.rb +0 -69
- data/lib/denko/fonts.rb +0 -106
- data/lib/denko/sensor/virtual.rb +0 -42
- data/src/lib/DenkoIROutESP.cpp +0 -26
- data/test/eeprom/built_in_test.rb +0 -61
- 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 -64
- data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
- data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
- data/tutorial/03-potentiometer/potentiometer.rb +0 -62
- 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 -66
- 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/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
@@ -44,17 +44,14 @@ module Denko
|
|
44
44
|
def parse_search_result(result)
|
45
45
|
address, complement = split_search_result(result)
|
46
46
|
|
47
|
-
if (address & complement) > 0
|
48
|
-
raise "OneWire device not connected or disconnected during search"
|
49
|
-
end
|
50
|
-
|
47
|
+
raise "OneWire device not connected, or disconnected during search" if (address & complement) > 0
|
51
48
|
raise "CRC error during OneWire search" unless Helper.crc(address)
|
52
49
|
|
53
50
|
# Gives 0 at every discrepancy we didn't write 1 for on this search.
|
54
51
|
new_discrepancies = address ^ complement
|
55
52
|
|
56
53
|
high_discrepancy = -1
|
57
|
-
(0..63).each { |i| high_discrepancy = i if new_discrepancies
|
54
|
+
(0..63).each { |i| high_discrepancy = i if ((new_discrepancies >> i) & 0b1 == 0) }
|
58
55
|
|
59
56
|
# LSByte of address is product family.
|
60
57
|
klass = family_lookup(address & 0xFF)
|
@@ -64,27 +61,41 @@ module Denko
|
|
64
61
|
|
65
62
|
# Result is 16 bytes, 8 byte address and complement interleaved LSByte first.
|
66
63
|
def split_search_result(data)
|
67
|
-
address
|
64
|
+
address = 0
|
68
65
|
complement = 0
|
69
|
-
|
70
66
|
data.reverse.each_slice(2) do |comp_byte, addr_byte|
|
71
|
-
address
|
67
|
+
address = (address << 8) | addr_byte
|
72
68
|
complement = (complement << 8) | comp_byte
|
73
69
|
end
|
74
|
-
|
75
70
|
[address, complement]
|
76
71
|
end
|
77
72
|
|
78
|
-
#
|
79
|
-
# Set FAMILY_CODE in peripheral class,
|
80
|
-
#
|
73
|
+
#
|
74
|
+
# Set FAMILY_CODE in peripheral class, then add the peripheral class
|
75
|
+
# to this array (as a String, since no autoloading on mruby).
|
76
|
+
# The class can then be identified during a bus search.
|
81
77
|
#
|
82
78
|
PERIPHERAL_CLASSES = [
|
83
|
-
Sensor::DS18B20,
|
79
|
+
"Denko::Sensor::DS18B20",
|
84
80
|
]
|
85
81
|
|
82
|
+
def peripheral_classes
|
83
|
+
return @peripheral_classes if @peripheral_classes
|
84
|
+
|
85
|
+
@peripheral_classes = []
|
86
|
+
PERIPHERAL_CLASSES.each do |class_name|
|
87
|
+
begin
|
88
|
+
klass = Object.const_get(class_name)
|
89
|
+
rescue
|
90
|
+
next
|
91
|
+
end
|
92
|
+
@peripheral_classes << klass
|
93
|
+
end
|
94
|
+
@peripheral_classes
|
95
|
+
end
|
96
|
+
|
86
97
|
def family_lookup(family_code)
|
87
|
-
|
98
|
+
peripheral_classes.each do |klass|
|
88
99
|
if (klass.const_defined? "FAMILY_CODE")
|
89
100
|
return klass if klass::FAMILY_CODE == family_code
|
90
101
|
end
|
@@ -2,7 +2,9 @@ module Denko
|
|
2
2
|
module OneWire
|
3
3
|
class Helper
|
4
4
|
def self.address_to_bytes(address)
|
5
|
-
[
|
5
|
+
bytes = []
|
6
|
+
8.times { |i| bytes[i] = address >> (8*i) & 0xFF }
|
7
|
+
bytes
|
6
8
|
end
|
7
9
|
|
8
10
|
def self.crc(data)
|
@@ -20,7 +22,7 @@ module Denko
|
|
20
22
|
crc = 0b00000000
|
21
23
|
bytes.take(bytes.length - 1).each do |byte|
|
22
24
|
for bit in (0..7)
|
23
|
-
xor = byte
|
25
|
+
xor = ((byte >> bit) & 0b1) ^ (crc & 0b1)
|
24
26
|
crc = crc ^ ((xor * (2 ** 3)) | (xor * (2 ** 4)))
|
25
27
|
crc = crc >> 1
|
26
28
|
crc = crc | (xor * (2 ** 7))
|
data/lib/denko/one_wire.rb
CHANGED
@@ -1,9 +1,22 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
ONE_WIRE_FILES = [
|
4
|
+
[:Constants, "constants"],
|
5
|
+
[:Helper, "helper"],
|
6
|
+
[:BusEnumerator, "bus_enumerator"],
|
7
|
+
[:Bus, "bus"],
|
8
|
+
[:Peripheral, "peripheral"],
|
9
|
+
]
|
10
|
+
|
1
11
|
module Denko
|
2
12
|
module OneWire
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
13
|
+
ONE_WIRE_FILES.each do |file|
|
14
|
+
file_path = "#{__dir__}/one_wire/#{file[1]}"
|
15
|
+
if file[0]
|
16
|
+
autoload file[0], file_path
|
17
|
+
else
|
18
|
+
require file_path
|
19
|
+
end
|
20
|
+
end
|
8
21
|
end
|
9
22
|
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,13 +19,9 @@ module Denko
|
|
13
19
|
def no_tone
|
14
20
|
board.no_tone(pin)
|
15
21
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
stop_thread
|
20
|
-
board.no_tone(pin)
|
21
|
-
end
|
22
|
-
alias :off :stop
|
22
|
+
|
23
|
+
alias :stop :no_tone
|
24
|
+
alias :off :no_tone
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module Denko
|
2
2
|
module PulseIO
|
3
|
-
class
|
4
|
-
include Behaviors::
|
3
|
+
class IROutput
|
4
|
+
include Behaviors::SinglePin
|
5
|
+
include Behaviors::Lifecycle
|
5
6
|
|
6
|
-
def
|
7
|
-
if pulses.length >
|
8
|
-
raise ArgumentError, 'wrong number of IR pulses (expected 1 to
|
7
|
+
def write(pulses=[], frequency: 38)
|
8
|
+
if pulses.length > 255 || pulses.length < 1
|
9
|
+
raise ArgumentError, 'wrong number of IR pulses (expected 1 to 255)'
|
9
10
|
end
|
10
11
|
|
11
12
|
pulses.each_with_index do |pulse, index|
|
@@ -1,33 +1,112 @@
|
|
1
1
|
module Denko
|
2
2
|
module PulseIO
|
3
3
|
class PWMOutput < DigitalIO::Output
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
include Behaviors::Lifecycle
|
5
|
+
|
6
|
+
interrupt_with :write, :pwm_write, :digital_write, :duty=
|
7
|
+
|
8
|
+
# Avoid setting :output mode if on PWM pin, and on a platform that muxes externally.
|
9
|
+
before_initialize do
|
10
|
+
b = params[:board]
|
11
|
+
p = params[:pin]
|
12
|
+
params[:mode] = :output_pwm if b.platform != :arduino && b.pin_is_pwm?(p)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Call #pwm_enable immediately if params[:mode] was overriden to :output_pwm.
|
16
|
+
after_initialize do
|
17
|
+
pwm_enable if params[:mode] == :output_pwm
|
18
|
+
end
|
19
|
+
|
20
|
+
def duty=(percent)
|
21
|
+
if board.platform == :arduino
|
22
|
+
pwm_write((percent / 100.0 * pwm_high).round)
|
23
|
+
else
|
24
|
+
pwm_write((percent / 100.0 * period).round)
|
25
|
+
end
|
8
26
|
end
|
9
27
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
digital_write(board.high)
|
28
|
+
def digital_write(value)
|
29
|
+
# Use regular #digital_write for speed until a PWM method is called.
|
30
|
+
unless pwm_enabled?
|
31
|
+
super(value)
|
15
32
|
else
|
16
|
-
|
33
|
+
# On Arduinos, disable PWM and switch back to regular #digital_write.
|
34
|
+
if board.platform == :arduino
|
35
|
+
pwm_disable
|
36
|
+
super(value)
|
37
|
+
# Can't do that on Linux, so mimic DigitalIO.
|
38
|
+
else
|
39
|
+
if value == 1
|
40
|
+
pwm_write(period)
|
41
|
+
else
|
42
|
+
pwm_write(0)
|
43
|
+
end
|
44
|
+
end
|
17
45
|
end
|
18
46
|
end
|
19
47
|
|
48
|
+
# Raw write. Takes nanoseconds on Linux, 0..pwm_high on Arduino.
|
20
49
|
def pwm_write(value)
|
50
|
+
pwm_enable unless pwm_enabled?
|
51
|
+
board.pwm_write(pin, value)
|
52
|
+
self.state = value
|
53
|
+
end
|
54
|
+
alias :write :pwm_write
|
55
|
+
|
56
|
+
def frequency
|
57
|
+
@frequency ||= params[:frequency] || 1000
|
58
|
+
end
|
59
|
+
|
60
|
+
def period
|
61
|
+
@period ||= (1_000_000_000.0 / frequency).round
|
62
|
+
end
|
63
|
+
|
64
|
+
def resolution
|
65
|
+
@resolution ||= params[:resolution] || board.analog_write_resolution
|
66
|
+
end
|
67
|
+
|
68
|
+
def pwm_high
|
69
|
+
@pwm_high ||= (2**resolution-1)
|
70
|
+
end
|
71
|
+
|
72
|
+
def _frequency=(value)
|
73
|
+
@frequency = value
|
74
|
+
@period = nil
|
75
|
+
end
|
76
|
+
|
77
|
+
def _resolution=(value)
|
78
|
+
@resolution = value
|
79
|
+
@pwm_high = nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def frequency=(value)
|
83
|
+
self._frequency = value
|
21
84
|
pwm_enable
|
22
|
-
board.pwm_write(pin, @state = value)
|
23
85
|
end
|
24
86
|
|
25
|
-
def
|
26
|
-
self.
|
87
|
+
def resolution=(value)
|
88
|
+
self._resolution = value
|
89
|
+
pwm_enable
|
27
90
|
end
|
28
|
-
|
91
|
+
|
92
|
+
def pwm_settings_hash
|
93
|
+
{ frequency: frequency, period: period, resolution: resolution }
|
94
|
+
end
|
95
|
+
|
96
|
+
def pwm_enable(frequency: nil, resolution: nil)
|
97
|
+
self._frequency = frequency if frequency
|
98
|
+
self._resolution = resolution if resolution
|
99
|
+
|
100
|
+
board.set_pin_mode(pin, :output_pwm, pwm_settings_hash)
|
101
|
+
@mode = :output_pwm
|
102
|
+
end
|
103
|
+
|
29
104
|
def pwm_disable
|
30
|
-
self.mode = :output
|
105
|
+
self.mode = :output if board.platform == :arduino
|
106
|
+
end
|
107
|
+
|
108
|
+
def pwm_enabled?
|
109
|
+
self.mode == :output_pwm
|
31
110
|
end
|
32
111
|
end
|
33
112
|
end
|
data/lib/denko/pulse_io.rb
CHANGED
@@ -1,7 +1,21 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
PULSE_IO_FILES = [
|
4
|
+
# Pin and component setup stuff
|
5
|
+
[:PWMOutput, "pwm_output"],
|
6
|
+
[:Buzzer, "buzzer"],
|
7
|
+
[:IROutput, "ir_output"],
|
8
|
+
]
|
9
|
+
|
1
10
|
module Denko
|
2
11
|
module PulseIO
|
3
|
-
|
4
|
-
|
5
|
-
|
12
|
+
PULSE_IO_FILES.each do |file|
|
13
|
+
file_path = "#{__dir__}/pulse_io/#{file[1]}"
|
14
|
+
if file[0]
|
15
|
+
autoload file[0], file_path
|
16
|
+
else
|
17
|
+
require file_path
|
18
|
+
end
|
19
|
+
end
|
6
20
|
end
|
7
21
|
end
|
data/lib/denko/rtc/ds3231.rb
CHANGED
@@ -2,42 +2,41 @@ module Denko
|
|
2
2
|
module RTC
|
3
3
|
class DS3231
|
4
4
|
include I2C::Peripheral
|
5
|
-
require 'bcd'
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
super(options)
|
10
|
-
end
|
11
|
-
|
6
|
+
I2C_ADDRESS = 0x68
|
7
|
+
|
12
8
|
# Write start register 0x00, then bytes to set time.
|
13
9
|
def time=(time)
|
14
|
-
i2c_write [0
|
10
|
+
i2c_write [0] + time_to_bcd(time)
|
15
11
|
time
|
16
12
|
end
|
17
|
-
|
13
|
+
|
18
14
|
# Do a blocking read when #time is called.
|
19
15
|
alias :time :read
|
20
|
-
|
16
|
+
|
21
17
|
# Time data starts at register 0 and is 7 bytes long.
|
22
18
|
def _read
|
23
|
-
i2c_read(
|
19
|
+
i2c_read(7, register: 0)
|
24
20
|
end
|
25
|
-
|
21
|
+
|
26
22
|
def pre_callback_filter(bytes)
|
27
23
|
bcd_to_time(bytes)
|
28
24
|
end
|
29
|
-
|
25
|
+
|
30
26
|
# Convert Time object to 7 byte BCD sequence.
|
31
27
|
def time_to_bcd(time)
|
28
|
+
wday = time.wday
|
29
|
+
wday = 7 if wday == 0
|
30
|
+
|
32
31
|
[ BCD.decode(time.sec),
|
33
32
|
BCD.decode(time.min),
|
34
33
|
BCD.decode(time.hour),
|
35
|
-
BCD.decode(
|
34
|
+
BCD.decode(wday),
|
36
35
|
BCD.decode(time.day),
|
37
36
|
BCD.decode(time.month),
|
38
37
|
BCD.decode(time.year - 1970) ]
|
39
38
|
end
|
40
|
-
|
39
|
+
|
41
40
|
# Convert 7 byte BCD sequence to Time object.
|
42
41
|
def bcd_to_time(bytes)
|
43
42
|
t = bytes.map { |b| BCD.encode(b) }
|
data/lib/denko/rtc.rb
CHANGED
@@ -1,5 +1,18 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
RTC_FILES = [
|
4
|
+
[:DS3231, "ds3231"],
|
5
|
+
]
|
6
|
+
|
1
7
|
module Denko
|
2
8
|
module RTC
|
3
|
-
|
9
|
+
RTC_FILES.each do |file|
|
10
|
+
file_path = "#{__dir__}/rtc/#{file[1]}"
|
11
|
+
if file[0]
|
12
|
+
autoload file[0], file_path
|
13
|
+
else
|
14
|
+
require file_path
|
15
|
+
end
|
16
|
+
end
|
4
17
|
end
|
5
18
|
end
|
data/lib/denko/sensor/aht.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
module Denko
|
2
2
|
module Sensor
|
3
|
-
class
|
3
|
+
class AHT1X
|
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 ||= { 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,58 +69,48 @@ module Denko
|
|
68
69
|
end
|
69
70
|
|
70
71
|
def read_status_register
|
71
|
-
|
72
|
+
bytes = i2c_read_raw(1, register: READ_STATUS_REGISTER)
|
73
|
+
@status_register = bytes[0] if bytes
|
72
74
|
sleep(COMMAND_DELAY)
|
73
75
|
end
|
74
76
|
|
75
77
|
def _read
|
76
78
|
i2c_write(START_MEASUREMENT)
|
77
79
|
sleep(MEASURE_DELAY)
|
78
|
-
i2c_read(
|
80
|
+
i2c_read(self.class::DATA_LENGTH)
|
79
81
|
end
|
80
82
|
|
81
83
|
def pre_callback_filter(bytes)
|
82
|
-
# Handle reading status byte only.
|
83
|
-
if bytes.length == 1
|
84
|
-
@status_register = bytes[0]
|
85
|
-
return nil
|
86
|
-
end
|
87
|
-
|
88
84
|
# Normal readings are 6 bytes given as:
|
89
85
|
# [STATUS, H19-H12, H11-H4, H3-H0+T19-T16, T15-T8, T7-T0]
|
90
86
|
@status_register = bytes[0]
|
91
87
|
|
92
88
|
# Humidity uses the upper 4 bits of the shared byte as its lowest 4 bits.
|
93
89
|
h_raw = ((bytes[1] << 16) | (bytes[2] << 8) | (bytes[3])) >> 4
|
94
|
-
|
90
|
+
reading[:humidity] = (h_raw.to_f / 2**20) * 100
|
95
91
|
|
96
92
|
# Temperature uses the lower 4 bits of the shared byte as its highest 4 bits.
|
97
93
|
t_raw = ((bytes[3] & 0x0F) << 16) | (bytes[4] << 8) | bytes[5]
|
98
|
-
|
94
|
+
reading[:temperature] = (t_raw.to_f / 2**20) * 200 - 50
|
99
95
|
|
100
|
-
|
96
|
+
reading
|
101
97
|
end
|
102
98
|
|
103
99
|
def update_state(reading)
|
104
|
-
@state_mutex.
|
105
|
-
|
106
|
-
|
107
|
-
|
100
|
+
@state_mutex.lock
|
101
|
+
@state[:temperature] = reading[:temperature]
|
102
|
+
@state[:humidity] = reading[:humidity]
|
103
|
+
@state_mutex.unlock
|
104
|
+
@state
|
108
105
|
end
|
109
106
|
end
|
110
|
-
end
|
111
|
-
end
|
112
107
|
|
113
|
-
|
114
|
-
module Sensor
|
115
|
-
class AHT20 < AHT10
|
116
|
-
include I2C::Peripheral
|
117
|
-
include Behaviors::Poller
|
108
|
+
class AHT2X < AHT1X
|
118
109
|
#
|
119
110
|
# Changed constants compared to AHT10. Always access with self.class::CONSTANT_NAME
|
120
111
|
# in shared methods coming from the superclass.
|
121
112
|
#
|
122
|
-
INIT_AND_CALIBRATE = [0xBE, 0x08, 0x00]
|
113
|
+
INIT_AND_CALIBRATE = [0xBE, 0x08, 0x00]
|
123
114
|
POWER_ON_DELAY = 0.100
|
124
115
|
DATA_LENGTH = 7
|
125
116
|
|
@@ -156,10 +147,16 @@ module Denko
|
|
156
147
|
end
|
157
148
|
end
|
158
149
|
end
|
159
|
-
|
150
|
+
|
160
151
|
# Limit CRC size to 8 bits.
|
161
152
|
crc = crc & 0xFF
|
162
153
|
end
|
163
154
|
end
|
155
|
+
|
156
|
+
#
|
157
|
+
# AHT3X and AHT2X have different specs, but work the same.
|
158
|
+
#
|
159
|
+
class AHT3X < AHT2X
|
160
|
+
end
|
164
161
|
end
|
165
162
|
end
|