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/board/spi.rb
CHANGED
@@ -1,45 +1,49 @@
|
|
1
1
|
module Denko
|
2
2
|
class Board
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
# Use all of the board's aux buffer, except 8 bytes for header, or default to 512.
|
4
|
+
# NOTE: SPI lengths are sent as 12-bit, so hard upper limit of 4095.
|
5
|
+
def spi_limit
|
6
|
+
@spi_limit ||= aux_limit ? aux_limit-8 : 512
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
raise ArgumentError, "can't
|
9
|
+
def spi_header_generic(select_pin, write, read, mode=0, bit_order=:msbfirst)
|
10
|
+
raise ArgumentError, "can't read more than #{spi_limit} SPI bytes at a time" if read > spi_limit
|
11
|
+
raise ArgumentError, "can't write more than #{spi_limit} SPI bytes at a time" if write.length > spi_limit
|
10
12
|
|
11
|
-
# Lowest 2 bits of settings
|
13
|
+
# Lowest 2 bits of settings hold the SPI mode number.
|
14
|
+
raise ArgumentError, "invalid SPI mode: #{mode}. Must be 0, 1, 2, or 3" unless (0..3).include? mode
|
12
15
|
settings = mode
|
13
|
-
unless (0..3).include? settings
|
14
|
-
raise ArgumentError, "invalid SPI mode: #{settings.inspect}. Must be 0, 1, 2, or 3"
|
15
|
-
end
|
16
16
|
|
17
17
|
# Bit 7 of settings toggles MSBFIRST (1) or LSBFIRST (0) for both read and write.
|
18
|
-
settings
|
18
|
+
settings |= 0b10000000 unless bit_order == :lsbfirst
|
19
19
|
|
20
|
-
#
|
21
|
-
|
22
|
-
end
|
20
|
+
# Bit 6 of settings indicates whether a select pin needs to be toggled.
|
21
|
+
settings |= 0b01000000 if select_pin
|
23
22
|
|
24
|
-
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
raise ArgumentError, "error in SPI frequency: #{frequency.inspect}"
|
29
|
-
end
|
23
|
+
# 3 bytes are available for read and write length, so 12-bits each.
|
24
|
+
# Bytes 1 and 2 are lower 8 bits for read and write respectively.
|
25
|
+
# Byte 3 is shared: upper 4 hold read[8..12], lower 4 hold write.length[8..12]
|
26
|
+
shared_byte = ((read & 0xF00) >> 4) | ((write.length & 0xF00) >> 8)
|
30
27
|
|
31
|
-
#
|
32
|
-
|
28
|
+
# Generic portion (first 4 bytes), used by both hardware and bit bang SPI.
|
29
|
+
pack :uint8, [settings, read & 0xFF, write.length & 0xFF, shared_byte]
|
30
|
+
end
|
31
|
+
|
32
|
+
def spi_header(select_pin, write, read, frequency=1_000_000, mode=0, bit_order=:msbfirst)
|
33
|
+
raise ArgumentError, "error in SPI frequency: #{frequency}" unless [Integer, Float].include?(frequency.class)
|
34
|
+
frequency = frequency.to_i
|
33
35
|
|
34
36
|
# Generic header + packed frequency = hardware SPI header.
|
35
|
-
header
|
37
|
+
header = spi_header_generic(select_pin, write, read, mode, bit_order)
|
38
|
+
header += pack(:uint32, frequency)
|
36
39
|
end
|
37
40
|
|
38
41
|
# CMD = 26
|
39
|
-
def spi_transfer(select_pin, write: [], read: 0, frequency:
|
40
|
-
raise ArgumentError, "no bytes given to read or write" if (read
|
42
|
+
def spi_transfer(spi_index, select_pin, write: [], read: 0, frequency: 1_000_000, mode: 0, bit_order: :msbfirst)
|
43
|
+
raise ArgumentError, "no bytes given to read or write" if (read <= 0) && (write.empty?)
|
44
|
+
raise ArgumentError, "select_pin cannot be nil when reading or listening" if (read > 0) && (select_pin == nil)
|
41
45
|
|
42
|
-
header = spi_header(write, read, frequency, mode, bit_order)
|
46
|
+
header = spi_header(select_pin, write, read, frequency, mode, bit_order)
|
43
47
|
|
44
48
|
self.write Message.encode command: 26,
|
45
49
|
pin: select_pin,
|
@@ -47,11 +51,12 @@ module Denko
|
|
47
51
|
end
|
48
52
|
|
49
53
|
# CMD = 27
|
50
|
-
def spi_listen(select_pin, read: 0, frequency:
|
51
|
-
raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read > 0)
|
54
|
+
def spi_listen(spi_index, select_pin, read: 0, frequency: 1_000_000, mode: 0, bit_order: :msbfirst)
|
55
|
+
raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read.class == Integer) && (read > 0)
|
56
|
+
raise ArgumentError, "select_pin cannot be nil when reading or listening" if (select_pin == nil)
|
57
|
+
|
58
|
+
header = spi_header(select_pin, [], read, frequency, mode, bit_order)
|
52
59
|
|
53
|
-
header = spi_header([], read, frequency, mode, bit_order)
|
54
|
-
|
55
60
|
self.write Message.encode command: 27,
|
56
61
|
pin: select_pin,
|
57
62
|
aux_message: header
|
@@ -1,26 +1,24 @@
|
|
1
1
|
module Denko
|
2
2
|
class Board
|
3
|
-
def spi_bb_header(clock, input, output, write, read, mode, bit_order)
|
4
|
-
|
5
|
-
raise ArgumentError, "
|
6
|
-
raise ArgumentError, "no input or output pin given. Require either or both" unless(input || output)
|
3
|
+
def spi_bb_header(clock, input, output, select_pin, write, read, mode=0, bit_order=:msbfirst)
|
4
|
+
raise ArgumentError, "either output or input pin required" unless (input || output)
|
5
|
+
raise ArgumentError, "clock pin required" unless clock
|
7
6
|
|
8
7
|
# Set the other to disabled if only one given.
|
9
8
|
input ||= 255
|
10
|
-
|
9
|
+
output ||= 255
|
11
10
|
|
12
|
-
#
|
13
|
-
header = spi_header_generic(write, read, mode, bit_order)
|
14
|
-
|
15
|
-
# Generic header + packed pins + empty byte = bit bang SPI bheader.
|
11
|
+
# Generic header + packed pins + empty byte = bit bang SPI header.
|
12
|
+
header = spi_header_generic(select_pin, write, read, mode, bit_order)
|
16
13
|
header = header + pack(:uint8, [clock, input, output, 0])
|
17
14
|
end
|
18
15
|
|
19
16
|
# CMD = 21
|
20
|
-
def spi_bb_transfer(select_pin, clock: nil, output: nil, input: nil, write: [], read: 0, frequency: nil, mode:
|
21
|
-
raise ArgumentError, "no bytes given to read or write" if (read
|
17
|
+
def spi_bb_transfer(select_pin, clock: nil, output: nil, input: nil, write: [], read: 0, frequency: nil, mode: 0, bit_order: :msbfirst)
|
18
|
+
raise ArgumentError, "no bytes given to read or write" if (read <= 0) && (write.empty?)
|
19
|
+
raise ArgumentError, "select_pin cannot be nil when reading or listening" if (read > 0) && (select_pin == nil)
|
22
20
|
|
23
|
-
header = spi_bb_header(clock, input, output, write, read, mode, bit_order)
|
21
|
+
header = spi_bb_header(clock, input, output, select_pin, write, read, mode, bit_order)
|
24
22
|
|
25
23
|
self.write Message.encode command: 21,
|
26
24
|
pin: select_pin,
|
@@ -28,10 +26,11 @@ module Denko
|
|
28
26
|
end
|
29
27
|
|
30
28
|
# CMD = 22
|
31
|
-
def spi_bb_listen(select_pin, clock: nil, input: nil, read: 0, frequency: nil, mode:
|
32
|
-
raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read > 0)
|
29
|
+
def spi_bb_listen(select_pin, clock: nil, input: nil, read: 0, frequency: nil, mode: 0, bit_order: :msbfirst)
|
30
|
+
raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read.class == Integer) && (read > 0)
|
31
|
+
raise ArgumentError, "select_pin cannot be nil when reading or listening" if (select_pin == nil)
|
33
32
|
|
34
|
-
header = spi_bb_header(clock, input, nil, [], read, mode, bit_order)
|
33
|
+
header = spi_bb_header(clock, input, nil, select_pin, [], read, mode, bit_order)
|
35
34
|
|
36
35
|
self.write Message.encode command: 22,
|
37
36
|
pin: select_pin,
|
data/lib/denko/board.rb
CHANGED
@@ -3,28 +3,31 @@ Dir["#{Denko.root}/lib/denko/board/*.rb"].each { |file| require file }
|
|
3
3
|
|
4
4
|
module Denko
|
5
5
|
class Board
|
6
|
-
attr_reader :name, :version, :serial_buffer_size, :aux_limit, :eeprom_length
|
7
|
-
attr_reader :low, :high, :analog_write_high, :analog_read_high
|
6
|
+
attr_reader :name, :version, :serial_buffer_size, :aux_limit, :eeprom_length, :i2c_limit
|
7
|
+
attr_reader :low, :high, :analog_write_resolution, :analog_read_resolution, :analog_write_high, :analog_read_high
|
8
8
|
|
9
|
-
def
|
9
|
+
def platform
|
10
|
+
:arduino
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(connection, options={})
|
10
14
|
# Shake hands
|
11
|
-
@
|
12
|
-
ack =
|
15
|
+
@connection = connection
|
16
|
+
ack = connection.handshake
|
13
17
|
|
14
18
|
# Split handshake acknowledgement into separate values.
|
15
19
|
@name, @version, @serial_buffer_size, @aux_limit, @eeprom_length, @i2c_limit = ack.split(",")
|
16
20
|
|
17
|
-
# Tell
|
21
|
+
# Tell connection how much serial buffer the board has, for flow control.
|
18
22
|
@serial_buffer_size = @serial_buffer_size.to_i
|
19
23
|
raise StandardError, "no serial buffer size given in handshake" if @serial_buffer_size < 1
|
20
|
-
@
|
24
|
+
@connection.remote_buffer_size = @serial_buffer_size
|
21
25
|
|
22
26
|
# Load board map by name.
|
23
27
|
@name = nil if @name.empty?
|
24
28
|
load_map(@name)
|
25
29
|
|
26
|
-
|
27
|
-
@aux_limit = @aux_limit.to_i - 1
|
30
|
+
@aux_limit = @aux_limit.to_i
|
28
31
|
|
29
32
|
# Set I2C transaction size limit. Safe minimum is 32.
|
30
33
|
# This makes I2C fail silently if board does not implement.
|
@@ -35,62 +38,54 @@ module Denko
|
|
35
38
|
@version = nil if @version.empty?
|
36
39
|
@eeprom_length = @eeprom_length.to_i
|
37
40
|
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
+
# connection calls #update on board when data is received.
|
42
|
+
connection.add_observer(self)
|
43
|
+
|
41
44
|
# Set digital and analog IO levels.
|
42
45
|
@low = 0
|
43
46
|
@high = 1
|
44
47
|
self.analog_write_resolution = options[:write_bits] || 8
|
45
48
|
self.analog_read_resolution = options[:read_bits] || 10
|
46
49
|
end
|
47
|
-
|
50
|
+
|
48
51
|
def finish_write
|
49
|
-
sleep 0.001 while @
|
52
|
+
sleep 0.001 while @connection.writing?
|
50
53
|
write "\n91\n"
|
51
|
-
sleep 0.001 while @
|
54
|
+
sleep 0.001 while @connection.writing?
|
52
55
|
end
|
53
|
-
|
56
|
+
|
54
57
|
def analog_write_resolution=(value)
|
55
58
|
set_analog_write_resolution(value)
|
56
|
-
@
|
57
|
-
@analog_write_high = (2 ** @
|
59
|
+
@analog_write_resolution = value
|
60
|
+
@analog_write_high = (2 ** @analog_write_resolution) - 1
|
58
61
|
end
|
59
|
-
|
62
|
+
|
60
63
|
def analog_read_resolution=(value)
|
61
64
|
set_analog_read_resolution(value)
|
62
|
-
@
|
63
|
-
@analog_read_high = (2 ** @
|
64
|
-
end
|
65
|
-
|
66
|
-
def analog_write_resolution
|
67
|
-
@write_bits
|
65
|
+
@analog_read_resolution = value
|
66
|
+
@analog_read_high = (2 ** @analog_read_resolution) - 1
|
68
67
|
end
|
69
68
|
|
70
|
-
def analog_read_resolution
|
71
|
-
@read_bits
|
72
|
-
end
|
73
|
-
|
74
69
|
alias :pwm_high :analog_write_high
|
75
70
|
alias :dac_high :analog_write_high
|
76
71
|
alias :adc_high :analog_read_high
|
77
|
-
|
72
|
+
|
78
73
|
def write(msg)
|
79
|
-
@
|
74
|
+
@connection.write(msg)
|
80
75
|
end
|
81
76
|
|
82
77
|
#
|
83
78
|
# Use Board#write_and_halt to call C++ board functions that disable interrupts
|
84
79
|
# for a long time. "Long" being more than 1 serial character (~85us for 115200 baud).
|
85
80
|
#
|
86
|
-
# The "halt" part tells the
|
81
|
+
# The "halt" part tells the Connection to halt transmission to the board after this message.
|
87
82
|
# Since it expects interrupts to be disabled, any data sent could be lost.
|
88
|
-
#
|
83
|
+
#
|
89
84
|
# When the board function has re-enabled interrupts, it should call sendReady(). That
|
90
|
-
# signal is read by the
|
85
|
+
# signal is read by the Connection, telling it to resume transmisison.
|
91
86
|
#
|
92
87
|
def write_and_halt(msg)
|
93
|
-
@
|
88
|
+
@connection.write(msg, true)
|
94
89
|
end
|
95
90
|
|
96
91
|
#
|
@@ -100,6 +95,16 @@ module Denko
|
|
100
95
|
|
101
96
|
def update(line)
|
102
97
|
pin, message = line.split(":", 2)
|
98
|
+
|
99
|
+
# Handle messages from hardware I2C buses.
|
100
|
+
match = pin.match /\AI2C(\d*)/
|
101
|
+
if match
|
102
|
+
dev_index = match[1].to_i
|
103
|
+
dev = hw_i2c_comps[dev_index]
|
104
|
+
dev.update(message) if dev
|
105
|
+
return
|
106
|
+
end
|
107
|
+
|
103
108
|
pin = pin.to_i
|
104
109
|
if single_pin_components[pin]
|
105
110
|
single_pin_components[pin].update(message)
|
@@ -111,7 +116,7 @@ module Denko
|
|
111
116
|
#
|
112
117
|
def eeprom
|
113
118
|
raise StandardError, 'board has no built-in EEPROM, or EEPROM disabled in sketch' if @eeprom_length == 0
|
114
|
-
@eeprom ||= EEPROM::
|
119
|
+
@eeprom ||= EEPROM::Board.new(board: self)
|
115
120
|
end
|
116
121
|
end
|
117
122
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Denko
|
2
|
+
module Connection
|
3
|
+
class BinaryEcho
|
4
|
+
include Behaviors::SinglePin
|
5
|
+
include Behaviors::Reader
|
6
|
+
|
7
|
+
def test_range(min:0, max:255)
|
8
|
+
bytes = (min..max).to_a
|
9
|
+
board.binary_echo(pin, bytes)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_array(arr)
|
13
|
+
board.binary_echo(pin, arr)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -8,8 +8,8 @@ module Denko
|
|
8
8
|
@transit_mutex.synchronize { @remote_buffer_size = size }
|
9
9
|
end
|
10
10
|
|
11
|
-
def initialize(*args)
|
12
|
-
super(*args)
|
11
|
+
def initialize(*args, **kwargs)
|
12
|
+
super(*args, **kwargs)
|
13
13
|
# Start with minimum known buffer size. Board will update after handshake.
|
14
14
|
# WARNING: If not updated, and ack threshold on the board is > minimum,
|
15
15
|
# FlowControl will stop sending data, and appear to hang. Fix this.
|
@@ -27,7 +27,7 @@ module Denko
|
|
27
27
|
@tx_halt_points << @write_buffer.length if tx_halt_after
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def writing?
|
32
32
|
@write_buffer_mutex.synchronize { !@write_buffer.empty? }
|
33
33
|
end
|
@@ -41,17 +41,16 @@ module Denko
|
|
41
41
|
|
42
42
|
@write_buffer_mutex ||= Mutex.new
|
43
43
|
@write_buffer_mutex.synchronize do
|
44
|
-
@write_buffer =
|
44
|
+
@write_buffer = String.new
|
45
45
|
@tx_halt_points = []
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def write_from_buffer
|
50
50
|
fragment = nil
|
51
51
|
halt_after_fragment = false
|
52
52
|
|
53
53
|
@write_buffer_mutex.synchronize do
|
54
|
-
# Nothing to write.
|
55
54
|
break if @write_buffer.empty?
|
56
55
|
|
57
56
|
# Try to send the entire buffer unless a halt point is coming up.
|
@@ -80,12 +79,10 @@ module Denko
|
|
80
79
|
end
|
81
80
|
end
|
82
81
|
|
83
|
-
# If no fragment, wait.
|
84
82
|
return wait unless fragment
|
85
83
|
|
86
|
-
# If fragment, write it.
|
87
84
|
loop do
|
88
|
-
# Write
|
85
|
+
# Write fragment if @tx_ready.
|
89
86
|
@tx_ready_mutex.synchronize do
|
90
87
|
if @tx_ready
|
91
88
|
_write fragment
|
@@ -110,7 +107,7 @@ module Denko
|
|
110
107
|
|
111
108
|
def read
|
112
109
|
line = _read
|
113
|
-
|
110
|
+
|
114
111
|
if line
|
115
112
|
case line[0..2]
|
116
113
|
# Board read (freed) this many bytes from its input buffer.
|
@@ -142,19 +139,18 @@ module Denko
|
|
142
139
|
end
|
143
140
|
|
144
141
|
def tx_halt
|
145
|
-
@tx_ready_mutex.synchronize { @tx_ready = false }
|
142
|
+
@tx_ready_mutex.synchronize { @tx_ready = false }
|
146
143
|
end
|
147
144
|
|
148
145
|
def tx_resume
|
149
146
|
@tx_ready_mutex.synchronize { @tx_ready = true }
|
150
147
|
end
|
151
148
|
|
152
|
-
def add_transit_bytes(value)
|
153
|
-
@transit_mutex.synchronize { @transit_bytes = @transit_bytes + value }
|
154
|
-
end
|
155
|
-
|
156
149
|
def remove_transit_bytes(value)
|
157
|
-
@transit_mutex.synchronize
|
150
|
+
@transit_mutex.synchronize do
|
151
|
+
@transit_bytes = @transit_bytes - value
|
152
|
+
@transit_bytes = 0 if @transit_bytes < 0
|
153
|
+
end
|
158
154
|
end
|
159
155
|
end
|
160
156
|
end
|
@@ -6,10 +6,10 @@ module Denko
|
|
6
6
|
BAUD = 115200
|
7
7
|
|
8
8
|
def initialize(options={})
|
9
|
-
@device
|
10
|
-
@baud
|
11
|
-
@rx_buffer
|
12
|
-
@rx_line
|
9
|
+
@device = options[:device]
|
10
|
+
@baud = options[:baud] || BAUD
|
11
|
+
@rx_buffer = String.new
|
12
|
+
@rx_line = String.new
|
13
13
|
@rx_escaped = false
|
14
14
|
end
|
15
15
|
|
@@ -36,7 +36,7 @@ module Denko
|
|
36
36
|
else
|
37
37
|
if (char == "\n")
|
38
38
|
line = @rx_line
|
39
|
-
@rx_line =
|
39
|
+
@rx_line = String.new
|
40
40
|
return line
|
41
41
|
elsif (char == "\\")
|
42
42
|
@rx_escaped = true
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Denko
|
2
|
+
module DigitalIO
|
3
|
+
class CBitBang
|
4
|
+
include Behaviors::SinglePin
|
5
|
+
include Behaviors::Callbacks
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
|
8
|
+
# This is purely to force initialize validation for any pins
|
9
|
+
# being used by C libraries that bit-bang.
|
10
|
+
before_initialize do
|
11
|
+
params[:mode] ||= :input
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -5,11 +5,10 @@ module Denko
|
|
5
5
|
include Behaviors::Reader
|
6
6
|
include Behaviors::Poller
|
7
7
|
include Behaviors::Listener
|
8
|
+
include Behaviors::Lifecycle
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
@divider = 4
|
12
|
-
_listen
|
10
|
+
after_initialize do
|
11
|
+
_listen(params[:divider] || 4)
|
13
12
|
end
|
14
13
|
|
15
14
|
def _read
|
@@ -32,7 +31,7 @@ module Denko
|
|
32
31
|
block.call(data) if data.to_i == board.low
|
33
32
|
end
|
34
33
|
end
|
35
|
-
|
34
|
+
|
36
35
|
def pre_callback_filter(value)
|
37
36
|
value.to_i
|
38
37
|
end
|
@@ -4,22 +4,31 @@ module Denko
|
|
4
4
|
include Behaviors::OutputPin
|
5
5
|
include Behaviors::Callbacks
|
6
6
|
include Behaviors::Threaded
|
7
|
+
include Behaviors::Lifecycle
|
8
|
+
|
7
9
|
interrupt_with :digital_write
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
board.digital_read(pin)
|
11
|
+
after_initialize do
|
12
|
+
board.digital_read(pin) unless @board.platform == :linux_milkv_duo
|
12
13
|
end
|
13
14
|
|
14
15
|
def pre_callback_filter(board_state)
|
15
16
|
board_state.to_i
|
16
17
|
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
# mruby optimization. Bypass #state= setter.
|
20
|
+
if Denko.mruby?
|
21
|
+
def digital_write(value)
|
22
|
+
@board.digital_write(@pin, value)
|
23
|
+
@state = value
|
24
|
+
end
|
25
|
+
else
|
26
|
+
def digital_write(value)
|
27
|
+
@board.digital_write(@pin, value)
|
28
|
+
self.state = value
|
29
|
+
end
|
21
30
|
end
|
22
|
-
|
31
|
+
|
23
32
|
alias :write :digital_write
|
24
33
|
|
25
34
|
def low
|
@@ -33,13 +42,13 @@ module Denko
|
|
33
42
|
def toggle
|
34
43
|
state == board.low ? high : low
|
35
44
|
end
|
36
|
-
|
45
|
+
|
37
46
|
alias :off :low
|
38
47
|
alias :on :high
|
39
|
-
|
48
|
+
|
40
49
|
def high?; state == board.high end
|
41
50
|
def low?; state == board.low end
|
42
|
-
|
51
|
+
|
43
52
|
alias :on? :high?
|
44
53
|
alias :off? :low?
|
45
54
|
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module Denko
|
2
|
+
module DigitalIO
|
3
|
+
class PCF8574
|
4
|
+
include I2C::Peripheral
|
5
|
+
include Behaviors::Lifecycle
|
6
|
+
|
7
|
+
# Default I2C address. Override with i2c_address: key in initialize hash.
|
8
|
+
I2C_ADDRESS = 0x3F
|
9
|
+
I2C_FREQUENCY = 400_000
|
10
|
+
|
11
|
+
#
|
12
|
+
# 8 bit I/O expander where each read/write is a single I2C byte that gets/sets the whole register.
|
13
|
+
# - No separate data direction register.
|
14
|
+
# - Writing 1 to a bit puts that pin into high-impedance mode. It behaves as input or high output.
|
15
|
+
# - Writing 0 is low output.
|
16
|
+
# - Reading gives the actual state of the pins, regardless of direction.
|
17
|
+
#
|
18
|
+
after_initialize do
|
19
|
+
read_state
|
20
|
+
end
|
21
|
+
|
22
|
+
def write
|
23
|
+
bytes = []
|
24
|
+
@state_mutex.lock
|
25
|
+
if @state != @previous_state
|
26
|
+
@state.each_slice(8) do |slice|
|
27
|
+
byte = 0
|
28
|
+
slice.each_with_index do |bit, index|
|
29
|
+
next unless bit
|
30
|
+
byte |= (bit << index)
|
31
|
+
end
|
32
|
+
|
33
|
+
bytes.unshift byte
|
34
|
+
end
|
35
|
+
i2c_write bytes
|
36
|
+
@previous_state = @state.dup
|
37
|
+
end
|
38
|
+
@state_mutex.unlock
|
39
|
+
@state
|
40
|
+
end
|
41
|
+
|
42
|
+
def read_state
|
43
|
+
@state_mutex.lock
|
44
|
+
byte = i2c_read_raw(1)[0]
|
45
|
+
8.times do |i|
|
46
|
+
@state[i] = (byte >> i) & 0b1
|
47
|
+
end
|
48
|
+
@state_mutex.unlock
|
49
|
+
@state
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# BoardProxy interface. Refactor maybe?
|
54
|
+
#
|
55
|
+
def platform
|
56
|
+
:pcf8574
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_pin_mode(pin, mode, options={})
|
60
|
+
if mode == :output
|
61
|
+
digital_write(pin, 0)
|
62
|
+
else
|
63
|
+
digital_write(pin, 1)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def digital_read(pin)
|
68
|
+
state[pin]
|
69
|
+
end
|
70
|
+
|
71
|
+
def is_a_register?
|
72
|
+
true
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# Taken from SPI::BaseRegister
|
77
|
+
#
|
78
|
+
include Behaviors::BoardProxy
|
79
|
+
#
|
80
|
+
# Default registers to 1 byte, or 8 pins when used as Board Proxy.
|
81
|
+
# Can be ignored if reading / writing the register directly.
|
82
|
+
def bytes
|
83
|
+
@bytes = params[:bytes] || 1
|
84
|
+
end
|
85
|
+
attr_writer :bytes
|
86
|
+
#
|
87
|
+
# When used as BoardProxy, store the state of each register
|
88
|
+
# pin as a 0 or 1 in an array that is (@bytes * 8) long.
|
89
|
+
#
|
90
|
+
def state
|
91
|
+
@state ||= Array.new(bytes*8) { 1 }
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# Taken from SPI::Output Register.
|
96
|
+
#
|
97
|
+
def digital_write(pin, value)
|
98
|
+
bit_set(pin, value)
|
99
|
+
write
|
100
|
+
end
|
101
|
+
|
102
|
+
def bit_set(pin, value)
|
103
|
+
@state_mutex.lock
|
104
|
+
@state[pin] = value
|
105
|
+
@state_mutex.unlock
|
106
|
+
value
|
107
|
+
end
|
108
|
+
|
109
|
+
def pin_is_pwm?(pin)
|
110
|
+
false
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|