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
data/lib/denko/led/apa102.rb
CHANGED
@@ -1,39 +1,50 @@
|
|
1
1
|
module Denko
|
2
2
|
module LED
|
3
3
|
class APA102
|
4
|
-
include
|
4
|
+
include Behaviors::BusPeripheral
|
5
|
+
include Behaviors::Lifecycle
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
def before_initialize(options={})
|
9
|
-
options[:pin] = 255
|
10
|
-
super(options)
|
7
|
+
def length
|
8
|
+
@length ||= params[:length] || 1
|
11
9
|
end
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
@length = options[:length]
|
11
|
+
# Start frame is always 32 0-bits (4 bytes).
|
12
|
+
def start_frame
|
13
|
+
@start_frame ||= Array.new(4) { 0 }
|
14
|
+
end
|
18
15
|
|
19
|
-
|
20
|
-
@
|
16
|
+
def end_frame
|
17
|
+
return @end_frame if @end_frame
|
21
18
|
|
22
|
-
# End frame must be at least
|
23
|
-
end_frame_bytes = (
|
19
|
+
# End frame must be at least length/2 bits long, and 32 bits (4 bytes) minimum.
|
20
|
+
end_frame_bytes = (length / 16.0).ceil
|
24
21
|
end_frame_bytes = 4 if end_frame_bytes < 4
|
25
22
|
|
26
23
|
# Use all 0's for end frame instead of 1's. Prevents extra pixel when using partial strip.
|
27
24
|
@end_frame = Array.new(end_frame_bytes) { 0 }
|
25
|
+
end
|
26
|
+
|
27
|
+
# This is BYTES per pixel, not bits per pixel.
|
28
|
+
# 0th byte is per-pixel brightness (PWM applied to all 3 colors).
|
29
|
+
def bpp
|
30
|
+
@bpp ||= 4
|
31
|
+
end
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
def buffer
|
34
|
+
@buffer ||= Array.new(length * bpp) { 0 }
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_writer :buffer
|
38
|
+
|
39
|
+
before_initialize do
|
40
|
+
unless [Denko::SPI::Bus, Denko::SPI::BitBang].include? params[:bus].class
|
41
|
+
raise "APA102 must be connected to the output pin of a SPI bus"
|
42
|
+
end
|
43
|
+
end
|
33
44
|
|
45
|
+
after_initialize do
|
34
46
|
# Default to max brightness.
|
35
47
|
self.brightness = 31
|
36
|
-
|
37
48
|
off
|
38
49
|
end
|
39
50
|
|
@@ -47,26 +58,26 @@ module Denko
|
|
47
58
|
@masked_brightness = 0b11100000 | @brightness
|
48
59
|
|
49
60
|
# Set brightness for all pixels.
|
50
|
-
(0
|
51
|
-
|
61
|
+
(0..length-1).each do |index|
|
62
|
+
buffer[index*bpp+0] = @masked_brightness
|
52
63
|
end
|
53
64
|
end
|
54
65
|
|
55
66
|
def []=(index, array)
|
56
67
|
# Per-pixel brightness control, as optional 3rd indexed element of array.
|
57
68
|
if array[3]
|
58
|
-
|
69
|
+
buffer[index*bpp+0] = 0b11100000 | array[3]
|
59
70
|
end
|
60
|
-
|
71
|
+
|
61
72
|
# APA102 uses BGR ordering.
|
62
|
-
|
63
|
-
|
64
|
-
|
73
|
+
buffer[index*bpp+1] = array[2]
|
74
|
+
buffer[index*bpp+2] = array[1]
|
75
|
+
buffer[index*bpp+3] = array[0]
|
65
76
|
end
|
66
77
|
|
67
78
|
def all_on
|
68
79
|
self.brightness = 31
|
69
|
-
|
80
|
+
self.buffer = buffer.each_slice(bpp).map { [@masked_brightness,255,255,255] }.flatten
|
70
81
|
show
|
71
82
|
end
|
72
83
|
|
@@ -76,11 +87,12 @@ module Denko
|
|
76
87
|
end
|
77
88
|
|
78
89
|
def clear
|
79
|
-
|
90
|
+
self.buffer = buffer.each_slice(bpp).map { [@masked_brightness,0,0,0] }.flatten
|
80
91
|
end
|
81
92
|
|
82
93
|
def show
|
83
|
-
|
94
|
+
data = start_frame + buffer + end_frame
|
95
|
+
bus.transfer(nil, write: data)
|
84
96
|
end
|
85
97
|
end
|
86
98
|
end
|
data/lib/denko/led/base.rb
CHANGED
@@ -2,11 +2,22 @@ module Denko
|
|
2
2
|
module LED
|
3
3
|
class Base < PulseIO::PWMOutput
|
4
4
|
def blink(interval=0.5)
|
5
|
-
|
5
|
+
self.blink_interval = interval
|
6
|
+
threaded_loop do
|
6
7
|
toggle
|
7
|
-
sleep
|
8
|
+
sleep @blink_interval
|
8
9
|
end
|
9
10
|
end
|
11
|
+
|
12
|
+
def blink_interval=(interval)
|
13
|
+
@blink_interval = interval
|
14
|
+
end
|
15
|
+
attr_reader :blink_interval
|
16
|
+
end
|
17
|
+
|
18
|
+
# Shortcut, so LED.new does LED::Base.new.
|
19
|
+
def self.new(options={})
|
20
|
+
self::Base.new(options)
|
10
21
|
end
|
11
22
|
end
|
12
23
|
end
|
data/lib/denko/led/rgb.rb
CHANGED
@@ -11,27 +11,31 @@ module Denko
|
|
11
11
|
|
12
12
|
# Format: [R, G, B]
|
13
13
|
COLORS = {
|
14
|
-
red: [
|
15
|
-
green: [000,
|
16
|
-
blue: [000, 000,
|
17
|
-
cyan: [000,
|
18
|
-
yellow: [
|
19
|
-
magenta: [
|
20
|
-
white: [
|
14
|
+
red: [100, 000, 000],
|
15
|
+
green: [000, 100, 000],
|
16
|
+
blue: [000, 000, 100],
|
17
|
+
cyan: [000, 100, 100],
|
18
|
+
yellow: [100, 100, 000],
|
19
|
+
magenta: [100, 000, 100],
|
20
|
+
white: [100, 100, 100],
|
21
21
|
off: [000, 000, 000]
|
22
22
|
}
|
23
23
|
|
24
|
-
def write(
|
25
|
-
red.
|
26
|
-
green.
|
27
|
-
blue.
|
24
|
+
def write(r, g, b)
|
25
|
+
red.duty = r
|
26
|
+
green.duty = g
|
27
|
+
blue.duty = b
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
31
|
-
|
30
|
+
def write_8_bit(r, g, b)
|
31
|
+
red.duty = ((r / 255.0) * 100).round
|
32
|
+
green.duty = ((g / 255.0) * 100).round
|
33
|
+
blue.duty = ((b / 255.0) * 100).round
|
34
|
+
end
|
32
35
|
|
36
|
+
def color=(color)
|
33
37
|
color = color.to_sym
|
34
|
-
write(COLORS[color]) if COLORS.include? color
|
38
|
+
write(*COLORS[color]) if COLORS.include? color
|
35
39
|
end
|
36
40
|
end
|
37
41
|
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_a_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/led.rb
CHANGED
@@ -1,13 +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
|
+
LED_FILES = [
|
4
|
+
[nil, "base"],
|
5
|
+
[:RGB, "rgb"],
|
6
|
+
[:SevenSegment, "seven_segment"],
|
7
|
+
[:WS2812, "ws2812"],
|
8
|
+
[:APA102, "apa102"],
|
9
|
+
]
|
10
|
+
|
1
11
|
module Denko
|
2
12
|
module LED
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
self::Base.new(options)
|
13
|
+
LED_FILES.each do |file|
|
14
|
+
file_path = "#{__dir__}/led/#{file[1]}"
|
15
|
+
if file[0]
|
16
|
+
autoload file[0], file_path
|
17
|
+
else
|
18
|
+
require file_path
|
19
|
+
end
|
11
20
|
end
|
12
21
|
end
|
13
22
|
end
|
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.
|
@@ -1,26 +1,25 @@
|
|
1
1
|
module Denko
|
2
2
|
module Motor
|
3
|
-
class
|
3
|
+
class A3967
|
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/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
@@ -1,40 +1,58 @@
|
|
1
1
|
module Denko
|
2
2
|
module Motor
|
3
3
|
class Servo
|
4
|
+
FREQUENCY = 50
|
5
|
+
PERIOD_NS = 20_000_000
|
6
|
+
|
4
7
|
include Behaviors::SinglePin
|
5
|
-
include Behaviors::
|
8
|
+
include Behaviors::Lifecycle
|
9
|
+
|
10
|
+
before_initialize do
|
11
|
+
params[:mode] = :output_pwm
|
12
|
+
end
|
6
13
|
|
7
|
-
|
8
|
-
super(options)
|
9
|
-
@min = options[:min] || 544
|
10
|
-
@max = options[:max] || 2400
|
14
|
+
after_initialize do
|
11
15
|
attach
|
12
16
|
end
|
13
17
|
|
18
|
+
def min
|
19
|
+
@min ||= params[:min] || 500
|
20
|
+
end
|
21
|
+
|
22
|
+
def max
|
23
|
+
@max ||= params[:max] || 2500
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_writer :min, :max
|
27
|
+
|
14
28
|
def attach
|
15
|
-
board.
|
29
|
+
if board.platform == :arduino
|
30
|
+
board.servo_toggle(pin, :on, min: min, max: max)
|
31
|
+
else
|
32
|
+
board.set_pin_mode(pin, :output_pwm, {frequency: FREQUENCY, period: PERIOD_NS})
|
33
|
+
end
|
16
34
|
end
|
17
35
|
|
18
36
|
def detach
|
19
|
-
board.servo_toggle(pin, :off)
|
37
|
+
board.servo_toggle(pin, :off) if board.platform == :arduino
|
20
38
|
end
|
21
39
|
|
22
40
|
def position=(value)
|
23
41
|
value = value % 180 unless value == 180
|
24
42
|
|
25
|
-
microseconds = ((value.to_f / 180) * (
|
26
|
-
|
43
|
+
microseconds = ((value.to_f / 180) * (max - min)) + min
|
44
|
+
write_microseconds(microseconds)
|
27
45
|
|
28
|
-
|
46
|
+
self.state = value
|
29
47
|
end
|
30
48
|
|
31
49
|
def speed=(value)
|
32
50
|
raise 'invalid speed value' if value > 100 || value < -100
|
33
51
|
|
34
|
-
microseconds = (((value.to_f + 100) / 200) * (
|
35
|
-
|
52
|
+
microseconds = (((value.to_f + 100) / 200) * (max - min)) + min
|
53
|
+
write_microseconds(microseconds)
|
36
54
|
|
37
|
-
|
55
|
+
self.state = value
|
38
56
|
end
|
39
57
|
|
40
58
|
alias :angle= :position=
|
@@ -43,8 +61,12 @@ module Denko
|
|
43
61
|
alias :speed :state
|
44
62
|
|
45
63
|
def write_microseconds(value)
|
46
|
-
raise 'invalid microsecond value' if value >
|
47
|
-
board.
|
64
|
+
raise 'invalid microsecond value' if value > max || value < min
|
65
|
+
if board.platform == :arduino
|
66
|
+
board.servo_write(pin, value)
|
67
|
+
else
|
68
|
+
board.pwm_write(pin, (value * 1000.0).round)
|
69
|
+
end
|
48
70
|
end
|
49
71
|
end
|
50
72
|
end
|
data/lib/denko/motor.rb
CHANGED
@@ -1,7 +1,20 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
MOTOR_FILES = [
|
4
|
+
[:Servo, "servo"],
|
5
|
+
[:A3967, "a3967"],
|
6
|
+
[:L298, "l298"],
|
7
|
+
]
|
8
|
+
|
1
9
|
module Denko
|
2
10
|
module Motor
|
3
|
-
|
4
|
-
|
5
|
-
|
11
|
+
MOTOR_FILES.each do |file|
|
12
|
+
file_path = "#{__dir__}/motor/#{file[1]}"
|
13
|
+
if file[0]
|
14
|
+
autoload file[0], file_path
|
15
|
+
else
|
16
|
+
require file_path
|
17
|
+
end
|
18
|
+
end
|
6
19
|
end
|
7
20
|
end
|
data/lib/denko/one_wire/bus.rb
CHANGED
@@ -1,44 +1,47 @@
|
|
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
|
|
17
16
|
def read_power_supply
|
18
|
-
mutex.
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
17
|
+
mutex.lock
|
18
|
+
|
19
|
+
# Without driving low first, results are inconsistent.
|
20
|
+
board.set_pin_mode(self.pin, :output)
|
21
|
+
board.digital_write(self.pin, board.low)
|
22
|
+
sleep 0.1
|
23
|
+
|
24
|
+
reset
|
25
|
+
write(SKIP_ROM, READ_POWER_SUPPLY)
|
26
|
+
|
27
|
+
# Only LSBIT matters, but we can only read whole bytes.
|
28
|
+
byte = read(1)
|
29
|
+
@parasite_power = (byte & 0b1 == 0) ? true : false
|
30
|
+
|
31
|
+
mutex.unlock
|
32
|
+
@parasite_power
|
31
33
|
end
|
32
34
|
|
33
35
|
def device_present
|
34
|
-
mutex.
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
mutex.lock
|
37
|
+
byte = read_using -> { reset(true) }
|
38
|
+
presence = (byte == 0) ? true : false
|
39
|
+
mutex.unlock
|
40
|
+
presence
|
38
41
|
end
|
39
42
|
alias :device_present? :device_present
|
40
43
|
|
41
|
-
def reset(get_presence=
|
44
|
+
def reset(get_presence=false)
|
42
45
|
board.one_wire_reset(pin, get_presence)
|
43
46
|
end
|
44
47
|
|
@@ -53,7 +56,12 @@ module Denko
|
|
53
56
|
end
|
54
57
|
|
55
58
|
def pre_callback_filter(bytes)
|
56
|
-
|
59
|
+
# C extensions respond with Ruby array
|
60
|
+
# External Board responds with comma delimited String
|
61
|
+
unless bytes.class == Array
|
62
|
+
bytes = bytes.split(",").map(&:to_i)
|
63
|
+
end
|
64
|
+
|
57
65
|
bytes.length > 1 ? bytes : bytes[0]
|
58
66
|
end
|
59
67
|
end
|