denko 0.14.0 → 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_atmega_avr.yml +2 -1
- data/.github/workflows/build_atmega_megaavr.yml +2 -1
- data/.github/workflows/build_atsam3x.yml +1 -0
- data/.github/workflows/build_atsamd21.yml +2 -1
- data/.github/workflows/build_esp32.yml +4 -2
- data/.github/workflows/build_esp32c3.yml +4 -3
- data/.github/workflows/build_esp32c6.yml +4 -2
- data/.github/workflows/build_esp32h2.yml +4 -2
- data/.github/workflows/build_esp32s2.yml +4 -2
- data/.github/workflows/build_esp32s3.yml +4 -2
- data/.github/workflows/build_esp8266.yml +2 -1
- data/.github/workflows/build_ra4m1.yml +1 -0
- data/.github/workflows/build_rp2040.yml +4 -3
- data/.github/workflows/ruby.yml +1 -1
- data/CHANGELOG.md +203 -0
- data/DEPS_CLI.md +16 -16
- data/DEPS_IDE.md +31 -30
- data/MICROCONTROLLERS.md +103 -0
- data/PERIPHERALS.md +178 -0
- data/README.md +28 -21
- data/denko.gemspec +6 -1
- data/lib/denko/analog_io/ads1118.rb +5 -5
- data/lib/denko/analog_io/ads111x.rb +23 -19
- data/lib/denko/analog_io/joystick.rb +87 -0
- data/lib/denko/analog_io/potentiometer.rb +1 -5
- data/lib/denko/analog_io.rb +22 -8
- data/lib/denko/behaviors/bus_controller.rb +2 -1
- data/lib/denko/behaviors/bus_peripheral.rb +1 -1
- data/lib/denko/behaviors/callbacks.rb +18 -16
- data/lib/denko/behaviors/component.rb +0 -4
- data/lib/denko/behaviors/lifecycle.rb +1 -1
- data/lib/denko/behaviors/listener.rb +9 -3
- data/lib/denko/behaviors/multi_pin.rb +4 -6
- data/lib/denko/behaviors/poller.rb +11 -2
- data/lib/denko/behaviors/reader.rb +109 -21
- data/lib/denko/behaviors/single_pin.rb +2 -4
- data/lib/denko/behaviors/state.rb +18 -13
- data/lib/denko/behaviors/threaded.rb +19 -8
- data/lib/denko/behaviors.rb +36 -23
- data/lib/denko/board/eeprom.rb +1 -1
- data/lib/denko/board/i2c.rb +1 -1
- data/lib/denko/board/i2c_bit_bang.rb +9 -5
- data/lib/denko/board/map.rb +6 -2
- data/lib/denko/board/one_wire.rb +3 -3
- data/lib/denko/board/spi.rb +30 -30
- data/lib/denko/board/spi_bit_bang.rb +8 -11
- data/lib/denko/board.rb +6 -3
- data/lib/denko/connection/flow_control.rb +1 -1
- data/lib/denko/connection/serial.rb +5 -5
- data/lib/denko/digital_io/output.rb +12 -4
- data/lib/denko/digital_io/pcf8574.rb +114 -0
- data/lib/denko/digital_io/rotary_encoder.rb +10 -6
- data/lib/denko/digital_io.rb +24 -6
- 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 +24 -20
- 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 +17 -21
- 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 -228
- 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 -4
- 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/{mutex_stub.rb → helpers/mutex_stub.rb} +6 -0
- data/lib/denko/helpers.rb +6 -0
- data/lib/denko/i2c/bit_bang.rb +1 -0
- data/lib/denko/i2c/bus_common.rb +9 -4
- data/lib/denko/i2c/peripheral.rb +5 -1
- data/lib/denko/i2c.rb +17 -4
- data/lib/denko/led/apa102.rb +1 -3
- data/lib/denko/led/base.rb +5 -0
- data/lib/denko/led/rgb.rb +16 -10
- data/lib/denko/led/seven_segment.rb +1 -1
- data/lib/denko/led.rb +17 -8
- data/lib/denko/motor/{stepper.rb → a3967.rb} +1 -1
- data/lib/denko/motor/servo.rb +16 -6
- data/lib/denko/motor.rb +16 -3
- data/lib/denko/one_wire/bus.rb +20 -16
- data/lib/denko/one_wire/bus_enumerator.rb +25 -14
- data/lib/denko/one_wire/helper.rb +4 -2
- data/lib/denko/one_wire.rb +18 -5
- data/lib/denko/pulse_io/buzzer.rb +2 -6
- data/lib/denko/pulse_io/ir_output.rb +1 -5
- data/lib/denko/pulse_io/pwm_output.rb +56 -31
- data/lib/denko/pulse_io.rb +17 -3
- data/lib/denko/rtc/ds3231.rb +4 -3
- data/lib/denko/rtc.rb +14 -1
- data/lib/denko/sensor/aht.rb +16 -20
- data/lib/denko/sensor/bme280.rb +23 -36
- data/lib/denko/sensor/bmp180.rb +8 -13
- data/lib/denko/sensor/dht.rb +17 -7
- data/lib/denko/sensor/ds18b20.rb +5 -4
- data/lib/denko/sensor/hdc1080.rb +174 -0
- data/lib/denko/sensor/htu21d.rb +17 -6
- data/lib/denko/sensor/htu31d.rb +6 -5
- data/lib/denko/sensor/jsnsr04t.rb +49 -0
- data/lib/denko/sensor/qmp6988.rb +14 -30
- data/lib/denko/sensor/rcwl9620.rb +1 -0
- data/lib/denko/sensor/sht3x.rb +6 -5
- data/lib/denko/sensor/sht4x.rb +125 -0
- data/lib/denko/sensor/vl53l0x.rb +58 -0
- data/lib/denko/sensor.rb +33 -15
- data/lib/denko/spi/base_register.rb +11 -7
- data/lib/denko/spi/bus_common.rb +12 -15
- data/lib/denko/spi/input_register.rb +6 -6
- data/lib/denko/spi/output_register.rb +13 -4
- data/lib/denko/spi/peripheral.rb +82 -84
- data/lib/denko/spi.rb +20 -10
- data/lib/denko/uart/bit_bang.rb +2 -27
- data/lib/denko/uart/common.rb +33 -0
- data/lib/denko/uart/hardware.rb +1 -26
- data/lib/denko/uart.rb +16 -2
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +22 -25
- data/lib/denko_cli/targets.rb +7 -7
- data/lib/denko_cli/targets.txt +19 -20
- data/src/lib/Denko.cpp +26 -13
- data/src/lib/Denko.h +4 -4
- data/src/lib/DenkoDefines.h +7 -26
- data/src/lib/DenkoLEDArray.cpp +1 -8
- data/src/lib/DenkoSPI.cpp +31 -29
- data/src/lib/DenkoSPIBB.cpp +12 -14
- data/test/analog_io/input_test.rb +1 -1
- data/test/analog_io/potentiometer_test.rb +2 -2
- data/test/behaviors/bus_peripheral_test.rb +4 -4
- data/test/behaviors/callbacks_test.rb +20 -10
- data/test/behaviors/component_test.rb +18 -8
- data/test/board/board_test.rb +9 -9
- data/test/board/one_wire_test.rb +25 -14
- data/test/board/spi_test.rb +31 -15
- data/test/digital_io/input_test.rb +2 -2
- 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 +93 -30
- data/test/i2c/peripheral_test.rb +2 -2
- data/test/led/apa102_test.rb +24 -0
- data/test/led/rgb_test.rb +4 -4
- data/test/motor/{stepper_test.rb → a3967_test.rb} +2 -2
- data/test/one_wire/bus_enumerator_test.rb +1 -1
- data/test/one_wire/bus_test.rb +42 -35
- data/test/one_wire/peripheral_test.rb +5 -17
- data/test/pulse_io/ir_output_test.rb +5 -0
- data/test/pulse_io/pwm_output_test.rb +10 -10
- data/test/rtc/ds3231_test.rb +3 -2
- data/test/sensor/dht_test.rb +11 -11
- data/test/spi/bitbang_test.rb +27 -0
- data/test/spi/bus_test.rb +19 -29
- data/test/spi/input_register_test.rb +2 -2
- data/test/spi/{peripheral_multi_pin_test.rb → peripheral_test.rb} +25 -5
- data/test/test_helper.rb +44 -124
- data/vendor/board-maps/BoardMap.h +264 -0
- data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -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/BPI_LEAF_S3.yml +0 -1
- 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/EDGES3D.yml +25 -0
- data/vendor/board-maps/yaml/ESP32C6_DEV.yml +3 -4
- data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +0 -1
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +0 -1
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +0 -1
- data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
- data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO.yml +0 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +0 -1
- data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
- data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
- data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +0 -1
- data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -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/HUIDU_HD_WF2.yml +5 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
- 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/LOLIN_C3_MINI.yml +0 -1
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +1 -2
- data/vendor/board-maps/yaml/LoPy.yml +0 -1
- data/vendor/board-maps/yaml/LoPy4.yml +0 -1
- data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -1
- data/vendor/board-maps/yaml/OMGS3.yml +25 -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/PYCOM_GPY.yml +0 -1
- data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +1 -1
- data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -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_C6.yml +0 -1
- 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/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/WIPY3.yml +0 -1
- data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -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
- metadata +116 -101
- data/.vscode/settings.json +0 -5
- data/.vscode/tasks.json +0 -20
- data/HARDWARE.md +0 -263
- data/benchmarks/analog_listen.rb +0 -49
- data/benchmarks/digital_write.rb +0 -28
- data/benchmarks/i2c_ssd1306_refresh.rb +0 -91
- data/examples/advanced/m5_env3.rb +0 -46
- data/examples/advanced/rotary_encoder_mac_volume.rb +0 -53
- data/examples/advanced/ssd1306_time_temp_rh.rb +0 -43
- data/examples/analog_io/ads1100.rb +0 -48
- data/examples/analog_io/ads1115.rb +0 -57
- data/examples/analog_io/ads1118.rb +0 -65
- data/examples/analog_io/dac_loopback.rb +0 -34
- data/examples/analog_io/input.rb +0 -56
- data/examples/analog_io/input_smoothing.rb +0 -27
- data/examples/analog_io/potentiometer.rb +0 -31
- data/examples/connection/binary_echo.rb +0 -34
- data/examples/connection/tcp.rb +0 -19
- data/examples/digital_io/button.rb +0 -17
- data/examples/digital_io/relay.rb +0 -17
- data/examples/digital_io/rotary_encoder.rb +0 -36
- data/examples/display/hd44780.png +0 -0
- data/examples/display/hd44780.rb +0 -47
- data/examples/display/ssd1306.rb +0 -43
- data/examples/display/ssd1306_s2_pico.rb +0 -29
- data/examples/eeprom/built_in.rb +0 -32
- data/examples/i2c/search.rb +0 -39
- data/examples/led/apa102_bounce.rb +0 -32
- data/examples/led/apa102_fade.rb +0 -44
- data/examples/led/builtin_blink.rb +0 -14
- data/examples/led/builtin_fade.rb +0 -19
- data/examples/led/rgb_led.rb +0 -31
- data/examples/led/seven_segment_char_echo.rb +0 -17
- data/examples/led/ws2812_bounce.rb +0 -30
- data/examples/led/ws2812_builtin_blink.rb +0 -22
- data/examples/led/ws2812_fade.rb +0 -43
- data/examples/motor/l298.rb +0 -45
- data/examples/motor/servo.rb +0 -17
- data/examples/motor/stepper.png +0 -0
- data/examples/motor/stepper.rb +0 -43
- data/examples/one_wire/search.rb +0 -32
- data/examples/pulse_io/buzzer.rb +0 -35
- data/examples/pulse_io/ir_output.rb +0 -51
- data/examples/pulse_io/pwm_output.rb +0 -30
- data/examples/rtc/ds3231.rb +0 -31
- data/examples/sensor/aht10.rb +0 -17
- data/examples/sensor/aht20.rb +0 -17
- data/examples/sensor/bme280.rb +0 -38
- data/examples/sensor/bmp180.rb +0 -26
- data/examples/sensor/dht.rb +0 -29
- data/examples/sensor/ds18b20.rb +0 -57
- data/examples/sensor/generic_pir.rb +0 -27
- data/examples/sensor/hcsr04.rb +0 -17
- data/examples/sensor/htu21d.rb +0 -43
- data/examples/sensor/htu31d.rb +0 -33
- data/examples/sensor/neat_tph_readings.rb +0 -32
- data/examples/sensor/qmp6988.rb +0 -51
- data/examples/sensor/rcwl9620.rb +0 -15
- data/examples/sensor/sht3x.rb +0 -32
- data/examples/spi/bitbang_loopback.rb +0 -46
- data/examples/spi/input_register.rb +0 -40
- data/examples/spi/output_register.rb +0 -41
- data/examples/spi/ssd_through_registers.rb +0 -28
- data/examples/spi/two_registers.rb +0 -40
- data/examples/uart/bit_bang_demo.rb +0 -25
- data/examples/uart/board_passthrough.rb +0 -40
- data/examples/uart/hardware_loopback.rb +0 -16
- data/lib/denko/eeprom/built_in.rb +0 -72
- data/lib/denko/fonts.rb +0 -106
- data/test/eeprom/built_in_test.rb +0 -61
- data/test/spi/peripheral_single_pin_test.rb +0 -48
- 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 -65
- data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
- data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
- data/tutorial/03-potentiometer/potentiometer.rb +0 -66
- 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 -64
- 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/lib/denko/uart/bit_bang.rb
CHANGED
@@ -10,6 +10,7 @@ module Denko
|
|
10
10
|
include Behaviors::MultiPin
|
11
11
|
include Behaviors::Callbacks
|
12
12
|
include Behaviors::Lifecycle
|
13
|
+
include Common
|
13
14
|
|
14
15
|
attr_reader :baud
|
15
16
|
|
@@ -24,32 +25,6 @@ module Denko
|
|
24
25
|
start(params[:baud] || 9600)
|
25
26
|
end
|
26
27
|
|
27
|
-
def initialize_buffer
|
28
|
-
@buffer = ""
|
29
|
-
@buffer_mutex = Mutex.new
|
30
|
-
self.add_callback(:buffer) do |data|
|
31
|
-
@buffer_mutex.synchronize do
|
32
|
-
@buffer = "#{@buffer}#{data}"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def gets
|
38
|
-
@buffer_mutex.synchronize do
|
39
|
-
newline = @buffer.index("\n")
|
40
|
-
return nil unless newline
|
41
|
-
line = @buffer[0..newline-1]
|
42
|
-
@buffer = @buffer[newline+1..-1]
|
43
|
-
return line
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def flush
|
48
|
-
@buffer_mutex.synchronize do
|
49
|
-
@buffer = ""
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
28
|
def start(baud)
|
54
29
|
@baud = baud
|
55
30
|
board.uart_bb_start(pins[:tx], pins[:rx], @baud)
|
@@ -64,7 +39,7 @@ module Denko
|
|
64
39
|
end
|
65
40
|
|
66
41
|
def hook_rx_callback
|
67
|
-
rx.add_callback {|data| self.update(data)}
|
42
|
+
rx.add_callback { |data| self.update(data) }
|
68
43
|
end
|
69
44
|
end
|
70
45
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Denko
|
2
|
+
module UART
|
3
|
+
module Common
|
4
|
+
def initialize_buffer
|
5
|
+
@buffer = String.new
|
6
|
+
@buffer_mutex = Denko.gil? ? Denko::MutexStub.new : Mutex.new
|
7
|
+
self.add_callback(:buffer) do |data|
|
8
|
+
@buffer_mutex.lock
|
9
|
+
@buffer = "#{@buffer}#{data}"
|
10
|
+
@buffer_mutex.unlock
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def gets
|
15
|
+
line = nil
|
16
|
+
@buffer_mutex.lock
|
17
|
+
newline = @buffer.index("\n")
|
18
|
+
if newline
|
19
|
+
line = @buffer[0..newline-1]
|
20
|
+
@buffer = @buffer[newline+1..-1]
|
21
|
+
end
|
22
|
+
@buffer_mutex.unlock
|
23
|
+
line
|
24
|
+
end
|
25
|
+
|
26
|
+
def flush
|
27
|
+
@buffer_mutex.lock
|
28
|
+
@buffer = ""
|
29
|
+
@buffer_mutex.unlock
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/denko/uart/hardware.rb
CHANGED
@@ -4,6 +4,7 @@ module Denko
|
|
4
4
|
include Behaviors::SinglePin
|
5
5
|
include Behaviors::Callbacks
|
6
6
|
include Behaviors::Lifecycle
|
7
|
+
include Common
|
7
8
|
|
8
9
|
attr_reader :index, :baud
|
9
10
|
|
@@ -23,32 +24,6 @@ module Denko
|
|
23
24
|
start(params[:baud] ||= 9600)
|
24
25
|
end
|
25
26
|
|
26
|
-
def initialize_buffer
|
27
|
-
@buffer = ""
|
28
|
-
@buffer_mutex = Mutex.new
|
29
|
-
self.add_callback(:buffer) do |data|
|
30
|
-
@buffer_mutex.synchronize do
|
31
|
-
@buffer = "#{@buffer}#{data}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def gets
|
37
|
-
@buffer_mutex.synchronize do
|
38
|
-
newline = @buffer.index("\n")
|
39
|
-
return nil unless newline
|
40
|
-
line = @buffer[0..newline-1]
|
41
|
-
@buffer = @buffer[newline+1..-1]
|
42
|
-
return line
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def flush
|
47
|
-
@buffer_mutex.synchronize do
|
48
|
-
@buffer = ""
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
27
|
def start(baud)
|
53
28
|
@baud = baud
|
54
29
|
board.uart_start(index, baud, true)
|
data/lib/denko/uart.rb
CHANGED
@@ -1,6 +1,20 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
UART_FILES = [
|
4
|
+
[nil, "common"],
|
5
|
+
[:Hardware, "hardware"],
|
6
|
+
[:BitBang, "bit_bang"],
|
7
|
+
]
|
8
|
+
|
1
9
|
module Denko
|
2
10
|
module UART
|
3
|
-
|
4
|
-
|
11
|
+
UART_FILES.each do |file|
|
12
|
+
file_path = "#{__dir__}/uart/#{file[1]}"
|
13
|
+
if file[0]
|
14
|
+
autoload file[0], file_path
|
15
|
+
else
|
16
|
+
require file_path
|
17
|
+
end
|
18
|
+
end
|
5
19
|
end
|
6
20
|
end
|
data/lib/denko/version.rb
CHANGED
data/lib/denko.rb
CHANGED
@@ -1,49 +1,46 @@
|
|
1
|
-
|
1
|
+
# Helpers needed during loading.
|
2
|
+
require_relative 'denko/helpers'
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
unless Denko.in_mruby_build?
|
5
|
+
Thread.abort_on_exception = true
|
6
|
+
|
7
|
+
require 'bcd'
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
module Denko
|
10
|
+
def self.root
|
11
|
+
File.expand_path '../..', __FILE__
|
12
|
+
end
|
10
13
|
end
|
11
14
|
end
|
12
15
|
|
13
|
-
#
|
14
|
-
require 'forwardable'
|
15
|
-
|
16
|
-
# Bypass mutexes where possible for CRuby.
|
17
|
-
require_relative 'denko/mutex_stub'
|
18
|
-
|
19
|
-
# Component support stuff.
|
16
|
+
# Early shared behavior
|
20
17
|
require_relative 'denko/version'
|
21
18
|
require_relative 'denko/behaviors'
|
22
|
-
require_relative 'denko/fonts'
|
23
19
|
|
24
|
-
# Board
|
25
|
-
|
26
|
-
require_relative 'denko/
|
27
|
-
require_relative 'denko/
|
20
|
+
# Denko::Board implementation for connected microcontrollers
|
21
|
+
unless Denko.in_mruby_build?
|
22
|
+
require_relative 'denko/message'
|
23
|
+
require_relative 'denko/connection'
|
24
|
+
require_relative 'denko/board'
|
25
|
+
# Diagnostics
|
26
|
+
require_relative 'denko/connection/binary_echo'
|
27
|
+
end
|
28
28
|
|
29
|
-
# Basic IO
|
29
|
+
# Basic IO peripherals
|
30
30
|
require_relative 'denko/digital_io'
|
31
31
|
require_relative 'denko/analog_io'
|
32
32
|
require_relative 'denko/pulse_io'
|
33
33
|
|
34
|
-
# Buses and interfaces
|
34
|
+
# Buses and interfaces
|
35
35
|
require_relative 'denko/uart'
|
36
36
|
require_relative 'denko/spi'
|
37
37
|
require_relative 'denko/i2c'
|
38
38
|
require_relative 'denko/one_wire'
|
39
39
|
|
40
|
-
# Everything else
|
40
|
+
# Everything else
|
41
41
|
require_relative 'denko/display'
|
42
42
|
require_relative 'denko/eeprom'
|
43
43
|
require_relative 'denko/led'
|
44
44
|
require_relative 'denko/motor'
|
45
45
|
require_relative 'denko/rtc'
|
46
46
|
require_relative 'denko/sensor'
|
47
|
-
|
48
|
-
# Diagnostics
|
49
|
-
require_relative 'denko/connection/binary_echo'
|
data/lib/denko_cli/targets.rb
CHANGED
@@ -8,7 +8,7 @@ class DenkoCLI::Generator
|
|
8
8
|
core: [:core],
|
9
9
|
|
10
10
|
# Specific features for the old mega168 chips.
|
11
|
-
atmega168: [:core, :
|
11
|
+
atmega168: [:core, :tone, :i2c, :spi, :servo, :uart_bb],
|
12
12
|
|
13
13
|
# Other ATmega chips do everything.
|
14
14
|
# Add bit bang serial for 328p / UNO since it has no extra hardware UART.
|
@@ -16,18 +16,18 @@ class DenkoCLI::Generator
|
|
16
16
|
|
17
17
|
# No tone, infrared or EEPROM on SAM3X / Due.
|
18
18
|
atsam3x: STANDARD_PACKAGES - [:tone, :ir_out, :eeprom],
|
19
|
-
|
19
|
+
|
20
20
|
# No EEPROM on SAMD / Zero.
|
21
21
|
atsamd21: STANDARD_PACKAGES - [:eeprom],
|
22
22
|
|
23
|
-
#
|
24
|
-
ra4m1: STANDARD_PACKAGES - [:ir_out
|
23
|
+
# Infrared library does not support the UNO R4.
|
24
|
+
ra4m1: STANDARD_PACKAGES - [:ir_out],
|
25
25
|
|
26
|
-
# ESP8266
|
26
|
+
# ESP8266 & ESP32
|
27
27
|
esp8266: STANDARD_PACKAGES,
|
28
28
|
esp32: STANDARD_PACKAGES,
|
29
|
-
|
30
|
-
# RP2040
|
29
|
+
|
30
|
+
# RP2040
|
31
31
|
rp2040: STANDARD_PACKAGES,
|
32
32
|
}
|
33
33
|
end
|
data/lib/denko_cli/targets.txt
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
atmega (default)
|
5
5
|
|
6
6
|
Covers the Atmel/Microchip AVR 8-bit chips and associated Arduino boards.
|
7
|
-
This is the default target. All
|
7
|
+
This is the default target. All interfaces are included.
|
8
8
|
|
9
9
|
Chips: ATmega328p, ATmega32u4, ATmega1280, ATmega2560
|
10
10
|
Atmega4809 (unconfirmed)
|
@@ -17,20 +17,20 @@
|
|
17
17
|
esp32
|
18
18
|
|
19
19
|
For the the ESP32 chip by Espressif, with integrated 2.4Ghz WiFi.
|
20
|
-
|
21
|
-
This option includes all
|
20
|
+
WiFi over-the-air updates are enabled by default.
|
21
|
+
This option includes all interfaces EXCEPT:
|
22
22
|
SoftwareSerial
|
23
23
|
|
24
24
|
Chips: ESP32, ESP32-S2, ESP32-S3
|
25
25
|
Boards: ESP32 DevKit, LOLIN D32 / D32 Pro, LOLIN S2 Pico / Mini,
|
26
26
|
LOLIN S3 Pico / Mini
|
27
|
-
|
27
|
+
|
28
28
|
|
29
29
|
esp8266
|
30
30
|
|
31
31
|
For the ESP8266 chip by Espressif, with integrated 2.4Ghz WiFi.
|
32
32
|
WiFi over-the-air updates are enabled by default.
|
33
|
-
This option includes all
|
33
|
+
This option includes all interfaces EXCEPT:
|
34
34
|
SoftwareSerial
|
35
35
|
|
36
36
|
Chips: ES8266, ESP8285
|
@@ -41,24 +41,23 @@
|
|
41
41
|
|
42
42
|
Note: After the initial upload via serial, the WiFi sketch for this target
|
43
43
|
supports over-the-air updates from the Arduino IDE using ArduinoOTA.
|
44
|
-
|
45
|
-
|
44
|
+
|
45
|
+
|
46
46
|
rp2040
|
47
47
|
|
48
|
-
For the Raspberry Pi RP2040 microcontroller.
|
49
|
-
|
50
|
-
|
51
|
-
SoftwareSerial, LEDArray
|
48
|
+
For the Raspberry Pi RP2040 microcontroller. WiFi available on the W version.
|
49
|
+
This option includes all interfaces EXCEPT:
|
50
|
+
SoftwareSerial
|
52
51
|
|
53
52
|
Chips: RP2040
|
54
53
|
Boards: Raspberry Pi Pico, Raspberry Pi Pico W, and many others
|
55
|
-
|
54
|
+
|
56
55
|
|
57
56
|
atsamd21
|
58
57
|
|
59
58
|
For the ATSAMD21G18, with native USB and no EEPROM.
|
60
59
|
Similar to the mega option, but Software Serial doesn't work.
|
61
|
-
This option includes all
|
60
|
+
This option includes all interfaces EXCEPT:
|
62
61
|
EEPROM, SoftwareSerial
|
63
62
|
|
64
63
|
Chips: ATSAMD21G18
|
@@ -69,16 +68,16 @@
|
|
69
68
|
|
70
69
|
Fpr the ATSAM3X8E, with native USB and no EEPROM.
|
71
70
|
Similar to the mega option, but some features don't work.
|
72
|
-
This option includes all
|
71
|
+
This option includes all interfaces EXCEPT:
|
73
72
|
EEPROM, SoftwareSerial, Tone, IR Out
|
74
73
|
|
75
74
|
Chips: ATSAM3X8E
|
76
75
|
Boards: Arduino Due
|
77
|
-
|
78
|
-
|
76
|
+
|
77
|
+
|
79
78
|
core
|
80
79
|
|
81
|
-
This includes only the core
|
80
|
+
This includes only the core interface set of denko:
|
82
81
|
Set Pin Mode
|
83
82
|
Digital Read/Write/Listen
|
84
83
|
Analog Read/Write/Listen
|
@@ -91,8 +90,8 @@
|
|
91
90
|
|
92
91
|
This targets the older ATmega168 chip used in early Arduinos.
|
93
92
|
With half the RAM and flash available, we need to cut the sketch down.
|
94
|
-
This option includes all
|
95
|
-
|
93
|
+
This option includes all interfaces EXCEPT:
|
94
|
+
EEPROM, OneWire, BitBang I2C, BitBang SPI, Hardware UART, IR Out, WS2812
|
96
95
|
|
97
96
|
Chips: ATmega168
|
98
97
|
Boards: Duemilanove, Diecimila, Pro (some), Pro Mini (some)
|
@@ -103,7 +102,7 @@
|
|
103
102
|
There is not enough memory available for Wi-Fi or Ethernet.
|
104
103
|
Try the core target instead to tradeoff features for networking.
|
105
104
|
|
106
|
-
Note: Aux message is always limited to
|
105
|
+
Note: Aux message is always limited to 48 bytes or less for the ATmega168.
|
107
106
|
Servo count is always limited to 6 (normally 12) for the ATmega168 chip.
|
108
107
|
These limits apply as long as an Atmega168 is selected in the
|
109
108
|
Arduino IDE, regardless of the options passed to this sketch generator.
|
data/src/lib/Denko.cpp
CHANGED
@@ -168,7 +168,14 @@ void Denko::process() {
|
|
168
168
|
|
169
169
|
// Implemented in DenkoSPIBB.cpp
|
170
170
|
#ifdef DENKO_SPI_BB
|
171
|
-
case 21:
|
171
|
+
case 21: {
|
172
|
+
// Unpack read and write lengths from their 3 shared bytes.
|
173
|
+
uint16_t readLength = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1];
|
174
|
+
uint16_t writeLength = (((uint16_t)auxMsg[3] & 0x0F) << 8) | auxMsg[2];
|
175
|
+
|
176
|
+
spiBBtransfer (auxMsg[4], auxMsg[5], auxMsg[6], pin, auxMsg[0], readLength, writeLength, &auxMsg[8]);
|
177
|
+
break;
|
178
|
+
}
|
172
179
|
case 22: spiBBaddListener (); break;
|
173
180
|
#endif
|
174
181
|
|
@@ -176,11 +183,17 @@ void Denko::process() {
|
|
176
183
|
#ifdef DENKO_SPI
|
177
184
|
case 26: {
|
178
185
|
// Do this since RP2040 crashes with reinterpet_cast of uint32_t.
|
179
|
-
uint32_t clockRate = (uint32_t)auxMsg[
|
180
|
-
clockRate |= (uint32_t)auxMsg[
|
181
|
-
clockRate |= (uint32_t)auxMsg[
|
182
|
-
clockRate |= (uint32_t)auxMsg[
|
183
|
-
|
186
|
+
uint32_t clockRate = (uint32_t)auxMsg[4];
|
187
|
+
clockRate |= (uint32_t)auxMsg[5] << 8;
|
188
|
+
clockRate |= (uint32_t)auxMsg[6] << 16;
|
189
|
+
clockRate |= (uint32_t)auxMsg[7] << 24;
|
190
|
+
|
191
|
+
// Unpack read and write lengths from their 3 shared bytes.
|
192
|
+
uint16_t readLength = (((uint16_t)auxMsg[3] & 0xF0) << 4) | auxMsg[1];
|
193
|
+
uint16_t writeLength = (((uint16_t)auxMsg[3] & 0x0F) << 8) | auxMsg[2];
|
194
|
+
|
195
|
+
spiTransfer(clockRate, pin, auxMsg[0], readLength, writeLength, &auxMsg[8]);
|
196
|
+
break;
|
184
197
|
}
|
185
198
|
case 27: spiAddListener (); break;
|
186
199
|
#endif
|
@@ -189,7 +202,7 @@ void Denko::process() {
|
|
189
202
|
#if defined(DENKO_SPI) || defined(DENKO_SPI_BB)
|
190
203
|
case 28: spiRemoveListener(); break;
|
191
204
|
#endif
|
192
|
-
|
205
|
+
|
193
206
|
// Implemented in DenkoI2CBB.cpp
|
194
207
|
#ifdef DENKO_I2C_BB
|
195
208
|
case 30: i2c_bb_search (); break;
|
@@ -239,11 +252,11 @@ void Denko::process() {
|
|
239
252
|
void Denko::updateListeners() {
|
240
253
|
currentTime = micros();
|
241
254
|
timeDiff = currentTime - lastTime;
|
242
|
-
|
255
|
+
|
243
256
|
if (timeDiff > 999) {
|
244
257
|
// Add a tick for every 1000us passed.
|
245
258
|
tickCount = tickCount + (timeDiff / 1000);
|
246
|
-
|
259
|
+
|
247
260
|
// lastTime for next run is currentTime offset by remainder.
|
248
261
|
lastTime = currentTime - (timeDiff % 1000);
|
249
262
|
|
@@ -269,7 +282,7 @@ void Denko::handshake() {
|
|
269
282
|
|
270
283
|
// Reset this so we never send Rx along with ACK:
|
271
284
|
rxBytes = 0;
|
272
|
-
|
285
|
+
|
273
286
|
// First handshake value is BOARD_MAP if set.
|
274
287
|
stream->print("ACK:");
|
275
288
|
#ifdef BOARD_MAP
|
@@ -281,7 +294,7 @@ void Denko::handshake() {
|
|
281
294
|
#ifdef DENKO_VERSION
|
282
295
|
stream->print(DENKO_VERSION);
|
283
296
|
#endif
|
284
|
-
|
297
|
+
|
285
298
|
// Third is serial buffer size.
|
286
299
|
stream->print(',');
|
287
300
|
stream->print(DENKO_SERIAL_BUFFER_SIZE);
|
@@ -289,7 +302,7 @@ void Denko::handshake() {
|
|
289
302
|
// Fourth is AUX_SIZE.
|
290
303
|
stream->print(',');
|
291
304
|
stream->print(AUX_SIZE);
|
292
|
-
|
305
|
+
|
293
306
|
// Fifth is EEPROM size. None on Due or Zero.
|
294
307
|
stream->print(',');
|
295
308
|
#if defined(EEPROM_EMULATED)
|
@@ -303,7 +316,7 @@ void Denko::handshake() {
|
|
303
316
|
#ifdef DENKO_I2C
|
304
317
|
stream->print(DENKO_I2C_BUFFER_SIZE);
|
305
318
|
#endif
|
306
|
-
|
319
|
+
|
307
320
|
// End
|
308
321
|
stream->print('\n');
|
309
322
|
}
|
data/src/lib/Denko.h
CHANGED
@@ -120,7 +120,7 @@ class Denko {
|
|
120
120
|
|
121
121
|
// Bit Bang SPI
|
122
122
|
void spiBBtransfer (uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t settings,
|
123
|
-
|
123
|
+
uint16_t rLength, uint16_t wLength, byte *data); //cmd = 21
|
124
124
|
byte spiBBtransferByte (uint8_t clock, uint8_t input, uint8_t output, uint8_t select,
|
125
125
|
uint8_t mode, uint8_t bitOrder, byte data);
|
126
126
|
void spiBBaddListener (); //cmd = 22
|
@@ -129,7 +129,7 @@ class Denko {
|
|
129
129
|
// Hardware SPI
|
130
130
|
void spiBegin (byte settings, uint32_t clockRate);
|
131
131
|
void spiEnd ();
|
132
|
-
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
|
133
133
|
void spiAddListener (); //cmd = 27
|
134
134
|
void spiReadListener (uint8_t i);
|
135
135
|
|
@@ -228,10 +228,10 @@ class Denko {
|
|
228
228
|
|
229
229
|
// How to store a SPI listener.
|
230
230
|
struct SpiListener{
|
231
|
-
uint32_t
|
231
|
+
uint32_t freq; // Frequency if hardware SPI. If bit bang: bits[0..7] = SCK pin, bits [8..15] = MOSI pin.
|
232
232
|
uint8_t select; // Select pin.
|
233
233
|
uint8_t settings; // Settings mask as given in request.
|
234
|
-
|
234
|
+
uint16_t length; // Read length as given in request.
|
235
235
|
uint8_t enabled; // 0 = disabled, 1 = hardware, 2 = bit bang.
|
236
236
|
};
|
237
237
|
SpiListener spiListeners[SPI_LISTENER_COUNT];
|
data/src/lib/DenkoDefines.h
CHANGED
@@ -28,29 +28,14 @@
|
|
28
28
|
|
29
29
|
// Define number of pins to set up listener storage.
|
30
30
|
#if defined(ESP32)
|
31
|
-
#define PIN_COUNT
|
32
|
-
#elif defined(ESP8266)
|
33
|
-
#define PIN_COUNT 18
|
34
|
-
#elif defined(ARDUINO_ARCH_RP2040)
|
35
|
-
#define PIN_COUNT 30
|
36
|
-
// These may have more physical pins, but limited to 54 by the Arduino cores.
|
37
|
-
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__SAM3X8E__)
|
38
|
-
#define PIN_COUNT 54
|
39
|
-
// Very small optimization for the 328P/UNO.
|
40
|
-
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
|
41
|
-
#define PIN_COUNT 20
|
42
|
-
// This catches ATmega32u4, SAMD21, RA4M1 etc.
|
31
|
+
#define PIN_COUNT SOC_GPIO_PIN_COUNT
|
43
32
|
#else
|
44
|
-
#define PIN_COUNT
|
33
|
+
#define PIN_COUNT NUM_DIGITAL_PINS
|
45
34
|
#endif
|
46
35
|
|
47
36
|
// Figure out how many LEDC channels are available on ESP32 boards.
|
48
37
|
#ifdef ESP32
|
49
|
-
#
|
50
|
-
#define LEDC_CHANNEL_COUNT 16
|
51
|
-
#else
|
52
|
-
#define LEDC_CHANNEL_COUNT SOC_LEDC_CHANNEL_NUM
|
53
|
-
#endif
|
38
|
+
#define LEDC_CHANNEL_COUNT SOC_LEDC_CHANNEL_NUM
|
54
39
|
#endif
|
55
40
|
|
56
41
|
// Filter for boards that can set their analog write resolution.
|
@@ -72,7 +57,7 @@
|
|
72
57
|
#elif defined(PIN_SERIAL_1_TX)
|
73
58
|
#define DENKO_UARTS 1
|
74
59
|
#endif
|
75
|
-
|
60
|
+
|
76
61
|
// ESP32 has either 1 or 2 extra UARTS enabled, depending on chip and board.
|
77
62
|
#elif defined(ESP32)
|
78
63
|
#define DENKO_UARTS (SOC_UART_NUM - 1)
|
@@ -105,15 +90,11 @@
|
|
105
90
|
#include <SoftwareSerial.h>
|
106
91
|
#endif
|
107
92
|
|
108
|
-
//
|
109
|
-
#if
|
93
|
+
// 32 + 16 bytes aux message for ATmega168. 512 + 16 bytes for all others.
|
94
|
+
#if defined(__AVR_ATmega168__)
|
110
95
|
#define AUX_SIZE 48
|
111
|
-
// If using IR_OUT or LED_ARRAY, and not on the ATmega168, 768 + 16.
|
112
|
-
#elif (defined(DENKO_IR_OUT) || defined(DENKO_LED_ARRAY)) && !defined(__AVR_ATmega168__)
|
113
|
-
#define AUX_SIZE 784
|
114
|
-
// Default aux message size to 256 + 16 bytes.
|
115
96
|
#else
|
116
|
-
#define AUX_SIZE
|
97
|
+
#define AUX_SIZE 528
|
117
98
|
#endif
|
118
99
|
|
119
100
|
// Define 'DENKO_SERIAL_IF' as the serial interface to use.
|
data/src/lib/DenkoLEDArray.cpp
CHANGED
@@ -10,9 +10,6 @@
|
|
10
10
|
//
|
11
11
|
#ifdef DENKO_LED_WS2812
|
12
12
|
#include <Adafruit_NeoPixel.h>
|
13
|
-
#ifdef ESP32
|
14
|
-
#include <esp.c>
|
15
|
-
#endif
|
16
13
|
|
17
14
|
#ifdef ARDUINO_ARCH_RP2040
|
18
15
|
Adafruit_NeoPixel ledArray;
|
@@ -32,12 +29,8 @@
|
|
32
29
|
#define WS2812_DATA_OFFSET 8
|
33
30
|
//
|
34
31
|
void Denko::showLEDArray() {
|
35
|
-
// Avoid memcpy on ESP32 by calling espShow() directly.
|
36
|
-
#ifdef ESP32
|
37
|
-
espShow(pin, &auxMsg[WS2812_DATA_OFFSET], val, true);
|
38
|
-
|
39
32
|
// Pre-init instance (one PIO) on Pi Pico.
|
40
|
-
#
|
33
|
+
#ifdef ARDUINO_ARCH_RP2040
|
41
34
|
ledArray.setPin(pin);
|
42
35
|
ledArray.updateLength(val);
|
43
36
|
memcpy(ledArray.getPixels(), &auxMsg[WS2812_DATA_OFFSET], val);
|
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.
|
@@ -92,35 +92,39 @@ void Denko::spiEnd() {
|
|
92
92
|
// auxMsg[3-6] = clock frequency (uint32_t as 4 bytes)
|
93
93
|
// auxMsg[7+] = data (bytes) (write only)
|
94
94
|
//
|
95
|
-
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) {
|
96
96
|
spiBegin(settings, clockRate);
|
97
97
|
|
98
|
-
// Stream read bytes as if coming from select pin.
|
99
|
-
if (rLength > 0) {
|
100
|
-
stream->print(select);
|
101
|
-
stream->print(':');
|
102
|
-
}
|
103
|
-
|
104
98
|
// Pull select low.
|
105
99
|
if (bitRead(settings, 6) == 1) {
|
106
100
|
pinMode(select, OUTPUT);
|
107
101
|
digitalWrite(select, LOW);
|
108
102
|
}
|
109
|
-
|
110
|
-
for (byte i = 0; (i < rLength || i < wLength); i++) {
|
111
|
-
byte b;
|
112
103
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
104
|
+
// Go one byte at a time if reading bytes out.
|
105
|
+
if (rLength > 0) {
|
106
|
+
// Stream read bytes as if coming from select pin.
|
107
|
+
stream->print(select);
|
108
|
+
stream->print(':');
|
109
|
+
|
110
|
+
for (uint16_t i=0; (i < rLength || i < wLength); i++) {
|
111
|
+
byte b;
|
118
112
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
113
|
+
if (i < wLength) {
|
114
|
+
b = SPI.transfer(data[i]);
|
115
|
+
} else {
|
116
|
+
b = SPI.transfer(0x00);
|
117
|
+
}
|
118
|
+
|
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
|
+
}
|
123
124
|
}
|
125
|
+
// Write the entire buffer at once if not reading.
|
126
|
+
} else {
|
127
|
+
SPI.transfer(data, wLength);
|
124
128
|
}
|
125
129
|
|
126
130
|
// Leave select high.
|
@@ -137,16 +141,14 @@ void Denko::spiAddListener() {
|
|
137
141
|
clockRate |= (uint32_t)auxMsg[4] << 8;
|
138
142
|
clockRate |= (uint32_t)auxMsg[5] << 16;
|
139
143
|
clockRate |= (uint32_t)auxMsg[6] << 24;
|
140
|
-
|
144
|
+
|
141
145
|
for (int i = 0; i < SPI_LISTENER_COUNT; i++) {
|
142
146
|
if (spiListeners[i].enabled == 0) {
|
143
|
-
spiListeners[i]
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
1 // Enabled = 1 sets hardware SPI listener
|
149
|
-
};
|
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
|
150
152
|
return;
|
151
153
|
} else {
|
152
154
|
// Should send some kind of error if all are in use.
|
@@ -156,7 +158,7 @@ void Denko::spiAddListener() {
|
|
156
158
|
|
157
159
|
// Called by spiUpdateListeners to read an individual hardware SPI listener.
|
158
160
|
void Denko::spiReadListener(uint8_t i) {
|
159
|
-
spiTransfer(spiListeners[i].
|
161
|
+
spiTransfer(spiListeners[i].freq,
|
160
162
|
spiListeners[i].select,
|
161
163
|
spiListeners[i].settings,
|
162
164
|
spiListeners[i].length,
|