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
@@ -0,0 +1,238 @@
|
|
1
|
+
//
|
2
|
+
// Adds I2C bitbang functionality to the Denko class if DENKO_I2C_BB defined in DenkoDefines.h.
|
3
|
+
//
|
4
|
+
#include "Denko.h"
|
5
|
+
|
6
|
+
#ifdef DENKO_I2C_BB
|
7
|
+
|
8
|
+
void Denko::i2c_bb_delay_quarter_period() {
|
9
|
+
#ifndef __AVR__
|
10
|
+
microDelay(i2c_bb_quarter_period);
|
11
|
+
#endif
|
12
|
+
}
|
13
|
+
|
14
|
+
// Delays for timing. Not sure how necessary this is.
|
15
|
+
void Denko::i2c_bb_delay_half_period() {
|
16
|
+
#ifndef __AVR__
|
17
|
+
microDelay(i2c_bb_quarter_period*2);
|
18
|
+
#endif
|
19
|
+
}
|
20
|
+
|
21
|
+
// Can't use output mode for SDA. Toggle between input for HIGH, output for LOW.
|
22
|
+
void Denko::i2c_bb_sda_high() { pinMode(i2c_bb_sda_pin, INPUT); }
|
23
|
+
void Denko::i2c_bb_sda_low() { pinMode(i2c_bb_sda_pin, OUTPUT); }
|
24
|
+
|
25
|
+
// Matching SCL functions for readability.
|
26
|
+
void Denko::i2c_bb_scl_high() { digitalWrite(i2c_bb_scl_pin, HIGH); }
|
27
|
+
void Denko::i2c_bb_scl_low() { digitalWrite(i2c_bb_scl_pin, LOW); }
|
28
|
+
|
29
|
+
// Start condition is SDA then SCL going low, from both high.
|
30
|
+
void Denko::i2c_bb_start() {
|
31
|
+
i2c_bb_delay_quarter_period();
|
32
|
+
i2c_bb_sda_low();
|
33
|
+
i2c_bb_delay_quarter_period();
|
34
|
+
i2c_bb_scl_low();
|
35
|
+
}
|
36
|
+
|
37
|
+
// Stop condition is SDA going high, while SCL is also high.
|
38
|
+
void Denko::i2c_bb_stop() {
|
39
|
+
i2c_bb_delay_quarter_period();
|
40
|
+
i2c_bb_sda_low();
|
41
|
+
i2c_bb_delay_quarter_period();
|
42
|
+
i2c_bb_scl_high();
|
43
|
+
i2c_bb_delay_quarter_period();
|
44
|
+
i2c_bb_sda_high();
|
45
|
+
}
|
46
|
+
|
47
|
+
uint8_t Denko::i2c_bb_read_bit() {
|
48
|
+
uint8_t bit;
|
49
|
+
|
50
|
+
// Ensure SDA high before we pull SCL high.
|
51
|
+
// i2c_bb_delay_quarter_period();
|
52
|
+
i2c_bb_sda_high();
|
53
|
+
i2c_bb_delay_quarter_period();
|
54
|
+
|
55
|
+
// Pull SCL high.
|
56
|
+
i2c_bb_scl_high();
|
57
|
+
|
58
|
+
// Wait 1/4 period and sample SDA.
|
59
|
+
i2c_bb_delay_quarter_period();
|
60
|
+
bit = digitalRead(i2c_bb_sda_pin);
|
61
|
+
|
62
|
+
// Leave SCL low.
|
63
|
+
// i2c_bb_delay_quarter_period();
|
64
|
+
i2c_bb_scl_low();
|
65
|
+
|
66
|
+
return bit;
|
67
|
+
}
|
68
|
+
|
69
|
+
void Denko::i2c_bb_write_bit(uint8_t bit) {
|
70
|
+
// i2c_bb_delay_quarter_period();
|
71
|
+
// Set SDA while SCL is low.
|
72
|
+
if (bit == 0) {
|
73
|
+
i2c_bb_sda_low();
|
74
|
+
} else {
|
75
|
+
i2c_bb_sda_high();
|
76
|
+
}
|
77
|
+
// i2c_bb_delay_quarter_period();
|
78
|
+
|
79
|
+
// Pull SCL high, wait (should be half cycle), then leave it low.
|
80
|
+
i2c_bb_scl_high();
|
81
|
+
i2c_bb_delay_quarter_period();
|
82
|
+
// i2c_bb_delay_half_period();
|
83
|
+
i2c_bb_scl_low();
|
84
|
+
}
|
85
|
+
|
86
|
+
uint8_t Denko::i2c_bb_read_byte(bool ack) {
|
87
|
+
uint8_t b;
|
88
|
+
|
89
|
+
// Receive MSB first.
|
90
|
+
for (int i=7; i>=0; i--) bitWrite(b, i, i2c_bb_read_bit());
|
91
|
+
|
92
|
+
// Send ACK or NACK and return byte.
|
93
|
+
if (ack) {
|
94
|
+
i2c_bb_write_bit(0);
|
95
|
+
} else {
|
96
|
+
i2c_bb_write_bit(1);
|
97
|
+
}
|
98
|
+
return b;
|
99
|
+
}
|
100
|
+
|
101
|
+
int Denko::i2c_bb_write_byte(uint8_t data) {
|
102
|
+
// Send MSB first.
|
103
|
+
for (int i=7; i>=0; i--) i2c_bb_write_bit(bitRead(data, i));
|
104
|
+
|
105
|
+
// Return -1 for NACK, 0 for ACK.
|
106
|
+
return (i2c_bb_read_bit() == 0) ? 0 : -1;
|
107
|
+
}
|
108
|
+
|
109
|
+
void Denko::i2c_bb_init(uint8_t scl, uint8_t sda) {
|
110
|
+
// Set pins in state variables, to avoid passing them around.
|
111
|
+
i2c_bb_scl_pin = scl;
|
112
|
+
i2c_bb_sda_pin = sda;
|
113
|
+
|
114
|
+
// Ensure SCL is output, and reset both pins to high.
|
115
|
+
pinMode(i2c_bb_scl_pin, OUTPUT);
|
116
|
+
i2c_bb_stop();
|
117
|
+
}
|
118
|
+
|
119
|
+
//
|
120
|
+
// Search for I2C devices on a bit banged I2C interface.
|
121
|
+
//
|
122
|
+
// cmd = 31
|
123
|
+
// pin = SCL pin
|
124
|
+
// val = SDA pin
|
125
|
+
//
|
126
|
+
// Ask each address for a single byte to see if it exists on the bus.
|
127
|
+
//
|
128
|
+
void Denko::i2c_bb_search() {
|
129
|
+
int ack;
|
130
|
+
uint8_t addr;
|
131
|
+
|
132
|
+
// Switch our "bus" to the given pins.
|
133
|
+
i2c_bb_init((uint8_t)pin, (uint8_t)val);
|
134
|
+
|
135
|
+
// Start sending results.
|
136
|
+
stream->print(i2c_bb_sda_pin);
|
137
|
+
|
138
|
+
// If SDA is low here, nothing connected to bus. Return no results.
|
139
|
+
if (digitalRead(i2c_bb_sda_pin) == 0) {
|
140
|
+
stream->print('\n');
|
141
|
+
return;
|
142
|
+
}
|
143
|
+
|
144
|
+
// Only addresses from 0x08 to 0x77 are usable (8 to 127).
|
145
|
+
for (addr = 0x08; addr < 0x78; addr++) {
|
146
|
+
i2c_bb_start();
|
147
|
+
ack = i2c_bb_write_byte((addr << 1) & 0b11111110);
|
148
|
+
if (ack == 0) {
|
149
|
+
stream->print(':');
|
150
|
+
stream->print(addr);
|
151
|
+
}
|
152
|
+
i2c_bb_stop();
|
153
|
+
}
|
154
|
+
stream->print('\n');
|
155
|
+
}
|
156
|
+
|
157
|
+
//
|
158
|
+
// Write to an I2C device over a bit banged I2C interface.
|
159
|
+
//
|
160
|
+
// cmd = 31
|
161
|
+
// pin = SCL pin
|
162
|
+
// val = SDA pin
|
163
|
+
// auxMsg[0] = I2C settings
|
164
|
+
// Bits[7..0] = <reserved>
|
165
|
+
// auxMsg[1] = Device address in bits [6..0] + repeated start in bit 7
|
166
|
+
// auxMsg[2] = Data length to write
|
167
|
+
// auxMsg[3]+ = Data
|
168
|
+
//
|
169
|
+
void Denko::i2c_bb_write() {
|
170
|
+
// Get parameters from message.
|
171
|
+
uint8_t address = auxMsg[1] & 0b01111111;
|
172
|
+
uint8_t writeAddress = (address << 1) & 0b11111110;
|
173
|
+
uint8_t sendStop = auxMsg[1] >> 7;
|
174
|
+
uint8_t dataLength = auxMsg[2];
|
175
|
+
|
176
|
+
// Switch our "bus" to the given pins.
|
177
|
+
i2c_bb_init((uint8_t)pin, (uint8_t)val);
|
178
|
+
|
179
|
+
i2c_bb_start();
|
180
|
+
i2c_bb_write_byte(writeAddress);
|
181
|
+
for (int i=0; i<dataLength; i++) i2c_bb_write_byte(auxMsg[3+i]);
|
182
|
+
i2c_bb_stop();
|
183
|
+
}
|
184
|
+
|
185
|
+
//
|
186
|
+
// Read from an I2C device over a bit banged I2C interface.
|
187
|
+
//
|
188
|
+
// cmd = 32
|
189
|
+
// pin = SCL pin
|
190
|
+
// val = SDA pin
|
191
|
+
// auxMsg[0] = I2C settings
|
192
|
+
// Bits[7..0] = <reserved>
|
193
|
+
// auxMsg[1] = Device address in bits [6..0] + repeated start in bit 7
|
194
|
+
// auxMsg[2] = Data length to read
|
195
|
+
// auxMsg[3] = Register address length
|
196
|
+
// auxMsg[4]+ = Register address bytes if length > 0
|
197
|
+
//
|
198
|
+
void Denko::i2c_bb_read() {
|
199
|
+
// Get parameters from message.
|
200
|
+
uint8_t address = auxMsg[1] & 0b01111111;
|
201
|
+
uint8_t writeAddress = (address << 1) & 0b11111110;
|
202
|
+
uint8_t readAddress = (address << 1) | 0b00000001;
|
203
|
+
uint8_t sendStop = auxMsg[1] >> 7;
|
204
|
+
uint8_t dataLength = auxMsg[2];
|
205
|
+
|
206
|
+
// Switch our "bus" to the given pins.
|
207
|
+
i2c_bb_init((uint8_t)pin, (uint8_t)val);
|
208
|
+
|
209
|
+
// Optionally write up to a 4 byte register address before reading.
|
210
|
+
if ((auxMsg[3] > 0) && (auxMsg[3] < 5)) {
|
211
|
+
i2c_bb_start();
|
212
|
+
i2c_bb_write_byte(writeAddress);
|
213
|
+
for(int i=0; i<auxMsg[3]; i++) i2c_bb_write_byte(auxMsg[4+i]);
|
214
|
+
i2c_bb_stop();
|
215
|
+
}
|
216
|
+
|
217
|
+
// If no ACK from device, return without sending any data.
|
218
|
+
i2c_bb_start();
|
219
|
+
int ack = i2c_bb_write_byte(readAddress);
|
220
|
+
if (ack < 0) return;
|
221
|
+
|
222
|
+
// Start streaming data as if coming from the SDA pin.
|
223
|
+
stream->print(i2c_bb_sda_pin); stream->print(':');
|
224
|
+
stream->print(address); stream->print('-');
|
225
|
+
|
226
|
+
// Read and ACK for all but the last byte.
|
227
|
+
for(int i=0; i<dataLength-1; i++){
|
228
|
+
stream->print(i2c_bb_read_byte(true));
|
229
|
+
stream->print(',');
|
230
|
+
}
|
231
|
+
stream->print(i2c_bb_read_byte(false));
|
232
|
+
|
233
|
+
// Finish stream and send stop condition.
|
234
|
+
stream->print(',');
|
235
|
+
stream->print('\n');
|
236
|
+
i2c_bb_stop();
|
237
|
+
}
|
238
|
+
#endif
|
data/src/lib/DenkoIROut.cpp
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
// This file adds to the Denko class only if DENKO_IR_OUT is defined in Denko.h.
|
3
3
|
//
|
4
4
|
#include "Denko.h"
|
5
|
-
#if defined(DENKO_IR_OUT)
|
5
|
+
#if defined(DENKO_IR_OUT)
|
6
6
|
|
7
7
|
// Save memory by disabling receiver.
|
8
8
|
#undef RAW_BUFFER_LENGTH
|
@@ -20,14 +20,19 @@
|
|
20
20
|
// CMD = 16
|
21
21
|
// Send an infrared signal.
|
22
22
|
void Denko::irSend(){
|
23
|
-
//
|
24
|
-
uint16_t *pulseArray = reinterpret_cast<uint16_t *>(auxMsg + 1);
|
25
|
-
|
26
|
-
// Dynamically set the sending pin. Needs to be PWM capable.
|
23
|
+
// Change send pin per call. Must be PWM capable.
|
27
24
|
IrSender.setSendPin(pin);
|
28
25
|
|
29
|
-
// auxMsg
|
26
|
+
// Byte 2+ of auxMsg is already little-endian uint16 pulses.
|
27
|
+
//
|
28
|
+
// WARNING: This offset must always be an even number, for aligned
|
29
|
+
// memory access on the ESP8266, or it breaks.
|
30
|
+
uint16_t *pulseArray = reinterpret_cast<uint16_t *>(auxMsg + 2);
|
31
|
+
|
32
|
+
// auxMsg[0..1] contains number of pulses, also uint16.
|
33
|
+
uint16_t length = *reinterpret_cast<uint16_t *>(auxMsg);
|
34
|
+
|
30
35
|
// Val contains frequency
|
31
|
-
IrSender.sendRaw(pulseArray,
|
36
|
+
IrSender.sendRaw(pulseArray, length, val);
|
32
37
|
}
|
33
38
|
#endif
|
data/src/lib/DenkoLEDArray.cpp
CHANGED
@@ -10,6 +10,10 @@
|
|
10
10
|
//
|
11
11
|
#ifdef DENKO_LED_WS2812
|
12
12
|
#include <Adafruit_NeoPixel.h>
|
13
|
+
|
14
|
+
#ifdef ARDUINO_ARCH_RP2040
|
15
|
+
Adafruit_NeoPixel ledArray;
|
16
|
+
#endif
|
13
17
|
#endif
|
14
18
|
|
15
19
|
//
|
@@ -18,24 +22,36 @@
|
|
18
22
|
//
|
19
23
|
// pin = Microcontroller pin connected to Data In pin of the LED array.
|
20
24
|
// val = Number of raw pixel data bytes to expect. Max 9999.
|
21
|
-
// auxMsg[0..3] =
|
22
|
-
// auxMsg[4
|
25
|
+
// auxMsg[0..3] = ALWAYS ZERO or ESP32 can crash if pixel bytes have certain low values. Very confusing.
|
26
|
+
// auxMsg[4..7] = Reserved for future settings.
|
27
|
+
// auxMsg[8+] = Raw pixel data, already in correct byte order (GRB, RGB, etc.).
|
28
|
+
//
|
29
|
+
#define WS2812_DATA_OFFSET 8
|
23
30
|
//
|
24
31
|
void Denko::showLEDArray() {
|
25
|
-
//
|
26
|
-
|
27
|
-
|
32
|
+
// Pre-init instance (one PIO) on Pi Pico.
|
33
|
+
#ifdef ARDUINO_ARCH_RP2040
|
34
|
+
ledArray.setPin(pin);
|
35
|
+
ledArray.updateLength(val);
|
36
|
+
memcpy(ledArray.getPixels(), &auxMsg[WS2812_DATA_OFFSET], val);
|
37
|
+
ledArray.show();
|
28
38
|
|
29
|
-
//
|
30
|
-
|
39
|
+
// Reinit and memcpy for everything else.
|
40
|
+
#else
|
41
|
+
// Setup a new LED array object.
|
42
|
+
Adafruit_NeoPixel ledArray(val, pin, NEO_GRB + NEO_KHZ800);
|
43
|
+
ledArray.begin();
|
31
44
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
45
|
+
// Copy LED data into the pixel buffer.
|
46
|
+
memcpy(ledArray.getPixels(), &auxMsg[WS2812_DATA_OFFSET], val);
|
47
|
+
|
48
|
+
// Let the line stay low for about 6 bytes worth of data.
|
49
|
+
// Prevents first pixel green being stuck on.
|
50
|
+
microDelay(60);
|
36
51
|
|
37
|
-
|
38
|
-
|
52
|
+
// Write the pixel buffer to the array.
|
53
|
+
ledArray.show();
|
54
|
+
#endif
|
39
55
|
|
40
56
|
// Tell the computer to resume sending data.
|
41
57
|
sendReady();
|
data/src/lib/DenkoSPI.cpp
CHANGED
@@ -45,7 +45,7 @@ void Denko::spiBegin(byte settings, uint32_t clockRate) {
|
|
45
45
|
|
46
46
|
// SPI mode is the lowest 2 bits of settings.
|
47
47
|
byte mode = settings & 0B00000011;
|
48
|
-
|
48
|
+
|
49
49
|
// Bit 7 of settings controls bit order. 0 = LSBFIRST, 1 = MSBFIRST.
|
50
50
|
if (bitRead(settings, 7) == 0) {
|
51
51
|
// True integer value for these macros vary by platform, so just do this.
|
@@ -84,46 +84,51 @@ void Denko::spiEnd() {
|
|
84
84
|
// val = empty
|
85
85
|
// auxMsg[0] = SPI settings
|
86
86
|
// Bit 0..1 = SPI mode
|
87
|
-
// Bit 2..
|
87
|
+
// Bit 2..5 = ** unused **
|
88
|
+
// Bit 6 = Whether to toggle select pin (1), or not (0)
|
88
89
|
// Bit 7 = Read and write bit order: MSBFIRST(1) or LSBFIRST(0)
|
89
90
|
// auxMsg[1] = read length (number of bytes)
|
90
91
|
// auxMsg[2] = write length (number of bytes)
|
91
92
|
// auxMsg[3-6] = clock frequency (uint32_t as 4 bytes)
|
92
93
|
// auxMsg[7+] = data (bytes) (write only)
|
93
94
|
//
|
94
|
-
void Denko::spiTransfer(uint32_t clockRate, uint8_t select, uint8_t settings,
|
95
|
+
void Denko::spiTransfer(uint32_t clockRate, uint8_t select, uint8_t settings, uint16_t rLength, uint16_t wLength, byte *data) {
|
95
96
|
spiBegin(settings, clockRate);
|
96
97
|
|
97
|
-
//
|
98
|
+
// Pull select low.
|
99
|
+
if (bitRead(settings, 6) == 1) {
|
100
|
+
pinMode(select, OUTPUT);
|
101
|
+
digitalWrite(select, LOW);
|
102
|
+
}
|
103
|
+
|
104
|
+
// Go one byte at a time if reading bytes out.
|
98
105
|
if (rLength > 0) {
|
106
|
+
// Stream read bytes as if coming from select pin.
|
99
107
|
stream->print(select);
|
100
108
|
stream->print(':');
|
101
|
-
}
|
102
109
|
|
103
|
-
|
104
|
-
|
105
|
-
pinMode(select, OUTPUT);
|
106
|
-
digitalWrite(select, LOW);
|
107
|
-
}
|
108
|
-
|
109
|
-
for (byte i = 0; (i < rLength || i < wLength); i++) {
|
110
|
-
byte b;
|
110
|
+
for (uint16_t i=0; (i < rLength || i < wLength); i++) {
|
111
|
+
byte b;
|
111
112
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
113
|
+
if (i < wLength) {
|
114
|
+
b = SPI.transfer(data[i]);
|
115
|
+
} else {
|
116
|
+
b = SPI.transfer(0x00);
|
117
|
+
}
|
117
118
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
119
|
+
if (i < rLength) {
|
120
|
+
// Print read byte, then a comma or \n if it's the last read byte.
|
121
|
+
stream->print(b);
|
122
|
+
stream->print((i+1 == rLength) ? '\n' : ',');
|
123
|
+
}
|
122
124
|
}
|
125
|
+
// Write the entire buffer at once if not reading.
|
126
|
+
} else {
|
127
|
+
SPI.transfer(data, wLength);
|
123
128
|
}
|
124
129
|
|
125
|
-
// Leave select high
|
126
|
-
if (
|
130
|
+
// Leave select high.
|
131
|
+
if (bitRead(settings, 6) == 1) digitalWrite(select, HIGH);
|
127
132
|
|
128
133
|
spiEnd();
|
129
134
|
}
|
@@ -136,16 +141,14 @@ void Denko::spiAddListener() {
|
|
136
141
|
clockRate |= (uint32_t)auxMsg[4] << 8;
|
137
142
|
clockRate |= (uint32_t)auxMsg[5] << 16;
|
138
143
|
clockRate |= (uint32_t)auxMsg[6] << 24;
|
139
|
-
|
144
|
+
|
140
145
|
for (int i = 0; i < SPI_LISTENER_COUNT; i++) {
|
141
146
|
if (spiListeners[i].enabled == 0) {
|
142
|
-
spiListeners[i]
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
1 // Enabled = 1 sets hardware SPI listener
|
148
|
-
};
|
147
|
+
spiListeners[i].freq = clockRate;
|
148
|
+
spiListeners[i].select = pin; // Select pin
|
149
|
+
spiListeners[i].settings = auxMsg[0]; // Settings mask
|
150
|
+
spiListeners[i].length = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1]; // Read length
|
151
|
+
spiListeners[i].enabled = 1; // 1 sets this listener as Hardware SPI
|
149
152
|
return;
|
150
153
|
} else {
|
151
154
|
// Should send some kind of error if all are in use.
|
@@ -155,7 +158,7 @@ void Denko::spiAddListener() {
|
|
155
158
|
|
156
159
|
// Called by spiUpdateListeners to read an individual hardware SPI listener.
|
157
160
|
void Denko::spiReadListener(uint8_t i) {
|
158
|
-
spiTransfer(spiListeners[i].
|
161
|
+
spiTransfer(spiListeners[i].freq,
|
159
162
|
spiListeners[i].select,
|
160
163
|
spiListeners[i].settings,
|
161
164
|
spiListeners[i].length,
|
data/src/lib/DenkoSPIBB.cpp
CHANGED
@@ -11,7 +11,8 @@
|
|
11
11
|
// val = empty
|
12
12
|
// auxMsg[0] = SPI settings
|
13
13
|
// Bit 0..1 = SPI mode
|
14
|
-
// Bit 2..
|
14
|
+
// Bit 2..5 = ** unused **
|
15
|
+
// Bit 6 = Whether to toggle select pin (1), or not (0)
|
15
16
|
// Bit 7 = Read and write bit order: MSBFIRST(1) or LSBFIRST(0)
|
16
17
|
// auxMsg[1] = read length (number of bytes)
|
17
18
|
// auxMsg[2] = write length (number of bytes)
|
@@ -21,8 +22,8 @@
|
|
21
22
|
// auxMsg[6] = ** unused **
|
22
23
|
// auxMsg[7+] = data (bytes) (write only) - Start from 7 for parity with hardware SPI.
|
23
24
|
//
|
24
|
-
void Denko::spiBBtransfer(
|
25
|
-
|
25
|
+
void Denko::spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
|
26
|
+
uint16_t rLength, uint16_t wLength, byte *data) {
|
26
27
|
|
27
28
|
// Mode is the lowest 2 bits of settings.
|
28
29
|
uint8_t mode = settings & 0b00000011;
|
@@ -38,7 +39,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
|
|
38
39
|
// Set idle state of clock pin based on SPI mode.
|
39
40
|
pinMode(clock, OUTPUT);
|
40
41
|
if ((mode == 0)||(mode == 1)) digitalWrite(clock, LOW);
|
41
|
-
if ((mode == 2)||(mode == 3)) digitalWrite(clock,
|
42
|
+
if ((mode == 2)||(mode == 3)) digitalWrite(clock, HIGH);
|
42
43
|
|
43
44
|
// Stream read bytes as if coming from select pin.
|
44
45
|
if (rLength > 0) {
|
@@ -46,13 +47,13 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
|
|
46
47
|
stream->print(':');
|
47
48
|
}
|
48
49
|
|
49
|
-
// Pull select
|
50
|
-
if (
|
50
|
+
// Pull select low, if needed.
|
51
|
+
if (bitRead(settings, 6) == 1) {
|
51
52
|
pinMode(select, OUTPUT);
|
52
53
|
digitalWrite(select, LOW);
|
53
54
|
}
|
54
55
|
|
55
|
-
for (
|
56
|
+
for (uint16_t i=0; (i < rLength || i < wLength); i++) {
|
56
57
|
byte b;
|
57
58
|
|
58
59
|
if (i < wLength) {
|
@@ -67,9 +68,9 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
|
|
67
68
|
stream->print((i+1 == rLength) ? '\n' : ',');
|
68
69
|
}
|
69
70
|
}
|
70
|
-
|
71
|
-
// Leave select high
|
72
|
-
if (
|
71
|
+
|
72
|
+
// Leave select high.
|
73
|
+
if (bitRead(settings, 6) == 1) digitalWrite(select, HIGH);
|
73
74
|
}
|
74
75
|
|
75
76
|
//
|
@@ -78,7 +79,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
|
|
78
79
|
byte Denko::spiBBtransferByte(uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t mode, uint8_t bitOrder, byte data) {
|
79
80
|
// Byte to return
|
80
81
|
byte b = 0x00;
|
81
|
-
|
82
|
+
|
82
83
|
// Track which of the 8 bits we're on.
|
83
84
|
uint8_t bitPos;
|
84
85
|
|
@@ -128,13 +129,11 @@ void Denko::spiBBaddListener() {
|
|
128
129
|
for (int i = 0; i < SPI_LISTENER_COUNT; i++) {
|
129
130
|
// Overwrite the first disabled listener in the struct array.
|
130
131
|
if (spiListeners[i].enabled == 0) {
|
131
|
-
spiListeners[i]
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
2 // Enabled = 2 sets bit bang SPI listener
|
137
|
-
};
|
132
|
+
spiListeners[i].freq = ((uint32_t)(auxMsg[4] << 8) | auxMsg[3]); // SCK: [0..7], MOSI: [8..15] in freq's uint32.
|
133
|
+
spiListeners[i].select = pin; // Select pin
|
134
|
+
spiListeners[i].settings = auxMsg[0]; // Settings mask
|
135
|
+
spiListeners[i].length = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1]; // Read length
|
136
|
+
spiListeners[i].enabled = 2; // 2 sets this listener as Bit-Bang
|
138
137
|
return;
|
139
138
|
} else {
|
140
139
|
// Should send some kind of error if all are in use.
|
@@ -144,8 +143,8 @@ void Denko::spiBBaddListener() {
|
|
144
143
|
|
145
144
|
// Called by spiUpdateListeners to read an individual bit bang SPI listener.
|
146
145
|
void Denko::spiBBreadListener(uint8_t i) {
|
147
|
-
spiBBtransfer((spiListeners[i].
|
148
|
-
((spiListeners[i].
|
146
|
+
spiBBtransfer ((spiListeners[i].freq & 0xFF), // SCK pin is bits [0..7] of freq's uint32
|
147
|
+
((spiListeners[i].freq >> 8) & 0xFF), // MOSI pin is bits [8..15] of freq's uint32
|
149
148
|
255, // Disabled output pin
|
150
149
|
spiListeners[i].select, // Select pin
|
151
150
|
spiListeners[i].settings,
|
data/target.yml
CHANGED
@@ -1,3 +1,38 @@
|
|
1
|
-
name:
|
1
|
+
name: atmega
|
2
2
|
fqbn: arduino:avr:uno
|
3
|
-
port: /dev/cu.
|
3
|
+
port: /dev/cu.usbmodem14501
|
4
|
+
|
5
|
+
# name: atmega
|
6
|
+
# fqbn: arduino:avr:mega
|
7
|
+
# port: /dev/cu.usbmodem14501
|
8
|
+
|
9
|
+
# name: atmega
|
10
|
+
# fqbn: arduino:avr:leonardo
|
11
|
+
# port: /dev/cu.usbmodem14501
|
12
|
+
|
13
|
+
# Uses native USB port
|
14
|
+
# name: atsam3x
|
15
|
+
# fqbn: arduino:sam:arduino_due_x
|
16
|
+
# port: /dev/cu.usbmodem14501
|
17
|
+
|
18
|
+
# Uses native USB port
|
19
|
+
# name: atsamd21
|
20
|
+
# fqbn: arduino:samd:arduino_zero_native
|
21
|
+
# port: /dev/cu.usbmodem14501
|
22
|
+
|
23
|
+
# name: esp8266
|
24
|
+
# fqbn: esp8266:esp8266:nodemcuv2
|
25
|
+
# port: /dev/cu.SLAB_USBtoUART
|
26
|
+
|
27
|
+
# name: esp32
|
28
|
+
# fqbn: esp32:esp32:esp32doit-devkit-v1
|
29
|
+
# port: /dev/cu.SLAB_USBtoUART
|
30
|
+
|
31
|
+
# Use for S3 on secondary UART port (not native USB). Native USB needs to be enabled in IDE.
|
32
|
+
# name: esp32
|
33
|
+
# fqbn: esp32:esp32:lolin_s3
|
34
|
+
# port: /dev/cu.usbmodem14501
|
35
|
+
|
36
|
+
# name: rp2040
|
37
|
+
# fqbn: rp2040:rp2040:rpipicow
|
38
|
+
# port: /dev/cu.usbmodem14501
|
@@ -15,47 +15,47 @@ class AnalogIOPotentiometerTest < Minitest::Test
|
|
15
15
|
part
|
16
16
|
end
|
17
17
|
|
18
|
-
assert part.smoothing
|
19
18
|
assert_equal 8, part.divider
|
20
|
-
assert_equal [], part.
|
19
|
+
assert_equal [], part.smoothing_set
|
21
20
|
end
|
22
|
-
|
21
|
+
|
23
22
|
def test_smoothing_on
|
23
|
+
part.smoothing = true
|
24
24
|
7.times do
|
25
25
|
part.update(10)
|
26
26
|
end
|
27
27
|
part.update(50)
|
28
|
-
|
28
|
+
|
29
29
|
# 120/8 = 15
|
30
|
-
assert_equal part.state
|
30
|
+
assert_equal 15, part.state
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def test_smoothing_off
|
34
34
|
part.smoothing = false
|
35
35
|
7.times do
|
36
36
|
part.update(10)
|
37
37
|
end
|
38
38
|
part.update(50)
|
39
|
-
|
39
|
+
|
40
40
|
# Give latest value.
|
41
41
|
assert_equal part.state, 50
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def test_on_change
|
45
45
|
mock = Minitest::Mock.new.expect(:call, nil)
|
46
|
-
|
46
|
+
|
47
47
|
# Turn off smoothing and set an initial value
|
48
48
|
part.smoothing = false
|
49
49
|
part.update(100)
|
50
|
-
|
50
|
+
|
51
51
|
# Add the callback
|
52
52
|
part.on_change { mock.call }
|
53
|
-
|
53
|
+
|
54
54
|
# Send a few updates
|
55
55
|
part.update(100)
|
56
56
|
part.update(100)
|
57
57
|
part.update(101)
|
58
|
-
|
58
|
+
|
59
59
|
# Should have only been called once.
|
60
60
|
mock.verify
|
61
61
|
end
|