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,166 @@
|
|
1
|
+
module Denko
|
2
|
+
module Display
|
3
|
+
class ST7565
|
4
|
+
include Behaviors::Lifecycle
|
5
|
+
include SPICommon
|
6
|
+
|
7
|
+
COLUMNS = 128
|
8
|
+
ROWS = 64
|
9
|
+
|
10
|
+
# Overall commands
|
11
|
+
RESET = 0b11100010
|
12
|
+
DISPLAY_ON = 0b10101111
|
13
|
+
DISPLAY_OFF = 0b10101110
|
14
|
+
ALL_POINTS_OFF = 0b10100100
|
15
|
+
ALL_POINTS_ON = 0b10100100
|
16
|
+
STATIC_INDICATOR_OFF = 0b10101100
|
17
|
+
STATIC_INDICATOR_ON = 0b10101101
|
18
|
+
|
19
|
+
def standby
|
20
|
+
command [DISPLAY_OFF, ALL_POINTS_ON]
|
21
|
+
end
|
22
|
+
|
23
|
+
def slp
|
24
|
+
command [STATIC_INDICATOR_OFF, 0b00, DISPLAY_OFF, ALL_POINTS_ON]
|
25
|
+
end
|
26
|
+
|
27
|
+
def wake
|
28
|
+
# Note static indicator stays disabled. Not sure how to use it.
|
29
|
+
command [ALL_POINTS_OFF, DISPLAY_ON, STATIC_INDICATOR_OFF, 0b00]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Overall votage commands
|
33
|
+
POWER_CONTROL = 0b00101000
|
34
|
+
LCD_BIAS_1_7 = 0b10100011
|
35
|
+
VOLUME = 0b10000001
|
36
|
+
VALID_VOLUMES = (0..63).to_a
|
37
|
+
#
|
38
|
+
# Control voltage regulator circuit. Values 0-7 are OR'ed into last 3 bits.
|
39
|
+
# 5 seems to work best for non-inverted mode, and 6 for inverted.
|
40
|
+
RESISTOR_RATIO = 0b00100000
|
41
|
+
VALID_RESISTOR_RATIOS = (0..7).to_a
|
42
|
+
|
43
|
+
def resistor_ratio=(ratio)
|
44
|
+
raise ArgumentError, "invalid resistor ratio #{ratio}" unless VALID_RESISTOR_RATIOS.include? ratio
|
45
|
+
command [RESISTOR_RATIO | ratio]
|
46
|
+
end
|
47
|
+
|
48
|
+
def volume=(value)
|
49
|
+
raise ArgumentError, "invalid volume #{value}" unless VALID_VOLUMES.include? value
|
50
|
+
command [VOLUME, value]
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Addressing and writing to display RAM.
|
55
|
+
# Always in write mode. Called Read-Modify-Write and END in datasheet.
|
56
|
+
RMW_WRITE = 0b11100000
|
57
|
+
RMW_END = 0b11101110
|
58
|
+
#
|
59
|
+
# Set page and column to start on before writing data.
|
60
|
+
# Page and column nibbles are OR'ed into lower 4 bits.
|
61
|
+
PASET = 0b10110000
|
62
|
+
CASET_UPPER = 0b00010000
|
63
|
+
CASET_LOWER = 0b00000000
|
64
|
+
#
|
65
|
+
# Control X and Y mirroring, so the display can be reflected
|
66
|
+
# in either axis, or rotated 180 degrees, in hardware.
|
67
|
+
#
|
68
|
+
# How RAM columns map to pixels. Called ADC in datasheet.
|
69
|
+
COL_NORMAL = 0b10100000
|
70
|
+
COL_REVERSE = 0b10100001
|
71
|
+
# How RAM pages map to pixels. Called Common Output Mode in datasheet.
|
72
|
+
PAGE_NORMAL = 0b11000000
|
73
|
+
PAGE_REVERSE = 0b11001000
|
74
|
+
# RAM has 132 columns. Need to start at index 4 when columns get reversed.
|
75
|
+
COL_REVERSE_COL_START = 4
|
76
|
+
|
77
|
+
def x_ram_offset
|
78
|
+
@x_ram_offset ||= 0
|
79
|
+
end
|
80
|
+
|
81
|
+
def reflect_x
|
82
|
+
@reflected_x ||= false
|
83
|
+
@reflected_x ? command([COL_NORMAL]) : command([COL_REVERSE])
|
84
|
+
@reflected_x = !@reflected_x
|
85
|
+
@x_ram_offset = @reflected_x ? COL_REVERSE_COL_START : 0
|
86
|
+
end
|
87
|
+
|
88
|
+
def reflect_y
|
89
|
+
@reflected_y ||= false
|
90
|
+
@reflected_y ? command([PAGE_NORMAL]) : command([PAGE_REVERSE])
|
91
|
+
@reflected_y = !@reflected_y
|
92
|
+
end
|
93
|
+
|
94
|
+
def rotate
|
95
|
+
reflect_x
|
96
|
+
reflect_y
|
97
|
+
end
|
98
|
+
|
99
|
+
# Control display inversion.
|
100
|
+
# White on black is OFF. Black on white ON.
|
101
|
+
INVERT_OFF = 0b10100110
|
102
|
+
INVERT_ON = 0b10100111
|
103
|
+
|
104
|
+
def invert
|
105
|
+
@inverted ||= false
|
106
|
+
if @inverted
|
107
|
+
command [INVERT_OFF]
|
108
|
+
self.resistor_ratio = 5
|
109
|
+
else
|
110
|
+
command [INVERT_ON]
|
111
|
+
self.resistor_ratio = 6
|
112
|
+
end
|
113
|
+
@inverted = !@inverted
|
114
|
+
end
|
115
|
+
|
116
|
+
after_initialize do
|
117
|
+
# Reset sequence.
|
118
|
+
reset.low if reset
|
119
|
+
sleep 0.001
|
120
|
+
reset.high if reset
|
121
|
+
command [RESET]
|
122
|
+
|
123
|
+
# Enable all power circuits:
|
124
|
+
# bit0 = voltage follower
|
125
|
+
# bit1 = voltage regulator
|
126
|
+
# bit2 = voltage booster
|
127
|
+
command [POWER_CONTROL | 0b111]
|
128
|
+
sleep 0.010
|
129
|
+
|
130
|
+
# Set LCD voltage bias ratio
|
131
|
+
command [LCD_BIAS_1_7]
|
132
|
+
|
133
|
+
# Non-inverted display by default. Set resistor ratio and volume.
|
134
|
+
self.resistor_ratio = 5
|
135
|
+
self.volume = 16
|
136
|
+
|
137
|
+
# Columns need to be reversed by default.
|
138
|
+
reflect_x
|
139
|
+
rotate if params[:rotated]
|
140
|
+
|
141
|
+
wake
|
142
|
+
end
|
143
|
+
|
144
|
+
def draw_partial(buffer, x_start, x_finish, p_start, p_finish, color=1)
|
145
|
+
x = x_start + x_ram_offset
|
146
|
+
x_lower4 = (x & 0b00001111)
|
147
|
+
x_upper4 = (x & 0b11110000) >> 4
|
148
|
+
|
149
|
+
(p_start..p_finish).each do |page|
|
150
|
+
command [RMW_WRITE]
|
151
|
+
# Set start page and column.
|
152
|
+
command [PASET | page, CASET_LOWER | x_lower4, CASET_UPPER | x_upper4]
|
153
|
+
|
154
|
+
# Get needed bytes for this page only.
|
155
|
+
src_start = (columns * page) + x_start
|
156
|
+
src_end = (columns * page) + x_finish
|
157
|
+
partial_buffer = buffer[src_start..src_end]
|
158
|
+
|
159
|
+
# Send in chunks up to maximum transfer size.
|
160
|
+
partial_buffer.each_slice(transfer_limit) { |slice| data(slice) }
|
161
|
+
command [RMW_END]
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
data/lib/denko/display.rb
CHANGED
@@ -1,7 +1,44 @@
|
|
1
|
+
require_relative "display/font"
|
2
|
+
|
3
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
4
|
+
# This allows Mruby::Build to parse and preload them instead.
|
5
|
+
DISPLAY_FILES = [
|
6
|
+
# Character Displays
|
7
|
+
[:HD44780, "hd44780"],
|
8
|
+
|
9
|
+
# Pixel display mixins and helpers
|
10
|
+
[:PixelCommon, "pixel_common"],
|
11
|
+
[:SPICommon, "spi_common"],
|
12
|
+
[:SPIEPaperCommon, "spi_epaper_common"],
|
13
|
+
[:Canvas, "canvas"],
|
14
|
+
|
15
|
+
# OLEDs
|
16
|
+
[:MonoOLED, "mono_oled"],
|
17
|
+
[:SSD1306, "ssd1306"],
|
18
|
+
[:SH1106, "sh1106"],
|
19
|
+
[:SH1107, "sh1107"],
|
20
|
+
|
21
|
+
# LCDs
|
22
|
+
[:PCD8544, "pcd8544"],
|
23
|
+
[:ST7302, "st7302"],
|
24
|
+
[:ST7565, "st7565"],
|
25
|
+
|
26
|
+
# E-paper
|
27
|
+
[:IL0373, "il0373"],
|
28
|
+
[:SSD168X, "ssd168x"],
|
29
|
+
[:SSD1680, "ssd1680"],
|
30
|
+
[:SSD1681, "ssd1681"],
|
31
|
+
]
|
32
|
+
|
1
33
|
module Denko
|
2
34
|
module Display
|
3
|
-
|
4
|
-
|
5
|
-
|
35
|
+
DISPLAY_FILES.each do |file|
|
36
|
+
file_path = "#{__dir__}/display/#{file[1]}"
|
37
|
+
if file[0]
|
38
|
+
autoload file[0], file_path
|
39
|
+
else
|
40
|
+
require file_path
|
41
|
+
end
|
42
|
+
end
|
6
43
|
end
|
7
44
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Denko
|
2
|
+
module EEPROM
|
3
|
+
class AT24C
|
4
|
+
include I2C::Peripheral
|
5
|
+
|
6
|
+
I2C_ADDRESS = 0x50
|
7
|
+
I2C_FREQUENCY = 400_000
|
8
|
+
READ_WRITE_US = 20_000
|
9
|
+
WRITE_PAGE_SIZE = 64
|
10
|
+
|
11
|
+
def int_to_reg_array(int)
|
12
|
+
[ (int >> 8) & 0xFF, int & 0xFF ]
|
13
|
+
end
|
14
|
+
|
15
|
+
def [](loc)
|
16
|
+
if loc.class == Range
|
17
|
+
index = loc.first
|
18
|
+
count = loc.count
|
19
|
+
limit = bus.board.i2c_limit
|
20
|
+
result = []
|
21
|
+
|
22
|
+
# Chunked reads based on Board#i2c_limit.
|
23
|
+
# Reading appears to cross page borders seamlessly.
|
24
|
+
while count > 0
|
25
|
+
this_count = (count > limit) ? limit : count
|
26
|
+
result += i2c_read_raw(this_count, register: int_to_reg_array(index))
|
27
|
+
index = index + this_count
|
28
|
+
count = count - this_count
|
29
|
+
end
|
30
|
+
|
31
|
+
result
|
32
|
+
else
|
33
|
+
i2c_read_raw(1, register: int_to_reg_array(loc))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def []=(loc, value)
|
38
|
+
if value.class == Array
|
39
|
+
# Start address uses up 2 bytes.
|
40
|
+
limit = bus.board.i2c_limit - 2
|
41
|
+
|
42
|
+
remaining = value.length
|
43
|
+
src_start = 0
|
44
|
+
dst_start = loc
|
45
|
+
|
46
|
+
while remaining > 0
|
47
|
+
# Limit to lowest of: remaining page size, I2C max size, or remaining bytes.
|
48
|
+
size = WRITE_PAGE_SIZE - (dst_start % WRITE_PAGE_SIZE)
|
49
|
+
size = limit if (limit < size)
|
50
|
+
size = remaining if (remaining < size)
|
51
|
+
src_end = src_start + size - 1
|
52
|
+
|
53
|
+
i2c_write(int_to_reg_array(dst_start) + value[src_start..src_end])
|
54
|
+
micro_delay(READ_WRITE_US)
|
55
|
+
|
56
|
+
remaining -= size
|
57
|
+
src_start += size
|
58
|
+
dst_start += size
|
59
|
+
end
|
60
|
+
else
|
61
|
+
i2c_write(int_to_reg_array(loc) + [value])
|
62
|
+
micro_delay(READ_WRITE_US)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Denko
|
2
|
+
module EEPROM
|
3
|
+
class Board
|
4
|
+
include Behaviors::Component
|
5
|
+
include Behaviors::Reader
|
6
|
+
|
7
|
+
def max_eeperom_txn
|
8
|
+
@max_eeeprom_txn ||= board.aux_limit - 3
|
9
|
+
end
|
10
|
+
|
11
|
+
def length
|
12
|
+
board.eeprom_length
|
13
|
+
end
|
14
|
+
|
15
|
+
def pin
|
16
|
+
254
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](loc)
|
20
|
+
if loc.class == Range
|
21
|
+
index = loc.first
|
22
|
+
remaining = loc.count
|
23
|
+
result = []
|
24
|
+
|
25
|
+
while remaining > 0
|
26
|
+
size = (max_eeperom_txn < remaining) ? max_eeperom_txn : remaining
|
27
|
+
end_address = index + size - 1
|
28
|
+
raise ArgumentError, "EEPROM address #{end_address} out of range" if (end_address >= length)
|
29
|
+
|
30
|
+
result += read_using -> { board.eeprom_read(index, size) }
|
31
|
+
index += size
|
32
|
+
remaining -= size
|
33
|
+
end
|
34
|
+
result
|
35
|
+
else
|
36
|
+
bytes = read_using -> { board.eeprom_read(loc, 1) }
|
37
|
+
bytes[0]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def []=(loc, value)
|
42
|
+
if value.class == Array
|
43
|
+
remaining = value.length
|
44
|
+
src_start = 0
|
45
|
+
dst_start = loc
|
46
|
+
|
47
|
+
while remaining > 0
|
48
|
+
size = (max_eeperom_txn < remaining) ? max_eeperom_txn : remaining
|
49
|
+
src_end = src_start + size - 1
|
50
|
+
raise ArgumentError, "EEPROM address #{src_end} out of range" if (src_end >= length)
|
51
|
+
|
52
|
+
board.eeprom_write(dst_start, value[src_start..src_end])
|
53
|
+
|
54
|
+
remaining -= size
|
55
|
+
src_start += size
|
56
|
+
dst_start += size
|
57
|
+
end
|
58
|
+
else
|
59
|
+
board.eeprom_write(loc, [value])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def pre_callback_filter(message)
|
64
|
+
# address = message.split("-", 2)[0].to_i
|
65
|
+
bytes = message.split("-", 2)[1].split(",").map(&:to_i)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/denko/eeprom.rb
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
EEPROM_FILES = [
|
4
|
+
[:Board, "board"],
|
5
|
+
[:AT24C, "at24c"],
|
6
|
+
]
|
7
|
+
|
1
8
|
module Denko
|
2
9
|
module EEPROM
|
3
|
-
|
10
|
+
EEPROM_FILES.each do |file|
|
11
|
+
file_path = "#{__dir__}/eeprom/#{file[1]}"
|
12
|
+
if file[0]
|
13
|
+
autoload file[0], file_path
|
14
|
+
else
|
15
|
+
require file_path
|
16
|
+
end
|
17
|
+
end
|
4
18
|
end
|
5
19
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Denko
|
2
|
+
module I2C
|
3
|
+
class BitBang
|
4
|
+
include Behaviors::MultiPin
|
5
|
+
include Behaviors::Lifecycle
|
6
|
+
include BusCommon
|
7
|
+
|
8
|
+
def initialize_pins(options={})
|
9
|
+
proxy_pin :scl, DigitalIO::CBitBang
|
10
|
+
proxy_pin :sda, DigitalIO::CBitBang
|
11
|
+
end
|
12
|
+
|
13
|
+
after_initialize do
|
14
|
+
# Data received for the SDA pin is really for the bus.
|
15
|
+
sda.add_callback(:bus_forwarder) { |data| self.update(data) }
|
16
|
+
board.i2c_bb_setup(pins[:scl], pins[:sda])
|
17
|
+
end
|
18
|
+
|
19
|
+
def _search
|
20
|
+
board.i2c_bb_search(pins[:scl], pins[:sda])
|
21
|
+
end
|
22
|
+
|
23
|
+
def write(address, bytes, frequency=nil, repeated_start=false)
|
24
|
+
board.i2c_bb_write(pins[:scl], pins[:sda], address, bytes, repeated_start)
|
25
|
+
end
|
26
|
+
|
27
|
+
def _read(address, register, num_bytes, frequency=nil, repeated_start=false)
|
28
|
+
board.i2c_bb_read(pins[:scl], pins[:sda], address, register, num_bytes, repeated_start)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/denko/i2c/bus.rb
CHANGED
@@ -1,51 +1,23 @@
|
|
1
1
|
module Denko
|
2
2
|
module I2C
|
3
3
|
class Bus
|
4
|
-
include Behaviors::
|
5
|
-
include
|
6
|
-
include Behaviors::Reader
|
4
|
+
include Behaviors::Lifecycle
|
5
|
+
include BusCommon
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
def after_initialize(options={})
|
11
|
-
super(options)
|
12
|
-
@found_devices = []
|
13
|
-
bubble_callbacks
|
7
|
+
def i2c_index
|
8
|
+
@i2c_index ||= params[:i2c_index] || params[:index] || 0
|
14
9
|
end
|
15
10
|
|
16
|
-
def
|
17
|
-
|
18
|
-
@found_devices = addresses.split(":").map(&:to_i) if addresses
|
11
|
+
def _search
|
12
|
+
board.i2c_search(i2c_index)
|
19
13
|
end
|
20
14
|
|
21
15
|
def write(address, bytes, frequency=100000, repeated_start=false)
|
22
|
-
board.i2c_write(address, bytes, frequency, repeated_start)
|
16
|
+
board.i2c_write(i2c_index, address, bytes, frequency, repeated_start)
|
23
17
|
end
|
24
18
|
|
25
19
|
def _read(address, register, num_bytes, frequency=100000, repeated_start=false)
|
26
|
-
board.i2c_read(address, register, num_bytes, frequency, repeated_start)
|
27
|
-
end
|
28
|
-
|
29
|
-
def bubble_callbacks
|
30
|
-
add_callback(:bus_controller) do |str|
|
31
|
-
if str && str.match(/\A\d+-/)
|
32
|
-
address, data = str.split("-", 2)
|
33
|
-
address = address.to_i
|
34
|
-
|
35
|
-
data = data.split(",").map(&:to_i)
|
36
|
-
data = nil if data.empty?
|
37
|
-
|
38
|
-
update_component(address, data)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def update_component(address, data)
|
44
|
-
components.each do |component|
|
45
|
-
if component.address == address
|
46
|
-
component.update(data)
|
47
|
-
end
|
48
|
-
end
|
20
|
+
board.i2c_read(i2c_index, address, register, num_bytes, frequency, repeated_start)
|
49
21
|
end
|
50
22
|
end
|
51
23
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Denko
|
2
|
+
module I2C
|
3
|
+
module BusCommon
|
4
|
+
include Behaviors::BusControllerAddressed
|
5
|
+
include Behaviors::Reader
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
|
8
|
+
after_initialize do
|
9
|
+
bubble_callbacks
|
10
|
+
end
|
11
|
+
|
12
|
+
def found_devices
|
13
|
+
@found_devices ||= []
|
14
|
+
end
|
15
|
+
|
16
|
+
def search
|
17
|
+
addresses = read_using -> { _search }
|
18
|
+
if addresses.class == String
|
19
|
+
@found_devices = addresses.split(":").map(&:to_i).reject{ |e| e==0 }
|
20
|
+
elsif addresses.class == Array
|
21
|
+
# 0th element being 0 (invalid address) means the array contains search results,
|
22
|
+
# instead of bytes read from a peripheral. Remove it.
|
23
|
+
@found_devices = addresses - [0]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def bubble_callbacks
|
28
|
+
add_callback(:bus_controller) do |data|
|
29
|
+
bytes = nil
|
30
|
+
|
31
|
+
# Array data from PiBoard.
|
32
|
+
if data.class == Array
|
33
|
+
address = data[0]
|
34
|
+
bytes = data[1..-1]
|
35
|
+
|
36
|
+
# String data from microcontroller.
|
37
|
+
elsif (data.class == String) && (data.match /\A\d+-/)
|
38
|
+
address, bytes = data.split("-", 2)
|
39
|
+
address = address.to_i
|
40
|
+
bytes = bytes.split(",").map(&:to_i)
|
41
|
+
bytes = nil if bytes.empty?
|
42
|
+
end
|
43
|
+
|
44
|
+
# Update components.
|
45
|
+
components.each { |c| c.update(bytes) if c.address == address } if bytes
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/denko/i2c/peripheral.rb
CHANGED
@@ -3,35 +3,48 @@ module Denko
|
|
3
3
|
module Peripheral
|
4
4
|
include Behaviors::BusPeripheralAddressed
|
5
5
|
include Behaviors::Reader
|
6
|
+
include Behaviors::Lifecycle
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
# Set I2C defaults for including classes by defining these constants in them.
|
9
|
+
I2C_ADDRESS = nil
|
10
|
+
I2C_FREQUENCY = 100_000
|
11
|
+
I2C_REPEATED_START = false
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
def i2c_default(sym)
|
14
|
+
const_sym = "I2C_#{sym}".upcase.to_sym
|
15
|
+
self.class.const_get(const_sym) if self.class.const_defined?(const_sym)
|
16
|
+
end
|
14
17
|
|
15
|
-
|
16
|
-
|
17
|
-
@
|
18
|
+
# Use @address instead of @i2c_address for default BusPeripheral behavior.
|
19
|
+
def address
|
20
|
+
@address ||= params[:i2c_address] || params[:address] || i2c_default(:address)
|
21
|
+
end
|
22
|
+
alias :i2c_address :address
|
18
23
|
|
19
|
-
|
20
|
-
|
21
|
-
|
24
|
+
def i2c_frequency
|
25
|
+
@i2c_frequency ||= params[:i2c_frequency] || params[:frequency] || i2c_default(:frequency)
|
26
|
+
end
|
22
27
|
|
23
|
-
|
28
|
+
def i2c_repeated_start
|
29
|
+
return @i2c_repeated_start unless @i2c_repeated_start.nil?
|
30
|
+
@i2c_repeated_start = params[:i2c_repeated_start] if @i2c_repeated_start.nil?
|
31
|
+
@i2c_repeated_start = params[:repeated_start] if @i2c_repeated_start.nil?
|
32
|
+
@i2c_repeated_start = i2c_default(:repeated_start) if @i2c_repeated_start.nil?
|
33
|
+
@i2c_repeated_start
|
24
34
|
end
|
25
|
-
|
26
|
-
|
27
|
-
alias :i2c_address :address
|
35
|
+
|
36
|
+
attr_writer :i2c_frequency, :i2c_repeated_start
|
28
37
|
|
29
38
|
def i2c_write(bytes=[])
|
30
|
-
bus.write(
|
39
|
+
bus.write(i2c_address, bytes, i2c_frequency, i2c_repeated_start)
|
40
|
+
end
|
41
|
+
|
42
|
+
def i2c_read(num_bytes, register: nil)
|
43
|
+
bus.read_nb(i2c_address, register, num_bytes, i2c_frequency, i2c_repeated_start)
|
31
44
|
end
|
32
45
|
|
33
|
-
def
|
34
|
-
bus.
|
46
|
+
def i2c_read_raw(num_bytes, register: nil)
|
47
|
+
read_raw -> { bus.read_nb(i2c_address, register, num_bytes, i2c_frequency, i2c_repeated_start)}
|
35
48
|
end
|
36
49
|
end
|
37
50
|
end
|
data/lib/denko/i2c.rb
CHANGED
@@ -1,6 +1,21 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
I2C_FILES = [
|
4
|
+
[:BusCommon, "bus_common"],
|
5
|
+
[:Bus, "bus"],
|
6
|
+
[:BitBang, "bit_bang"],
|
7
|
+
[:Peripheral, "peripheral"],
|
8
|
+
]
|
9
|
+
|
1
10
|
module Denko
|
2
11
|
module I2C
|
3
|
-
|
4
|
-
|
12
|
+
I2C_FILES.each do |file|
|
13
|
+
file_path = "#{__dir__}/i2c/#{file[1]}"
|
14
|
+
if file[0]
|
15
|
+
autoload file[0], file_path
|
16
|
+
else
|
17
|
+
require file_path
|
18
|
+
end
|
19
|
+
end
|
5
20
|
end
|
6
21
|
end
|