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/src/lib/DenkoSPIBB.cpp
CHANGED
@@ -22,8 +22,8 @@
|
|
22
22
|
// auxMsg[6] = ** unused **
|
23
23
|
// auxMsg[7+] = data (bytes) (write only) - Start from 7 for parity with hardware SPI.
|
24
24
|
//
|
25
|
-
void Denko::spiBBtransfer(
|
26
|
-
|
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) {
|
27
27
|
|
28
28
|
// Mode is the lowest 2 bits of settings.
|
29
29
|
uint8_t mode = settings & 0b00000011;
|
@@ -53,7 +53,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
|
|
53
53
|
digitalWrite(select, LOW);
|
54
54
|
}
|
55
55
|
|
56
|
-
for (
|
56
|
+
for (uint16_t i=0; (i < rLength || i < wLength); i++) {
|
57
57
|
byte b;
|
58
58
|
|
59
59
|
if (i < wLength) {
|
@@ -68,7 +68,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
|
|
68
68
|
stream->print((i+1 == rLength) ? '\n' : ',');
|
69
69
|
}
|
70
70
|
}
|
71
|
-
|
71
|
+
|
72
72
|
// Leave select high.
|
73
73
|
if (bitRead(settings, 6) == 1) digitalWrite(select, HIGH);
|
74
74
|
}
|
@@ -79,7 +79,7 @@ void Denko::spiBBtransfer( uint8_t clock, uint8_t input, uint8_t output, uint8_t
|
|
79
79
|
byte Denko::spiBBtransferByte(uint8_t clock, uint8_t input, uint8_t output, uint8_t select, uint8_t mode, uint8_t bitOrder, byte data) {
|
80
80
|
// Byte to return
|
81
81
|
byte b = 0x00;
|
82
|
-
|
82
|
+
|
83
83
|
// Track which of the 8 bits we're on.
|
84
84
|
uint8_t bitPos;
|
85
85
|
|
@@ -129,13 +129,11 @@ void Denko::spiBBaddListener() {
|
|
129
129
|
for (int i = 0; i < SPI_LISTENER_COUNT; i++) {
|
130
130
|
// Overwrite the first disabled listener in the struct array.
|
131
131
|
if (spiListeners[i].enabled == 0) {
|
132
|
-
spiListeners[i]
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
2 // Enabled = 2 sets bit bang SPI listener
|
138
|
-
};
|
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
|
139
137
|
return;
|
140
138
|
} else {
|
141
139
|
// Should send some kind of error if all are in use.
|
@@ -145,8 +143,8 @@ void Denko::spiBBaddListener() {
|
|
145
143
|
|
146
144
|
// Called by spiUpdateListeners to read an individual bit bang SPI listener.
|
147
145
|
void Denko::spiBBreadListener(uint8_t i) {
|
148
|
-
spiBBtransfer((spiListeners[i].
|
149
|
-
((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
|
150
148
|
255, // Disabled output pin
|
151
149
|
spiListeners[i].select, // Select pin
|
152
150
|
spiListeners[i].settings,
|
@@ -15,19 +15,19 @@ class AnalogIOPotentiometerTest < Minitest::Test
|
|
15
15
|
part
|
16
16
|
end
|
17
17
|
|
18
|
-
assert part.smoothing
|
19
18
|
assert_equal 8, part.divider
|
20
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
|
@@ -18,19 +18,19 @@ class BusPeripheralTest < Minitest::Test
|
|
18
18
|
def bus
|
19
19
|
@bus ||= NoAddressController.new(board: board)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def part
|
23
23
|
@part ||= NoAddressPeripheral.new(bus: bus, address: 0x22)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def test_initialize
|
27
27
|
assert_equal part.board, bus
|
28
28
|
end
|
29
29
|
|
30
|
-
def test_can_use_bus_atomically
|
30
|
+
def test_can_use_bus_atomically
|
31
31
|
mock = Minitest::Mock.new
|
32
32
|
1.times {mock.expect(:call, nil)}
|
33
|
-
|
33
|
+
|
34
34
|
bus.mutex.stub(:synchronize, mock) do
|
35
35
|
part.atomically { true; false; }
|
36
36
|
end
|
@@ -29,23 +29,33 @@ class CallbacksTest < Minitest::Test
|
|
29
29
|
|
30
30
|
def callback_mutex_is_correct_class
|
31
31
|
if (RUBY_ENGINE == "ruby")
|
32
|
-
assert_equal Denko::MutexStub, part.callback_mutex.class
|
32
|
+
assert_equal Denko::MutexStub, part.instance_variable_get(:@callback_mutex).class
|
33
33
|
else
|
34
|
-
assert_equal Mutex, part.callback_mutex.class
|
34
|
+
assert_equal Mutex, part.instance_variable_get(:@callback_mutex).class
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
def test_callback_mutex
|
39
39
|
callback = Proc.new{}
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
lock_mock = Minitest::Mock.new
|
41
|
+
2.times {lock_mock.expect(:call, nil)}
|
42
|
+
|
43
|
+
unlock_mock = Minitest::Mock.new
|
44
|
+
2.times {unlock_mock.expect(:call, nil)}
|
45
|
+
|
46
|
+
mutex = part.instance_variable_get(:@callback_mutex)
|
47
|
+
mutex.stub(:lock, lock_mock) do
|
48
|
+
mutex.stub(:unlock, unlock_mock) do
|
49
|
+
part.callbacks
|
50
|
+
assert_equal({}, part.callbacks)
|
51
|
+
part.add_callback(:key, &callback)
|
52
|
+
assert part.callbacks[:key]
|
53
|
+
part.remove_callbacks(:key)
|
54
|
+
assert_equal({}, part.callbacks)
|
55
|
+
end
|
47
56
|
end
|
48
|
-
|
57
|
+
lock_mock.verify
|
58
|
+
unlock_mock.verify
|
49
59
|
end
|
50
60
|
|
51
61
|
def test_add_callback
|
@@ -32,9 +32,9 @@ class ComponentTest < Minitest::Test
|
|
32
32
|
|
33
33
|
def test_state_mutex_is_correct_class
|
34
34
|
if (RUBY_ENGINE == "ruby")
|
35
|
-
assert_equal Denko::MutexStub, part.state_mutex.class
|
35
|
+
assert_equal Denko::MutexStub, part.instance_variable_get(:@state_mutex).class
|
36
36
|
else
|
37
|
-
assert_equal Mutex, part.state_mutex.class
|
37
|
+
assert_equal Mutex, part.instance_variable_get(:@state_mutex).class
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -43,15 +43,25 @@ class ComponentTest < Minitest::Test
|
|
43
43
|
assert_equal part.state, 10
|
44
44
|
end
|
45
45
|
|
46
|
+
# ONLY for pass by value states. If state is Hash or Array, ignore mutex.
|
46
47
|
def test_state_through_mutex
|
47
|
-
|
48
|
-
2.times {
|
48
|
+
lock_mock = Minitest::Mock.new
|
49
|
+
2.times { lock_mock.expect(:call, nil) }
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
unlock_mock = Minitest::Mock.new
|
52
|
+
2.times { unlock_mock.expect(:call, nil) }
|
53
|
+
|
54
|
+
mutex = part.instance_variable_get(:@state_mutex)
|
55
|
+
mutex.stub(:lock, lock_mock) do
|
56
|
+
mutex.stub(:unlock, unlock_mock) do
|
57
|
+
part.state
|
58
|
+
part.send(:state=, 20)
|
59
|
+
end
|
53
60
|
end
|
54
|
-
|
61
|
+
|
62
|
+
lock_mock.verify
|
63
|
+
unlock_mock.verify
|
64
|
+
assert_equal 20, part.state
|
55
65
|
end
|
56
66
|
|
57
67
|
def test_micro_delay
|
data/test/board/board_test.rb
CHANGED
@@ -31,7 +31,7 @@ class BoardTest < Minitest::Test
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_set_aux_limit
|
34
|
-
assert_equal
|
34
|
+
assert_equal 528, board.aux_limit
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_set_eeprom_length
|
@@ -42,13 +42,13 @@ class BoardTest < Minitest::Test
|
|
42
42
|
assert_equal 0, board.low
|
43
43
|
assert_equal 1, board.high
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
def test_analog_resolution
|
47
47
|
assert_equal 255, board.analog_write_high
|
48
48
|
assert_equal 8, board.analog_write_resolution
|
49
49
|
assert_equal 1023, board.analog_read_high
|
50
50
|
assert_equal 10, board.analog_read_resolution
|
51
|
-
|
51
|
+
|
52
52
|
mock = Minitest::Mock.new
|
53
53
|
mock.expect(:call, nil, [Denko::Message.encode(command:96, value:12)])
|
54
54
|
mock.expect(:call, nil, [Denko::Message.encode(command:97, value:12)])
|
@@ -57,17 +57,17 @@ class BoardTest < Minitest::Test
|
|
57
57
|
board.analog_read_resolution = 12
|
58
58
|
end
|
59
59
|
mock.verify
|
60
|
-
|
60
|
+
|
61
61
|
assert_equal 0, board.low
|
62
62
|
assert_equal 12, board.analog_write_resolution
|
63
63
|
assert_equal 4095, board.analog_write_high
|
64
64
|
assert_equal 12, board.analog_read_resolution
|
65
65
|
assert_equal 4095, board.analog_read_high
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
def test_eeprom
|
69
69
|
mock = Minitest::Mock.new.expect(:call, "test eeprom", [], board: board)
|
70
|
-
Denko::EEPROM::
|
70
|
+
Denko::EEPROM::Board.stub(:new, mock) do
|
71
71
|
board.eeprom
|
72
72
|
end
|
73
73
|
mock.verify
|
@@ -85,16 +85,16 @@ class BoardTest < Minitest::Test
|
|
85
85
|
def test_update_passes_messages_to_correct_components
|
86
86
|
mock1 = Minitest::Mock.new.expect(:update, nil, ["data"])
|
87
87
|
3.times { mock1.expect(:pin, 1) }
|
88
|
-
|
88
|
+
|
89
89
|
# Make sure lines are split only on the first colon.
|
90
90
|
# Tests for string based pine names too.
|
91
91
|
mock2 = Minitest::Mock.new.expect(:update, nil, ["with:colon"])
|
92
92
|
3.times { mock2.expect(:pin, 14) }
|
93
|
-
|
93
|
+
|
94
94
|
# Special EEPROM mock.
|
95
95
|
mock3 = Minitest::Mock.new.expect(:update, nil, ["bytes"])
|
96
96
|
3.times { mock3.expect(:pin, 254) }
|
97
|
-
|
97
|
+
|
98
98
|
board.add_component(mock1)
|
99
99
|
board.add_component(mock2)
|
100
100
|
board.add_component(mock3)
|
data/test/board/one_wire_test.rb
CHANGED
@@ -2,7 +2,7 @@ require_relative '../test_helper'
|
|
2
2
|
|
3
3
|
class APIOneWireTest < Minitest::Test
|
4
4
|
include TestPacker
|
5
|
-
|
5
|
+
|
6
6
|
def connection
|
7
7
|
@connection ||= ConnectionMock.new
|
8
8
|
end
|
@@ -10,36 +10,47 @@ class APIOneWireTest < Minitest::Test
|
|
10
10
|
def board
|
11
11
|
@board ||= Denko::Board.new(connection)
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def test_one_wire_reset
|
15
15
|
board
|
16
|
-
message = Denko::Message.encode command: 41, pin: 1, value:
|
17
|
-
|
16
|
+
message = Denko::Message.encode command: 41, pin: 1, value: 0
|
17
|
+
|
18
18
|
mock = Minitest::Mock.new.expect :call, nil, [message]
|
19
19
|
connection.stub(:write, mock) do
|
20
|
-
board.one_wire_reset(1,
|
20
|
+
board.one_wire_reset(1, false)
|
21
21
|
end
|
22
22
|
mock.verify
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
|
+
def test_one_wire_reset_with_presence
|
26
|
+
board
|
27
|
+
message = Denko::Message.encode command: 41, pin: 1, value: 1
|
28
|
+
|
29
|
+
mock = Minitest::Mock.new.expect :call, nil, [message]
|
30
|
+
connection.stub(:write, mock) do
|
31
|
+
board.one_wire_reset(1, true)
|
32
|
+
end
|
33
|
+
mock.verify
|
34
|
+
end
|
35
|
+
|
25
36
|
def test_one_wire_search
|
26
37
|
board
|
27
38
|
message = Denko::Message.encode command: 42, pin: 1, aux_message: pack(:uint64, 128, max:8)
|
28
|
-
|
39
|
+
|
29
40
|
mock = Minitest::Mock.new.expect :call, nil, [message]
|
30
41
|
connection.stub(:write, mock) do
|
31
42
|
board.one_wire_search(1, 128)
|
32
43
|
end
|
33
44
|
mock.verify
|
34
45
|
end
|
35
|
-
|
46
|
+
|
36
47
|
def test_one_wire_write
|
37
48
|
board
|
38
|
-
|
49
|
+
|
39
50
|
# Calculate length and parasite power properly.
|
40
51
|
message1 = Denko::Message.encode command: 43, pin: 1, value: 0b10000000 | 3, aux_message: pack(:uint8, [1,2,3])
|
41
52
|
message2 = Denko::Message.encode command: 43, pin: 1, value: 4, aux_message: pack(:uint8, [1,2,3,4])
|
42
|
-
|
53
|
+
|
43
54
|
mock = Minitest::Mock.new
|
44
55
|
mock.expect :call, nil, [message1]
|
45
56
|
mock.expect :call, nil, [message2]
|
@@ -48,18 +59,18 @@ class APIOneWireTest < Minitest::Test
|
|
48
59
|
board.one_wire_write(1, nil, [1,2,3,4])
|
49
60
|
end
|
50
61
|
mock.verify
|
51
|
-
|
62
|
+
|
52
63
|
# Don't allow more than 127 bytes of data.
|
53
|
-
assert_raises(ArgumentError) do
|
64
|
+
assert_raises(ArgumentError) do
|
54
65
|
too_big = Array.new(128).map { 42 }
|
55
66
|
board.one_wire_write(1, true, too_big)
|
56
67
|
end
|
57
68
|
end
|
58
|
-
|
69
|
+
|
59
70
|
def test_one_wire_read
|
60
71
|
board
|
61
72
|
message = Denko::Message.encode command: 44, pin: 1, value: 9
|
62
|
-
|
73
|
+
|
63
74
|
mock = Minitest::Mock.new.expect :call, nil, [message]
|
64
75
|
connection.stub(:write, mock) do
|
65
76
|
board.one_wire_read(1, 9)
|
data/test/board/spi_test.rb
CHANGED
@@ -14,40 +14,56 @@ class APISPITest < Minitest::Test
|
|
14
14
|
@board ||= Denko::Board.new(connection)
|
15
15
|
end
|
16
16
|
|
17
|
+
def header_args
|
18
|
+
length = board.aux_limit - 8
|
19
|
+
|
20
|
+
[nil, Array.new(length){0}, length, 1000000, 0, :msbfirst]
|
21
|
+
end
|
22
|
+
|
17
23
|
def test_spi_modes
|
18
|
-
#
|
19
|
-
|
20
|
-
assert_equal (pack :uint8, 0b10000000), board.spi_header(*args)[0]
|
24
|
+
# Default to mode 0.
|
25
|
+
assert_equal (pack :uint8, 0b10000000), board.spi_header(*header_args)[0]
|
21
26
|
|
22
|
-
args[4] = 1
|
27
|
+
args = header_args.tap { |a| a[4] = 1 }
|
23
28
|
assert_equal (pack :uint8, 0b10000001), board.spi_header(*args)[0]
|
24
29
|
|
25
|
-
args[4] = 2
|
30
|
+
args = header_args.tap { |a| a[4] = 2 }
|
26
31
|
assert_equal (pack :uint8, 0b10000010), board.spi_header(*args)[0]
|
27
32
|
|
28
|
-
args[4] = 3
|
33
|
+
args = header_args.tap { |a| a[4] = 3 }
|
29
34
|
assert_equal (pack :uint8, 0b10000011), board.spi_header(*args)[0]
|
30
35
|
|
31
|
-
|
32
|
-
assert_raises(ArgumentError) { board.spi_header(*args
|
36
|
+
args = header_args.tap { |a| a[4] = 4 }
|
37
|
+
assert_raises(ArgumentError) { board.spi_header(*args) }
|
33
38
|
end
|
34
39
|
|
35
40
|
def test_spi_lsbfirst
|
36
|
-
|
41
|
+
# Default to :msbfirst
|
42
|
+
assert_equal (pack :uint8, 0b10000000), board.spi_header(*header_args)[0]
|
43
|
+
|
44
|
+
args = header_args.tap { |a| a[5] = :lsbfirst }
|
37
45
|
assert_equal (pack :uint8, 0b00000000), board.spi_header(*args)[0]
|
38
46
|
end
|
39
47
|
|
40
48
|
def test_spi_frequency
|
41
|
-
|
42
|
-
assert_equal (pack :uint32,
|
49
|
+
# Default to 1 MHz.
|
50
|
+
assert_equal (pack :uint32, 1_000_000), board.spi_header(*header_args)[4..7]
|
43
51
|
|
44
|
-
args[3] =
|
45
|
-
assert_equal (pack :uint32,
|
52
|
+
args = header_args.tap { |a| a[3] = 8_000_000 }
|
53
|
+
assert_equal (pack :uint32, 8_000_000), board.spi_header(*args)[4..7]
|
46
54
|
end
|
47
55
|
|
48
56
|
def test_spi_too_many_bytes
|
49
|
-
|
50
|
-
|
57
|
+
# Default args have maximum read and write based on aux_limit.
|
58
|
+
board.spi_header(*header_args)
|
59
|
+
|
60
|
+
# Too many write
|
61
|
+
args = header_args.tap { |a| a[1] << 0 }
|
62
|
+
assert_raises(ArgumentError) { board.spi_header(*args) }
|
63
|
+
|
64
|
+
# Too many read
|
65
|
+
args = header_args.tap { |a| a[2] += 1 }
|
66
|
+
assert_raises(ArgumentError) { board.spi_header(*args) }
|
51
67
|
end
|
52
68
|
|
53
69
|
def test_spi_no_bytes
|
@@ -16,7 +16,7 @@ class DigitalIOInputTest < Minitest::Test
|
|
16
16
|
end
|
17
17
|
mock.verify
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def test_converts_to_integer
|
21
21
|
part
|
22
22
|
part.update("1")
|
@@ -26,7 +26,7 @@ class DigitalIOInputTest < Minitest::Test
|
|
26
26
|
def test__read
|
27
27
|
mock = Minitest::Mock.new.expect :call, nil, [14]
|
28
28
|
board.stub(:digital_read, mock) do
|
29
|
-
part.
|
29
|
+
part.read_nb
|
30
30
|
end
|
31
31
|
mock.verify
|
32
32
|
end
|