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
@@ -3,13 +3,11 @@ module Denko
|
|
3
3
|
module SinglePin
|
4
4
|
include Component
|
5
5
|
attr_reader :pin, :mode
|
6
|
-
|
7
|
-
def mode=(mode)
|
6
|
+
|
7
|
+
def mode=(mode)
|
8
8
|
board.set_pin_mode(pin, mode)
|
9
9
|
@mode = mode
|
10
10
|
end
|
11
|
-
|
12
|
-
protected
|
13
11
|
|
14
12
|
def convert_pins(options={})
|
15
13
|
raise ArgumentError, 'a pin is required for this component' unless options[:pin]
|
@@ -18,6 +16,7 @@ module Denko
|
|
18
16
|
|
19
17
|
def initialize_pins(options={})
|
20
18
|
@pin = options[:pin]
|
19
|
+
self.mode = params[:mode] if params[:mode]
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
@@ -1,22 +1,33 @@
|
|
1
1
|
module Denko
|
2
2
|
module Behaviors
|
3
3
|
module State
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def state
|
11
|
-
@state_mutex.synchronize { @state }
|
4
|
+
include Lifecycle
|
5
|
+
|
6
|
+
# Force state and mutex initialization.
|
7
|
+
after_initialize do
|
8
|
+
@state_mutex = Denko.gil? ? Denko::MutexStub.new : Mutex.new
|
9
|
+
state
|
12
10
|
end
|
13
|
-
|
14
|
-
protected
|
15
11
|
|
16
|
-
|
17
|
-
|
12
|
+
# mruby optimization. Bypass state_mutex for simple states.
|
13
|
+
if Denko.mruby?
|
14
|
+
attr_accessor :state
|
15
|
+
else
|
16
|
+
def state
|
17
|
+
@state_mutex.lock
|
18
|
+
value = @state
|
19
|
+
@state_mutex.unlock
|
20
|
+
value
|
21
|
+
end
|
22
|
+
|
23
|
+
def state=(value)
|
24
|
+
@state_mutex.lock
|
25
|
+
@state = value
|
26
|
+
@state_mutex.unlock
|
27
|
+
@state
|
28
|
+
end
|
18
29
|
end
|
19
|
-
|
30
|
+
|
20
31
|
def update_state(value)
|
21
32
|
self.state = value if value
|
22
33
|
end
|
@@ -1,15 +1,32 @@
|
|
1
1
|
module Denko
|
2
2
|
module Behaviors
|
3
3
|
module Subcomponents
|
4
|
-
|
5
|
-
|
4
|
+
#
|
5
|
+
# Main Methods
|
6
|
+
#
|
7
|
+
def add_component(component)
|
8
|
+
add_single_pin(component)
|
9
|
+
add_hw_i2c(component)
|
10
|
+
add_hw_spi(component)
|
11
|
+
components << component
|
6
12
|
end
|
7
13
|
|
8
|
-
def
|
9
|
-
|
14
|
+
def remove_component(component)
|
15
|
+
remove_single_pin(component)
|
16
|
+
remove_hw_i2c(component)
|
17
|
+
remove_hw_spi(component)
|
18
|
+
deleted = components.delete(component)
|
19
|
+
component.stop if deleted && component.respond_to?(:stop)
|
10
20
|
end
|
11
21
|
|
12
|
-
def
|
22
|
+
def components
|
23
|
+
@components ||= []
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Single Pin
|
28
|
+
#
|
29
|
+
def add_single_pin(component)
|
13
30
|
if component.respond_to?(:pin) && component.pin.class == Integer
|
14
31
|
unless single_pin_components[component.pin]
|
15
32
|
single_pin_components[component.pin] = component
|
@@ -18,17 +35,60 @@ module Denko
|
|
18
35
|
"already in use by: #{single_pin_components[component.pin]}"
|
19
36
|
end
|
20
37
|
end
|
21
|
-
|
22
|
-
components << component
|
23
38
|
end
|
24
39
|
|
25
|
-
def
|
40
|
+
def remove_single_pin(component)
|
26
41
|
if component.respond_to?(:pin) && component.pin.class == Integer
|
27
|
-
single_pin_components
|
42
|
+
single_pin_components.delete(component.pin)
|
28
43
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
44
|
+
end
|
45
|
+
|
46
|
+
def single_pin_components
|
47
|
+
@single_pin_components ||= {}
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# I2C
|
52
|
+
#
|
53
|
+
def add_hw_i2c(component)
|
54
|
+
if component.respond_to?(:i2c_index)
|
55
|
+
unless hw_i2c_comps[component.i2c_index]
|
56
|
+
hw_i2c_comps[component.i2c_index] = component
|
57
|
+
else
|
58
|
+
raise StandardError, "Error adding #{component} to #{self}. I2C dev: #{component.i2c_index} " \
|
59
|
+
"already in use by: #{hw_i2c_comps[component.i2c_index]}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def remove_hw_i2c(component)
|
65
|
+
hw_i2c_comps.delete(component.i2c_index) if component.respond_to?(:i2c_index)
|
66
|
+
end
|
67
|
+
|
68
|
+
def hw_i2c_comps
|
69
|
+
@hw_i2c_comps ||= {}
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# SPI
|
74
|
+
#
|
75
|
+
def add_hw_spi(component)
|
76
|
+
if component.respond_to?(:spi_index)
|
77
|
+
unless hw_spi_comps[component.spi_index]
|
78
|
+
hw_spi_comps[component.spi_index] = component
|
79
|
+
else
|
80
|
+
raise StandardError, "Error adding #{component} to #{self}. SPI dev: #{component.spi_index} " \
|
81
|
+
"already in use by: #{hw_spi_comps[component.spi_index]}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def remove_hw_spi(component)
|
87
|
+
hw_spi_comps.delete(component.spi_index) if component.respond_to?(:spi_index)
|
88
|
+
end
|
89
|
+
|
90
|
+
def hw_spi_comps
|
91
|
+
@hw_spi_comps ||= {}
|
32
92
|
end
|
33
93
|
end
|
34
94
|
end
|
@@ -11,39 +11,50 @@ module Denko
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def mruby_thread_check
|
15
|
+
if Denko.mruby?
|
16
|
+
raise NotImplementedError, "threads unavailable in mruby "
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
14
20
|
def self.included(base)
|
15
21
|
base.extend ClassMethods
|
16
22
|
end
|
17
23
|
|
18
24
|
def threaded(&block)
|
25
|
+
mruby_thread_check
|
19
26
|
stop_thread
|
20
27
|
enable_interrupts unless interrupts_enabled
|
21
28
|
@thread = Thread.new(&block)
|
22
29
|
end
|
23
30
|
|
24
31
|
def threaded_loop(&block)
|
32
|
+
mruby_thread_check
|
25
33
|
threaded do
|
26
34
|
loop(&block)
|
27
35
|
end
|
28
36
|
end
|
29
37
|
|
30
38
|
def stop_thread
|
39
|
+
mruby_thread_check
|
31
40
|
@thread.kill if @thread
|
32
41
|
end
|
33
42
|
|
34
43
|
def stop
|
35
|
-
stop_thread
|
36
|
-
super
|
44
|
+
stop_thread unless Denko.mruby?
|
45
|
+
begin; super; rescue NoMethodError; end
|
37
46
|
end
|
38
47
|
|
39
48
|
def enable_interrupts
|
40
|
-
|
41
|
-
|
42
|
-
|
49
|
+
unless Denko.mruby?
|
50
|
+
interrupts = self.class.class_eval('@@interrupts') rescue []
|
51
|
+
interrupts.each do |method_name|
|
52
|
+
standard_method = self.method(method_name)
|
43
53
|
|
44
|
-
|
45
|
-
|
46
|
-
|
54
|
+
singleton_class.send(:define_method, method_name) do |*args|
|
55
|
+
stop_thread unless (Thread.current == @thread)
|
56
|
+
standard_method.call(*args)
|
57
|
+
end
|
47
58
|
end
|
48
59
|
end
|
49
60
|
|
data/lib/denko/behaviors.rb
CHANGED
@@ -1,26 +1,40 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
BEHAVIORS_FILES = [
|
4
|
+
# Pin and component setup stuff
|
5
|
+
[:Lifecycle, "lifecycle"],
|
6
|
+
[:State, "state"],
|
7
|
+
[:Component, "component"],
|
8
|
+
[:SinglePin, "single_pin"],
|
9
|
+
[:InputPin, "input_pin"],
|
10
|
+
[:OutputPin, "output_pin"],
|
11
|
+
[:MultiPin, "multi_pin"],
|
12
|
+
|
13
|
+
# Subcomponent stuff
|
14
|
+
[:Subcomponents, "subcomponents"],
|
15
|
+
[:BusController, "bus_controller"],
|
16
|
+
[:BusControllerAddressed, "bus_controller_addressed"],
|
17
|
+
[:BusPeripheral, "bus_peripheral"],
|
18
|
+
[:BusPeripheralAddressed, "bus_peripheral_addressed"],
|
19
|
+
[:BoardProxy, "board_proxy"],
|
20
|
+
|
21
|
+
# Async stuff
|
22
|
+
[:Threaded, "threaded"],
|
23
|
+
[:Callbacks, "callbacks"],
|
24
|
+
[:Reader, "reader"],
|
25
|
+
[:Poller, "poller"],
|
26
|
+
[:Listener, "listener"],
|
27
|
+
]
|
28
|
+
|
1
29
|
module Denko
|
2
30
|
module Behaviors
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# Subcomponent stuff
|
12
|
-
autoload :Subcomponents, "#{__dir__}/behaviors/subcomponents"
|
13
|
-
autoload :BusController, "#{__dir__}/behaviors/bus_controller"
|
14
|
-
autoload :BusControllerAddressed, "#{__dir__}/behaviors/bus_controller_addressed"
|
15
|
-
autoload :BusPeripheral, "#{__dir__}/behaviors/bus_peripheral"
|
16
|
-
autoload :BusPeripheralAddressed, "#{__dir__}/behaviors/bus_peripheral_addressed"
|
17
|
-
autoload :BoardProxy, "#{__dir__}/behaviors/board_proxy"
|
18
|
-
|
19
|
-
# Async stuff
|
20
|
-
autoload :Threaded, "#{__dir__}/behaviors/threaded"
|
21
|
-
autoload :Callbacks, "#{__dir__}/behaviors/callbacks"
|
22
|
-
autoload :Reader, "#{__dir__}/behaviors/reader"
|
23
|
-
autoload :Poller, "#{__dir__}/behaviors/poller"
|
24
|
-
autoload :Listener, "#{__dir__}/behaviors/listener"
|
31
|
+
BEHAVIORS_FILES.each do |file|
|
32
|
+
file_path = "#{__dir__}/behaviors/#{file[1]}"
|
33
|
+
if file[0]
|
34
|
+
autoload file[0], file_path
|
35
|
+
else
|
36
|
+
require file_path
|
37
|
+
end
|
38
|
+
end
|
25
39
|
end
|
26
40
|
end
|
data/lib/denko/board/core.rb
CHANGED
@@ -3,29 +3,44 @@ module Denko
|
|
3
3
|
DIVIDERS = [1, 2, 4, 8, 16, 32, 64, 128]
|
4
4
|
|
5
5
|
PIN_MODES = {
|
6
|
-
output:
|
7
|
-
output_pwm:
|
8
|
-
output_dac:
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
output: 0b0000,
|
7
|
+
output_pwm: 0b0010,
|
8
|
+
output_dac: 0b0100,
|
9
|
+
output_open_drain: 0b0110,
|
10
|
+
output_open_source: 0b1000,
|
11
|
+
input: 0b0001,
|
12
|
+
input_pulldown: 0b0011,
|
13
|
+
input_pullup: 0b0101,
|
13
14
|
}
|
14
15
|
|
15
16
|
# CMD = 0
|
16
|
-
def set_pin_mode(pin, mode=:input)
|
17
|
+
def set_pin_mode(pin, mode=:input, options={})
|
17
18
|
unless PIN_MODES.keys.include? mode
|
18
19
|
raise ArgumentError, "cannot set mode: #{mode}. Should be one of: #{PIN_MODES.keys.inspect}"
|
19
20
|
end
|
21
|
+
|
22
|
+
# Set frequency and resolution for PWM if given.
|
23
|
+
aux = nil
|
24
|
+
if (mode == :output_pwm) && options
|
25
|
+
aux = [0, 0]
|
26
|
+
aux[0] = options[:frequency] if options[:frequency]
|
27
|
+
aux[1] = options[:resolution] if options[:resolution]
|
28
|
+
aux = pack :uint32, aux, min: 8, max: 8
|
29
|
+
end
|
30
|
+
|
20
31
|
write Message.encode command: 0,
|
21
32
|
pin: pin,
|
22
|
-
value: PIN_MODES[mode]
|
33
|
+
value: PIN_MODES[mode],
|
34
|
+
aux_message: aux
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_pin_debounce(pin, debounce_time)
|
23
38
|
end
|
24
39
|
|
25
40
|
# CMD = 1
|
26
41
|
def digital_write(pin,value)
|
27
42
|
unless (value == 1) || (value == 0)
|
28
|
-
raise ArgumentError, "cannot write digital value: #{value}. Should be Integer either 0 or 1"
|
43
|
+
raise ArgumentError, "cannot write digital value: #{value}. Should be Integer either 0 or 1"
|
29
44
|
end
|
30
45
|
write Message.encode command: 1, pin: pin, value: value
|
31
46
|
end
|
@@ -37,12 +52,10 @@ module Denko
|
|
37
52
|
|
38
53
|
# CMD = 3
|
39
54
|
def pwm_write(pin,value)
|
40
|
-
|
41
|
-
raise ArgumentError, "cannot write PWM value: #{value}. Should be Integer in range 0..#{pwm_high} "
|
42
|
-
end
|
55
|
+
raise ArgumentError, "PWM value cannot be negative" if (value < 0)
|
43
56
|
write Message.encode command: 3, pin: pin, value: value.round
|
44
57
|
end
|
45
|
-
|
58
|
+
|
46
59
|
# CMD = 4
|
47
60
|
def dac_write(pin,value)
|
48
61
|
if (value < 0) || (value > dac_high)
|
@@ -60,7 +73,7 @@ module Denko
|
|
60
73
|
def set_listener(pin, state=:off, **options)
|
61
74
|
# Default to digital listener and validate.
|
62
75
|
options[:mode] ||= :digital
|
63
|
-
unless (options[:mode] == :digital) || (options[:mode] == :analog)
|
76
|
+
unless (options[:mode] == :digital) || (options[:mode] == :analog)
|
64
77
|
raise ArgumentError, "error in mode: #{options[:mode]}. Should be one of: [:digital, :analog]"
|
65
78
|
end
|
66
79
|
mode_byte = (options[:mode] == :digital) ? 0 : 1
|
@@ -71,7 +84,7 @@ module Denko
|
|
71
84
|
else
|
72
85
|
options[:divider] ||= 16
|
73
86
|
end
|
74
|
-
|
87
|
+
|
75
88
|
# Convert divider to exponent and validate.
|
76
89
|
exponent = Math.log2(options[:divider]).round
|
77
90
|
if (exponent < 0) || (exponent > 7)
|
@@ -79,7 +92,7 @@ module Denko
|
|
79
92
|
end
|
80
93
|
|
81
94
|
# Validate state.
|
82
|
-
unless (state == :on) || (state == :off)
|
95
|
+
unless (state == :on) || (state == :off)
|
83
96
|
raise ArgumentError, "error in state: #{options[:state]}. Should be one of: [:on, :off]"
|
84
97
|
end
|
85
98
|
state_byte = (state == :on) ? 1 : 0
|
@@ -131,7 +144,7 @@ module Denko
|
|
131
144
|
end
|
132
145
|
write Message.encode(command: 96, value: value)
|
133
146
|
end
|
134
|
-
|
147
|
+
|
135
148
|
# CMD = 97
|
136
149
|
def set_analog_read_resolution(value)
|
137
150
|
if (value < 0) || (value > 16)
|
@@ -140,6 +153,11 @@ module Denko
|
|
140
153
|
write Message.encode(command: 97, value: value)
|
141
154
|
end
|
142
155
|
|
156
|
+
# CMD = 98
|
157
|
+
def binary_echo(pin, data=[])
|
158
|
+
write Message.encode command: 98, pin: pin, value: data.length, aux_message: pack(:uint8, data)
|
159
|
+
end
|
160
|
+
|
143
161
|
# CMD = 99
|
144
162
|
def micro_delay(duration)
|
145
163
|
if (duration < 0) || (duration > 0xFFFF)
|
data/lib/denko/board/eeprom.rb
CHANGED
@@ -11,7 +11,7 @@ module Denko
|
|
11
11
|
# CMD = 8
|
12
12
|
def eeprom_write(address, bytes)
|
13
13
|
address = pack :uint16, address
|
14
|
-
bytes
|
14
|
+
bytes = pack :uint8, bytes
|
15
15
|
write Message.encode command: 8,
|
16
16
|
value: bytes.length,
|
17
17
|
aux_message: address + bytes
|
data/lib/denko/board/i2c.rb
CHANGED
@@ -14,38 +14,37 @@ module Denko
|
|
14
14
|
freq = 100000 unless freq
|
15
15
|
|
16
16
|
unless I2C_FREQUENCIES.include?(freq)
|
17
|
-
raise ArgumentError, "I2C frequency must be in: #{I2C_FREQUENCIES.keys.inspect}"
|
17
|
+
raise ArgumentError, "I2C frequency must be in: #{I2C_FREQUENCIES.keys.inspect}"
|
18
18
|
end
|
19
19
|
I2C_FREQUENCIES[freq]
|
20
20
|
end
|
21
21
|
|
22
22
|
# CMD = 33
|
23
|
-
def i2c_search
|
23
|
+
def i2c_search(i2c_index)
|
24
24
|
write Message.encode command: 33
|
25
25
|
end
|
26
26
|
|
27
27
|
# CMD = 34
|
28
|
-
def i2c_write(address, bytes, frequency=100000, repeated_start=false)
|
29
|
-
bytes = [bytes] unless bytes.class == Array
|
28
|
+
def i2c_write(i2c_index, address, bytes, frequency=100000, repeated_start=false)
|
29
|
+
bytes = [bytes].flatten unless bytes.class == Array
|
30
30
|
raise ArgumentError, "I2C write must be 1..#{i2c_limit} bytes long" if (bytes.length > i2c_limit || bytes.length < 1)
|
31
|
-
|
31
|
+
|
32
32
|
# Use top bit of address to select stop condition (1), or repated start (0).
|
33
33
|
send_stop = repeated_start ? 0 : 1
|
34
|
-
|
35
|
-
|
34
|
+
|
36
35
|
write Message.encode command: 34,
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
aux_message: pack(:uint8, i2c_convert_frequency(frequency)) +
|
37
|
+
pack(:uint8, address | (send_stop << 7)) +
|
38
|
+
pack(:uint8, bytes.length) +
|
39
|
+
pack(:uint8, bytes)
|
40
40
|
end
|
41
41
|
|
42
42
|
# CMD = 35
|
43
|
-
def i2c_read(address, register, read_length, frequency=100000, repeated_start=false)
|
43
|
+
def i2c_read(i2c_index, address, register, read_length, frequency=100000, repeated_start=false)
|
44
44
|
raise ArgumentError, "I2C read must be 1..#{i2c_limit} bytes long" if (read_length > i2c_limit || read_length < 1)
|
45
45
|
|
46
46
|
# Use top bit of address to select stop condition (1), or repated start (0).
|
47
47
|
send_stop = repeated_start ? 0 : 1
|
48
|
-
frequency = i2c_convert_frequency(frequency)
|
49
48
|
|
50
49
|
# A register address starting register address can be given (up to 4 bytes)
|
51
50
|
if register
|
@@ -57,9 +56,10 @@ module Denko
|
|
57
56
|
end
|
58
57
|
|
59
58
|
write Message.encode command: 35,
|
60
|
-
|
61
|
-
|
62
|
-
|
59
|
+
aux_message: pack(:uint8, i2c_convert_frequency(frequency)) +
|
60
|
+
pack(:uint8, address | (send_stop << 7)) +
|
61
|
+
pack(:uint8, read_length) +
|
62
|
+
register_packed
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
def i2c_bb_setup(scl, sda)
|
4
|
+
# Stub method. Other implementations may call this.
|
5
|
+
end
|
6
|
+
|
7
|
+
# CMD = 30
|
8
|
+
def i2c_bb_search(scl, sda)
|
9
|
+
write Message.encode command: 30,
|
10
|
+
pin: scl,
|
11
|
+
value: sda
|
12
|
+
end
|
13
|
+
|
14
|
+
# CMD = 31
|
15
|
+
def i2c_bb_write(scl, sda, address, bytes, repeated_start=false)
|
16
|
+
bytes = [bytes].flatten unless bytes.class == Array
|
17
|
+
|
18
|
+
# Use top bit of address to select stop condition (1), or repated start (0).
|
19
|
+
send_stop = repeated_start ? 0 : 1
|
20
|
+
|
21
|
+
write Message.encode command: 31,
|
22
|
+
pin: scl,
|
23
|
+
value: sda,
|
24
|
+
aux_message: pack(:uint8, 0x00) +
|
25
|
+
pack(:uint8, address | (send_stop << 7)) +
|
26
|
+
pack(:uint8, bytes.length) +
|
27
|
+
pack(:uint8, bytes)
|
28
|
+
end
|
29
|
+
|
30
|
+
# CMD = 32
|
31
|
+
def i2c_bb_read(scl, sda, address, register, read_length, repeated_start=false)
|
32
|
+
# Use top bit of address to select stop condition (1), or repated start (0).
|
33
|
+
send_stop = repeated_start ? 0 : 1
|
34
|
+
|
35
|
+
# A register address starting register address can be given (up to 4 bytes)
|
36
|
+
if register
|
37
|
+
register = [register].flatten
|
38
|
+
raise ArgumentError, 'maximum 4 byte register address for I2C read' if register.length > 4
|
39
|
+
register_packed = pack(:uint8, [register.length] + register)
|
40
|
+
else
|
41
|
+
register_packed = pack(:uint8, [0])
|
42
|
+
end
|
43
|
+
|
44
|
+
write Message.encode command: 32,
|
45
|
+
pin: scl,
|
46
|
+
value: sda,
|
47
|
+
aux_message: pack(:uint8, 0x00) +
|
48
|
+
pack(:uint8, address | (send_stop << 7)) +
|
49
|
+
pack(:uint8, read_length) +
|
50
|
+
register_packed
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/denko/board/infrared.rb
CHANGED
@@ -2,17 +2,17 @@ module Denko
|
|
2
2
|
class Board
|
3
3
|
def infrared_emit(pin, frequency, pulses)
|
4
4
|
#
|
5
|
-
# Limit to 255 marks/spaces (not pairs)
|
5
|
+
# Limit to 255 marks/spaces (not pairs).
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# Make length uint16 as well, for aligned memory access on ESP8266.
|
8
8
|
# Pulses max is 2x255 bytes long since each is 2 bytes.
|
9
|
-
length = pack :
|
9
|
+
length = pack :uint16, pulses.length, max: 2
|
10
10
|
bytes = pack :uint16, pulses, min: 1, max: 510
|
11
11
|
|
12
12
|
write Message.encode command: 16,
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
pin: pin,
|
14
|
+
value: frequency,
|
15
|
+
aux_message: length + bytes
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -1,15 +1,16 @@
|
|
1
1
|
module Denko
|
2
2
|
class Board
|
3
3
|
def show_ws2812(pin, pixel_buffer)
|
4
|
-
#
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
# ALWAYS have first 4 bytes set to 0. ESP32 crashes without this!
|
5
|
+
# Last 4 bytes will be settings, but not yet. Just 24-bit 800 kHz for now.
|
6
|
+
settings = pack :uint8, [0, 0, 0, 0, 0, 0, 0, 0]
|
7
|
+
|
8
|
+
pixel_bytes = pack :uint8, pixel_buffer
|
8
9
|
|
9
10
|
write_and_halt Message.encode command: 19,
|
10
11
|
pin: pin,
|
11
12
|
value: pixel_buffer.length,
|
12
|
-
aux_message: settings +
|
13
|
+
aux_message: settings + pixel_bytes
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
data/lib/denko/board/map.rb
CHANGED
@@ -5,7 +5,7 @@ module Denko
|
|
5
5
|
MAPS_FOLDER = File.join(Denko.root, "vendor/board-maps/yaml")
|
6
6
|
|
7
7
|
attr_reader :map
|
8
|
-
|
8
|
+
|
9
9
|
def substitute_zero_pins
|
10
10
|
["SDA", "SCL", "MOSI", "MISO", "SCK", "SS"].each do |name|
|
11
11
|
symbol = name.to_sym
|
@@ -25,7 +25,7 @@ module Denko
|
|
25
25
|
rescue
|
26
26
|
raise StandardError, "error loading board map from file for board name: '#{board_name}'"
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def convert_pin(pin)
|
30
30
|
# Convert non numerical strings to symbols.
|
31
31
|
pin = pin.to_sym if (pin.class == String) && !(pin.match (/\A\d+\.*\d*/))
|
@@ -50,6 +50,10 @@ module Denko
|
|
50
50
|
rescue
|
51
51
|
raise ArgumentError, "error in pin: #{pin.inspect}"
|
52
52
|
end
|
53
|
+
|
54
|
+
def pin_is_pwm?(pin)
|
55
|
+
false
|
56
|
+
end
|
53
57
|
end
|
54
58
|
end
|
55
59
|
end
|
data/lib/denko/board/one_wire.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Denko
|
2
2
|
class Board
|
3
|
-
def one_wire_reset(pin,
|
3
|
+
def one_wire_reset(pin, read_presence=false)
|
4
4
|
write Message.encode command: 41,
|
5
5
|
pin: pin,
|
6
|
-
value:
|
6
|
+
value: read_presence ? 1 : 0
|
7
7
|
end
|
8
8
|
|
9
9
|
def one_wire_search(pin, branch_mask)
|
@@ -12,7 +12,7 @@ module Denko
|
|
12
12
|
aux_message: pack(:uint64, branch_mask, max: 8)
|
13
13
|
end
|
14
14
|
|
15
|
-
def one_wire_write(pin, parasite_power,
|
15
|
+
def one_wire_write(pin, parasite_power, data)
|
16
16
|
bytes = pack :uint8, data, min: 1, max: 127 # Should be 128 with 0 = 1.
|
17
17
|
|
18
18
|
# Set high bit of length if the bus must drive high after write.
|