denko 0.13.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 +7 -0
- data/.github/workflows/build_avr.yml +61 -0
- data/.github/workflows/build_esp32.yml +58 -0
- data/.github/workflows/build_esp8266.yml +57 -0
- data/.github/workflows/build_megaavr.yml +61 -0
- data/.github/workflows/build_rp2040.yml +61 -0
- data/.github/workflows/build_sam3x.yml +59 -0
- data/.github/workflows/build_samd.yml +61 -0
- data/.github/workflows/ruby.yml +47 -0
- data/.gitignore +24 -0
- data/.gitmodules +3 -0
- data/.vscode/settings.json +5 -0
- data/.vscode/tasks.json +20 -0
- data/CHANGELOG.md +466 -0
- data/DEPS_CLI.md +80 -0
- data/DEPS_IDE.md +120 -0
- data/Gemfile +4 -0
- data/HARDWARE.md +195 -0
- data/LICENSE +22 -0
- data/README.md +152 -0
- data/Rakefile +11 -0
- data/bin/denko +22 -0
- data/build +27 -0
- data/denko.gemspec +47 -0
- data/examples/advanced/rotary_encoder_mac_volume.rb +48 -0
- data/examples/advanced/ssd1306_time_temp_rh.rb +48 -0
- data/examples/analog_io/ads1118.rb +74 -0
- data/examples/analog_io/dac_loopback.rb +32 -0
- data/examples/analog_io/input.rb +52 -0
- data/examples/connection/tcp.rb +34 -0
- data/examples/digital_io/rotary_encoder.rb +26 -0
- data/examples/display/hd44780.png +0 -0
- data/examples/display/hd44780.rb +39 -0
- data/examples/display/ssd1306.rb +40 -0
- data/examples/display/ssd1306_s2_pico.rb +29 -0
- data/examples/eeprom/built_in.rb +32 -0
- data/examples/i2c/search.rb +53 -0
- data/examples/led/apa102_bounce.rb +33 -0
- data/examples/led/apa102_breathe.rb +45 -0
- data/examples/led/builtin_blink.rb +12 -0
- data/examples/led/seven_segment_char_echo.rb +15 -0
- data/examples/led/ws2812_bounce.rb +32 -0
- data/examples/led/ws2812_builtin_blink.rb +21 -0
- data/examples/motor/l298.rb +43 -0
- data/examples/motor/servo.rb +16 -0
- data/examples/motor/stepper.png +0 -0
- data/examples/motor/stepper.rb +43 -0
- data/examples/pulse_io/buzzer.rb +30 -0
- data/examples/pulse_io/ir_transmitter.rb +55 -0
- data/examples/rtc/ds3231.rb +48 -0
- data/examples/sensor/aht10.rb +15 -0
- data/examples/sensor/aht20.rb +15 -0
- data/examples/sensor/bme280.rb +75 -0
- data/examples/sensor/dht.rb +24 -0
- data/examples/sensor/ds18b20.rb +58 -0
- data/examples/sensor/htu21d.rb +54 -0
- data/examples/sensor/htu31d.rb +31 -0
- data/examples/spi/input_register.rb +50 -0
- data/examples/spi/output_register.rb +49 -0
- data/examples/spi/ssd_through_register.rb +40 -0
- data/examples/spi/two_registers.rb +46 -0
- data/examples/uart/bit_bang_read.rb +16 -0
- data/examples/uart/bit_bang_write.rb +16 -0
- data/examples/uart/board_passthrough.rb +34 -0
- data/examples/uart/hardware_loopback.rb +16 -0
- data/lib/denko/analog_io/ads1118.rb +182 -0
- data/lib/denko/analog_io/input.rb +79 -0
- data/lib/denko/analog_io/output.rb +20 -0
- data/lib/denko/analog_io/potentiometer.rb +15 -0
- data/lib/denko/analog_io/sensor.rb +6 -0
- data/lib/denko/analog_io.rb +9 -0
- data/lib/denko/behaviors/board_proxy.rb +23 -0
- data/lib/denko/behaviors/bus_controller.rb +11 -0
- data/lib/denko/behaviors/bus_controller_addressed.rb +15 -0
- data/lib/denko/behaviors/bus_peripheral.rb +21 -0
- data/lib/denko/behaviors/bus_peripheral_addressed.rb +15 -0
- data/lib/denko/behaviors/callbacks.rb +67 -0
- data/lib/denko/behaviors/component.rb +48 -0
- data/lib/denko/behaviors/input_pin.rb +24 -0
- data/lib/denko/behaviors/listener.rb +22 -0
- data/lib/denko/behaviors/multi_pin.rb +72 -0
- data/lib/denko/behaviors/output_pin.rb +13 -0
- data/lib/denko/behaviors/poller.rb +31 -0
- data/lib/denko/behaviors/reader.rb +49 -0
- data/lib/denko/behaviors/single_pin.rb +26 -0
- data/lib/denko/behaviors/state.rb +24 -0
- data/lib/denko/behaviors/subcomponents.rb +35 -0
- data/lib/denko/behaviors/threaded.rb +54 -0
- data/lib/denko/behaviors.rb +26 -0
- data/lib/denko/board/core.rb +151 -0
- data/lib/denko/board/eeprom.rb +20 -0
- data/lib/denko/board/i2c.rb +68 -0
- data/lib/denko/board/infrared.rb +18 -0
- data/lib/denko/board/led_array.rb +18 -0
- data/lib/denko/board/map.rb +46 -0
- data/lib/denko/board/message_pack.rb +7 -0
- data/lib/denko/board/one_wire.rb +34 -0
- data/lib/denko/board/pulse.rb +26 -0
- data/lib/denko/board/servo.rb +22 -0
- data/lib/denko/board/spi.rb +65 -0
- data/lib/denko/board/spi_bit_bang.rb +41 -0
- data/lib/denko/board/tone.rb +23 -0
- data/lib/denko/board/uart.rb +42 -0
- data/lib/denko/board/uart_bit_bang.rb +33 -0
- data/lib/denko/board.rb +104 -0
- data/lib/denko/connection/base.rb +75 -0
- data/lib/denko/connection/board_uart.rb +36 -0
- data/lib/denko/connection/flow_control.rb +153 -0
- data/lib/denko/connection/handshake.rb +60 -0
- data/lib/denko/connection/serial.rb +90 -0
- data/lib/denko/connection/tcp.rb +44 -0
- data/lib/denko/connection.rb +10 -0
- data/lib/denko/digital_io/button.rb +8 -0
- data/lib/denko/digital_io/input.rb +44 -0
- data/lib/denko/digital_io/output.rb +47 -0
- data/lib/denko/digital_io/relay.rb +6 -0
- data/lib/denko/digital_io/rotary_encoder.rb +107 -0
- data/lib/denko/digital_io.rb +9 -0
- data/lib/denko/display/canvas.rb +282 -0
- data/lib/denko/display/hd44780.rb +266 -0
- data/lib/denko/display/ssd1306.rb +179 -0
- data/lib/denko/display.rb +7 -0
- data/lib/denko/eeprom/built_in.rb +69 -0
- data/lib/denko/eeprom.rb +5 -0
- data/lib/denko/fonts.rb +106 -0
- data/lib/denko/i2c/bus.rb +52 -0
- data/lib/denko/i2c/peripheral.rb +38 -0
- data/lib/denko/i2c.rb +6 -0
- data/lib/denko/led/apa102.rb +87 -0
- data/lib/denko/led/base.rb +12 -0
- data/lib/denko/led/rgb.rb +38 -0
- data/lib/denko/led/seven_segment.rb +111 -0
- data/lib/denko/led/ws2812.rb +48 -0
- data/lib/denko/led.rb +13 -0
- data/lib/denko/message.rb +92 -0
- data/lib/denko/motor/l298.rb +49 -0
- data/lib/denko/motor/servo.rb +51 -0
- data/lib/denko/motor/stepper.rb +71 -0
- data/lib/denko/motor.rb +7 -0
- data/lib/denko/one_wire/bus.rb +61 -0
- data/lib/denko/one_wire/bus_enumeration.rb +88 -0
- data/lib/denko/one_wire/constants.rb +17 -0
- data/lib/denko/one_wire/helper.rb +33 -0
- data/lib/denko/one_wire/peripheral.rb +62 -0
- data/lib/denko/one_wire.rb +9 -0
- data/lib/denko/pulse_io/buzzer.rb +25 -0
- data/lib/denko/pulse_io/ir_transmitter.rb +22 -0
- data/lib/denko/pulse_io/pwm_output.rb +34 -0
- data/lib/denko/pulse_io.rb +7 -0
- data/lib/denko/rtc/ds3231.rb +48 -0
- data/lib/denko/rtc.rb +5 -0
- data/lib/denko/sensor/aht.rb +165 -0
- data/lib/denko/sensor/bme280.rb +366 -0
- data/lib/denko/sensor/dht.rb +43 -0
- data/lib/denko/sensor/ds18b20.rb +74 -0
- data/lib/denko/sensor/htu21d.rb +168 -0
- data/lib/denko/sensor/htu31d.rb +187 -0
- data/lib/denko/sensor/virtual.rb +42 -0
- data/lib/denko/sensor.rb +13 -0
- data/lib/denko/spi/base_register.rb +37 -0
- data/lib/denko/spi/bit_bang.rb +74 -0
- data/lib/denko/spi/bus.rb +44 -0
- data/lib/denko/spi/input_register.rb +130 -0
- data/lib/denko/spi/output_register.rb +67 -0
- data/lib/denko/spi/peripheral.rb +43 -0
- data/lib/denko/spi.rb +10 -0
- data/lib/denko/uart/bit_bang.rb +69 -0
- data/lib/denko/uart/hardware.rb +65 -0
- data/lib/denko/uart.rb +6 -0
- data/lib/denko/version.rb +3 -0
- data/lib/denko.rb +39 -0
- data/lib/denko_cli/generator.rb +171 -0
- data/lib/denko_cli/helper.rb +29 -0
- data/lib/denko_cli/missing_files.txt +20 -0
- data/lib/denko_cli/packages.rb +101 -0
- data/lib/denko_cli/parser.rb +73 -0
- data/lib/denko_cli/targets.rb +30 -0
- data/lib/denko_cli/targets.txt +113 -0
- data/lib/denko_cli/usage.txt +34 -0
- data/lib/denko_cli.rb +18 -0
- data/src/denko_ethernet.ino +78 -0
- data/src/denko_serial.ino +41 -0
- data/src/denko_wifi.ino +157 -0
- data/src/lib/Denko.cpp +330 -0
- data/src/lib/Denko.h +259 -0
- data/src/lib/DenkoCoreIO.cpp +322 -0
- data/src/lib/DenkoDefines.h +116 -0
- data/src/lib/DenkoEEPROM.cpp +64 -0
- data/src/lib/DenkoI2C.cpp +155 -0
- data/src/lib/DenkoIROut.cpp +33 -0
- data/src/lib/DenkoIROutESP.cpp +26 -0
- data/src/lib/DenkoLEDArray.cpp +49 -0
- data/src/lib/DenkoOneWire.cpp +156 -0
- data/src/lib/DenkoPulseInput.cpp +57 -0
- data/src/lib/DenkoSPI.cpp +165 -0
- data/src/lib/DenkoSPIBB.cpp +156 -0
- data/src/lib/DenkoServo.cpp +83 -0
- data/src/lib/DenkoTone.cpp +25 -0
- data/src/lib/DenkoUART.cpp +118 -0
- data/src/lib/DenkoUARTBB.cpp +62 -0
- data/target.yml +3 -0
- data/test/analog_io/input_test.rb +38 -0
- data/test/analog_io/output_test.rb +26 -0
- data/test/analog_io/potentiometer_test.rb +62 -0
- data/test/behaviors/board_proxy_test.rb +24 -0
- data/test/behaviors/bus_controller_addressed_test.rb +40 -0
- data/test/behaviors/bus_controller_test.rb +28 -0
- data/test/behaviors/bus_peripheral_addressed.rb +44 -0
- data/test/behaviors/bus_peripheral_test.rb +39 -0
- data/test/behaviors/callbacks_test.rb +118 -0
- data/test/behaviors/component_test.rb +56 -0
- data/test/behaviors/input_pin_test.rb +42 -0
- data/test/behaviors/listener_test.rb +60 -0
- data/test/behaviors/multi_pin_test.rb +70 -0
- data/test/behaviors/output_pin_test.rb +27 -0
- data/test/behaviors/poller_test.rb +64 -0
- data/test/behaviors/reader_test.rb +68 -0
- data/test/behaviors/single_pin_test.rb +41 -0
- data/test/behaviors/subcomponents_test.rb +75 -0
- data/test/behaviors/threaded_test.rb +98 -0
- data/test/board/board_test.rb +130 -0
- data/test/board/core_test.rb +182 -0
- data/test/board/eeprom_test.rb +34 -0
- data/test/board/helper_test.rb +38 -0
- data/test/board/i2c_test.rb +114 -0
- data/test/board/infrared_test.rb +37 -0
- data/test/board/message_test.rb +54 -0
- data/test/board/one_wire_test.rb +69 -0
- data/test/board/pulse_test.rb +51 -0
- data/test/board/servo_test.rb +47 -0
- data/test/board/spi_test.rb +97 -0
- data/test/board/tone_test.rb +42 -0
- data/test/connection/serial_test.rb +172 -0
- data/test/connection/tcp_test.rb +37 -0
- data/test/digital_io/input_test.rb +65 -0
- data/test/digital_io/output_test.rb +64 -0
- data/test/digital_io/rotary_encoder_test.rb +99 -0
- data/test/display/hd44780_test.rb +23 -0
- data/test/eeprom/built_in_test.rb +61 -0
- data/test/i2c/bus_test.rb +66 -0
- data/test/i2c/peripheral_test.rb +50 -0
- data/test/led/base_test.rb +24 -0
- data/test/led/rgb_test.rb +64 -0
- data/test/led/seven_segment_test.rb +86 -0
- data/test/motor/servo_test.rb +62 -0
- data/test/motor/stepper_test.rb +51 -0
- data/test/one_wire/bus_enumerator_test.rb +134 -0
- data/test/one_wire/bus_test.rb +142 -0
- data/test/one_wire/helper_test.rb +18 -0
- data/test/one_wire/peripheral_test.rb +158 -0
- data/test/pulse_io/buzzer_test.rb +48 -0
- data/test/pulse_io/ir_transmitter_test.rb +38 -0
- data/test/pulse_io/pwm_output_test.rb +72 -0
- data/test/rtc/ds3231_test.rb +55 -0
- data/test/sensor/dht_test.rb +64 -0
- data/test/sensor/ds18b20_test.rb +107 -0
- data/test/spi/base_register_test.rb +34 -0
- data/test/spi/bus_test.rb +76 -0
- data/test/spi/input_register_test.rb +140 -0
- data/test/spi/output_register_test.rb +93 -0
- data/test/test_helper.rb +223 -0
- data/test/uart/bitbang_test.rb +37 -0
- data/tutorial/01-led/led.fzz +0 -0
- data/tutorial/01-led/led.pdf +0 -0
- data/tutorial/01-led/led.rb +73 -0
- data/tutorial/02-button/button.fzz +0 -0
- data/tutorial/02-button/button.pdf +0 -0
- data/tutorial/02-button/button.rb +64 -0
- data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
- data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
- data/tutorial/03-potentiometer/potentiometer.rb +62 -0
- 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 +66 -0
- 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 +58 -0
- data/tutorial/05-rgb_led/rgb_mapping.rb +76 -0
- data/vendor/board-maps/.gitignore +56 -0
- data/vendor/board-maps/.gitmodules +21 -0
- data/vendor/board-maps/BoardMap.h +1364 -0
- data/vendor/board-maps/README.md +51 -0
- data/vendor/board-maps/lib/boards_parser.rb +66 -0
- data/vendor/board-maps/lib/header_parser.rb +164 -0
- data/vendor/board-maps/run.rb +47 -0
- data/vendor/board-maps/yaml/0XCB_HELIOS.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2.yml +25 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2_REVTFT.yml +25 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2_TFT.yml +27 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3.yml +29 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_NOPSRAM.yml +29 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_REVTFT.yml +25 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_TFT.yml +27 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +30 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_CAN.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_DVI.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_PROP_MAKER.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_RFM.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_SCORPIO.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_THINKINK.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_USB_HOST.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_ITSYBITSY_ESP32.yml +24 -0
- data/vendor/board-maps/yaml/ADAFRUIT_ITSYBITSY_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_KB2040_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_MACROPAD_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_MATRIXPORTAL_ESP32S3.yml +16 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +12 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +22 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +20 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +27 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_STEMMAFRIEND_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/ADAFRUIT_TRINKEYQT_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/ALKS.yml +34 -0
- data/vendor/board-maps/yaml/AMPERKA_WIFI_SLOT.yml +16 -0
- data/vendor/board-maps/yaml/AVR_ADK.yml +24 -0
- data/vendor/board-maps/yaml/AVR_BT.yml +16 -0
- data/vendor/board-maps/yaml/AVR_CIRCUITPLAY.yml +14 -0
- data/vendor/board-maps/yaml/AVR_DUEMILANOVE.yml +16 -0
- data/vendor/board-maps/yaml/AVR_ESPLORA.yml +20 -0
- data/vendor/board-maps/yaml/AVR_ETHERNET.yml +16 -0
- data/vendor/board-maps/yaml/AVR_FIO.yml +16 -0
- data/vendor/board-maps/yaml/AVR_GEMMA.yml +6 -0
- data/vendor/board-maps/yaml/AVR_INDUSTRIAL101.yml +20 -0
- data/vendor/board-maps/yaml/AVR_LEONARDO.yml +20 -0
- data/vendor/board-maps/yaml/AVR_LEONARDO_ETH.yml +20 -0
- data/vendor/board-maps/yaml/AVR_LILYPAD.yml +16 -0
- data/vendor/board-maps/yaml/AVR_LILYPAD_USB.yml +20 -0
- data/vendor/board-maps/yaml/AVR_LININO_ONE.yml +20 -0
- data/vendor/board-maps/yaml/AVR_MEGA.yml +24 -0
- data/vendor/board-maps/yaml/AVR_MEGA2560.yml +24 -0
- data/vendor/board-maps/yaml/AVR_MICRO.yml +20 -0
- data/vendor/board-maps/yaml/AVR_MINI.yml +16 -0
- data/vendor/board-maps/yaml/AVR_NANO.yml +16 -0
- data/vendor/board-maps/yaml/AVR_NANO_EVERY.yml +22 -0
- data/vendor/board-maps/yaml/AVR_NG.yml +16 -0
- data/vendor/board-maps/yaml/AVR_PRO.yml +16 -0
- data/vendor/board-maps/yaml/AVR_ROBOT_CONTROL.yml +22 -0
- data/vendor/board-maps/yaml/AVR_ROBOT_MOTOR.yml +19 -0
- data/vendor/board-maps/yaml/AVR_UNO.yml +16 -0
- data/vendor/board-maps/yaml/AVR_UNO_WIFI_DEV_ED.yml +16 -0
- data/vendor/board-maps/yaml/AVR_UNO_WIFI_REV2.yml +22 -0
- data/vendor/board-maps/yaml/AVR_YUN.yml +20 -0
- data/vendor/board-maps/yaml/AVR_YUNMINI.yml +20 -0
- data/vendor/board-maps/yaml/AirM2M_CORE_ESP32C3.yml +14 -0
- data/vendor/board-maps/yaml/BEE_DATA_LOGGER.yml +39 -0
- data/vendor/board-maps/yaml/BPI_BIT.yml +9 -0
- data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +31 -0
- data/vendor/board-maps/yaml/BRIDGETEK_IDM2040-7A.yml +48 -0
- data/vendor/board-maps/yaml/BeeMotionS3.yml +40 -0
- data/vendor/board-maps/yaml/Bee_Motion.yml +27 -0
- data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +1 -0
- data/vendor/board-maps/yaml/Bee_S3.yml +38 -0
- data/vendor/board-maps/yaml/CHALLENGER_2040_LORA_RP2040.yml +39 -0
- data/vendor/board-maps/yaml/CHALLENGER_2040_LTE_RP2040.yml +38 -0
- data/vendor/board-maps/yaml/CHALLENGER_2040_NFC_RP2040.yml +32 -0
- data/vendor/board-maps/yaml/CHALLENGER_2040_SDRTC_RP2040.yml +36 -0
- data/vendor/board-maps/yaml/CHALLENGER_2040_SUBGHZ_RP2040.yml +39 -0
- data/vendor/board-maps/yaml/CHALLENGER_2040_UWB_RP2040.yml +39 -0
- data/vendor/board-maps/yaml/CHALLENGER_2040_WIFI_BLE_RP2040.yml +42 -0
- data/vendor/board-maps/yaml/CHALLENGER_2040_WIFI_RP2040.yml +38 -0
- data/vendor/board-maps/yaml/CHALLENGER_NB_2040_WIFI_RP2040.yml +38 -0
- data/vendor/board-maps/yaml/CRABIK_SLOT_ESP32_S3.yml +19 -0
- data/vendor/board-maps/yaml/CYTRON_MAKER_FEATHER_AIOT_S3.yml +26 -0
- data/vendor/board-maps/yaml/CYTRON_MAKER_NANO_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/CYTRON_MAKER_PI_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/CoreESP32.yml +49 -0
- data/vendor/board-maps/yaml/D1_MINI32.yml +36 -0
- data/vendor/board-maps/yaml/D1_UNO32.yml +28 -0
- data/vendor/board-maps/yaml/DATANOISETV_PICOADK.yml +48 -0
- data/vendor/board-maps/yaml/DENKY.yml +26 -0
- data/vendor/board-maps/yaml/DENKY_PICOV3.yml +26 -0
- data/vendor/board-maps/yaml/DENKY_WROOM32.yml +26 -0
- data/vendor/board-maps/yaml/DEPARTMENT_OF_ALCHEMY_MINIMAIN_ESP32S2.yml +26 -0
- data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32_C3.yml +14 -0
- data/vendor/board-maps/yaml/DFROBOT_BEETLE_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32E.yml +44 -0
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32S3.yml +38 -0
- data/vendor/board-maps/yaml/DFROBOT_ROMEO_ESP32S3.yml +7 -0
- data/vendor/board-maps/yaml/DPU_ESP32.yml +26 -0
- data/vendor/board-maps/yaml/DYDK.yml +38 -0
- data/vendor/board-maps/yaml/DYDK1A.yml +37 -0
- data/vendor/board-maps/yaml/DYDK1Av2.yml +45 -0
- data/vendor/board-maps/yaml/DYG.yml +20 -0
- data/vendor/board-maps/yaml/DYM.yml +40 -0
- data/vendor/board-maps/yaml/DYMv2.yml +39 -0
- data/vendor/board-maps/yaml/D_Duino_32.yml +29 -0
- data/vendor/board-maps/yaml/ELECTRONICCATS_HUNTERCAT_NFC.yml +44 -0
- data/vendor/board-maps/yaml/ESP320.yml +8 -0
- data/vendor/board-maps/yaml/ESP32C3_DEV.yml +14 -0
- data/vendor/board-maps/yaml/ESP32C3_M1_I_KIT.yml +13 -0
- data/vendor/board-maps/yaml/ESP32S2_DEV.yml +33 -0
- data/vendor/board-maps/yaml/ESP32S2_THING_PLUS.yml +34 -0
- data/vendor/board-maps/yaml/ESP32S2_USB.yml +33 -0
- data/vendor/board-maps/yaml/ESP32S3_CAM_LCD.yml +7 -0
- data/vendor/board-maps/yaml/ESP32S3_DEV.yml +38 -0
- data/vendor/board-maps/yaml/ESP32_DEV.yml +26 -0
- data/vendor/board-maps/yaml/ESP32_DEVKIT_LIPO.yml +26 -0
- data/vendor/board-maps/yaml/ESP32_EVB.yml +7 -0
- data/vendor/board-maps/yaml/ESP32_GATEWAY.yml +13 -0
- data/vendor/board-maps/yaml/ESP32_GATEWAY_C.yml +13 -0
- data/vendor/board-maps/yaml/ESP32_GATEWAY_E.yml +13 -0
- data/vendor/board-maps/yaml/ESP32_GATEWAY_F.yml +13 -0
- data/vendor/board-maps/yaml/ESP32_IOT_REDBOARD.yml +27 -0
- data/vendor/board-maps/yaml/ESP32_MICROMOD.yml +24 -0
- data/vendor/board-maps/yaml/ESP32_PICO.yml +26 -0
- data/vendor/board-maps/yaml/ESP32_POE.yml +7 -0
- data/vendor/board-maps/yaml/ESP32_POE_ISO.yml +7 -0
- data/vendor/board-maps/yaml/ESP32_S3_BOX.yml +16 -0
- data/vendor/board-maps/yaml/ESP32_S3_USB_OTG.yml +11 -0
- data/vendor/board-maps/yaml/ESP32_THING.yml +27 -0
- data/vendor/board-maps/yaml/ESP32_THING_PLUS.yml +30 -0
- data/vendor/board-maps/yaml/ESP32_THING_PLUS_C.yml +30 -0
- data/vendor/board-maps/yaml/ESP32_WROOM_DA.yml +26 -0
- data/vendor/board-maps/yaml/ESP32_WROVER_KIT.yml +26 -0
- data/vendor/board-maps/yaml/ESP8266_ADAFRUIT_HUZZAH.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_AGRUMINO_LEMON_V4.yml +8 -0
- data/vendor/board-maps/yaml/ESP8266_ARDUINO_PRIMO.yml +7 -0
- data/vendor/board-maps/yaml/ESP8266_ARDUINO_STAR_OTTO.yml +7 -0
- data/vendor/board-maps/yaml/ESP8266_ARDUINO_UNOWIFI.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_ESP01.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_ESP07.yml +20 -0
- data/vendor/board-maps/yaml/ESP8266_ESP12.yml +20 -0
- data/vendor/board-maps/yaml/ESP8266_ESP13.yml +17 -0
- data/vendor/board-maps/yaml/ESP8266_ESP210.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_ESPECTRO_CORE.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_ESPINO_ESP12.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_ESPINO_ESP13.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_ESPRESSO_LITE_V1.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_ESPRESSO_LITE_V2.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_GENERIC.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_INVENT_ONE.yml +22 -0
- data/vendor/board-maps/yaml/ESP8266_NODEMCU_ESP12.yml +20 -0
- data/vendor/board-maps/yaml/ESP8266_NODEMCU_ESP12E.yml +20 -0
- data/vendor/board-maps/yaml/ESP8266_OAK.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_PHOENIX_V1.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_PHOENIX_V2.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_SCHIRMILABS_EDUINO_WIFI.yml +25 -0
- data/vendor/board-maps/yaml/ESP8266_SONOFF_BASIC.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_SONOFF_S20.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_SONOFF_SV.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_SONOFF_TH.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_THING.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_THING_DEV.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINI.yml +18 -0
- data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINILITE.yml +18 -0
- data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINIPRO.yml +18 -0
- data/vendor/board-maps/yaml/ESP8266_WEMOS_D1R1.yml +25 -0
- data/vendor/board-maps/yaml/ESP8266_WEMOS_D1WROOM02.yml +18 -0
- data/vendor/board-maps/yaml/ESP8266_WIO_LINK.yml +9 -0
- data/vendor/board-maps/yaml/ESP8266_XINABOX_CW01.yml +9 -0
- data/vendor/board-maps/yaml/ESPECTRO32.yml +27 -0
- data/vendor/board-maps/yaml/ESPea32.yml +27 -0
- data/vendor/board-maps/yaml/ESPino32.yml +27 -0
- data/vendor/board-maps/yaml/ET-Board.yml +26 -0
- data/vendor/board-maps/yaml/EXTREMEELEXTRONICS_RC2040.yml +46 -0
- data/vendor/board-maps/yaml/Edgebox-ESP-100.yml +7 -0
- data/vendor/board-maps/yaml/FEATHERS2.yml +33 -0
- data/vendor/board-maps/yaml/FEATHERS2NEO.yml +30 -0
- data/vendor/board-maps/yaml/FEATHERS3.yml +29 -0
- data/vendor/board-maps/yaml/FEATHER_ESP32.yml +28 -0
- data/vendor/board-maps/yaml/FLYBOARD2040_CORE.yml +48 -0
- data/vendor/board-maps/yaml/FRANZININHO_WIFI.yml +33 -0
- data/vendor/board-maps/yaml/FRANZININHO_WIFI_MSC.yml +33 -0
- data/vendor/board-maps/yaml/FROG_ESP32.yml +26 -0
- data/vendor/board-maps/yaml/FUNHOUSE_ESP32S2.yml +22 -0
- data/vendor/board-maps/yaml/GEN4_IOD.yml +9 -0
- data/vendor/board-maps/yaml/GENERIC_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/HEALTHYPI_4.yml +27 -0
- data/vendor/board-maps/yaml/HONEYLEMON.yml +27 -0
- data/vendor/board-maps/yaml/HORNBILL_ESP32_DEV.yml +27 -0
- data/vendor/board-maps/yaml/HORNBILL_ESP32_MINIMA.yml +16 -0
- data/vendor/board-maps/yaml/ILABS_2040_RPICO32_RP2040.yml +47 -0
- data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +19 -0
- data/vendor/board-maps/yaml/INTOROBOT_ESP32_DEV.yml +34 -0
- data/vendor/board-maps/yaml/LILYGO_T_DISPLAY_S3.yml +26 -0
- data/vendor/board-maps/yaml/LOLIN32.yml +27 -0
- data/vendor/board-maps/yaml/LOLIN32_LITE.yml +27 -0
- data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +14 -0
- data/vendor/board-maps/yaml/LOLIN_D32.yml +27 -0
- data/vendor/board-maps/yaml/LOLIN_D32_PRO.yml +27 -0
- data/vendor/board-maps/yaml/LOLIN_S2_MINI.yml +34 -0
- data/vendor/board-maps/yaml/LOLIN_S2_PICO.yml +34 -0
- data/vendor/board-maps/yaml/LOLIN_S3.yml +32 -0
- data/vendor/board-maps/yaml/LOLIN_S3_MINI.yml +32 -0
- data/vendor/board-maps/yaml/LOLIN_S3_PRO.yml +32 -0
- data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +18 -0
- data/vendor/board-maps/yaml/LoPy.yml +27 -0
- data/vendor/board-maps/yaml/LoPy4.yml +27 -0
- data/vendor/board-maps/yaml/M5STACK_CORES3.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_Core2.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +10 -0
- data/vendor/board-maps/yaml/M5Stack-Timer-CAM.yml +10 -0
- data/vendor/board-maps/yaml/M5Stack_ATOM.yml +10 -0
- data/vendor/board-maps/yaml/M5Stack_ATOMS3.yml +7 -0
- data/vendor/board-maps/yaml/M5Stack_CoreInk.yml +9 -0
- data/vendor/board-maps/yaml/M5Stack_Core_ESP32.yml +10 -0
- data/vendor/board-maps/yaml/M5Stack_Station.yml +10 -0
- data/vendor/board-maps/yaml/M5Stick_C.yml +10 -0
- data/vendor/board-maps/yaml/MAGTAG29_ESP32S2.yml +21 -0
- data/vendor/board-maps/yaml/MELOPERO_COOKIE_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/MELOPERO_SHAKE_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/METRO_ESP32S2.yml +34 -0
- data/vendor/board-maps/yaml/MGBOT_IOTIK32A.yml +27 -0
- data/vendor/board-maps/yaml/MGBOT_IOTIK32B.yml +27 -0
- data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32DEVKIT.yml +27 -0
- data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32MINIKIT.yml +27 -0
- data/vendor/board-maps/yaml/MICROS2.yml +34 -0
- data/vendor/board-maps/yaml/MOD_WIFI_ESP8266.yml +9 -0
- data/vendor/board-maps/yaml/Metro.yml +8 -0
- data/vendor/board-maps/yaml/NANO32.yml +27 -0
- data/vendor/board-maps/yaml/NANO_RP2040_CONNECT.yml +35 -0
- data/vendor/board-maps/yaml/NEBULAS3.yml +33 -0
- data/vendor/board-maps/yaml/NEKOSYSTEMS_BL2040_MINI.yml +48 -0
- data/vendor/board-maps/yaml/NULLBITS_BIT_C_PRO.yml +48 -0
- data/vendor/board-maps/yaml/Node32s.yml +27 -0
- data/vendor/board-maps/yaml/NodeMCU_32S.yml +27 -0
- data/vendor/board-maps/yaml/ODROID_ESP32.yml +10 -0
- data/vendor/board-maps/yaml/ONEHORSE_ESP32_DEV.yml +24 -0
- data/vendor/board-maps/yaml/OROCA_EDUBOT.yml +33 -0
- data/vendor/board-maps/yaml/PIMORONI_PGA2040.yml +48 -0
- data/vendor/board-maps/yaml/PROS3.yml +28 -0
- data/vendor/board-maps/yaml/PYCOM_GPY.yml +27 -0
- data/vendor/board-maps/yaml/Piranha.yml +16 -0
- data/vendor/board-maps/yaml/Pocket32.yml +27 -0
- data/vendor/board-maps/yaml/QUANTUM.yml +26 -0
- data/vendor/board-maps/yaml/RASPBERRY_PI_PICO.yml +48 -0
- data/vendor/board-maps/yaml/RASPBERRY_PI_PICO_W.yml +48 -0
- data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +32 -0
- data/vendor/board-maps/yaml/RMP.yml +33 -0
- data/vendor/board-maps/yaml/SAMD_CIRCUITPLAYGROUND_EXPRESS.yml +12 -0
- data/vendor/board-maps/yaml/SAMD_MKR1000.yml +20 -0
- data/vendor/board-maps/yaml/SAMD_MKRFox1200.yml +19 -0
- data/vendor/board-maps/yaml/SAMD_MKRGSM1400.yml +15 -0
- data/vendor/board-maps/yaml/SAMD_MKRNB1500.yml +15 -0
- data/vendor/board-maps/yaml/SAMD_MKRVIDOR4000.yml +19 -0
- data/vendor/board-maps/yaml/SAMD_MKRWAN1300.yml +18 -0
- data/vendor/board-maps/yaml/SAMD_MKRWAN1310.yml +18 -0
- data/vendor/board-maps/yaml/SAMD_MKRWIFI1010.yml +19 -0
- data/vendor/board-maps/yaml/SAMD_MKRZERO.yml +19 -0
- data/vendor/board-maps/yaml/SAMD_NANO_33_IOT.yml +13 -0
- data/vendor/board-maps/yaml/SAMD_TIAN.yml +15 -0
- data/vendor/board-maps/yaml/SAMD_ZERO.yml +14 -0
- data/vendor/board-maps/yaml/SAM_DUE.yml +26 -0
- data/vendor/board-maps/yaml/SAM_ZERO.yml +15 -0
- data/vendor/board-maps/yaml/SEEED_INDICATOR_RP2040.yml +47 -0
- data/vendor/board-maps/yaml/SEEED_XIAO_RP2040.yml +29 -0
- data/vendor/board-maps/yaml/SOLDERPARTY_RP2040_STAMP.yml +48 -0
- data/vendor/board-maps/yaml/SONOFF_DUALR3.yml +26 -0
- data/vendor/board-maps/yaml/SPARKFUN_PROMICRO_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/SPARKFUN_THINGPLUS_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/STAMP_S3.yml +4 -0
- data/vendor/board-maps/yaml/TAMC_TERMOD_S3.yml +31 -0
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1262.yml +23 -0
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1268.yml +23 -0
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1276.yml +23 -0
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1278.yml +23 -0
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1280.yml +23 -0
- data/vendor/board-maps/yaml/TBeam.yml +23 -0
- data/vendor/board-maps/yaml/TINYPICO.yml +26 -0
- data/vendor/board-maps/yaml/TINYS2.yml +33 -0
- data/vendor/board-maps/yaml/TINYS3.yml +25 -0
- data/vendor/board-maps/yaml/TTGO-T-OI-PLUS_DEV.yml +11 -0
- data/vendor/board-maps/yaml/TTGO_LoRa32_V1.yml +28 -0
- data/vendor/board-maps/yaml/TTGO_LoRa32_V2.yml +28 -0
- data/vendor/board-maps/yaml/TTGO_LoRa32_v21new.yml +28 -0
- data/vendor/board-maps/yaml/TTGO_T1.yml +27 -0
- data/vendor/board-maps/yaml/TTGO_T7_V13_Mini32.yml +27 -0
- data/vendor/board-maps/yaml/TTGO_T7_V14_Mini32.yml +27 -0
- data/vendor/board-maps/yaml/TWATCH_2020_V1.yml +10 -0
- data/vendor/board-maps/yaml/TWATCH_2020_V2.yml +10 -0
- data/vendor/board-maps/yaml/TWATCH_2020_V3.yml +10 -0
- data/vendor/board-maps/yaml/TWATCH_BASE.yml +10 -0
- data/vendor/board-maps/yaml/TWatch.yml +10 -0
- data/vendor/board-maps/yaml/Trueverit_ESP32_Universal_IoT_Driver.yml +18 -0
- data/vendor/board-maps/yaml/Trueverit_ESP32_Universal_IoT_Driver_MK_II.yml +18 -0
- data/vendor/board-maps/yaml/UBLOX_NINA_W10.yml +48 -0
- data/vendor/board-maps/yaml/UBLOX_NORA_W10.yml +43 -0
- data/vendor/board-maps/yaml/UPESY_RP2040_DEVKIT.yml +48 -0
- data/vendor/board-maps/yaml/VALTRACK_V4_MFW_ESP32_C3.yml +23 -0
- data/vendor/board-maps/yaml/VALTRACK_V4_VTS_ESP32_C3.yml +23 -0
- data/vendor/board-maps/yaml/VIYALAB_MIZU_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/WATCHY.yml +7 -0
- data/vendor/board-maps/yaml/WATCHY_V10.yml +7 -0
- data/vendor/board-maps/yaml/WATCHY_V15.yml +7 -0
- data/vendor/board-maps/yaml/WATCHY_V20.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_LCD_0_96.yml +47 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_LCD_1_28.yml +47 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +47 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_PLUS.yml +48 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +47 -0
- data/vendor/board-maps/yaml/WESP32.yml +17 -0
- data/vendor/board-maps/yaml/WIDORA_AIR.yml +34 -0
- data/vendor/board-maps/yaml/WIFIDUINO_ESP8266.yml +23 -0
- data/vendor/board-maps/yaml/WIFINFO.yml +20 -0
- data/vendor/board-maps/yaml/WIPY3.yml +27 -0
- data/vendor/board-maps/yaml/WIZNET_5100S_EVB_PICO.yml +48 -0
- data/vendor/board-maps/yaml/WIZNET_5500_EVB_PICO.yml +48 -0
- data/vendor/board-maps/yaml/WIZNET_WIZFI360_EVB_PICO.yml +48 -0
- data/vendor/board-maps/yaml/WT32_ETH01.yml +8 -0
- data/vendor/board-maps/yaml/WiFiduino32S3.yml +27 -0
- data/vendor/board-maps/yaml/WiFiduinoV2.yml +27 -0
- data/vendor/board-maps/yaml/Wifiduino32.yml +40 -0
- data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +22 -0
- data/vendor/board-maps/yaml/XIAO_ESP32S3.yml +36 -0
- data/vendor/board-maps/yaml/YD_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/atmegazero_esp32s2.yml +30 -0
- data/vendor/board-maps/yaml/connaxio_espoir.yml +18 -0
- data/vendor/board-maps/yaml/esp32vn_iot_uno.yml +22 -0
- data/vendor/board-maps/yaml/fm_devkit.yml +15 -0
- data/vendor/board-maps/yaml/heltec_wifi_32_lora_V3.yml +31 -0
- data/vendor/board-maps/yaml/heltec_wifi_kit_32.yml +28 -0
- data/vendor/board-maps/yaml/heltec_wifi_kit_32_V3.yml +32 -0
- data/vendor/board-maps/yaml/heltec_wifi_lora_32.yml +27 -0
- data/vendor/board-maps/yaml/heltec_wifi_lora_32_V2.yml +27 -0
- data/vendor/board-maps/yaml/heltec_wireless_stick.yml +27 -0
- data/vendor/board-maps/yaml/heltec_wireless_stick_LITE.yml +27 -0
- data/vendor/board-maps/yaml/openkb.yml +27 -0
- data/vendor/board-maps/yaml/roboheart_hercules.yml +17 -0
- data/vendor/board-maps/yaml/sensesiot_weizen.yml +26 -0
- data/vendor/board-maps/yaml/uPesy_WROOM.yml +27 -0
- data/vendor/board-maps/yaml/uPesy_WROVER.yml +27 -0
- data/vendor/board-maps/yaml/unphone8.yml +32 -0
- data/vendor/board-maps/yaml/unphone9.yml +32 -0
- data/vendor/board-maps/yaml/wifi_kit_8.yml +15 -0
- metadata +800 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
#
|
2
|
+
# Example that writes to bit bang UART and reads back on hardware UART1. Tested on Arduino Mega.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
+
|
9
|
+
hw_uart = Denko::UART::Hardware.new(board: board, index: 1, baud: 31250)
|
10
|
+
bb_uart = Denko::UART::BitBang.new(board: board, pins: { rx:10, tx:11 }, baud: 31250)
|
11
|
+
|
12
|
+
bb_uart.write("Hello World!\n")
|
13
|
+
|
14
|
+
sleep 1
|
15
|
+
|
16
|
+
puts hw_uart.gets
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# Example using one board's UART as the transport for a second board, also running Denko.
|
3
|
+
#
|
4
|
+
# For this example, board1 (direct) is an Arduino Mega. board2 (passthrough) is an Uno,
|
5
|
+
# running Denko, with its UART pins (0, 1) connected to the Mega's UART1 pins (18, 19)
|
6
|
+
#
|
7
|
+
# This isn't 100% reliable. The Rx buffer on the direct board is periodically read, so
|
8
|
+
# it can potentially overflow, causing data sent from the passthrough board to be lost.
|
9
|
+
# Eventually flow control data will be lost and the host will stop sending altogether.
|
10
|
+
#
|
11
|
+
# Use at your own risk, but for the best possible performance:
|
12
|
+
# 1) Avoid long running commands on the direct board (eg. IR transmission, HTU21D).
|
13
|
+
# These block the CPU enough that the Rx buffer won't be read in time to avoid overflow.
|
14
|
+
# 2) Use the lowest practical baud rate on the passthrough board. 19200 is used here, so
|
15
|
+
# the direct board's Rx buffer takes 6x the time to fill, compared to 115200 baud.
|
16
|
+
#
|
17
|
+
require 'bundler/setup'
|
18
|
+
require 'denko'
|
19
|
+
|
20
|
+
board1 = Denko::Board.new(Denko::Connection::Serial.new)
|
21
|
+
|
22
|
+
uart = Denko::UART::Hardware.new(board: board1, index: 1)
|
23
|
+
board2 = Denko::Board.new(Denko::Connection::BoardUART.new(uart, baud: 19200))
|
24
|
+
|
25
|
+
led1 = Denko::LED.new(board: board1, pin: 13)
|
26
|
+
led1.blink(0.02)
|
27
|
+
|
28
|
+
led2 = Denko::LED.new(board: board2, pin: 13)
|
29
|
+
led2.blink(0.02)
|
30
|
+
|
31
|
+
sensor = Denko::AnalogIO::Input.new(board: board1, pin: :A0)
|
32
|
+
sensor.listen(4)
|
33
|
+
|
34
|
+
sleep
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#
|
2
|
+
# Example that writes to TX pin of hardware UART1 and reads back on RX pin of same UART.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
+
|
9
|
+
uart = Denko::UART::Hardware.new(board: board, index: 1, baud: 31250)
|
10
|
+
|
11
|
+
uart.write("Hello World!\nBye World!\n")
|
12
|
+
|
13
|
+
sleep 1
|
14
|
+
|
15
|
+
puts uart.gets
|
16
|
+
puts uart.gets
|
@@ -0,0 +1,182 @@
|
|
1
|
+
module Denko
|
2
|
+
module AnalogIO
|
3
|
+
class ADS1118
|
4
|
+
include SPI::Peripheral
|
5
|
+
include Behaviors::Reader
|
6
|
+
include Behaviors::Threaded
|
7
|
+
|
8
|
+
PGA_SETTINGS = [ # Bitmask Full scale voltage
|
9
|
+
0.0001875, # 0b000 6.144 V
|
10
|
+
0.000125, # 0b001 4.095 V
|
11
|
+
0.0000625, # 0b010 2.048 V (default)
|
12
|
+
0.00003125, # 0b011 1.024 V
|
13
|
+
0.000015625, # 0b100 0.512 V
|
14
|
+
0.0000078125, # 0b101 0.256 V
|
15
|
+
0.0000078125, # 0b110 0.256 V
|
16
|
+
0.0000078125, # 0b111 0.256 V
|
17
|
+
]
|
18
|
+
PGA_RANGE = (0..7).to_a
|
19
|
+
|
20
|
+
# Sample rate bitmask maps to sample time in seconds.
|
21
|
+
SAMPLE_TIMES = [ # Bitmask
|
22
|
+
0.125, # 0b000
|
23
|
+
0.0625, # 0b001
|
24
|
+
0.03125, # 0b010
|
25
|
+
0.015625, # 0b011
|
26
|
+
0.0078125, # 0b100 (default)
|
27
|
+
0.004, # 0b101
|
28
|
+
0.002105263, # 0b110
|
29
|
+
0.00116279, # 0b111
|
30
|
+
]
|
31
|
+
SAMPLE_RATE_RANGE = (0..7).to_a
|
32
|
+
|
33
|
+
# Wait times need to be slightly longer than the actual sample times.
|
34
|
+
WAIT_TIMES = SAMPLE_TIMES.map { |time| time + 0.0005 }
|
35
|
+
|
36
|
+
# Mux bits map to array of form [positive input, negative input].
|
37
|
+
MUX_SETTINGS = {
|
38
|
+
0b000 => [0, 1],
|
39
|
+
0b001 => [0, 3],
|
40
|
+
0b010 => [1, 3],
|
41
|
+
0b011 => [2, 3],
|
42
|
+
0b100 => [0, nil],
|
43
|
+
0b101 => [1, nil],
|
44
|
+
0b110 => [2, nil],
|
45
|
+
0b111 => [3, nil],
|
46
|
+
}
|
47
|
+
|
48
|
+
# Config register values on startup.
|
49
|
+
CONFIG_DEFAULT = [0x05, 0x8B]
|
50
|
+
|
51
|
+
# Base config bytes to mask settings into. Not same as default.
|
52
|
+
BASE_MSB = 0b10000001
|
53
|
+
BASE_LSB = 0b00001011
|
54
|
+
|
55
|
+
def after_initialize(options={})
|
56
|
+
super(options)
|
57
|
+
|
58
|
+
# SPI mode 1 recommended.
|
59
|
+
@spi_mode = options[:spi_mode] || 1
|
60
|
+
|
61
|
+
# Mutex and variables for BoardProxy behavior.
|
62
|
+
@mutex = Mutex.new
|
63
|
+
@active_pin = nil
|
64
|
+
@active_gain = nil
|
65
|
+
|
66
|
+
# Set register bytes to default and write to device.
|
67
|
+
@config_register = CONFIG_DEFAULT.dup
|
68
|
+
spi_write(@config_register)
|
69
|
+
|
70
|
+
# Enable BoardProxy callbacks.
|
71
|
+
enable_proxy
|
72
|
+
end
|
73
|
+
|
74
|
+
def _read(config)
|
75
|
+
# Write config register to start reading.
|
76
|
+
spi_write(config)
|
77
|
+
|
78
|
+
# Sleep the right amount of time for conversion, based on sample rate bits.
|
79
|
+
sleep WAIT_TIMES[config[1] >> 5]
|
80
|
+
|
81
|
+
# Read the result, triggering callbacks.
|
82
|
+
spi_read(2)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Pack the 2 bytes back into a string, then unpack as big-endian int16.
|
86
|
+
def pre_callback_filter(message)
|
87
|
+
bytes = message.split(",").map { |b| b.to_i }
|
88
|
+
bytes.pack("C*").unpack("s>")[0]
|
89
|
+
end
|
90
|
+
|
91
|
+
def _temperature_read
|
92
|
+
# Wrap in mutex to not interfere with other reads.
|
93
|
+
@mutex.synchronize do
|
94
|
+
_read([0b10000001, 0b10011011])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def temperature_read(&block)
|
99
|
+
reading = read_using -> { _temperature_read }
|
100
|
+
|
101
|
+
# Temperature is shifted 2 bits left, and is 0.03125 degrees C per bit.
|
102
|
+
temperature = (reading / 4) * 0.03125
|
103
|
+
|
104
|
+
block.call(temperature) if block_given?
|
105
|
+
return temperature
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# BoardProxy behavior so AnalogIO classes can use this as a Board.
|
110
|
+
#
|
111
|
+
include Behaviors::BoardProxy
|
112
|
+
|
113
|
+
# Mimic Board#update, but inside a callback, wrapped by #update.
|
114
|
+
def enable_proxy
|
115
|
+
self.add_callback(:board_proxy) do |value|
|
116
|
+
components.each do |component|
|
117
|
+
if @active_pin == component.pin
|
118
|
+
component.volts_per_bit = PGA_SETTINGS[@active_gain]
|
119
|
+
component.update(value)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def analog_read(pin, negative_pin=nil, gain=nil, sample_rate=nil)
|
126
|
+
# Wrap in mutex so calls and callbacks are atomic.
|
127
|
+
@mutex.synchronize do
|
128
|
+
# Default gain and sample rate.
|
129
|
+
gain ||= 0b010
|
130
|
+
sample_rate ||= 0b100
|
131
|
+
|
132
|
+
# Set these for callbacks.
|
133
|
+
@active_pin = pin
|
134
|
+
@active_gain = gain
|
135
|
+
|
136
|
+
# Set gain in upper config register.
|
137
|
+
raise ArgumentError "wrong gain: #{gain.inspect} given for ADS1118" unless PGA_RANGE.include?(gain)
|
138
|
+
@config_register[0] = BASE_MSB | (gain << 1)
|
139
|
+
|
140
|
+
# Set mux bits in upper config register.
|
141
|
+
mux_bits = pins_to_mux_bits(pin, negative_pin)
|
142
|
+
@config_register[0] = @config_register[0] | (mux_bits << 4)
|
143
|
+
|
144
|
+
# Set sample rate in lower config_register.
|
145
|
+
raise ArgumentError "wrong sample_rate: #{sample_rate.inspect} given for ADS1118" unless SAMPLE_RATE_RANGE.include?(gain)
|
146
|
+
@config_register[1] = BASE_LSB | (sample_rate << 5)
|
147
|
+
|
148
|
+
read(@config_register)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def pins_to_mux_bits(pin, negative_pin)
|
153
|
+
# Pin 1 is negative input. Only pin 0 can be read.
|
154
|
+
if negative_pin == 1
|
155
|
+
raise ArgumentError, "given pin: #{pin.inspect} cannot be used when pin 1 is negative input, only 0" unless pin == 0
|
156
|
+
return 0b000
|
157
|
+
end
|
158
|
+
|
159
|
+
# Pin 3 is negative input. Pins 0..2 can be read.
|
160
|
+
if negative_pin == 3
|
161
|
+
raise ArgumentError, "given pin: #{pin.inspect} cannot be used when pin 3 is negative input, only 0..2" unless [0,1,2].include? pin
|
162
|
+
return 0b001 + pin
|
163
|
+
end
|
164
|
+
|
165
|
+
# No negative input. Any pin from 0 to 3 can be read.
|
166
|
+
unless negative_pin
|
167
|
+
raise ArgumentError, "given pin: #{pin.inspect} is out of range 0..3" unless [0,1,2,3].include? pin
|
168
|
+
return (0b100 + pin)
|
169
|
+
end
|
170
|
+
|
171
|
+
raise ArgumentError, "only pins 1 and 3 can be used as negative input"
|
172
|
+
end
|
173
|
+
|
174
|
+
def analog_listen(pin, divider=nil)
|
175
|
+
raise StandardError, "ADS1118 does not implement #listen for subcomponents. Use #read or #poll instead"
|
176
|
+
end
|
177
|
+
|
178
|
+
def stop_listener(pin)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Denko
|
2
|
+
module AnalogIO
|
3
|
+
class Input
|
4
|
+
include Behaviors::InputPin
|
5
|
+
include Behaviors::Reader
|
6
|
+
include Behaviors::Poller
|
7
|
+
include Behaviors::Listener
|
8
|
+
|
9
|
+
def before_initialize(options={})
|
10
|
+
options[:board] = options[:adc] if options[:adc]
|
11
|
+
options[:adc] = nil
|
12
|
+
super(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def after_initialize(options={})
|
16
|
+
super(options)
|
17
|
+
|
18
|
+
# Default 16ms listener for analog inputs connected to a Board.
|
19
|
+
@divider = 16
|
20
|
+
|
21
|
+
# If using a negative input on a supported ADC, store the pin.
|
22
|
+
@negative_pin = options[:negative_pin]
|
23
|
+
|
24
|
+
# If the ADC has a programmable amplifier, pass through its setting.
|
25
|
+
@gain = options[:gain]
|
26
|
+
|
27
|
+
# If using a non-default sampling rate, store it.
|
28
|
+
@sample_rate = options[:sample_rate]
|
29
|
+
|
30
|
+
# Default to smoothing disabled.
|
31
|
+
@smoothing = false
|
32
|
+
@smoothing_set ||= []
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :negative_pin, :gain, :sample_rate
|
36
|
+
|
37
|
+
# ADCs can set this based on gain, so exact voltages can be calculated.
|
38
|
+
attr_accessor :volts_per_bit
|
39
|
+
|
40
|
+
def _read
|
41
|
+
board.analog_read(pin, negative_pin, gain, sample_rate)
|
42
|
+
end
|
43
|
+
|
44
|
+
def _listen(divider=nil)
|
45
|
+
@divider = divider || @divider
|
46
|
+
board.analog_listen(pin, @divider)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Attach a callback that only fires when state changes.
|
50
|
+
def on_change(&block)
|
51
|
+
add_callback(:on_change) do |new_state|
|
52
|
+
block.call(new_state) if new_state != self.state
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# Smoothing features.
|
58
|
+
# Does a moving average of the last 8 readings.
|
59
|
+
#
|
60
|
+
attr_accessor :smoothing
|
61
|
+
|
62
|
+
def smooth_input(value)
|
63
|
+
# Add new value, but limit to the 8 latest values.
|
64
|
+
@smoothing_set << value
|
65
|
+
@smoothing_set.shift if @smoothing_set.length > 8
|
66
|
+
|
67
|
+
average = @smoothing_set.reduce(:+) / @smoothing_set.length.to_f
|
68
|
+
|
69
|
+
# Round up or down based on previous state to reduce fluctuations.
|
70
|
+
state && (state > average) ? average.ceil : average.floor
|
71
|
+
end
|
72
|
+
|
73
|
+
# Convert data to integer, or pass it through smoothing if enabled.
|
74
|
+
def pre_callback_filter(value)
|
75
|
+
smoothing ? smooth_input(value.to_i) : value.to_i
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Denko
|
2
|
+
module AnalogIO
|
3
|
+
class Output
|
4
|
+
include Behaviors::OutputPin
|
5
|
+
include Behaviors::Callbacks
|
6
|
+
include Behaviors::Threaded
|
7
|
+
|
8
|
+
interrupt_with :write
|
9
|
+
|
10
|
+
def initialize_pins(options={})
|
11
|
+
super(options)
|
12
|
+
self.mode = :output_dac
|
13
|
+
end
|
14
|
+
|
15
|
+
def write(value)
|
16
|
+
board.dac_write(pin, @state = value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Denko
|
2
|
+
module AnalogIO
|
3
|
+
class Potentiometer < Input
|
4
|
+
def after_initialize(options={})
|
5
|
+
super(options)
|
6
|
+
|
7
|
+
# Enable smoothing.
|
8
|
+
self.smoothing = true
|
9
|
+
|
10
|
+
# Start listening immediately. Read 2x as often as regular Input.
|
11
|
+
listen(@divider = 8)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Denko
|
2
|
+
module AnalogIO
|
3
|
+
autoload :Input, "#{__dir__}/analog_io/input"
|
4
|
+
autoload :Output, "#{__dir__}/analog_io/output"
|
5
|
+
autoload :Potentiometer, "#{__dir__}/analog_io/potentiometer"
|
6
|
+
autoload :Sensor, "#{__dir__}/analog_io/sensor"
|
7
|
+
autoload :ADS1118, "#{__dir__}/analog_io/ads1118"
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Denko
|
2
|
+
module Behaviors
|
3
|
+
module BoardProxy
|
4
|
+
include Subcomponents
|
5
|
+
|
6
|
+
def high
|
7
|
+
1
|
8
|
+
end
|
9
|
+
|
10
|
+
def low
|
11
|
+
0
|
12
|
+
end
|
13
|
+
|
14
|
+
def convert_pin(pin)
|
15
|
+
pin.to_i
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_pin_mode(pin, mode, pull=nil); end
|
19
|
+
|
20
|
+
def start_read; end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Denko
|
2
|
+
module Behaviors
|
3
|
+
module BusControllerAddressed
|
4
|
+
include BusController
|
5
|
+
|
6
|
+
def add_component(component)
|
7
|
+
addresses = components.map { |c| c.address }
|
8
|
+
if addresses.include? component.address
|
9
|
+
raise ArgumentError, "duplicate peripheral address for #{component}"
|
10
|
+
end
|
11
|
+
super(component)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Denko
|
2
|
+
module Behaviors
|
3
|
+
module BusPeripheral
|
4
|
+
include Component
|
5
|
+
|
6
|
+
attr_reader :address
|
7
|
+
alias :bus :board
|
8
|
+
|
9
|
+
def before_initialize(options={})
|
10
|
+
options[:board] ||= options[:bus]
|
11
|
+
super(options)
|
12
|
+
end
|
13
|
+
|
14
|
+
def atomically(&block)
|
15
|
+
bus.mutex.synchronize do
|
16
|
+
block.call
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Denko
|
2
|
+
module Behaviors
|
3
|
+
module BusPeripheralAddressed
|
4
|
+
include Denko::Behaviors::BusPeripheral
|
5
|
+
|
6
|
+
def before_initialize(options={})
|
7
|
+
# Aallow @address override in options, even if peripheral sets default.
|
8
|
+
@address = options[:address] if options[:address]
|
9
|
+
|
10
|
+
raise ArgumentError, "missing address for #{self}. Try Bus#search first" unless @address
|
11
|
+
super(options)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Denko
|
2
|
+
module Behaviors
|
3
|
+
module Callbacks
|
4
|
+
include State
|
5
|
+
attr_reader :callback_mutex
|
6
|
+
|
7
|
+
def initialize(options={})
|
8
|
+
@callback_mutex = Mutex.new
|
9
|
+
remove_callbacks
|
10
|
+
super(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def callbacks
|
14
|
+
callback_mutex.synchronize { @callbacks }
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_callback(key=:persistent, &block)
|
18
|
+
callback_mutex.synchronize do
|
19
|
+
@callbacks[key] ||= []
|
20
|
+
@callbacks[key] << block
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def remove_callback(key=nil)
|
25
|
+
callback_mutex.synchronize do
|
26
|
+
key ? @callbacks.delete(key) : @callbacks = {}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
alias :on_data :add_callback
|
31
|
+
alias :remove_callbacks :remove_callback
|
32
|
+
|
33
|
+
def update(data)
|
34
|
+
# nil will unblock #read without running callbacks.
|
35
|
+
unless data
|
36
|
+
remove_callback(:read)
|
37
|
+
return nil
|
38
|
+
end
|
39
|
+
|
40
|
+
filtered_data = pre_callback_filter(data)
|
41
|
+
|
42
|
+
# nil will unblock #read without running callbacks.
|
43
|
+
unless filtered_data
|
44
|
+
remove_callback(:read)
|
45
|
+
return nil
|
46
|
+
end
|
47
|
+
|
48
|
+
callback_mutex.synchronize do
|
49
|
+
@callbacks.each_value do |array|
|
50
|
+
array.each do |callback|
|
51
|
+
callback.call(filtered_data)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
# Remove one-time callbacks added by #read.
|
55
|
+
@callbacks.delete(:read)
|
56
|
+
end
|
57
|
+
|
58
|
+
update_state(filtered_data)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Override to process data before giving to callbacks and state.
|
62
|
+
def pre_callback_filter(data)
|
63
|
+
data
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Denko
|
2
|
+
module Behaviors
|
3
|
+
module Component
|
4
|
+
include State
|
5
|
+
attr_reader :board
|
6
|
+
|
7
|
+
def initialize(options={})
|
8
|
+
super(options)
|
9
|
+
before_initialize(options)
|
10
|
+
initialize_board(options)
|
11
|
+
convert_pins(options)
|
12
|
+
initialize_pins(options)
|
13
|
+
register
|
14
|
+
after_initialize(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def micro_delay(duration)
|
18
|
+
board.micro_delay(duration)
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def initialize_board(options={})
|
24
|
+
raise ArgumentError, 'a board is required for a component' unless options[:board]
|
25
|
+
@board = options[:board]
|
26
|
+
end
|
27
|
+
|
28
|
+
def register
|
29
|
+
board.add_component(self)
|
30
|
+
end
|
31
|
+
|
32
|
+
def unregister
|
33
|
+
board.remove_component(self)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Setup::Base only requires a board.
|
37
|
+
# Include modules from Setup or override this to use pins.
|
38
|
+
#
|
39
|
+
def before_initialize(options={}); end
|
40
|
+
def convert_pins(options={}); end
|
41
|
+
def initialize_pins(options={}); end
|
42
|
+
alias :initialize_pin :initialize_pins
|
43
|
+
|
44
|
+
# Override in components. Call super when inheriting or mixing in.
|
45
|
+
def after_initialize(options={}); end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Denko
|
2
|
+
module Behaviors
|
3
|
+
module InputPin
|
4
|
+
include SinglePin
|
5
|
+
|
6
|
+
def _stop_listener
|
7
|
+
board.stop_listener(pin)
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def initialize_pins(options={})
|
13
|
+
super(options)
|
14
|
+
|
15
|
+
initial_mode = :input
|
16
|
+
initial_mode = :input_pullup if options[:pullup]
|
17
|
+
initial_mode = :input_pulldown if options[:pulldown]
|
18
|
+
initial_mode = options[:mode] if options[:mode]
|
19
|
+
|
20
|
+
self.mode = initial_mode
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Denko
|
2
|
+
module Behaviors
|
3
|
+
module Listener
|
4
|
+
include Callbacks
|
5
|
+
|
6
|
+
attr_reader :divider
|
7
|
+
|
8
|
+
def listen(divider=nil, &block)
|
9
|
+
@divider = divider || @listener
|
10
|
+
stop
|
11
|
+
add_callback(:listen, &block) if block_given?
|
12
|
+
_listen(@divider)
|
13
|
+
end
|
14
|
+
|
15
|
+
def stop
|
16
|
+
super if defined?(super)
|
17
|
+
_stop_listener
|
18
|
+
remove_callbacks :listen
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|