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
@@ -7,7 +7,8 @@ module Denko
|
|
7
7
|
module Display
|
8
8
|
class HD44780
|
9
9
|
include Behaviors::MultiPin
|
10
|
-
|
10
|
+
include Behaviors::Lifecycle
|
11
|
+
|
11
12
|
# Commands
|
12
13
|
LCD_CLEARDISPLAY = 0x01
|
13
14
|
LCD_RETURNHOME = 0x02
|
@@ -17,13 +18,13 @@ module Denko
|
|
17
18
|
LCD_FUNCTIONSET = 0x20
|
18
19
|
LCD_SETCGRAMADDR = 0x40
|
19
20
|
LCD_SETDDRAMADDR = 0x80
|
20
|
-
|
21
|
+
|
21
22
|
# Flags for display entry mode
|
22
23
|
LCD_ENTRYRIGHT = 0x00
|
23
24
|
LCD_ENTRYLEFT = 0x02
|
24
25
|
LCD_ENTRYSHIFTINCREMENT = 0x01
|
25
26
|
LCD_ENTRYSHIFTDECREMENT = 0x00
|
26
|
-
|
27
|
+
|
27
28
|
# Flags for display on/off control
|
28
29
|
LCD_DISPLAYON = 0x04
|
29
30
|
LCD_DISPLAYOFF = 0x00
|
@@ -31,13 +32,13 @@ module Denko
|
|
31
32
|
LCD_CURSOROFF = 0x00
|
32
33
|
LCD_BLINKON = 0x01
|
33
34
|
LCD_BLINKOFF = 0x00
|
34
|
-
|
35
|
+
|
35
36
|
# Flags for display/cursor shift
|
36
37
|
LCD_DISPLAYMOVE = 0x08
|
37
38
|
LCD_CURSORMOVE = 0x00
|
38
39
|
LCD_MOVERIGHT = 0x04
|
39
40
|
LCD_MOVELEFT = 0x00
|
40
|
-
|
41
|
+
|
41
42
|
# Flags for function set
|
42
43
|
LCD_8BITMODE = 0x10
|
43
44
|
LCD_4BITMODE = 0x00
|
@@ -46,88 +47,110 @@ module Denko
|
|
46
47
|
LCD_5x10DOTS = 0x04
|
47
48
|
LCD_5x8DOTS = 0x00
|
48
49
|
|
50
|
+
def data_lines
|
51
|
+
@data_lines ||= 4
|
52
|
+
end
|
53
|
+
|
54
|
+
# Default to 16x2 display if columns and rows given.
|
55
|
+
def columns
|
56
|
+
@columns ||= params[:columns] || 16
|
57
|
+
end
|
58
|
+
|
59
|
+
def rows
|
60
|
+
@rows ||= params[:rows] || 2
|
61
|
+
end
|
62
|
+
|
63
|
+
# Fuction set byte to set up the LCD. These OR'ed defaults == 0x00.
|
64
|
+
def function
|
65
|
+
@function ||= LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS
|
66
|
+
end
|
67
|
+
|
68
|
+
# Offset memory address when moving cursor.
|
69
|
+
# Row 2 always starts at memory address 0x40.
|
70
|
+
# For 4 line LCDs:
|
71
|
+
# Row 3 is immediately after row 1, +16 or 20 bytes, depending on columns.
|
72
|
+
# Row 4 is immediately after row 2, +16 or 20 bytes, depending on columns.
|
73
|
+
def row_offsets
|
74
|
+
@row_offsets ||= [0x00, 0x40, 0x00+columns, 0x40+columns]
|
75
|
+
end
|
76
|
+
|
77
|
+
# Start with cursor off and no cursor blink.
|
78
|
+
def control
|
79
|
+
@control ||= LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF
|
80
|
+
end
|
81
|
+
|
82
|
+
def entry_mode
|
83
|
+
@entry_mode ||= LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT
|
84
|
+
end
|
85
|
+
|
86
|
+
attr_writer :columns, :rows, :function, :data_lines, :row_offsets, :control, :entry_mode
|
87
|
+
|
49
88
|
def initialize_pins(options={})
|
50
89
|
# All the required pins.
|
51
90
|
[:rs, :enable, :d4, :d5, :d6, :d7].each do |symbol|
|
52
91
|
proxy_pin(symbol, DigitalIO::Output)
|
53
92
|
end
|
54
|
-
|
93
|
+
|
55
94
|
# If any of d0-d3 was given, make them all non-optional.
|
56
95
|
lower_bits_optional = (self.pins.keys & [:d0, :d1, :d2, :d3]).empty?
|
57
96
|
[:d0, :d1, :d2, :d3].each do |symbol|
|
58
97
|
proxy_pin(symbol, DigitalIO::Output, optional: lower_bits_optional)
|
59
98
|
end
|
60
|
-
|
61
|
-
# RW pin
|
62
|
-
proxy_pin
|
99
|
+
|
100
|
+
# RW pin can be hardwired to GND, or given. Will be always pulled low.
|
101
|
+
proxy_pin :rw, DigitalIO::Output, optional: true
|
102
|
+
|
103
|
+
# Backlight can be hardwired, given here, or modeled as a separate component.
|
104
|
+
# If HD44780 is on a digital register, and PWM is desired, use a separate component.
|
105
|
+
proxy_pin :backlight, LED::Base, optional: true
|
63
106
|
end
|
64
107
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
# Default to 16x2 display if no options given.
|
69
|
-
@columns = options[:columns] || 16
|
70
|
-
@rows = options[:rows] || 2
|
71
|
-
|
72
|
-
# Create a fuction set byte to set up the LCD. These defaults equal 0x00.
|
73
|
-
@function = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS
|
74
|
-
|
75
|
-
# Set 8-bit mode in the mask if d0-d3 are present.
|
108
|
+
after_initialize do
|
109
|
+
# Switch to 8-bit mode if d0-d3 are present.
|
76
110
|
if (d0 && d1 && d2 && d3)
|
77
|
-
|
78
|
-
|
79
|
-
else
|
80
|
-
@bits = 4
|
111
|
+
self.data_lines = 8
|
112
|
+
self.function |= LCD_8BITMODE
|
81
113
|
end
|
82
114
|
|
83
115
|
# Set 2 line (row) mode if needed.
|
84
|
-
|
116
|
+
self.function |= LCD_2LINE if (rows > 1)
|
85
117
|
|
86
118
|
# Some 1 line displays can use a 5x10 font.
|
87
|
-
|
88
|
-
|
89
|
-
# Offset memory address when moving cursor.
|
90
|
-
# Row 2 always starts at memory address 0x40.
|
91
|
-
# For 4 line LCDs:
|
92
|
-
# Row 3 is immediately after row 1, +16 or 20 bytes, depending on columns.
|
93
|
-
# Row 4 is immediately after row 2, +16 or 20 bytes, depending on columns.
|
94
|
-
@row_offsets = [0x00, 0x40, 0x00+@columns, 0x40+@columns]
|
95
|
-
|
119
|
+
self.function |= LCD_5x10DOTS if params[:tall_font] && (rows == 1)
|
120
|
+
|
96
121
|
# Wait 50ms for power to be > 2.7V, then pull everything low.
|
97
122
|
micro_delay(50000)
|
98
123
|
enable.low; rs.low; rw.low if rw
|
99
124
|
|
100
125
|
# Start in 4-bit mode.
|
101
|
-
if
|
126
|
+
if data_lines == 4
|
102
127
|
# Keep setting 8-bit mode until ready.
|
103
128
|
command(0x03); micro_delay(4500)
|
104
129
|
command(0x03); micro_delay(4500)
|
105
130
|
command(0x03); micro_delay(150)
|
106
|
-
|
131
|
+
|
107
132
|
# Set 4-bit mode.
|
108
133
|
command(0x02)
|
109
|
-
|
134
|
+
|
110
135
|
# Or start in 8 bit mode.
|
111
136
|
else
|
112
|
-
command(LCD_FUNCTIONSET |
|
137
|
+
command(LCD_FUNCTIONSET | function)
|
113
138
|
micro_delay(4500)
|
114
|
-
command(LCD_FUNCTIONSET |
|
139
|
+
command(LCD_FUNCTIONSET | function)
|
115
140
|
micro_delay(150)
|
116
|
-
command(LCD_FUNCTIONSET |
|
141
|
+
command(LCD_FUNCTIONSET | function)
|
117
142
|
end
|
118
|
-
|
143
|
+
|
119
144
|
# Set functions (lines, font size, etc.).
|
120
|
-
command(LCD_FUNCTIONSET |
|
145
|
+
command(LCD_FUNCTIONSET | function)
|
121
146
|
|
122
|
-
# Start with cursor off and no cursor blink.
|
123
|
-
@control = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF
|
124
147
|
display_on
|
125
148
|
clear
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
command(LCD_ENTRYMODESET |
|
130
|
-
|
149
|
+
backlight.on if backlight
|
150
|
+
|
151
|
+
# Write entry mode.
|
152
|
+
command(LCD_ENTRYMODESET | entry_mode)
|
153
|
+
|
131
154
|
# Need this small delay to avoid garbage data on startup.
|
132
155
|
sleep 0.05
|
133
156
|
end
|
@@ -142,17 +165,17 @@ module Denko
|
|
142
165
|
micro_delay(2000)
|
143
166
|
end
|
144
167
|
|
145
|
-
def
|
168
|
+
def text_cursor(col, row)
|
146
169
|
# Limit to the highest row, 0 indexed.
|
147
|
-
row = (
|
148
|
-
command(LCD_SETDDRAMADDR | (col +
|
170
|
+
row = (rows - 1) if row > (rows - 1)
|
171
|
+
command(LCD_SETDDRAMADDR | (col + row_offsets[row]))
|
149
172
|
end
|
150
|
-
alias :move_to :
|
151
|
-
|
152
|
-
def
|
153
|
-
|
173
|
+
alias :move_to :text_cursor
|
174
|
+
|
175
|
+
def text(str)
|
176
|
+
str.each_byte { |b| write b }
|
154
177
|
end
|
155
|
-
|
178
|
+
|
156
179
|
#
|
157
180
|
# Create a #key_on and #key_off method for each feature in this hash,
|
158
181
|
# using the constant in the value to send a control signal.
|
@@ -160,58 +183,58 @@ module Denko
|
|
160
183
|
# Eg. #display_on and #display_off.
|
161
184
|
#
|
162
185
|
CONTROL_TOGGLES = {
|
163
|
-
display
|
164
|
-
cursor
|
165
|
-
blink
|
186
|
+
"display" => LCD_DISPLAYON,
|
187
|
+
"cursor" => LCD_CURSORON,
|
188
|
+
"blink" => LCD_BLINKON,
|
166
189
|
}
|
167
190
|
CONTROL_TOGGLES.each_key do |key|
|
168
|
-
define_method (key
|
169
|
-
command LCD_DISPLAYCONTROL | (
|
191
|
+
define_method (key + "_off") do
|
192
|
+
command LCD_DISPLAYCONTROL | (self.control &= ~CONTROL_TOGGLES[key])
|
170
193
|
end
|
171
|
-
define_method (key
|
172
|
-
command LCD_DISPLAYCONTROL | (
|
194
|
+
define_method (key + "_on") do
|
195
|
+
command LCD_DISPLAYCONTROL | (self.control |= CONTROL_TOGGLES[key])
|
173
196
|
end
|
174
197
|
end
|
175
|
-
|
198
|
+
|
176
199
|
def left_to_right
|
177
|
-
|
178
|
-
command(LCD_ENTRYMODESET |
|
200
|
+
self.entry_mode |= LCD_ENTRYLEFT
|
201
|
+
command(LCD_ENTRYMODESET | entry_mode)
|
179
202
|
end
|
180
|
-
|
203
|
+
|
181
204
|
def right_to_left
|
182
|
-
|
183
|
-
command(LCD_ENTRYMODESET |
|
205
|
+
self.entry_mode &= ~LCD_ENTRYLEFT
|
206
|
+
command(LCD_ENTRYMODESET | entry_mode)
|
184
207
|
end
|
185
|
-
|
208
|
+
|
186
209
|
def scroll_left
|
187
210
|
command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT)
|
188
211
|
end
|
189
|
-
|
212
|
+
|
190
213
|
def scroll_right
|
191
214
|
command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT)
|
192
215
|
end
|
193
|
-
|
216
|
+
|
194
217
|
def autoscroll_on
|
195
|
-
|
196
|
-
command(LCD_ENTRYMODESET |
|
218
|
+
self.entry_mode |= LCD_ENTRYSHIFTINCREMENT;
|
219
|
+
command(LCD_ENTRYMODESET | entry_mode);
|
197
220
|
end
|
198
|
-
|
221
|
+
|
199
222
|
def autoscroll_off
|
200
|
-
|
201
|
-
command(LCD_ENTRYMODESET |
|
223
|
+
self.entry_mode &= ~LCD_ENTRYSHIFTINCREMENT;
|
224
|
+
command(LCD_ENTRYMODESET | entry_mode);
|
202
225
|
end
|
203
|
-
|
226
|
+
|
204
227
|
# Define custom characters as bitmaps.
|
205
228
|
def create_char(location, bitmap)
|
206
229
|
location &= 0x7
|
207
230
|
command(LCD_SETCGRAMADDR | (location << 3))
|
208
231
|
bitmap.each { |byte| write byte }
|
209
232
|
end
|
210
|
-
|
233
|
+
|
211
234
|
def command(byte)
|
212
235
|
send(byte, board.low)
|
213
236
|
end
|
214
|
-
|
237
|
+
|
215
238
|
def write(byte)
|
216
239
|
send(byte, board.high)
|
217
240
|
end
|
@@ -219,38 +242,62 @@ module Denko
|
|
219
242
|
def send(byte, rs_level)
|
220
243
|
# RS pin goes low to send commands, high to send data.
|
221
244
|
rs.write(rs_level) unless rs.state == rs_level
|
222
|
-
|
223
|
-
|
245
|
+
|
224
246
|
# Get the byte as a string of 0s and 1s, LSBFIRST.
|
225
247
|
bits_from_byte = byte.to_s(2).rjust(8, "0").reverse
|
226
|
-
|
248
|
+
|
227
249
|
# Write bits depending on connection.
|
228
|
-
|
250
|
+
data_lines == 8 ? write8(bits_from_byte) : write4(bits_from_byte)
|
229
251
|
end
|
230
|
-
|
252
|
+
|
231
253
|
def write4(bits)
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
254
|
+
if board.is_a_register?
|
255
|
+
board.bit_set(d4.pin, bits[4].to_i)
|
256
|
+
board.bit_set(d5.pin, bits[5].to_i)
|
257
|
+
board.bit_set(d6.pin, bits[6].to_i)
|
258
|
+
d7.write bits[7].to_i
|
259
|
+
pulse_enable
|
260
|
+
board.bit_set(d4.pin, bits[0].to_i)
|
261
|
+
board.bit_set(d5.pin, bits[1].to_i)
|
262
|
+
board.bit_set(d6.pin, bits[2].to_i)
|
263
|
+
d7.write bits[3].to_i
|
264
|
+
pulse_enable
|
265
|
+
else
|
266
|
+
d4.write bits[4].to_i
|
267
|
+
d5.write bits[5].to_i
|
268
|
+
d6.write bits[6].to_i
|
269
|
+
d7.write bits[7].to_i
|
270
|
+
pulse_enable
|
271
|
+
d4.write bits[0].to_i
|
272
|
+
d5.write bits[1].to_i
|
273
|
+
d6.write bits[2].to_i
|
274
|
+
d7.write bits[3].to_i
|
275
|
+
pulse_enable
|
276
|
+
end
|
242
277
|
end
|
243
278
|
|
244
279
|
def write8(bits)
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
280
|
+
if board.is_a_register?
|
281
|
+
board.bit_set(d0.pin, bits[0].to_i)
|
282
|
+
board.bit_set(d1.pin, bits[1].to_i)
|
283
|
+
board.bit_set(d2.pin, bits[2].to_i)
|
284
|
+
board.bit_set(d3.pin, bits[3].to_i)
|
285
|
+
board.bit_set(d4.pin, bits[4].to_i)
|
286
|
+
board.bit_set(d5.pin, bits[5].to_i)
|
287
|
+
board.bit_set(d6.pin, bits[6].to_i)
|
288
|
+
d7.write bits[7].to_i
|
289
|
+
pulse_enable
|
290
|
+
else
|
291
|
+
d0.write bits[0].to_i
|
292
|
+
d1.write bits[1].to_i
|
293
|
+
d2.write bits[2].to_i
|
294
|
+
d3.write bits[3].to_i
|
295
|
+
d4.write bits[4].to_i
|
296
|
+
d5.write bits[5].to_i
|
297
|
+
d6.write bits[6].to_i
|
298
|
+
d7.write bits[7].to_i
|
299
|
+
pulse_enable
|
300
|
+
end
|
254
301
|
end
|
255
302
|
|
256
303
|
def pulse_enable
|
@@ -0,0 +1,186 @@
|
|
1
|
+
module Denko
|
2
|
+
module Display
|
3
|
+
class IL0373
|
4
|
+
include SPIEPaperCommon
|
5
|
+
include Behaviors::Lifecycle
|
6
|
+
|
7
|
+
COLUMNS = 212
|
8
|
+
ROWS = 104
|
9
|
+
|
10
|
+
# Subset of used commands from datasheet:
|
11
|
+
PANEL_SETTING = 0x00
|
12
|
+
POWER_SETTING = 0x01
|
13
|
+
POWER_OFF = 0x02
|
14
|
+
POWER_OFF_SEQUENCE = 0x03
|
15
|
+
POWER_ON = 0x04
|
16
|
+
POWER_ON_MEASURE = 0x05
|
17
|
+
BOOSTER_SOFT_START = 0x06
|
18
|
+
DEEP_SLEEP = 0x07
|
19
|
+
DATA_START_1 = 0x10
|
20
|
+
DATA_STOP = 0x11
|
21
|
+
DISPLAY_REFRESH = 0x12
|
22
|
+
DATA_START_2 = 0x13
|
23
|
+
VCOM_DATA_SETTING = 0x50
|
24
|
+
RESOLUTION_SETTING = 0x61
|
25
|
+
PARTIAL_WINDOW = 0x90
|
26
|
+
PARTIAL_IN = 0x91
|
27
|
+
PARTIAL_OUT = 0x92
|
28
|
+
|
29
|
+
def set_power_setting
|
30
|
+
# Defaults from datasheet.
|
31
|
+
command [POWER_SETTING]
|
32
|
+
data [0x03, 0x00, 0x26, 0x26, 0x03]
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_panel_setting
|
36
|
+
# NOT DEFAULTS
|
37
|
+
# From datasheet:
|
38
|
+
# Bits 7..6: Enable all source and gate channels
|
39
|
+
# Bit 5: 0 = LUT from OTP
|
40
|
+
# Bit 4: 0 = B/W/R mode, 1 = B/W mode
|
41
|
+
# Bit 3: 0 = Gate scan decrements (1 increments)
|
42
|
+
# Bit 2: 0 = Source scan decrements (1 increments)
|
43
|
+
# Bit 1: 1 = Enable booster
|
44
|
+
# Bit 0: 1 = Soft reset
|
45
|
+
value = 0b0000_0011
|
46
|
+
|
47
|
+
# Handle colors
|
48
|
+
value |= (1 << 4) if colors == 2
|
49
|
+
|
50
|
+
# Handle screen size
|
51
|
+
source_gate_bits = 0b11
|
52
|
+
source_gate_bits = 0b10 if (rows <= 128)
|
53
|
+
source_gate_bits = 0b01 if (rows <= 96) && (columns <= 252)
|
54
|
+
source_gate_bits = 0b00 if (rows <= 96) && (columns <= 230)
|
55
|
+
value |= source_gate_bits
|
56
|
+
|
57
|
+
# Handle hardware reflection/rotation
|
58
|
+
value |= (1 << 2) if @reflect_y
|
59
|
+
value |= (1 << 3) if @reflect_x
|
60
|
+
|
61
|
+
command [PANEL_SETTING]
|
62
|
+
data [value]
|
63
|
+
end
|
64
|
+
|
65
|
+
def reflect_x
|
66
|
+
@reflect_x = !@reflect_x
|
67
|
+
end
|
68
|
+
|
69
|
+
def reflect_y
|
70
|
+
@reflect_y = !@reflect_y
|
71
|
+
end
|
72
|
+
|
73
|
+
def rotate
|
74
|
+
@reflect_x = !@reflect_x
|
75
|
+
@reflect_y = !@reflect_y
|
76
|
+
end
|
77
|
+
|
78
|
+
def set_vcom_data_setting
|
79
|
+
# Default value from data sheet.
|
80
|
+
value = 0b0000_0111
|
81
|
+
|
82
|
+
# Datsheet may be wrong here. Bit 5 set seems to always invert DATA2, so Bit 4 does DATA1?
|
83
|
+
# In B/W mode: set bit 5 to avoid black channel inversion relative to Canvas.
|
84
|
+
# In B/W/R mode: set bit 4 to avoid black channel inversion relative to Canvas.
|
85
|
+
if (colors == 2)
|
86
|
+
value |= (1 << 4) unless @invert_black
|
87
|
+
else
|
88
|
+
value |= (1 << 5) unless @invert_black
|
89
|
+
end
|
90
|
+
|
91
|
+
command [VCOM_DATA_SETTING]
|
92
|
+
data [value]
|
93
|
+
end
|
94
|
+
|
95
|
+
def invert_black
|
96
|
+
@invert_black = !@invert_black
|
97
|
+
end
|
98
|
+
|
99
|
+
def set_resolution
|
100
|
+
command [RESOLUTION_SETTING]
|
101
|
+
data [
|
102
|
+
p_max+1 << 3,
|
103
|
+
(columns >> 8) & 0b1,
|
104
|
+
columns & 0xFF
|
105
|
+
]
|
106
|
+
end
|
107
|
+
|
108
|
+
def booster_soft_start
|
109
|
+
# Defaults from datasheet.
|
110
|
+
command [BOOSTER_SOFT_START]
|
111
|
+
data [0x17, 0x17, 0x17]
|
112
|
+
end
|
113
|
+
|
114
|
+
def power_on
|
115
|
+
command [POWER_ON]
|
116
|
+
busy_wait
|
117
|
+
end
|
118
|
+
|
119
|
+
def wake
|
120
|
+
hw_reset
|
121
|
+
set_power_setting
|
122
|
+
set_panel_setting
|
123
|
+
set_vcom_data_setting
|
124
|
+
set_resolution
|
125
|
+
booster_soft_start
|
126
|
+
power_on
|
127
|
+
end
|
128
|
+
|
129
|
+
def deep_sleep
|
130
|
+
# Default from datasheet.
|
131
|
+
command [DEEP_SLEEP]
|
132
|
+
data [0xA5]
|
133
|
+
end
|
134
|
+
|
135
|
+
# Treat what the datasheet calls x as vertical (y, page), and vertical as horizontal (x).
|
136
|
+
def set_window(x_start=x_min, x_finish=x_max, p_start=p_min, p_finish=p_max)
|
137
|
+
command [PARTIAL_WINDOW]
|
138
|
+
data [
|
139
|
+
p_start << 3,
|
140
|
+
p_finish << 3,
|
141
|
+
(x_start >> 8) & 0b1,
|
142
|
+
x_start & 0xFF,
|
143
|
+
(x_finish >> 8) & 0b1,
|
144
|
+
x_finish & 0xFF,
|
145
|
+
0b0
|
146
|
+
]
|
147
|
+
command [PARTIAL_IN]
|
148
|
+
end
|
149
|
+
|
150
|
+
def draw(*args, **kwargs)
|
151
|
+
wake
|
152
|
+
super(*args, **kwargs)
|
153
|
+
end
|
154
|
+
|
155
|
+
def draw_partial(buffer, x_start, x_finish, p_start, p_finish, color=1)
|
156
|
+
set_window(x_start, x_finish, p_start, p_finish)
|
157
|
+
|
158
|
+
if (colors == 2)
|
159
|
+
# In B/W/Red mode, red goes in DATA2, black in DATA1
|
160
|
+
(color == 2) ? command[DATA_START_2] : command[DATA_START_1]
|
161
|
+
else
|
162
|
+
# In B/W mode, always write to DATA2
|
163
|
+
command [DATA_START_2]
|
164
|
+
end
|
165
|
+
|
166
|
+
# Can't control address increment to go horizontally, always vertical.
|
167
|
+
# So get partial from the full buffer and reorder the bytes.
|
168
|
+
transformed_buffer = []
|
169
|
+
(x_start..x_finish).each do |x|
|
170
|
+
(p_start..p_finish).to_a.reverse.each do |page|
|
171
|
+
index = (page * columns) + x
|
172
|
+
transformed_buffer << buffer[index]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
transformed_buffer.each_slice(transfer_limit) { |slice| data(slice) }
|
176
|
+
|
177
|
+
command [DATA_STOP]
|
178
|
+
end
|
179
|
+
|
180
|
+
def refresh
|
181
|
+
command [DISPLAY_REFRESH]
|
182
|
+
busy_wait
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|