denko 0.13.6 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/{build_avr.yml → build_atmega_avr.yml} +19 -18
- data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +19 -18
- data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +18 -17
- data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +19 -18
- data/.github/workflows/build_esp32.yml +19 -18
- data/.github/workflows/build_esp32c3.yml +58 -0
- data/.github/workflows/build_esp32c6.yml +59 -0
- data/.github/workflows/build_esp32h2.yml +58 -0
- data/.github/workflows/build_esp32s2.yml +59 -0
- data/.github/workflows/build_esp32s3.yml +59 -0
- data/.github/workflows/build_esp8266.yml +16 -15
- data/.github/workflows/build_ra4m1.yml +17 -16
- data/.github/workflows/build_rp2040.yml +19 -17
- data/.github/workflows/ruby.yml +20 -20
- data/CHANGELOG.md +398 -11
- data/DEPS_CLI.md +16 -16
- data/DEPS_IDE.md +39 -39
- data/MICROCONTROLLERS.md +103 -0
- data/PERIPHERALS.md +178 -0
- data/README.md +73 -58
- data/Rakefile +1 -1
- data/build +1 -1
- data/denko.gemspec +11 -3
- data/lib/denko/analog_io/ads1100.rb +127 -0
- data/lib/denko/analog_io/ads1115.rb +8 -25
- data/lib/denko/analog_io/ads1118.rb +12 -27
- data/lib/denko/analog_io/ads111x.rb +39 -21
- data/lib/denko/analog_io/input.rb +29 -55
- data/lib/denko/analog_io/input_helper.rb +42 -0
- data/lib/denko/analog_io/joystick.rb +87 -0
- data/lib/denko/analog_io/output.rb +5 -5
- data/lib/denko/analog_io/potentiometer.rb +3 -9
- data/lib/denko/analog_io.rb +22 -7
- data/lib/denko/behaviors/board_proxy.rb +13 -1
- data/lib/denko/behaviors/bus_controller.rb +3 -1
- data/lib/denko/behaviors/bus_controller_addressed.rb +1 -0
- data/lib/denko/behaviors/bus_peripheral.rb +3 -4
- data/lib/denko/behaviors/bus_peripheral_addressed.rb +8 -6
- data/lib/denko/behaviors/callbacks.rb +18 -14
- data/lib/denko/behaviors/component.rb +12 -14
- data/lib/denko/behaviors/input_pin.rb +14 -15
- data/lib/denko/behaviors/lifecycle.rb +51 -0
- data/lib/denko/behaviors/listener.rb +9 -3
- data/lib/denko/behaviors/multi_pin.rb +22 -20
- data/lib/denko/behaviors/output_pin.rb +9 -4
- data/lib/denko/behaviors/poller.rb +11 -2
- data/lib/denko/behaviors/reader.rb +109 -21
- data/lib/denko/behaviors/single_pin.rb +3 -4
- data/lib/denko/behaviors/state.rb +24 -13
- data/lib/denko/behaviors/subcomponents.rb +72 -12
- data/lib/denko/behaviors/threaded.rb +19 -8
- data/lib/denko/behaviors.rb +36 -22
- data/lib/denko/board/core.rb +36 -18
- data/lib/denko/board/eeprom.rb +1 -1
- data/lib/denko/board/i2c.rb +15 -15
- data/lib/denko/board/i2c_bit_bang.rb +53 -0
- data/lib/denko/board/infrared.rb +6 -6
- data/lib/denko/board/led_array.rb +6 -5
- data/lib/denko/board/map.rb +6 -2
- data/lib/denko/board/one_wire.rb +3 -3
- data/lib/denko/board/spi.rb +35 -30
- data/lib/denko/board/spi_bit_bang.rb +14 -15
- data/lib/denko/board.rb +41 -36
- data/lib/denko/connection/binary_echo.rb +17 -0
- data/lib/denko/connection/flow_control.rb +12 -16
- data/lib/denko/connection/handshake.rb +2 -0
- data/lib/denko/connection/serial.rb +5 -5
- data/lib/denko/digital_io/button.rb +4 -0
- data/lib/denko/digital_io/c_bit_bang.rb +15 -0
- data/lib/denko/digital_io/input.rb +4 -5
- data/lib/denko/digital_io/output.rb +19 -10
- data/lib/denko/digital_io/pcf8574.rb +114 -0
- data/lib/denko/digital_io/relay.rb +2 -0
- data/lib/denko/digital_io/rotary_encoder.rb +83 -61
- data/lib/denko/digital_io.rb +24 -5
- data/lib/denko/display/canvas.rb +350 -157
- data/lib/denko/display/font/bmp_5x7.rb +142 -0
- data/lib/denko/display/font/bmp_6x8.rb +142 -0
- data/lib/denko/display/font/bmp_8x16.rb +141 -0
- data/lib/denko/display/font.rb +22 -0
- data/lib/denko/display/hd44780.rb +152 -105
- data/lib/denko/display/il0373.rb +186 -0
- data/lib/denko/display/mono_oled.rb +193 -0
- data/lib/denko/display/pcd8544.rb +154 -0
- data/lib/denko/display/pixel_common.rb +83 -0
- data/lib/denko/display/sh1106.rb +38 -0
- data/lib/denko/display/sh1107.rb +10 -0
- data/lib/denko/display/spi_common.rb +35 -0
- data/lib/denko/display/spi_epaper_common.rb +30 -0
- data/lib/denko/display/ssd1306.rb +6 -168
- data/lib/denko/display/ssd1680.rb +14 -0
- data/lib/denko/display/ssd1681.rb +8 -0
- data/lib/denko/display/ssd168x.rb +227 -0
- data/lib/denko/display/st7302.rb +207 -0
- data/lib/denko/display/st7565.rb +166 -0
- data/lib/denko/display.rb +40 -3
- data/lib/denko/eeprom/at24c.rb +67 -0
- data/lib/denko/eeprom/board.rb +69 -0
- data/lib/denko/eeprom.rb +15 -1
- data/lib/denko/helpers/engine_check.rb +13 -0
- data/lib/denko/helpers/mutex_stub.rb +13 -0
- data/lib/denko/helpers.rb +6 -0
- data/lib/denko/i2c/bit_bang.rb +32 -0
- data/lib/denko/i2c/bus.rb +8 -36
- data/lib/denko/i2c/bus_common.rb +50 -0
- data/lib/denko/i2c/peripheral.rb +32 -19
- data/lib/denko/i2c.rb +17 -2
- data/lib/denko/led/apa102.rb +42 -30
- data/lib/denko/led/base.rb +13 -2
- data/lib/denko/led/rgb.rb +18 -14
- data/lib/denko/led/seven_segment.rb +24 -9
- data/lib/denko/led/ws2812.rb +10 -7
- data/lib/denko/led.rb +17 -8
- data/lib/denko/message.rb +5 -0
- data/lib/denko/motor/{stepper.rb → a3967.rb} +12 -15
- data/lib/denko/motor/l298.rb +11 -10
- data/lib/denko/motor/servo.rb +37 -15
- data/lib/denko/motor.rb +16 -3
- data/lib/denko/one_wire/bus.rb +31 -23
- data/lib/denko/one_wire/bus_enumerator.rb +25 -14
- data/lib/denko/one_wire/helper.rb +4 -2
- data/lib/denko/one_wire/peripheral.rb +0 -3
- data/lib/denko/one_wire.rb +18 -5
- data/lib/denko/pulse_io/buzzer.rb +11 -9
- data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +6 -5
- data/lib/denko/pulse_io/pwm_output.rb +94 -15
- data/lib/denko/pulse_io.rb +17 -3
- data/lib/denko/rtc/ds3231.rb +13 -14
- data/lib/denko/rtc.rb +14 -1
- data/lib/denko/sensor/aht.rb +35 -38
- data/lib/denko/sensor/bme280.rb +76 -92
- data/lib/denko/sensor/bmp180.rb +46 -48
- data/lib/denko/sensor/dht.rb +34 -7
- data/lib/denko/sensor/ds18b20.rb +41 -34
- data/lib/denko/sensor/hcsr04.rb +7 -5
- data/lib/denko/sensor/hdc1080.rb +174 -0
- data/lib/denko/sensor/helper.rb +37 -0
- data/lib/denko/sensor/htu21d.rb +57 -57
- data/lib/denko/sensor/htu31d.rb +36 -36
- data/lib/denko/sensor/jsnsr04t.rb +49 -0
- data/lib/denko/sensor/qmp6988.rb +34 -48
- data/lib/denko/sensor/rcwl9620.rb +3 -5
- data/lib/denko/sensor/sht3x.rb +27 -24
- data/lib/denko/sensor/sht4x.rb +125 -0
- data/lib/denko/sensor/vl53l0x.rb +58 -0
- data/lib/denko/sensor.rb +33 -16
- data/lib/denko/spi/base_register.rb +25 -21
- data/lib/denko/spi/bit_bang.rb +17 -51
- data/lib/denko/spi/bus.rb +15 -29
- data/lib/denko/spi/bus_common.rb +33 -0
- data/lib/denko/spi/input_register.rb +37 -31
- data/lib/denko/spi/output_register.rb +33 -39
- data/lib/denko/spi/peripheral.rb +81 -14
- data/lib/denko/spi.rb +21 -6
- data/lib/denko/uart/bit_bang.rb +7 -30
- data/lib/denko/uart/common.rb +33 -0
- data/lib/denko/uart/hardware.rb +10 -34
- data/lib/denko/uart.rb +16 -2
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +23 -16
- data/lib/denko_cli/generator.rb +2 -2
- data/lib/denko_cli/packages.rb +8 -10
- data/lib/denko_cli/targets.rb +13 -13
- data/lib/denko_cli/targets.txt +23 -24
- data/lib/denko_cli/usage.txt +1 -1
- data/src/denko_ethernet.ino +0 -14
- data/src/denko_serial.ino +0 -14
- data/src/denko_wifi.ino +6 -15
- data/src/lib/Denko.cpp +65 -16
- data/src/lib/Denko.h +46 -30
- data/src/lib/DenkoCoreIO.cpp +57 -102
- data/src/lib/DenkoDefines.h +32 -46
- data/src/lib/DenkoI2C.cpp +54 -45
- data/src/lib/DenkoI2CBB.cpp +238 -0
- data/src/lib/DenkoIROut.cpp +12 -7
- data/src/lib/DenkoLEDArray.cpp +29 -13
- data/src/lib/DenkoSPI.cpp +36 -33
- data/src/lib/DenkoSPIBB.cpp +19 -20
- data/target.yml +37 -2
- data/test/analog_io/input_test.rb +1 -1
- data/test/analog_io/potentiometer_test.rb +12 -12
- data/test/behaviors/board_proxy_test.rb +1 -1
- data/test/behaviors/bus_peripheral_test.rb +4 -4
- data/test/behaviors/callbacks_test.rb +28 -10
- data/test/behaviors/component_test.rb +32 -14
- data/test/behaviors/input_pin_test.rb +14 -9
- data/test/behaviors/multi_pin_test.rb +14 -4
- data/test/behaviors/output_pin_test.rb +11 -8
- data/test/behaviors/poller_test.rb +1 -0
- data/test/behaviors/reader_test.rb +3 -2
- data/test/behaviors/subcomponents_test.rb +22 -2
- data/test/board/board_test.rb +9 -9
- data/test/board/core_test.rb +15 -11
- data/test/board/i2c_test.rb +39 -33
- data/test/board/infrared_test.rb +1 -1
- data/test/board/message_test.rb +17 -11
- data/test/board/one_wire_test.rb +25 -14
- data/test/board/spi_test.rb +45 -29
- data/test/digital_io/button_test.rb +15 -0
- data/test/digital_io/input_test.rb +2 -2
- data/test/digital_io/relay_test.rb +18 -0
- data/test/digital_io/rotary_encoder_test.rb +80 -60
- data/test/display/canvas_test.rb +306 -0
- data/test/display/hd44780_test.rb +34 -7
- data/test/eeprom/board_test.rb +45 -0
- data/test/helpers/mruby_minitest.rb +95 -0
- data/test/helpers/mruby_runner.rb +13 -0
- data/test/i2c/bus_test.rb +108 -29
- data/test/i2c/peripheral_test.rb +38 -19
- data/test/led/apa102_test.rb +24 -0
- data/test/led/base_test.rb +2 -1
- data/test/led/rgb_test.rb +9 -9
- data/test/led/seven_segment_test.rb +7 -7
- data/test/motor/{stepper_test.rb → a3967_test.rb} +4 -4
- data/test/motor/servo_test.rb +1 -1
- data/test/one_wire/bus_enumerator_test.rb +1 -1
- data/test/one_wire/bus_test.rb +43 -35
- data/test/one_wire/peripheral_test.rb +5 -17
- data/test/pulse_io/buzzer_test.rb +7 -4
- data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +15 -10
- data/test/pulse_io/pwm_output_test.rb +74 -18
- data/test/rtc/ds3231_test.rb +13 -14
- data/test/sensor/dht_test.rb +12 -12
- data/test/sensor/ds18b20_test.rb +4 -8
- data/test/spi/bitbang_test.rb +27 -0
- data/test/spi/bus_test.rb +24 -34
- data/test/spi/input_register_test.rb +17 -17
- data/test/spi/output_register_test.rb +10 -28
- data/test/spi/peripheral_test.rb +73 -0
- data/test/test_helper.rb +44 -121
- data/vendor/board-maps/BoardMap.h +678 -54
- data/vendor/board-maps/lib/header_parser.rb +12 -2
- data/vendor/board-maps/yaml/ADAFRUIT_CAMERA_ESP32S3.yml +2 -2
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32C6.yml +15 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +1 -1
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_ADALOGGER.yml +44 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +1 -0
- data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
- data/vendor/board-maps/yaml/AMKEN_BB.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_ES.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_REVELOP.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_REVELOP_PLUS.yml +48 -0
- data/vendor/board-maps/yaml/ASL_CAN_X2.yml +41 -0
- data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
- data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
- data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
- data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
- data/vendor/board-maps/yaml/BLING.yml +25 -0
- data/vendor/board-maps/yaml/BRIDGETEK_IDM2040_7A.yml +48 -0
- data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +13 -1
- data/vendor/board-maps/yaml/Breadstick_Raspberry.yml +31 -0
- data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
- data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
- data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
- data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
- data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
- data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32C6.yml +8 -0
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32C6.yml +20 -0
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_ESP32.yml +46 -0
- data/vendor/board-maps/yaml/DPTECHNICS_WALTER.yml +39 -0
- data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
- data/vendor/board-maps/yaml/ELECROW_CROWPANEL_7.yml +8 -0
- data/vendor/board-maps/yaml/ESP32C2_DEV.yml +12 -0
- data/vendor/board-maps/yaml/ESP32C3_DEVKIT_LIPO.yml +14 -0
- data/vendor/board-maps/yaml/ESP32C6_DEV.yml +14 -0
- data/vendor/board-maps/yaml/ESP32C6_EVB.yml +15 -0
- data/vendor/board-maps/yaml/ESP32C6_QWIIC_POCKET.yml +15 -0
- data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +14 -0
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +12 -0
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +12 -0
- data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
- data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +1 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +43 -0
- data/vendor/board-maps/yaml/ESP32S3_DEVKIT_LIPO.yml +42 -0
- data/vendor/board-maps/yaml/ESP32S3_POWERFEATHER.yml +22 -0
- data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
- data/vendor/board-maps/yaml/ESP32_SBC_FABGL.yml +35 -0
- data/vendor/board-maps/yaml/EVN_ALPHA.yml +48 -0
- data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
- data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
- data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +13 -0
- data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
- data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_WIFI_LORA_32_V3.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_BRIDGE.yml +8 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_MINI_SHELL.yml +13 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_PAPER.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_SHELL_V3.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_STICK_LITE_V3.yml +30 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_TRACKER.yml +41 -0
- data/vendor/board-maps/yaml/HT_DE01.yml +42 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
- data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
- data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_LR1121.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1262.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1276.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1278.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280PA.yml +8 -0
- data/vendor/board-maps/yaml/LILYGO_T_ETH_LITE.yml +21 -0
- data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +13 -0
- data/vendor/board-maps/yaml/LOLIN_S3.yml +1 -0
- data/vendor/board-maps/yaml/LOLIN_S3_MINI_PRO.yml +40 -0
- data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -2
- data/vendor/board-maps/yaml/M5STACK_CAPSULE.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_CARDPUTER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_DIAL.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -2
- data/vendor/board-maps/yaml/M5STACK_NANOC6.yml +17 -0
- data/vendor/board-maps/yaml/M5STACK_PAPER.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_POE_CAM.yml +5 -0
- data/vendor/board-maps/yaml/M5STACK_STAMP_C3.yml +13 -0
- data/vendor/board-maps/yaml/M5STACK_STAMP_S3.yml +4 -0
- data/vendor/board-maps/yaml/{M5Stick_C.yml → M5STACK_STICKC.yml} +0 -1
- data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS2.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_TOUGH.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_UNIT_CAM.yml +10 -0
- data/vendor/board-maps/yaml/M5STACK_UNIT_CAMS3.yml +4 -0
- data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -1
- data/vendor/board-maps/yaml/MAKERGO_C3_SUPERMINI.yml +14 -0
- data/vendor/board-maps/yaml/MARBLE_PICO.yml +48 -0
- data/vendor/board-maps/yaml/METEHOCA_AKANA_R1.yml +46 -0
- data/vendor/board-maps/yaml/NAMINO_BIANCO.yml +13 -0
- data/vendor/board-maps/yaml/NEBULAS3.yml +0 -1
- data/vendor/board-maps/yaml/NEWSAN_ARCHI.yml +48 -0
- data/vendor/board-maps/yaml/NOLOGO_ESP32C3_SUPER_MINI.yml +14 -0
- data/vendor/board-maps/yaml/NOLOGO_ESP32S3_PICO.yml +12 -0
- data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_16MB.yml +48 -0
- data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_2MB.yml +48 -0
- data/vendor/board-maps/yaml/OMGS3.yml +25 -0
- data/vendor/board-maps/yaml/OPTA_ANALOG.yml +7 -0
- data/vendor/board-maps/yaml/OPTA_DIGITAL.yml +5 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
- data/vendor/board-maps/yaml/PINTRONIX_PINMAX.yml +42 -0
- data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -1
- data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +12 -0
- data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
- data/vendor/board-maps/yaml/SPARKFUN_MICROMOD_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/SPARKFUN_PRO_MICRO_ESP32C3.yml +24 -0
- data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
- data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
- data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
- data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER.yml +31 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +14 -0
- data/vendor/board-maps/yaml/TINYC6.yml +25 -0
- data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
- data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
- data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
- data/vendor/board-maps/yaml/UPESY_EDU_ESP32.yml +28 -0
- data/vendor/board-maps/yaml/UPESY_ESP32C3_BASIC.yml +13 -0
- data/vendor/board-maps/yaml/UPESY_ESP32C3_MINI.yml +12 -0
- data/vendor/board-maps/yaml/UPESY_ESP32S3_BASIC.yml +42 -0
- data/vendor/board-maps/yaml/VIRALINK_GATE32_01.yml +6 -0
- data/vendor/board-maps/yaml/VIRALINK_GATE32_11.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32S3_TOUCH_LCD_128.yml +8 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_MATRIX.yml +48 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +1 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_PIZERO.yml +47 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +1 -0
- data/vendor/board-maps/yaml/WEACT_STUDIO_ESP32C3.yml +14 -0
- data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
- data/vendor/board-maps/yaml/WT32_SC01_PLUS.yml +7 -0
- data/vendor/board-maps/yaml/WiFiduinoV2.yml +1 -0
- data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -1
- data/vendor/board-maps/yaml/XIAO_ESP32C6.yml +22 -0
- data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
- data/vendor/board-maps/yaml/mercury.yml +20 -0
- data/vendor/board-maps/yaml/unphone9.yml +8 -0
- metadata +259 -105
- data/.vscode/settings.json +0 -5
- data/.vscode/tasks.json +0 -20
- data/HARDWARE.md +0 -264
- data/benchmarks/i2c_ssd1306_refresh.rb +0 -84
- data/examples/advanced/m5_env.rb +0 -48
- data/examples/advanced/rotary_encoder_mac_volume.rb +0 -48
- data/examples/advanced/ssd1306_time_temp_rh.rb +0 -48
- data/examples/analog_io/ads1115.rb +0 -57
- data/examples/analog_io/ads1118.rb +0 -73
- data/examples/analog_io/dac_loopback.rb +0 -34
- data/examples/analog_io/input.rb +0 -55
- data/examples/connection/tcp.rb +0 -34
- data/examples/digital_io/button.rb +0 -13
- data/examples/digital_io/rotary_encoder.rb +0 -26
- data/examples/display/hd44780.png +0 -0
- data/examples/display/hd44780.rb +0 -39
- data/examples/display/ssd1306.rb +0 -40
- data/examples/display/ssd1306_s2_pico.rb +0 -29
- data/examples/eeprom/built_in.rb +0 -32
- data/examples/i2c/search.rb +0 -55
- data/examples/led/apa102_bounce.rb +0 -33
- data/examples/led/apa102_breathe.rb +0 -45
- data/examples/led/builtin_blink.rb +0 -12
- data/examples/led/seven_segment_char_echo.rb +0 -15
- data/examples/led/ws2812_bounce.rb +0 -32
- data/examples/led/ws2812_builtin_blink.rb +0 -21
- data/examples/motor/l298.rb +0 -43
- data/examples/motor/servo.rb +0 -16
- data/examples/motor/stepper.png +0 -0
- data/examples/motor/stepper.rb +0 -43
- data/examples/pulse_io/buzzer.rb +0 -30
- data/examples/pulse_io/ir_transmitter.rb +0 -55
- data/examples/rtc/ds3231.rb +0 -48
- data/examples/sensor/aht10.rb +0 -19
- data/examples/sensor/aht20.rb +0 -19
- data/examples/sensor/bme280.rb +0 -38
- data/examples/sensor/bmp180.rb +0 -22
- data/examples/sensor/dht.rb +0 -24
- data/examples/sensor/ds18b20.rb +0 -58
- data/examples/sensor/generic_pir.rb +0 -25
- data/examples/sensor/hcsr04.rb +0 -14
- data/examples/sensor/htu21d.rb +0 -54
- data/examples/sensor/htu31d.rb +0 -35
- data/examples/sensor/neat_tph_readings.rb +0 -26
- data/examples/sensor/qmp6988.rb +0 -53
- data/examples/sensor/rcwl9620.rb +0 -15
- data/examples/sensor/sht3x.rb +0 -34
- data/examples/spi/input_register.rb +0 -50
- data/examples/spi/output_register.rb +0 -49
- data/examples/spi/ssd_through_register.rb +0 -40
- data/examples/spi/two_registers.rb +0 -46
- data/examples/uart/bit_bang_read.rb +0 -16
- data/examples/uart/bit_bang_write.rb +0 -16
- data/examples/uart/board_passthrough.rb +0 -34
- data/examples/uart/hardware_loopback.rb +0 -16
- data/lib/denko/analog_io/sensor.rb +0 -6
- data/lib/denko/eeprom/built_in.rb +0 -69
- data/lib/denko/fonts.rb +0 -106
- data/lib/denko/sensor/virtual.rb +0 -42
- data/src/lib/DenkoIROutESP.cpp +0 -26
- data/test/eeprom/built_in_test.rb +0 -61
- data/tutorial/01-led/led.fzz +0 -0
- data/tutorial/01-led/led.pdf +0 -0
- data/tutorial/01-led/led.rb +0 -73
- data/tutorial/02-button/button.fzz +0 -0
- data/tutorial/02-button/button.pdf +0 -0
- data/tutorial/02-button/button.rb +0 -64
- data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
- data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
- data/tutorial/03-potentiometer/potentiometer.rb +0 -62
- data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
- data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
- data/tutorial/04-pwm_led/pwm_led.rb +0 -66
- data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
- data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
- data/tutorial/05-rgb_led/rgb_led.rb +0 -58
- data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
- data/vendor/board-maps/yaml/STAMP_S3.yml +0 -8
- /data/vendor/board-maps/yaml/{BRIDGETEK_IDM2040-7A.yml → BRIDGETEK_IDM2040_43A.yml} +0 -0
- /data/vendor/board-maps/yaml/{heltec_wifi_32_lora_V3.yml → HELTEC_WIRELESS_STICK_V3.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stack_Core_ESP32.yml → M5STACK_CORE.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stamp_Pico.yml → M5STACK_STAMP_PICO.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stack-Timer-CAM.yml → M5STACK_TIMER_CAM.yml} +0 -0
data/src/lib/Denko.h
CHANGED
@@ -13,14 +13,6 @@ class Denko {
|
|
13
13
|
// Store it and call ->print, ->write, ->available, ->read etc. on it.
|
14
14
|
Stream* stream;
|
15
15
|
|
16
|
-
// Callback hooks for local logic (defined in main sketch) based on listeners.
|
17
|
-
// These should be used if:
|
18
|
-
// 1) a round-trip to the remote client is too slow, or
|
19
|
-
// 2) something needs to happen regardless of remote client connection.
|
20
|
-
// Eg. Instant feedback from a smart light switch.
|
21
|
-
void (*digitalListenCallback)(byte p, byte v);
|
22
|
-
void (*analogListenCallback)(byte p, int v);
|
23
|
-
|
24
16
|
// Core IO API Functions
|
25
17
|
// Functions with a cmd value can be called through the remote API.
|
26
18
|
//
|
@@ -35,10 +27,10 @@ class Denko {
|
|
35
27
|
void dacWrite (byte p, int v, boolean echo=true); //cmd = 4
|
36
28
|
int aRead (byte p); //cmd = 5
|
37
29
|
void setListener (byte p, boolean enabled, byte analog, byte exponent, boolean local=true); //cmd = 6
|
38
|
-
|
30
|
+
|
39
31
|
// Read value of micros() every loop.
|
40
32
|
unsigned long currentTime;
|
41
|
-
|
33
|
+
|
42
34
|
// Counts 1ms ticks based on currentTime. Rolls over every 256ms.
|
43
35
|
byte tickCount;
|
44
36
|
|
@@ -53,19 +45,10 @@ class Denko {
|
|
53
45
|
void clearCoreListeners ();
|
54
46
|
void findLastActiveListener();
|
55
47
|
|
56
|
-
//
|
57
|
-
// Tanslating aWrite to ledcWrite for PWM out on the ESP32.
|
58
|
-
//
|
59
|
-
// Track which pin is assigned to each LEDC channel.
|
60
|
-
// Byte 0 = enabled or disabled
|
61
|
-
// Byte 1 = pin number attached to that channel
|
62
|
-
//
|
63
48
|
#ifdef ESP32
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
void releaseLEDC(byte p);
|
68
|
-
void clearLedcChannels();
|
49
|
+
// 8-bit global PWM resolution by default, to match other boards. Reconfigurable.
|
50
|
+
uint8_t esp32AnalogWRes = 8;
|
51
|
+
void ledcDetachAll();
|
69
52
|
#endif
|
70
53
|
|
71
54
|
//
|
@@ -136,8 +119,8 @@ class Denko {
|
|
136
119
|
void showLEDArray (); //cmd = 19
|
137
120
|
|
138
121
|
// Bit Bang SPI
|
139
|
-
void spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
|
140
|
-
|
122
|
+
void spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
|
123
|
+
uint16_t rLength, uint16_t wLength, byte *data); //cmd = 21
|
141
124
|
byte spiBBtransferByte (uint8_t clock, uint8_t input, uint8_t output, uint8_t select,
|
142
125
|
uint8_t mode, uint8_t bitOrder, byte data);
|
143
126
|
void spiBBaddListener (); //cmd = 22
|
@@ -146,10 +129,10 @@ class Denko {
|
|
146
129
|
// Hardware SPI
|
147
130
|
void spiBegin (byte settings, uint32_t clockRate);
|
148
131
|
void spiEnd ();
|
149
|
-
void spiTransfer (uint32_t clockRate, uint8_t select, uint8_t settings,
|
132
|
+
void spiTransfer (uint32_t clockRate, uint8_t select, uint8_t settings, uint16_t rLength, uint16_t wLength, byte *data); //cmd = 26
|
150
133
|
void spiAddListener (); //cmd = 27
|
151
134
|
void spiReadListener (uint8_t i);
|
152
|
-
|
135
|
+
|
153
136
|
// SPI Listeners (both hardware and bit bang)
|
154
137
|
void spiRemoveListener (); //cmd = 28
|
155
138
|
void spiUpdateListeners ();
|
@@ -182,6 +165,7 @@ class Denko {
|
|
182
165
|
void setRegisterDivider (); //cmd = 97
|
183
166
|
void setAnalogWriteResolution (); //cmd = 96
|
184
167
|
void setAnalogReadResolution (); //cmd = 97
|
168
|
+
void binaryEcho (); //cmd = 98
|
185
169
|
void microDelay(uint32_t microseconds); //cmd = 99, Platform specific microsecond delay
|
186
170
|
unsigned long lastTime;
|
187
171
|
unsigned long timeDiff;
|
@@ -211,7 +195,12 @@ class Denko {
|
|
211
195
|
//
|
212
196
|
// Notify computer that board has received bytes.
|
213
197
|
void rxNotify();
|
214
|
-
|
198
|
+
// 8-bit counter on AVR for efficiency, 32-bit otherwise.
|
199
|
+
#ifdef __AVR__
|
200
|
+
uint8_t rxBytes = 0;
|
201
|
+
#else
|
202
|
+
uint32_t rxBytes = 0;
|
203
|
+
#endif
|
215
204
|
//
|
216
205
|
// Tell the computer to halt or resume sending data to the board.
|
217
206
|
//
|
@@ -232,19 +221,46 @@ class Denko {
|
|
232
221
|
|
233
222
|
//
|
234
223
|
// Shared SPI listeners that can be used by either hardware or bit bang SPI.
|
235
|
-
//
|
224
|
+
//
|
236
225
|
#if defined(DENKO_SPI) || defined(DENKO_SPI_BB)
|
237
226
|
// How many SPI lsiteners.
|
238
227
|
#define SPI_LISTENER_COUNT 4
|
239
228
|
|
240
229
|
// How to store a SPI listener.
|
241
230
|
struct SpiListener{
|
242
|
-
uint32_t
|
231
|
+
uint32_t freq; // Frequency if hardware SPI. If bit bang: bits[0..7] = SCK pin, bits [8..15] = MOSI pin.
|
243
232
|
uint8_t select; // Select pin.
|
244
233
|
uint8_t settings; // Settings mask as given in request.
|
245
|
-
|
234
|
+
uint16_t length; // Read length as given in request.
|
246
235
|
uint8_t enabled; // 0 = disabled, 1 = hardware, 2 = bit bang.
|
247
236
|
};
|
248
237
|
SpiListener spiListeners[SPI_LISTENER_COUNT];
|
249
238
|
#endif
|
239
|
+
|
240
|
+
// I2C Bit Bang Interface
|
241
|
+
#if defined(DENKO_I2C_BB)
|
242
|
+
uint8_t i2c_bb_scl_pin;
|
243
|
+
uint8_t i2c_bb_sda_pin;
|
244
|
+
uint8_t i2c_bb_quarter_period = 1;
|
245
|
+
|
246
|
+
// Internal stuff
|
247
|
+
void i2c_bb_delay_quarter_period();
|
248
|
+
void i2c_bb_delay_half_period();
|
249
|
+
void i2c_bb_sda_high ();
|
250
|
+
void i2c_bb_sda_low ();
|
251
|
+
void i2c_bb_scl_high ();
|
252
|
+
void i2c_bb_scl_low ();
|
253
|
+
void i2c_bb_start ();
|
254
|
+
void i2c_bb_stop ();
|
255
|
+
uint8_t i2c_bb_read_bit ();
|
256
|
+
void i2c_bb_write_bit (uint8_t bit );
|
257
|
+
uint8_t i2c_bb_read_byte (bool back);
|
258
|
+
int i2c_bb_write_byte (uint8_t data);
|
259
|
+
void i2c_bb_init (uint8_t scl, uint8_t sda);
|
260
|
+
|
261
|
+
// Remote exposed interface
|
262
|
+
void i2c_bb_search ();
|
263
|
+
void i2c_bb_write ();
|
264
|
+
void i2c_bb_read ();
|
265
|
+
#endif
|
250
266
|
};
|
data/src/lib/DenkoCoreIO.cpp
CHANGED
@@ -4,62 +4,82 @@
|
|
4
4
|
// Set up a single pin for the desired type of input or output.
|
5
5
|
void Denko::setMode(byte p, byte m) {
|
6
6
|
//
|
7
|
-
// Use the lowest
|
8
|
-
//
|
7
|
+
// Use the lowest 4 bits of m to set different input/output modes.
|
8
|
+
// Also enables/disables peripherals for certain targets.
|
9
9
|
//
|
10
|
-
// OUTPUT MODES:
|
11
|
-
//
|
12
|
-
//
|
13
|
-
//
|
10
|
+
// OUTPUT MODES:
|
11
|
+
// 0000 = Digital Output
|
12
|
+
// 0010 = PWM Ouptut
|
13
|
+
// 0100 = DAC Output
|
14
|
+
// 0110 = Open Drain Output (Only ESP32 implements this, and we don't really use it)
|
15
|
+
// 1000 = Open Source Output (Nothing implements this yet)
|
14
16
|
//
|
15
17
|
// INPUT MODES
|
16
|
-
//
|
17
|
-
//
|
18
|
-
//
|
19
|
-
|
20
|
-
m = m & 0b00000111;
|
18
|
+
// 0001 = Input with no pull bias
|
19
|
+
// 0011 = Input with internal pulldown, if available.
|
20
|
+
// 0101 = Input with internal pullup, if available.
|
21
|
+
m = m & 0b00001111;
|
21
22
|
|
22
23
|
#if defined(ESP32)
|
23
|
-
// Free the LEDC channel if leaving PWM mode.
|
24
|
-
if (m != 0b010) releaseLEDC(p);
|
25
|
-
|
26
24
|
// Disable attached DAC if leaving DAC mode.
|
27
25
|
#if defined(SOC_DAC_SUPPORTED)
|
28
|
-
|
26
|
+
if (m != 0b0100) dacDisable(p);
|
29
27
|
#endif
|
28
|
+
|
29
|
+
// Attach or detach LEDC channel whether entering or leaving PWM mode.
|
30
|
+
if (m == 0b0010) {
|
31
|
+
// auxMsg[0..3] is frequency, [4..7] is resolution.
|
32
|
+
uint32_t freq = *reinterpret_cast<uint32_t *>(auxMsg);
|
33
|
+
uint8_t res = *reinterpret_cast<uint8_t *>(auxMsg + 4);
|
34
|
+
// Fallback to defaults.
|
35
|
+
if (freq == 0) freq = 1000;
|
36
|
+
if (res == 0) res = esp32AnalogWRes;
|
37
|
+
ledcAttach(p, freq, res);
|
38
|
+
return;
|
39
|
+
} else {
|
40
|
+
ledcDetach(p);
|
41
|
+
}
|
30
42
|
#endif
|
31
|
-
|
43
|
+
|
32
44
|
// On the SAMD21 and RA4M1, mode needs to be INPUT when using the DAC.
|
33
45
|
#if defined(__SAMD21G18A__) || defined(_RENESAS_RA_)
|
34
|
-
if (m ==
|
46
|
+
if (m == 0b0100){
|
35
47
|
pinMode(p, INPUT);
|
36
48
|
return;
|
37
49
|
}
|
38
50
|
#endif
|
39
|
-
|
40
|
-
// Handle
|
51
|
+
|
52
|
+
// Handle INPUT_* states on boards implementing them.
|
41
53
|
#ifdef INPUT_PULLDOWN
|
42
|
-
if (m ==
|
54
|
+
if (m == 0b0011) {
|
43
55
|
pinMode(p, INPUT_PULLDOWN);
|
44
56
|
return;
|
45
57
|
}
|
46
58
|
#endif
|
47
|
-
|
48
|
-
#ifdef
|
49
|
-
if (m ==
|
50
|
-
pinMode(p,
|
59
|
+
|
60
|
+
#ifdef INPUT_PULLUP
|
61
|
+
if (m == 0b0101) {
|
62
|
+
pinMode(p, INPUT_PULLUP);
|
51
63
|
return;
|
52
64
|
}
|
53
65
|
#endif
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
66
|
+
|
67
|
+
// Handle OUTPUT_* states on boards implementing them.
|
68
|
+
#ifdef OUTPUT_OPEN_DRAIN
|
69
|
+
if (m == 0b0110) {
|
70
|
+
pinMode(p, OUTPUT_OPEN_DRAIN);
|
71
|
+
return;
|
72
|
+
}
|
73
|
+
#endif
|
74
|
+
|
75
|
+
#ifdef OUTPUT_OPEN_SOURCE
|
76
|
+
if (m == 0b1000) {
|
77
|
+
pinMode(p, OUTPUT_OPEN_SOURCE);
|
58
78
|
return;
|
59
79
|
}
|
60
80
|
#endif
|
61
|
-
|
62
|
-
// Handle
|
81
|
+
|
82
|
+
// Handle standard INPUT and OUTPUT states.
|
63
83
|
// Allows INPUT_* to fallback to INPUT when not implemented.
|
64
84
|
if (bitRead(m, 0) == 0) {
|
65
85
|
pinMode(p, OUTPUT);
|
@@ -69,7 +89,7 @@ void Denko::setMode(byte p, byte m) {
|
|
69
89
|
|
70
90
|
// Write high to set pullup for AVRs that use this method.
|
71
91
|
#ifdef __AVR__
|
72
|
-
if (m ==
|
92
|
+
if (m == 0b0101) digitalWrite(p, HIGH);
|
73
93
|
#endif
|
74
94
|
}
|
75
95
|
|
@@ -89,9 +109,9 @@ void Denko::dWrite(byte p, byte v, boolean echo) {
|
|
89
109
|
#if defined(SOC_DAC_SUPPORTED)
|
90
110
|
dacDisable(p);
|
91
111
|
#endif
|
92
|
-
|
112
|
+
ledcDetach(p);
|
93
113
|
#endif
|
94
|
-
|
114
|
+
|
95
115
|
if (v == 0) {
|
96
116
|
digitalWrite(p, LOW);
|
97
117
|
}
|
@@ -113,13 +133,7 @@ byte Denko::dRead(byte p) {
|
|
113
133
|
// Write an analog output pin. 0 for LOW, up to 255 for HIGH @ 8-bit resolution.
|
114
134
|
void Denko::pwmWrite(byte p, int v, boolean echo) {
|
115
135
|
#ifdef ESP32
|
116
|
-
|
117
|
-
byte channel = ledcChannel(p);
|
118
|
-
|
119
|
-
// Reattach the pin in case dWrite detached it.
|
120
|
-
ledcAttachPin(p, channel);
|
121
|
-
|
122
|
-
ledcWrite(channel, v);
|
136
|
+
ledcWrite(p, v);
|
123
137
|
#else
|
124
138
|
analogWrite(p,v);
|
125
139
|
#endif
|
@@ -127,66 +141,9 @@ void Denko::pwmWrite(byte p, int v, boolean echo) {
|
|
127
141
|
if (echo) coreResponse(p, v);
|
128
142
|
}
|
129
143
|
|
130
|
-
//
|
131
|
-
// Manage ESP32 LEDC channels so we can do PWM write.
|
132
|
-
//
|
133
144
|
#ifdef ESP32
|
134
|
-
|
135
|
-
|
136
|
-
for (int i = LEDC_CHANNEL_COUNT -1; i > 0; i--){
|
137
|
-
if ((ledcPins[i][0] == 1) && (ledcPins[i][1] == p)){
|
138
|
-
return i;
|
139
|
-
}
|
140
|
-
}
|
141
|
-
|
142
|
-
// We didn't find a channel to reuse.
|
143
|
-
for (int i = LEDC_CHANNEL_COUNT -1; i > 0; i--){
|
144
|
-
// If the channel isn't initialized and it isn't marked as used, use it.
|
145
|
-
// should find some way to check if the channel itslef is being used
|
146
|
-
if ((ledcPins[i][0] == 0)) {
|
147
|
-
assignLEDC(i, p);
|
148
|
-
return i;
|
149
|
-
}
|
150
|
-
}
|
151
|
-
|
152
|
-
// Return a useless channel if none available.
|
153
|
-
return 255;
|
154
|
-
};
|
155
|
-
|
156
|
-
// Assign a LEDC channel to a pin and save it.
|
157
|
-
byte Denko::assignLEDC(byte channel, byte p){
|
158
|
-
// First 8 channels: up to 40Mhz @ 16-bits
|
159
|
-
// Last 8 channels: up to 500kHz @ 13-bits
|
160
|
-
// Just use similar settings to ATmega for now.
|
161
|
-
ledcSetup(channel, 1000, 8);
|
162
|
-
ledcAttachPin(p, channel);
|
163
|
-
|
164
|
-
// Save the pin and mark it as in use.
|
165
|
-
ledcPins[channel][0] = 1;
|
166
|
-
ledcPins[channel][1] = p;
|
167
|
-
return channel;
|
168
|
-
}
|
169
|
-
|
170
|
-
// Release a LEDC channel when done with it.
|
171
|
-
void Denko::releaseLEDC(byte p){
|
172
|
-
// Detach the pin from the channel.
|
173
|
-
ledcDetachPin(p);
|
174
|
-
|
175
|
-
// Mark any channel associated with the pin as unused.
|
176
|
-
for (int i = LEDC_CHANNEL_COUNT -1; i > 0; i--){
|
177
|
-
if (ledcPins[i][1] == p) ledcPins[i][0] = 0;
|
178
|
-
}
|
179
|
-
}
|
180
|
-
|
181
|
-
// Clear all the LEDC channels on reset.
|
182
|
-
void Denko::clearLedcChannels(){
|
183
|
-
for (int i = LEDC_CHANNEL_COUNT -1; i > 0; i--){
|
184
|
-
// Stop the channel if it was still enabled.
|
185
|
-
if (ledcPins[i][0] != 0) ledcDetachPin(ledcPins[i][1]);
|
186
|
-
|
187
|
-
// Mark the channel as unused.
|
188
|
-
ledcPins[i][0] = 0;
|
189
|
-
}
|
145
|
+
void Denko::ledcDetachAll() {
|
146
|
+
for(byte i=0; i++; i<256) ledcDetach(i);
|
190
147
|
}
|
191
148
|
#endif
|
192
149
|
|
@@ -197,7 +154,7 @@ void Denko::dacWrite(byte p, int v, boolean echo) {
|
|
197
154
|
#if defined(ESP32) && defined(SOC_DAC_SUPPORTED)
|
198
155
|
::dacWrite(p, v);
|
199
156
|
#endif
|
200
|
-
|
157
|
+
|
201
158
|
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(_RENESAS_RA_)
|
202
159
|
analogWrite(p, v);
|
203
160
|
#endif
|
@@ -284,7 +241,6 @@ void Denko::updateCoreListeners() {
|
|
284
241
|
// Handle a single analog listener when it needs to read.
|
285
242
|
void Denko::analogListenerUpdate(byte i){
|
286
243
|
int rval = analogRead(listeners[i][1]);
|
287
|
-
analogListenCallback(listeners[i][1], rval);
|
288
244
|
coreResponse(listeners[i][1], rval);
|
289
245
|
}
|
290
246
|
|
@@ -295,7 +251,6 @@ void Denko::digitalListenerUpdate(byte i){
|
|
295
251
|
if (rval != bitRead(listeners[i][0], 5)){
|
296
252
|
// State for digital listeners is stored in byte 5 of the listener itself.
|
297
253
|
bitWrite(listeners[i][0], 5, rval);
|
298
|
-
digitalListenCallback(listeners[i][1], rval);
|
299
254
|
coreResponse(listeners[i][1], rval);
|
300
255
|
}
|
301
256
|
}
|
data/src/lib/DenkoDefines.h
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
// #define DENKO_EEPROM
|
12
12
|
// #define DENKO_ONE_WIRE
|
13
13
|
// #define DENKO_TONE
|
14
|
+
// #define DENKO_I2C_BB
|
14
15
|
// #define DENKO_SPI_BB
|
15
16
|
// #define DENKO_I2C
|
16
17
|
// #define DENKO_SPI
|
@@ -26,29 +27,15 @@
|
|
26
27
|
#endif
|
27
28
|
|
28
29
|
// Define number of pins to set up listener storage.
|
29
|
-
#if defined(
|
30
|
-
#define PIN_COUNT
|
31
|
-
#elif defined(__SAM3X8E__)
|
32
|
-
#define PIN_COUNT 72
|
33
|
-
#elif defined(ESP8266)
|
34
|
-
#define PIN_COUNT 18
|
35
|
-
#elif defined(ESP32)
|
36
|
-
#define PIN_COUNT 40
|
37
|
-
#elif defined(ARDUINO_ARCH_RP2040)
|
38
|
-
#define PIN_COUNT 26
|
30
|
+
#if defined(ESP32)
|
31
|
+
#define PIN_COUNT SOC_GPIO_PIN_COUNT
|
39
32
|
#else
|
40
|
-
#define PIN_COUNT
|
33
|
+
#define PIN_COUNT NUM_DIGITAL_PINS
|
41
34
|
#endif
|
42
35
|
|
43
36
|
// Figure out how many LEDC channels are available on ESP32 boards.
|
44
37
|
#ifdef ESP32
|
45
|
-
#
|
46
|
-
#define LEDC_CHANNEL_COUNT 16
|
47
|
-
#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
48
|
-
#define LEDC_CHANNEL_COUNT 8
|
49
|
-
#elif CONFIG_IDF_TARGET_ESP32C3
|
50
|
-
#define LEDC_CHANNEL_COUNT 6
|
51
|
-
#endif
|
38
|
+
#define LEDC_CHANNEL_COUNT SOC_LEDC_CHANNEL_NUM
|
52
39
|
#endif
|
53
40
|
|
54
41
|
// Filter for boards that can set their analog write resolution.
|
@@ -70,14 +57,10 @@
|
|
70
57
|
#elif defined(PIN_SERIAL_1_TX)
|
71
58
|
#define DENKO_UARTS 1
|
72
59
|
#endif
|
73
|
-
|
60
|
+
|
74
61
|
// ESP32 has either 1 or 2 extra UARTS enabled, depending on chip and board.
|
75
62
|
#elif defined(ESP32)
|
76
|
-
#
|
77
|
-
#define DENKO_UARTS 2
|
78
|
-
#elif SOC_UART_NUM == 2
|
79
|
-
#define DENKO_UARTS 1
|
80
|
-
#endif
|
63
|
+
#define DENKO_UARTS (SOC_UART_NUM - 1)
|
81
64
|
|
82
65
|
// ESP8266 has a single open transmit-only UART.
|
83
66
|
#elif defined(ESP8266) && defined(SERIAL_PORT_HARDWARE_OPEN)
|
@@ -107,24 +90,20 @@
|
|
107
90
|
#include <SoftwareSerial.h>
|
108
91
|
#endif
|
109
92
|
|
110
|
-
//
|
111
|
-
#if
|
93
|
+
// 32 + 16 bytes aux message for ATmega168. 512 + 16 bytes for all others.
|
94
|
+
#if defined(__AVR_ATmega168__)
|
112
95
|
#define AUX_SIZE 48
|
113
|
-
// If using IR_OUT or LED_ARRAY, and not on the ATmega168, 768 + 16.
|
114
|
-
#elif (defined(DENKO_IR_OUT) || defined(DENKO_LED_ARRAY)) && !defined(__AVR_ATmega168__)
|
115
|
-
#define AUX_SIZE 784
|
116
|
-
// Default aux message size to 256 + 16 bytes.
|
117
96
|
#else
|
118
|
-
#define AUX_SIZE
|
97
|
+
#define AUX_SIZE 528
|
119
98
|
#endif
|
120
99
|
|
121
100
|
// Define 'DENKO_SERIAL_IF' as the serial interface to use.
|
122
101
|
// Uses SerialUSB (left port), which is native USB, on Arduino Due & Zero, or Serial otherwise.
|
123
102
|
// On many boards, eg. Arduino Leonardo, RP2040, ESP32-S3, Serial is native USB regardless.
|
124
103
|
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
|
125
|
-
#define DENKO_SERIAL_IF
|
104
|
+
#define DENKO_SERIAL_IF SERIAL_PORT_USBVIRTUAL
|
126
105
|
#define DENKO_USB_CDC
|
127
|
-
//
|
106
|
+
// "Serial" is UART (right port) on Due and Zero, but may be native USB on boards with one port.
|
128
107
|
// #define DENKO_SERIAL_IF Serial
|
129
108
|
#else
|
130
109
|
#define DENKO_SERIAL_IF Serial
|
@@ -135,30 +114,37 @@
|
|
135
114
|
//
|
136
115
|
// These are 256/64 regardless of whether native USB CDC or UART bridge.
|
137
116
|
#if defined(ARDUINO_ARCH_RP2040) || defined(ESP8266) || defined(__SAM3X8E__)
|
138
|
-
#define DENKO_SERIAL_BUFFER_SIZE
|
117
|
+
#define DENKO_SERIAL_BUFFER_SIZE 248
|
139
118
|
#define DENKO_RX_ACK_INTERVAL 64
|
119
|
+
|
140
120
|
// ESP32 defaults to 256 buffer. Stay one under.
|
141
121
|
#elif defined(ESP32)
|
142
|
-
#define DENKO_SERIAL_BUFFER_SIZE
|
143
|
-
|
144
|
-
|
145
|
-
#
|
146
|
-
|
147
|
-
|
122
|
+
#define DENKO_SERIAL_BUFFER_SIZE 248
|
123
|
+
// H2 and C6 unreliable with CDC. Use UART bridge. Still unreliable ACK before buffer full, like S2.
|
124
|
+
#if defined(CONFIG_IDF_TARGET_ESP32H2) || defined(CONFIG_IDF_TARGET_ESP32C6)
|
125
|
+
#define DENKO_RX_ACK_INTERVAL 248
|
126
|
+
#else
|
127
|
+
#ifdef ARDUINO_USB_CDC_ON_BOOT
|
128
|
+
// S2 unreliable with acknowledgement before buffer is full.
|
129
|
+
#ifdef CONFIG_IDF_TARGET_ESP32S2
|
130
|
+
#define DENKO_RX_ACK_INTERVAL 248
|
131
|
+
// S3 and C3 are fine acknowledging at half buffer filled.
|
132
|
+
#else
|
133
|
+
#define DENKO_RX_ACK_INTERVAL 128
|
134
|
+
#endif
|
135
|
+
// Fall back to 64 if using a UART bridge.
|
148
136
|
#else
|
149
|
-
|
137
|
+
#define DENKO_RX_ACK_INTERVAL 64
|
150
138
|
#endif
|
151
|
-
// Default to 64 if using a UART bridge.
|
152
|
-
#else
|
153
|
-
#define DENKO_RX_ACK_INTERVAL 64
|
154
139
|
#endif
|
140
|
+
|
155
141
|
// RA4M1 has a 512 Serial buffer.
|
156
142
|
#elif defined(_RENESAS_RA_)
|
157
|
-
#define DENKO_SERIAL_BUFFER_SIZE
|
143
|
+
#define DENKO_SERIAL_BUFFER_SIZE 504
|
158
144
|
#define DENKO_RX_ACK_INTERVAL 64
|
159
145
|
// SAMD21 is 256/128 in native USB mode ONLY. Must use defaults on programming port to avoid data loss.
|
160
146
|
#elif defined(__SAMD21G18A__) && defined(DENKO_USB_CDC)
|
161
|
-
#define DENKO_SERIAL_BUFFER_SIZE
|
147
|
+
#define DENKO_SERIAL_BUFFER_SIZE 248
|
162
148
|
#define DENKO_RX_ACK_INTERVAL 128
|
163
149
|
// 32u4 is odd. Size is 63 instead of 64. Interval must be 31. 32 doesn't work at all. Off by 1 errors?
|
164
150
|
#elif defined(__AVR_ATmega32U4__)
|
data/src/lib/DenkoI2C.cpp
CHANGED
@@ -37,6 +37,14 @@ void Denko::i2cSetSpeed(uint8_t code) {
|
|
37
37
|
default: Wire.setClock(100000); break;
|
38
38
|
}
|
39
39
|
i2cSpeed = code;
|
40
|
+
|
41
|
+
// ESP32-H2 doesn't safely fallback if speed > 400kHz is chosen.
|
42
|
+
#ifdef CONFIG_IDF_TARGET_ESP32H2
|
43
|
+
if (i2cSpeed > 1) {
|
44
|
+
i2cSpeed = 1;
|
45
|
+
Wire.setClock(400000);
|
46
|
+
}
|
47
|
+
#endif
|
40
48
|
}
|
41
49
|
|
42
50
|
// CMD = 33
|
@@ -46,7 +54,7 @@ void Denko::i2cSearch() {
|
|
46
54
|
uint8_t addr;
|
47
55
|
if (!i2cStarted) i2cBegin();
|
48
56
|
i2cSetSpeed(0);
|
49
|
-
stream->print(
|
57
|
+
stream->print("I2C0");
|
50
58
|
|
51
59
|
// Only addresses from 0x08 to 0x77 are usable (8 to 127).
|
52
60
|
for (addr = 0x08; addr < 0x78; addr++) {
|
@@ -59,88 +67,89 @@ void Denko::i2cSearch() {
|
|
59
67
|
stream->print('\n');
|
60
68
|
}
|
61
69
|
|
62
|
-
// CMD = 34
|
63
|
-
// Write to an I2C device over a harwdare I2C interface.
|
64
|
-
//
|
65
|
-
// pin
|
66
|
-
// bits 0..6 = Device address
|
67
|
-
// bit 7 = Send stop condition. 0 = no, repeated start. 1 = yes.
|
68
70
|
//
|
69
|
-
//
|
70
|
-
//
|
71
|
-
//
|
72
|
-
// auxMsg[0]
|
73
|
-
//
|
74
|
-
//
|
71
|
+
// cmd = 34
|
72
|
+
// pin = <reseverd>
|
73
|
+
// val = <reserved>
|
74
|
+
// auxMsg[0] = I2C settings
|
75
|
+
// Bits[7..2] = <reserved>
|
76
|
+
// Bits[1..0] = Bitmask for I2C speed
|
77
|
+
// auxMsg[1] = Device address in bits [6..0] + repeated start in bit 7
|
78
|
+
// auxMsg[2] = Data length to write
|
79
|
+
// auxMsg[3]+ = Data
|
75
80
|
//
|
76
81
|
void Denko::i2cWrite() {
|
77
82
|
// Get parameters from message.
|
78
|
-
uint8_t
|
79
|
-
uint8_t
|
83
|
+
uint8_t speedMask = auxMsg[0] & 0b00000011;
|
84
|
+
uint8_t address = auxMsg[1] & 0b01111111;
|
85
|
+
uint8_t sendStop = auxMsg[1] >> 7;
|
86
|
+
uint8_t dataLength = auxMsg[2];
|
80
87
|
|
81
|
-
// Limit to
|
88
|
+
// Limit to board's I2C buffer size.
|
82
89
|
if (dataLength > DENKO_I2C_BUFFER_SIZE) dataLength = DENKO_I2C_BUFFER_SIZE;
|
83
90
|
|
91
|
+
// Start and set speed.
|
84
92
|
if (!i2cStarted) i2cBegin();
|
85
|
-
if (i2cSpeed !=
|
93
|
+
if (i2cSpeed != speedMask) i2cSetSpeed(speedMask);
|
86
94
|
|
87
95
|
Wire.beginTransmission(address);
|
88
|
-
Wire.write(&auxMsg[
|
96
|
+
Wire.write(&auxMsg[3], dataLength);
|
89
97
|
|
90
98
|
// No repeated start on ESP32.
|
91
99
|
#if defined(ESP32)
|
92
100
|
Wire.endTransmission();
|
93
101
|
#else
|
94
|
-
|
102
|
+
|
95
103
|
Wire.endTransmission(sendStop);
|
96
104
|
#endif
|
97
105
|
}
|
98
106
|
|
99
|
-
// CMD = 35
|
100
|
-
// Read from an I2C device over a harwdare I2C interface.
|
101
107
|
//
|
102
|
-
//
|
103
|
-
// bits 0..6 = Device address
|
104
|
-
// bit 7 = Send stop condition. 0 = no, repeated start. 1 = yes.
|
105
|
-
//
|
106
|
-
// val
|
107
|
-
// bits 0..4 = Data length. NOTE: maximum of 32. Anything more is ignored.
|
108
|
-
//
|
109
|
-
// auxMsg[0] = I2C settings. Just speed selection for now.
|
108
|
+
// Read from an I2C device over a harwdare I2C interface.
|
110
109
|
//
|
111
|
-
//
|
112
|
-
//
|
110
|
+
// cmd = 35
|
111
|
+
// pin = <reseverd>
|
112
|
+
// val = <reserved>
|
113
|
+
// auxMsg[0] = I2C settings
|
114
|
+
// Bits[7..2] = <reserved>
|
115
|
+
// Bits[1..0] = Bitmask for I2C speed
|
116
|
+
// auxMsg[1] = Device address in bits [6..0] + repeated start in bit 7
|
117
|
+
// auxMsg[2] = Data length to read
|
118
|
+
// auxMsg[3] = Register address length
|
119
|
+
// auxMsg[4]+ = Register address bytes if length > 0
|
113
120
|
//
|
114
121
|
void Denko::i2cRead() {
|
115
122
|
// Get parameters from message.
|
116
|
-
uint8_t
|
117
|
-
uint8_t
|
118
|
-
uint8_t
|
123
|
+
uint8_t speedMask = auxMsg[0] & 0b00000011;
|
124
|
+
uint8_t address = auxMsg[1] & 0b01111111;
|
125
|
+
uint8_t sendStop = auxMsg[1] >> 7;
|
126
|
+
uint8_t dataLength = auxMsg[2];
|
119
127
|
|
120
|
-
// Limit to
|
128
|
+
// Limit to board's I2C buffer size.
|
121
129
|
if (dataLength > DENKO_I2C_BUFFER_SIZE) dataLength = DENKO_I2C_BUFFER_SIZE;
|
122
130
|
|
131
|
+
// Start and set speed.
|
123
132
|
if (!i2cStarted) i2cBegin();
|
124
|
-
if (i2cSpeed !=
|
125
|
-
|
133
|
+
if (i2cSpeed != speedMask) i2cSetSpeed(speedMask);
|
134
|
+
|
126
135
|
// Optionally write up to a 4 byte register address before reading.
|
127
|
-
if ((auxMsg[
|
136
|
+
if ((auxMsg[3] > 0) && (auxMsg[3] < 5)) {
|
128
137
|
Wire.beginTransmission(address);
|
129
|
-
Wire.write(&auxMsg[
|
138
|
+
Wire.write(&auxMsg[4], auxMsg[3]);
|
130
139
|
Wire.endTransmission(sendStop);
|
131
140
|
}
|
132
|
-
|
141
|
+
|
133
142
|
// ESP32 crashes if requestFrom gets the 3rd arg.
|
134
|
-
#if defined(ESP32)
|
143
|
+
#if defined(ESP32)
|
135
144
|
Wire.requestFrom(address, dataLength);
|
136
145
|
#else
|
137
146
|
Wire.requestFrom(address, dataLength, sendStop);
|
138
147
|
#endif
|
139
|
-
|
140
|
-
// Send data as if coming from
|
148
|
+
|
149
|
+
// Send data as if coming from a pin called "I2C0". Prefix with device adddress.
|
141
150
|
// Fail silently if no bytes read / invalid device address.
|
142
|
-
stream->print(
|
143
|
-
stream->print(address); stream->print('-');
|
151
|
+
stream->print("I2C0:");
|
152
|
+
stream->print(address); stream->print('-');
|
144
153
|
while(Wire.available()){
|
145
154
|
stream->print(Wire.read());
|
146
155
|
stream->print(',');
|