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,34 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
def one_wire_reset(pin, value=0)
|
4
|
+
write Message.encode command: 41,
|
5
|
+
pin: pin,
|
6
|
+
value: value
|
7
|
+
end
|
8
|
+
|
9
|
+
def one_wire_search(pin, branch_mask)
|
10
|
+
write Message.encode command: 42,
|
11
|
+
pin: pin,
|
12
|
+
aux_message: pack(:uint64, branch_mask, max: 8)
|
13
|
+
end
|
14
|
+
|
15
|
+
def one_wire_write(pin, parasite_power, *data)
|
16
|
+
bytes = pack :uint8, data, min: 1, max: 127 # Should be 128 with 0 = 1.
|
17
|
+
|
18
|
+
# Set high bit of length if the bus must drive high after write.
|
19
|
+
length = bytes.length
|
20
|
+
length = length | 0b10000000 if parasite_power
|
21
|
+
|
22
|
+
write Message.encode command: 43,
|
23
|
+
pin: pin,
|
24
|
+
value: length,
|
25
|
+
aux_message: bytes
|
26
|
+
end
|
27
|
+
|
28
|
+
def one_wire_read(pin, num_bytes)
|
29
|
+
write Message.encode command: 44,
|
30
|
+
pin: pin,
|
31
|
+
value: num_bytes
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
# CMD = 9
|
4
|
+
def pulse_read(pin, reset: false, reset_time: 0, pulse_limit: 100, timeout: 200)
|
5
|
+
# Validation
|
6
|
+
raise ArgumentError, "error in reset: #{reset}. Should be either #{high} or #{low}" if reset && ![high, low].include?(reset)
|
7
|
+
raise ArgumentError, "errror in reset_time: #{reset_time}. Should be 0..65535 microseconds" if (reset_time < 0) || (reset_time > 0xFFFF)
|
8
|
+
raise ArgumentError, "errror in pulse_limit: #{pulse_limit}. Should be 0..255 pulses" if (pulse_limit < 0) || (pulse_limit > 0xFF)
|
9
|
+
raise ArgumentError, "errror in timeout: #{timeout}. Should be 0..65535 milliseconds" if (timeout < 0) || (timeout > 0xFFFF)
|
10
|
+
|
11
|
+
# Bit 0 of settings mask controls whether to hold high/low for reset.
|
12
|
+
settings = reset ? 1 : 0
|
13
|
+
|
14
|
+
# Bit 1 of settings mask controls whether to hold high (1) or to hold low (0).
|
15
|
+
settings = settings | 0b10 if (reset && reset != low)
|
16
|
+
|
17
|
+
# Pack and send.
|
18
|
+
aux = pack :uint16, [reset_time, timeout]
|
19
|
+
aux << pack(:uint8, pulse_limit)
|
20
|
+
write Message.encode command: 9,
|
21
|
+
pin: pin,
|
22
|
+
value: settings,
|
23
|
+
aux_message: aux
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
# CMD = 10
|
4
|
+
def servo_toggle(pin, value=:off, options={})
|
5
|
+
options[:min] ||= 544
|
6
|
+
options[:max] ||= 2400
|
7
|
+
aux = pack :uint16, [options[:min], options[:max]]
|
8
|
+
|
9
|
+
write Message.encode command: 10,
|
10
|
+
pin: pin,
|
11
|
+
value: (value == :off) ? 0 : 1,
|
12
|
+
aux_message: aux
|
13
|
+
end
|
14
|
+
|
15
|
+
# CMD = 11
|
16
|
+
def servo_write(pin, value=0)
|
17
|
+
write Message.encode command: 11,
|
18
|
+
pin: pin,
|
19
|
+
aux_message: pack(:uint16, value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
def spi_header_generic(write, read, mode, bit_order)
|
4
|
+
# Defaults.
|
5
|
+
mode ||= 0
|
6
|
+
bit_order ||= :msbfrst
|
7
|
+
|
8
|
+
raise ArgumentError, "can't read more than 255 SPI bytes at a time" if read > 255
|
9
|
+
raise ArgumentError, "can't write more than 255 SPI bytes at a time" if write.length > 255
|
10
|
+
|
11
|
+
# Lowest 2 bits of settings control the SPI mode.
|
12
|
+
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
|
+
|
17
|
+
# Bit 7 of settings toggles MSBFIRST (1) or LSBFIRST (0) for both read and write.
|
18
|
+
settings = settings | 0b10000000 unless bit_order == :lsbfirst
|
19
|
+
|
20
|
+
# Return generic portion of header (used by both hardware and bit bang SPI).
|
21
|
+
pack(:uint8, [settings, read, write.length])
|
22
|
+
end
|
23
|
+
|
24
|
+
def spi_header(write, read, frequency, mode, bit_order)
|
25
|
+
# Set default frequency and validate.
|
26
|
+
frequency ||= 1000000
|
27
|
+
unless [Integer, Float].include? frequency.class
|
28
|
+
raise ArgumentError, "error in SPI frequency: #{frequency.inspect}"
|
29
|
+
end
|
30
|
+
|
31
|
+
# Get the generic part of the SPI header.
|
32
|
+
header = spi_header_generic(write, read, mode, bit_order)
|
33
|
+
|
34
|
+
# Generic header + packed frequency = hardware SPI header.
|
35
|
+
header + pack(:uint32, frequency)
|
36
|
+
end
|
37
|
+
|
38
|
+
# CMD = 26
|
39
|
+
def spi_transfer(select_pin, write: [], read: 0, frequency: nil, mode: nil, bit_order: nil)
|
40
|
+
raise ArgumentError, "no bytes given to read or write" if (read == 0) && (write.empty?)
|
41
|
+
|
42
|
+
header = spi_header(write, read, frequency, mode, bit_order)
|
43
|
+
|
44
|
+
self.write Message.encode command: 26,
|
45
|
+
pin: select_pin,
|
46
|
+
aux_message: header + pack(:uint8, write)
|
47
|
+
end
|
48
|
+
|
49
|
+
# CMD = 27
|
50
|
+
def spi_listen(select_pin, read: 0, frequency: nil, mode: nil, bit_order: nil)
|
51
|
+
raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read > 0)
|
52
|
+
|
53
|
+
header = spi_header([], read, frequency, mode, bit_order)
|
54
|
+
|
55
|
+
self.write Message.encode command: 27,
|
56
|
+
pin: select_pin,
|
57
|
+
aux_message: header
|
58
|
+
end
|
59
|
+
|
60
|
+
# CMD = 28
|
61
|
+
def spi_stop(select_pin)
|
62
|
+
self.write Message.encode command: 28, pin: select_pin
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
def spi_bb_header(clock, input, output, write, read, mode, bit_order)
|
4
|
+
# Validate clock and data pins
|
5
|
+
raise ArgumentError, "no clock pin given" unless clock
|
6
|
+
raise ArgumentError, "no input or output pin given. Require either or both" unless(input || output)
|
7
|
+
|
8
|
+
# Set the other to disabled if only one given.
|
9
|
+
input ||= 255
|
10
|
+
ouptut ||= 255
|
11
|
+
|
12
|
+
# Get the generic part of the SPI header.
|
13
|
+
header = spi_header_generic(write, read, mode, bit_order)
|
14
|
+
|
15
|
+
# Generic header + packed pins + empty byte = bit bang SPI bheader.
|
16
|
+
header = header + pack(:uint8, [clock, input, output, 0])
|
17
|
+
end
|
18
|
+
|
19
|
+
# CMD = 21
|
20
|
+
def spi_bb_transfer(select_pin, clock: nil, output: nil, input: nil, write: [], read: 0, frequency: nil, mode: nil, bit_order: nil)
|
21
|
+
raise ArgumentError, "no bytes given to read or write" if (read == 0) && (write.empty?)
|
22
|
+
|
23
|
+
header = spi_bb_header(clock, input, output, write, read, mode, bit_order)
|
24
|
+
|
25
|
+
self.write Message.encode command: 21,
|
26
|
+
pin: select_pin,
|
27
|
+
aux_message: header + pack(:uint8, write)
|
28
|
+
end
|
29
|
+
|
30
|
+
# CMD = 22
|
31
|
+
def spi_bb_listen(select_pin, clock: nil, input: nil, read: 0, frequency: nil, mode: nil, bit_order: nil)
|
32
|
+
raise ArgumentError, 'no bytes to read. Give read: argument > 0' unless (read > 0)
|
33
|
+
|
34
|
+
header = spi_bb_header(clock, input, nil, [], read, mode, bit_order)
|
35
|
+
|
36
|
+
self.write Message.encode command: 22,
|
37
|
+
pin: select_pin,
|
38
|
+
aux_message: header
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
# CMD = 17
|
4
|
+
def tone(pin, frequency, duration=nil)
|
5
|
+
raise ArgumentError, "Tone cannot generate frequencies lower than 31Hz" if frequency < 31
|
6
|
+
raise ArgumentError, "Tone duration cannot be more than 65535 milliseconds" if (duration && (duration > 0xFFFF))
|
7
|
+
|
8
|
+
# Pack the frequency and optional duration as binary.
|
9
|
+
aux = pack(:uint16, frequency)
|
10
|
+
aux << pack(:uint16, duration) if duration
|
11
|
+
|
12
|
+
write Message.encode command: 17,
|
13
|
+
pin: pin,
|
14
|
+
value: duration ? 1 : 0,
|
15
|
+
aux_message: aux
|
16
|
+
end
|
17
|
+
|
18
|
+
# CMD = 18
|
19
|
+
def no_tone(pin)
|
20
|
+
write Message.encode command: 18, pin: pin
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
UART_BAUD_RATES = [
|
4
|
+
300, 600, 750, 1200, 2400, 4800, 9600, 19200, 31250, 38400, 57600, 74880, 115200, 230400
|
5
|
+
]
|
6
|
+
|
7
|
+
# CMD = 14
|
8
|
+
def uart_start(index, baud, listening=true)
|
9
|
+
raise ArgumentError, "given UART: #{index} out of range. Only 1..3 supported" if (index < 1 || index > 3)
|
10
|
+
unless UART_BAUD_RATES.include?(baud)
|
11
|
+
raise ArgumentError, "given baud rate: #{baud} not supported. Must be in #{UART_BAUD_RATES.inspect}"
|
12
|
+
end
|
13
|
+
|
14
|
+
config = index | 0b01000000
|
15
|
+
config |= 0b10000000 if listening
|
16
|
+
|
17
|
+
self.write Message.encode command: 14,
|
18
|
+
pin: config,
|
19
|
+
aux_message: pack(:uint32, baud)
|
20
|
+
end
|
21
|
+
|
22
|
+
# CMD = 14
|
23
|
+
def uart_stop(index)
|
24
|
+
raise ArgumentError, "given UART: #{index} out of range. Only 1..3 supported" if (index < 1 || index > 3)
|
25
|
+
self.write Message.encode(command: 14, pin: index)
|
26
|
+
end
|
27
|
+
|
28
|
+
# CMD = 15
|
29
|
+
def uart_write(index, data)
|
30
|
+
raise ArgumentError, "given UART: #{index} out of range. Only 1..3 supported" if (index < 1 || index > 3)
|
31
|
+
|
32
|
+
if data.class == Array
|
33
|
+
data = pack(:uint8, data)
|
34
|
+
elsif data.class == String
|
35
|
+
else
|
36
|
+
raise ArgumentError, "data to write to UART should be Array of bytes or String. Given: #{data.inspect}"
|
37
|
+
end
|
38
|
+
|
39
|
+
self.write Message.encode(command: 15, pin: index, value: data.length, aux_message: data)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Denko
|
2
|
+
class Board
|
3
|
+
# CMD = 12
|
4
|
+
def uart_bb_start(tx, rx, baud, listening=true)
|
5
|
+
config = 0b01000000
|
6
|
+
config |= 0b10000000 if listening
|
7
|
+
|
8
|
+
self.write Message.encode command: 12,
|
9
|
+
pin: tx,
|
10
|
+
value: rx,
|
11
|
+
aux_message: pack(:uint32, baud) + pack(:uint8, config)
|
12
|
+
end
|
13
|
+
|
14
|
+
# CMD = 12
|
15
|
+
def uart_bb_stop
|
16
|
+
config = 0b00000000
|
17
|
+
self.write Message.encode command: 12,
|
18
|
+
aux_message: pack(:uint32, [0]) + pack(:uint8, config)
|
19
|
+
end
|
20
|
+
|
21
|
+
# CMD = 13
|
22
|
+
def uart_bb_write(data)
|
23
|
+
if data.class == Array
|
24
|
+
data = pack(:uint8, data)
|
25
|
+
elsif data.class == String
|
26
|
+
else
|
27
|
+
raise ArgumentError, "data to write to UART should be Array of bytes or String. Given: #{data.inspect}"
|
28
|
+
end
|
29
|
+
|
30
|
+
self.write Message.encode(command: 13, value: data.length, aux_message: data)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/denko/board.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# Require all files in board folder relative to this file.
|
2
|
+
Dir["#{Denko.root}/lib/denko/board/*.rb"].each {|file| require file }
|
3
|
+
|
4
|
+
module Denko
|
5
|
+
class Board
|
6
|
+
attr_reader :board_name, :version, :aux_limit, :eeprom_length
|
7
|
+
attr_reader :low, :high, :analog_write_high, :analog_read_high
|
8
|
+
|
9
|
+
def initialize(io, options={})
|
10
|
+
# Connect the IO, and get the ACK.
|
11
|
+
@io = io
|
12
|
+
ack = io.handshake
|
13
|
+
@name, @version, @aux_limit, @eeprom_length = ack.split(",")
|
14
|
+
|
15
|
+
# Parse map, version and eeprom_legnth.
|
16
|
+
@name = nil if @name.empty?
|
17
|
+
@version = nil if @version.empty?
|
18
|
+
@eeprom_length = @eeprom_length.to_i
|
19
|
+
|
20
|
+
# Leave room for null termination of aux messages.
|
21
|
+
@aux_limit = @aux_limit.to_i - 1
|
22
|
+
|
23
|
+
# Load the board map.
|
24
|
+
@map = load_map(@name)
|
25
|
+
|
26
|
+
# Allow the IO to call #update on the board when messages received.
|
27
|
+
io.add_observer(self)
|
28
|
+
|
29
|
+
# Set digital and analog IO levels.
|
30
|
+
@low = 0
|
31
|
+
@high = 1
|
32
|
+
self.analog_write_resolution = options[:write_bits] || 8
|
33
|
+
self.analog_read_resolution = options[:read_bits] || 10
|
34
|
+
end
|
35
|
+
|
36
|
+
def finish_write
|
37
|
+
sleep 0.001 while @io.writing?
|
38
|
+
write "\n91\n"
|
39
|
+
sleep 0.001 while @io.writing?
|
40
|
+
end
|
41
|
+
|
42
|
+
def analog_write_resolution=(value)
|
43
|
+
set_analog_write_resolution(value)
|
44
|
+
@write_bits = value
|
45
|
+
@analog_write_high = (2 ** @write_bits) - 1
|
46
|
+
end
|
47
|
+
|
48
|
+
def analog_read_resolution=(value)
|
49
|
+
set_analog_read_resolution(value)
|
50
|
+
@read_bits = value
|
51
|
+
@analog_read_high = (2 ** @read_bits) - 1
|
52
|
+
end
|
53
|
+
|
54
|
+
def analog_write_resolution
|
55
|
+
@write_bits
|
56
|
+
end
|
57
|
+
|
58
|
+
def analog_read_resolution
|
59
|
+
@read_bits
|
60
|
+
end
|
61
|
+
|
62
|
+
alias :pwm_high :analog_write_high
|
63
|
+
alias :dac_high :analog_write_high
|
64
|
+
alias :adc_high :analog_read_high
|
65
|
+
|
66
|
+
def write(msg)
|
67
|
+
@io.write(msg)
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Use Board#write_and_halt to call C++ board functions that disable interrupts
|
72
|
+
# for a long time. "Long" being more than 1 serial character (~85us for 115200 baud).
|
73
|
+
#
|
74
|
+
# The "halt" part tells the TxRx to halt transmission to the board after this message.
|
75
|
+
# Since it expects interrupts to be disabled, any data sent could be lost.
|
76
|
+
#
|
77
|
+
# When the board function has re-enabled interrupts, it should call sendReady(). That
|
78
|
+
# signal is read by the TxRx, telling it to resume transmisison.
|
79
|
+
#
|
80
|
+
def write_and_halt(msg)
|
81
|
+
@io.write(msg, true)
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# Use standard Subcomponents behavior.
|
86
|
+
#
|
87
|
+
include Behaviors::Subcomponents
|
88
|
+
|
89
|
+
def update(line)
|
90
|
+
pin, message = line.split(":", 2)
|
91
|
+
pin = pin.to_i
|
92
|
+
if single_pin_components[pin]
|
93
|
+
single_pin_components[pin].update(message)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
#
|
98
|
+
# Component generating convenience methods. TODO: add more!
|
99
|
+
#
|
100
|
+
def eeprom
|
101
|
+
@eeprom ||= EEPROM::BuiltIn.new(board: self)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'observer'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
module Denko
|
5
|
+
module Connection
|
6
|
+
class SerialConnectError < StandardError; end
|
7
|
+
class RxFlushTimeout < StandardError; end
|
8
|
+
|
9
|
+
class Base
|
10
|
+
include Observable
|
11
|
+
include Handshake
|
12
|
+
# We need the methods in FlowControl to wrap subclass methods too.
|
13
|
+
def self.inherited(subclass)
|
14
|
+
subclass.send(:prepend, FlowControl)
|
15
|
+
end
|
16
|
+
|
17
|
+
def stop
|
18
|
+
stop_read
|
19
|
+
stop_write
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def parse(line)
|
25
|
+
changed && notify_observers(line) if line
|
26
|
+
end
|
27
|
+
|
28
|
+
def io
|
29
|
+
@io ||= connect
|
30
|
+
end
|
31
|
+
|
32
|
+
def io_reset
|
33
|
+
flush_read
|
34
|
+
stop_read
|
35
|
+
start_read
|
36
|
+
stop_write
|
37
|
+
start_write
|
38
|
+
end
|
39
|
+
|
40
|
+
def flush_read
|
41
|
+
Timeout.timeout(5) { _read until _read == nil }
|
42
|
+
rescue Timeout::Error
|
43
|
+
raise RxFlushTimeout, "Cannot read from device, or device not running denko"
|
44
|
+
end
|
45
|
+
|
46
|
+
def start_read
|
47
|
+
@read_thread ||= Thread.new do
|
48
|
+
loop { parse(read) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def stop_read
|
53
|
+
Thread.kill(@read_thread) if @read_thread
|
54
|
+
@read_thread = nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def start_write
|
58
|
+
@write_thread ||= Thread.new do
|
59
|
+
# Tell the board to reset if our script is interrupted.
|
60
|
+
trap("INT") do
|
61
|
+
_write "\n91\n"
|
62
|
+
raise Interrupt
|
63
|
+
end
|
64
|
+
|
65
|
+
loop { write_from_buffer }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def stop_write
|
70
|
+
Thread.kill(@write_thread) if @write_thread
|
71
|
+
@write_thread = nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Denko
|
2
|
+
module Connection
|
3
|
+
class BoardUART < Base
|
4
|
+
BAUD = 115200
|
5
|
+
|
6
|
+
def initialize(uart, options={})
|
7
|
+
@uart = uart
|
8
|
+
@uart.start(options[:baud] || BAUD)
|
9
|
+
end
|
10
|
+
|
11
|
+
def baud
|
12
|
+
@uart.baud
|
13
|
+
end
|
14
|
+
|
15
|
+
def flush_read
|
16
|
+
@uart.flush
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"#{@uart} @ #{@uart.baud} baud"
|
21
|
+
end
|
22
|
+
|
23
|
+
def _write(message)
|
24
|
+
io.write(message)
|
25
|
+
end
|
26
|
+
|
27
|
+
def _read
|
28
|
+
io.gets
|
29
|
+
end
|
30
|
+
|
31
|
+
def connect
|
32
|
+
@uart
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
module Denko
|
2
|
+
module Connection
|
3
|
+
module FlowControl
|
4
|
+
BOARD_BUFFER = 63
|
5
|
+
SLEEP_TIME = 0.001
|
6
|
+
|
7
|
+
def initialize(*args)
|
8
|
+
super(*args)
|
9
|
+
reset_flow_control
|
10
|
+
tx_resume
|
11
|
+
end
|
12
|
+
|
13
|
+
def write(message, tx_halt_after=nil)
|
14
|
+
@write_buffer_mutex.synchronize do
|
15
|
+
@write_buffer << message
|
16
|
+
|
17
|
+
# Optionally halt transmission after this message.
|
18
|
+
# See comments on Board#write_and_halt for more info.
|
19
|
+
@tx_halt_points << @write_buffer.length if tx_halt_after
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def writing?
|
24
|
+
@write_buffer_mutex.synchronize { !@write_buffer.empty? }
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def reset_flow_control
|
30
|
+
@tx_ready_mutex ||= Mutex.new
|
31
|
+
@transit_mutex ||= Mutex.new
|
32
|
+
@transit_mutex.synchronize { @transit_bytes = 0 }
|
33
|
+
|
34
|
+
@write_buffer_mutex ||= Mutex.new
|
35
|
+
@write_buffer_mutex.synchronize do
|
36
|
+
@write_buffer = ""
|
37
|
+
@tx_halt_points = []
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def write_from_buffer
|
42
|
+
fragment = nil
|
43
|
+
halt_after_fragment = false
|
44
|
+
|
45
|
+
@write_buffer_mutex.synchronize do
|
46
|
+
# Nothing to write.
|
47
|
+
break if @write_buffer.empty?
|
48
|
+
|
49
|
+
# Try to send the entire buffer unless a halt point is coming up.
|
50
|
+
if @tx_halt_points.empty?
|
51
|
+
limit = @write_buffer.length
|
52
|
+
# Don't send beyond the first halt point if one exists.
|
53
|
+
else
|
54
|
+
limit = @tx_halt_points[0]
|
55
|
+
end
|
56
|
+
# Try to reserve limit bytes on the remote read buffer.
|
57
|
+
bytes = reserve_bytes(limit)
|
58
|
+
|
59
|
+
if bytes > 0
|
60
|
+
# Take fragment of bytes length off the write buffer.
|
61
|
+
fragment = @write_buffer[0..(bytes-1)]
|
62
|
+
@write_buffer = @write_buffer[bytes..-1]
|
63
|
+
|
64
|
+
# Update the halt points to reflect bytes removed.
|
65
|
+
@tx_halt_points.map! { |length| length - bytes }
|
66
|
+
|
67
|
+
# If the first halt point was reached, delete it, and halt after writing fragment.
|
68
|
+
if @tx_halt_points[0] == 0
|
69
|
+
@tx_halt_points.shift
|
70
|
+
halt_after_fragment = true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# If no fragment, wait.
|
76
|
+
return wait unless fragment
|
77
|
+
|
78
|
+
# If fragment, write it.
|
79
|
+
loop do
|
80
|
+
# Write and end loop if the board is ready.
|
81
|
+
@tx_ready_mutex.synchronize do
|
82
|
+
if @tx_ready
|
83
|
+
_write fragment
|
84
|
+
@tx_ready = false if halt_after_fragment
|
85
|
+
return
|
86
|
+
end
|
87
|
+
end
|
88
|
+
# Else wait outside the @tx_ready_mutex. Allows read thread to update @tx_ready.
|
89
|
+
wait
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Keep transit mutex as short as possible, by only reserving bytes, and writing outside.
|
94
|
+
def reserve_bytes(length)
|
95
|
+
@transit_mutex.synchronize do
|
96
|
+
available = BOARD_BUFFER - @transit_bytes
|
97
|
+
reserved = (length > available) ? available : length
|
98
|
+
@transit_bytes += reserved
|
99
|
+
reserved
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def read
|
104
|
+
line = _read
|
105
|
+
|
106
|
+
if line
|
107
|
+
case line[0..2]
|
108
|
+
# Board read (freed) this many bytes from its input buffer.
|
109
|
+
when "Rx:"
|
110
|
+
remove_transit_bytes(line.split(/:/)[1].to_i)
|
111
|
+
line = nil
|
112
|
+
# Board says to resume transmission.
|
113
|
+
when "Rdy"
|
114
|
+
tx_resume
|
115
|
+
line = nil
|
116
|
+
# Board says to halt transmission.
|
117
|
+
when "Hlt"
|
118
|
+
tx_halt
|
119
|
+
line = nil
|
120
|
+
# Print debug lines.
|
121
|
+
when "DBG"
|
122
|
+
puts line.inspect
|
123
|
+
line = nil
|
124
|
+
end
|
125
|
+
else
|
126
|
+
wait
|
127
|
+
end
|
128
|
+
|
129
|
+
return line
|
130
|
+
end
|
131
|
+
|
132
|
+
def wait
|
133
|
+
sleep SLEEP_TIME
|
134
|
+
end
|
135
|
+
|
136
|
+
def tx_halt
|
137
|
+
@tx_ready_mutex.synchronize { @tx_ready = false }
|
138
|
+
end
|
139
|
+
|
140
|
+
def tx_resume
|
141
|
+
@tx_ready_mutex.synchronize { @tx_ready = true }
|
142
|
+
end
|
143
|
+
|
144
|
+
def add_transit_bytes(value)
|
145
|
+
@transit_mutex.synchronize { @transit_bytes = @transit_bytes + value }
|
146
|
+
end
|
147
|
+
|
148
|
+
def remove_transit_bytes(value)
|
149
|
+
@transit_mutex.synchronize { @transit_bytes = @transit_bytes - value }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|