From 7f087ae85496b1fb42fdbbed2224b3c8ecfe819e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= <ondra@ondrovo.com> Date: Sun, 30 Oct 2022 23:00:53 +0100 Subject: [PATCH] initial --- .gitignore | 2 + Makefile | 95 + lib/libssd1306/README.txt | 5 + lib/libssd1306/bld/intf/i2c/ssd1306_i2c.d | 15 + lib/libssd1306/bld/intf/i2c/ssd1306_i2c.o | Bin 0 -> 7092 bytes .../bld/intf/i2c/ssd1306_i2c_embedded.d | 16 + .../bld/intf/i2c/ssd1306_i2c_embedded.o | Bin 0 -> 20104 bytes lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.d | 16 + lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.o | Bin 0 -> 16548 bytes lib/libssd1306/bld/intf/spi/ssd1306_spi.d | 15 + lib/libssd1306/bld/intf/spi/ssd1306_spi.o | Bin 0 -> 5916 bytes lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.d | 15 + lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.o | Bin 0 -> 16720 bytes lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.d | 15 + lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.o | Bin 0 -> 2196 bytes lib/libssd1306/bld/intf/ssd1306_interface.d | 14 + lib/libssd1306/bld/intf/ssd1306_interface.o | Bin 0 -> 8680 bytes .../bld/intf/uart/ssd1306_uart_builtin.d | 14 + .../bld/intf/uart/ssd1306_uart_builtin.o | Bin 0 -> 10360 bytes .../bld/intf/vga/atmega328p/vga128x64.d | 14 + .../bld/intf/vga/atmega328p/vga128x64.o | Bin 0 -> 28540 bytes .../bld/intf/vga/atmega328p/vga96x40.d | 14 + .../bld/intf/vga/atmega328p/vga96x40.o | Bin 0 -> 33624 bytes .../bld/intf/vga/esp32/CompositeOutput.d | 14 + .../bld/intf/vga/esp32/CompositeOutput.o | Bin 0 -> 2304 bytes lib/libssd1306/bld/intf/vga/esp32/vga128x64.d | 14 + lib/libssd1306/bld/intf/vga/esp32/vga128x64.o | Bin 0 -> 2540 bytes lib/libssd1306/bld/intf/vga/vga.d | 13 + lib/libssd1306/bld/intf/vga/vga.o | Bin 0 -> 3256 bytes lib/libssd1306/bld/lcd/lcd_common.d | 14 + lib/libssd1306/bld/lcd/lcd_common.o | Bin 0 -> 23528 bytes lib/libssd1306/bld/lcd/lcd_il9163.d | 15 + lib/libssd1306/bld/lcd/lcd_il9163.o | Bin 0 -> 51224 bytes lib/libssd1306/bld/lcd/lcd_ili9341.d | 15 + lib/libssd1306/bld/lcd/lcd_ili9341.o | Bin 0 -> 38508 bytes lib/libssd1306/bld/lcd/lcd_pcd8544.d | 14 + lib/libssd1306/bld/lcd/lcd_pcd8544.o | Bin 0 -> 15596 bytes lib/libssd1306/bld/lcd/oled_sh1106.d | 16 + lib/libssd1306/bld/lcd/oled_sh1106.o | Bin 0 -> 17052 bytes lib/libssd1306/bld/lcd/oled_ssd1306.d | 16 + lib/libssd1306/bld/lcd/oled_ssd1306.o | Bin 0 -> 32172 bytes lib/libssd1306/bld/lcd/oled_ssd1325.d | 14 + lib/libssd1306/bld/lcd/oled_ssd1325.o | Bin 0 -> 25464 bytes lib/libssd1306/bld/lcd/oled_ssd1327.d | 14 + lib/libssd1306/bld/lcd/oled_ssd1327.o | Bin 0 -> 26560 bytes lib/libssd1306/bld/lcd/oled_ssd1331.d | 15 + lib/libssd1306/bld/lcd/oled_ssd1331.o | Bin 0 -> 46700 bytes lib/libssd1306/bld/lcd/oled_ssd1351.d | 15 + lib/libssd1306/bld/lcd/oled_ssd1351.o | Bin 0 -> 32348 bytes lib/libssd1306/bld/lcd/oled_template.d | 14 + lib/libssd1306/bld/lcd/oled_template.o | Bin 0 -> 22540 bytes lib/libssd1306/bld/lcd/vga_monitor.d | 14 + lib/libssd1306/bld/lcd/vga_monitor.o | Bin 0 -> 20376 bytes lib/libssd1306/bld/libssd1306.a | Bin 0 -> 1573852 bytes lib/libssd1306/bld/nano_engine/canvas.d | 21 + lib/libssd1306/bld/nano_engine/canvas.o | Bin 0 -> 377256 bytes lib/libssd1306/bld/nano_engine/core.d | 17 + lib/libssd1306/bld/nano_engine/core.o | Bin 0 -> 23308 bytes lib/libssd1306/bld/nano_gfx.d | 18 + lib/libssd1306/bld/nano_gfx.o | Bin 0 -> 107164 bytes lib/libssd1306/bld/sprite_pool.d | 19 + lib/libssd1306/bld/sprite_pool.o | Bin 0 -> 36140 bytes lib/libssd1306/bld/ssd1306_16bit.d | 14 + lib/libssd1306/bld/ssd1306_16bit.o | Bin 0 -> 62876 bytes lib/libssd1306/bld/ssd1306_1bit.d | 21 + lib/libssd1306/bld/ssd1306_1bit.o | Bin 0 -> 195580 bytes lib/libssd1306/bld/ssd1306_8bit.d | 15 + lib/libssd1306/bld/ssd1306_8bit.o | Bin 0 -> 62976 bytes lib/libssd1306/bld/ssd1306_console.d | 20 + lib/libssd1306/bld/ssd1306_console.o | Bin 0 -> 15248 bytes lib/libssd1306/bld/ssd1306_fonts.d | 13 + lib/libssd1306/bld/ssd1306_fonts.o | Bin 0 -> 16688 bytes lib/libssd1306/bld/ssd1306_generic.d | 21 + lib/libssd1306/bld/ssd1306_generic.o | Bin 0 -> 64856 bytes .../bld/ssd1306_hal/arduino/platform.d | 16 + .../bld/ssd1306_hal/arduino/platform.o | Bin 0 -> 2292 bytes lib/libssd1306/bld/ssd1306_hal/avr/platform.d | 13 + lib/libssd1306/bld/ssd1306_hal/avr/platform.o | Bin 0 -> 11416 bytes .../bld/ssd1306_hal/energia/platform.d | 13 + .../bld/ssd1306_hal/energia/platform.o | Bin 0 -> 2292 bytes .../bld/ssd1306_hal/linux/platform.d | 1 + .../bld/ssd1306_hal/linux/platform.o | Bin 0 -> 1124 bytes .../bld/ssd1306_hal/mingw/platform.d | 1 + .../bld/ssd1306_hal/mingw/platform.o | Bin 0 -> 1124 bytes .../bld/ssd1306_hal/stm32/platform.d | 13 + .../bld/ssd1306_hal/stm32/platform.o | Bin 0 -> 2192 bytes .../bld/ssd1306_hal/template/platform.d | 13 + .../bld/ssd1306_hal/template/platform.o | Bin 0 -> 2200 bytes lib/libssd1306/bld/ssd1306_menu.d | 18 + lib/libssd1306/bld/ssd1306_menu.o | Bin 0 -> 51752 bytes lib/libssd1306/bld/ssd1306_uart.d | 13 + lib/libssd1306/bld/ssd1306_uart.o | Bin 0 -> 10932 bytes lib/libssd1306/src/Makefile.avr | 47 + lib/libssd1306/src/Makefile.common | 107 + lib/libssd1306/src/Makefile.energia | 4 + lib/libssd1306/src/Makefile.esp32 | 5 + lib/libssd1306/src/Makefile.linux | 38 + lib/libssd1306/src/Makefile.mingw32 | 42 + lib/libssd1306/src/Makefile.src | 80 + lib/libssd1306/src/Makefile.stm32 | 49 + lib/libssd1306/src/README.md | 169 ++ lib/libssd1306/src/doxygen.cfg | 2499 +++++++++++++++++ lib/libssd1306/src/font6x8.h | 23 + lib/libssd1306/src/intf/i2c/ssd1306_i2c.c | 65 + lib/libssd1306/src/intf/i2c/ssd1306_i2c.h | 112 + .../src/intf/i2c/ssd1306_i2c_conf.h | 77 + .../src/intf/i2c/ssd1306_i2c_embedded.c | 191 ++ .../src/intf/i2c/ssd1306_i2c_embedded.h | 63 + lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.c | 173 ++ lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.h | 72 + lib/libssd1306/src/intf/spi/ssd1306_spi.c | 56 + lib/libssd1306/src/intf/spi/ssd1306_spi.h | 85 + lib/libssd1306/src/intf/spi/ssd1306_spi_avr.c | 150 + lib/libssd1306/src/intf/spi/ssd1306_spi_avr.h | 60 + .../src/intf/spi/ssd1306_spi_conf.h | 34 + lib/libssd1306/src/intf/spi/ssd1306_spi_usi.c | 136 + lib/libssd1306/src/intf/spi/ssd1306_spi_usi.h | 60 + lib/libssd1306/src/intf/ssd1306_interface.c | 68 + lib/libssd1306/src/intf/ssd1306_interface.h | 152 + .../src/intf/uart/ssd1306_uart_builtin.c | 75 + .../src/intf/uart/ssd1306_uart_builtin.h | 59 + .../src/intf/vga/atmega328p/vga128x64.c | 243 ++ .../src/intf/vga/atmega328p/vga96x40.c | 292 ++ .../src/intf/vga/atmega328p/vga_isr.h | 312 ++ .../src/intf/vga/esp32/CompositeOutput.cpp | 286 ++ .../src/intf/vga/esp32/CompositeOutput.h | 112 + .../src/intf/vga/esp32/vga128x64.cpp | 211 ++ lib/libssd1306/src/intf/vga/vga.c | 41 + lib/libssd1306/src/intf/vga/vga.h | 86 + lib/libssd1306/src/lcd/composite_video.c | 142 + lib/libssd1306/src/lcd/composite_video.h | 63 + lib/libssd1306/src/lcd/lcd_common.c | 150 + lib/libssd1306/src/lcd/lcd_common.h | 459 +++ lib/libssd1306/src/lcd/lcd_il9163.c | 434 +++ lib/libssd1306/src/lcd/lcd_il9163.h | 144 + lib/libssd1306/src/lcd/lcd_ili9341.c | 283 ++ lib/libssd1306/src/lcd/lcd_ili9341.h | 117 + lib/libssd1306/src/lcd/lcd_pcd8544.c | 108 + lib/libssd1306/src/lcd/lcd_pcd8544.h | 72 + lib/libssd1306/src/lcd/oled_sh1106.c | 127 + lib/libssd1306/src/lcd/oled_sh1106.h | 81 + lib/libssd1306/src/lcd/oled_ssd1306.c | 259 ++ lib/libssd1306/src/lcd/oled_ssd1306.h | 198 ++ lib/libssd1306/src/lcd/oled_ssd1325.c | 182 ++ lib/libssd1306/src/lcd/oled_ssd1325.h | 98 + lib/libssd1306/src/lcd/oled_ssd1327.c | 195 ++ lib/libssd1306/src/lcd/oled_ssd1327.h | 83 + lib/libssd1306/src/lcd/oled_ssd1331.c | 287 ++ lib/libssd1306/src/lcd/oled_ssd1331.h | 146 + lib/libssd1306/src/lcd/oled_ssd1351.c | 226 ++ lib/libssd1306/src/lcd/oled_ssd1351.h | 88 + lib/libssd1306/src/lcd/oled_template.c | 173 ++ lib/libssd1306/src/lcd/oled_template.h | 99 + lib/libssd1306/src/lcd/pcd8544_commands.h | 76 + lib/libssd1306/src/lcd/ssd1306_commands.h | 82 + lib/libssd1306/src/lcd/ssd1331_commands.h | 69 + lib/libssd1306/src/lcd/ssd1351_commands.h | 75 + lib/libssd1306/src/lcd/vga_commands.h | 71 + lib/libssd1306/src/lcd/vga_monitor.c | 145 + lib/libssd1306/src/lcd/vga_monitor.h | 75 + lib/libssd1306/src/nano_engine.h | 134 + lib/libssd1306/src/nano_engine/README.md | 299 ++ lib/libssd1306/src/nano_engine/adafruit.h | 335 +++ lib/libssd1306/src/nano_engine/canvas.cpp | 1477 ++++++++++ lib/libssd1306/src/nano_engine/canvas.h | 613 ++++ lib/libssd1306/src/nano_engine/core.cpp | 193 ++ lib/libssd1306/src/nano_engine/core.h | 301 ++ lib/libssd1306/src/nano_engine/point.h | 183 ++ lib/libssd1306/src/nano_engine/rect.h | 257 ++ lib/libssd1306/src/nano_engine/sprite.h | 303 ++ lib/libssd1306/src/nano_engine/tiler.h | 364 +++ lib/libssd1306/src/nano_gfx.cpp | 522 ++++ lib/libssd1306/src/nano_gfx.h | 239 ++ lib/libssd1306/src/nano_gfx_types.h | 261 ++ lib/libssd1306/src/sprite_pool.cpp | 132 + lib/libssd1306/src/sprite_pool.h | 131 + lib/libssd1306/src/ssd1306.h | 72 + lib/libssd1306/src/ssd1306_16bit.c | 366 +++ lib/libssd1306/src/ssd1306_16bit.h | 303 ++ lib/libssd1306/src/ssd1306_1bit.c | 1098 ++++++++ lib/libssd1306/src/ssd1306_1bit.h | 458 +++ lib/libssd1306/src/ssd1306_8bit.c | 378 +++ lib/libssd1306/src/ssd1306_8bit.h | 426 +++ lib/libssd1306/src/ssd1306_console.cpp | 91 + lib/libssd1306/src/ssd1306_console.h | 116 + lib/libssd1306/src/ssd1306_fonts.c | 1355 +++++++++ lib/libssd1306/src/ssd1306_fonts.h | 100 + lib/libssd1306/src/ssd1306_generic.c | 395 +++ lib/libssd1306/src/ssd1306_generic.h | 318 +++ .../src/ssd1306_hal/Print_internal.h | 111 + lib/libssd1306/src/ssd1306_hal/README.md | 14 + lib/libssd1306/src/ssd1306_hal/UserSettings.h | 96 + lib/libssd1306/src/ssd1306_hal/arduino/io.h | 225 ++ .../src/ssd1306_hal/arduino/platform.cpp | 220 ++ .../src/ssd1306_hal/avr/arduino/Arduino.h | 13 + .../src/ssd1306_hal/avr/arduino/Print.h | 10 + .../src/ssd1306_hal/avr/arduino/Wire.h | 1 + lib/libssd1306/src/ssd1306_hal/avr/io.h | 117 + lib/libssd1306/src/ssd1306_hal/avr/platform.c | 96 + lib/libssd1306/src/ssd1306_hal/energia/io.h | 176 ++ .../src/ssd1306_hal/energia/platform.cpp | 158 ++ lib/libssd1306/src/ssd1306_hal/esp/io.h | 135 + lib/libssd1306/src/ssd1306_hal/esp/platform.c | 292 ++ lib/libssd1306/src/ssd1306_hal/io.h | 136 + .../src/ssd1306_hal/linux/arduino/Arduino.h | 18 + .../src/ssd1306_hal/linux/arduino/Print.h | 10 + .../src/ssd1306_hal/linux/arduino/Wire.h | 1 + .../ssd1306_hal/linux/arduino/avr/interrupt.h | 1 + .../ssd1306_hal/linux/arduino/avr/pgmspace.h | 1 + .../src/ssd1306_hal/linux/arduino/avr/sleep.h | 1 + lib/libssd1306/src/ssd1306_hal/linux/io.h | 168 ++ .../src/ssd1306_hal/linux/platform.c | 583 ++++ lib/libssd1306/src/ssd1306_hal/mingw/io.h | 132 + .../src/ssd1306_hal/mingw/platform.c | 342 +++ lib/libssd1306/src/ssd1306_hal/stm32/io.h | 147 + .../src/ssd1306_hal/stm32/platform.c | 130 + lib/libssd1306/src/ssd1306_hal/template/io.h | 173 ++ .../src/ssd1306_hal/template/platform.c | 124 + lib/libssd1306/src/ssd1306_menu.c | 297 ++ lib/libssd1306/src/ssd1306_uart.c | 145 + lib/libssd1306/src/ssd1306_uart.h | 134 + src/main.c | 46 + src/sevenseg.c | 146 + src/sevenseg.h | 30 + src/twi.c | 166 ++ src/twi.h | 178 ++ 226 files changed, 27881 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 lib/libssd1306/README.txt create mode 100644 lib/libssd1306/bld/intf/i2c/ssd1306_i2c.d create mode 100644 lib/libssd1306/bld/intf/i2c/ssd1306_i2c.o create mode 100644 lib/libssd1306/bld/intf/i2c/ssd1306_i2c_embedded.d create mode 100644 lib/libssd1306/bld/intf/i2c/ssd1306_i2c_embedded.o create mode 100644 lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.d create mode 100644 lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.o create mode 100644 lib/libssd1306/bld/intf/spi/ssd1306_spi.d create mode 100644 lib/libssd1306/bld/intf/spi/ssd1306_spi.o create mode 100644 lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.d create mode 100644 lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.o create mode 100644 lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.d create mode 100644 lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.o create mode 100644 lib/libssd1306/bld/intf/ssd1306_interface.d create mode 100644 lib/libssd1306/bld/intf/ssd1306_interface.o create mode 100644 lib/libssd1306/bld/intf/uart/ssd1306_uart_builtin.d create mode 100644 lib/libssd1306/bld/intf/uart/ssd1306_uart_builtin.o create mode 100644 lib/libssd1306/bld/intf/vga/atmega328p/vga128x64.d create mode 100644 lib/libssd1306/bld/intf/vga/atmega328p/vga128x64.o create mode 100644 lib/libssd1306/bld/intf/vga/atmega328p/vga96x40.d create mode 100644 lib/libssd1306/bld/intf/vga/atmega328p/vga96x40.o create mode 100644 lib/libssd1306/bld/intf/vga/esp32/CompositeOutput.d create mode 100644 lib/libssd1306/bld/intf/vga/esp32/CompositeOutput.o create mode 100644 lib/libssd1306/bld/intf/vga/esp32/vga128x64.d create mode 100644 lib/libssd1306/bld/intf/vga/esp32/vga128x64.o create mode 100644 lib/libssd1306/bld/intf/vga/vga.d create mode 100644 lib/libssd1306/bld/intf/vga/vga.o create mode 100644 lib/libssd1306/bld/lcd/lcd_common.d create mode 100644 lib/libssd1306/bld/lcd/lcd_common.o create mode 100644 lib/libssd1306/bld/lcd/lcd_il9163.d create mode 100644 lib/libssd1306/bld/lcd/lcd_il9163.o create mode 100644 lib/libssd1306/bld/lcd/lcd_ili9341.d create mode 100644 lib/libssd1306/bld/lcd/lcd_ili9341.o create mode 100644 lib/libssd1306/bld/lcd/lcd_pcd8544.d create mode 100644 lib/libssd1306/bld/lcd/lcd_pcd8544.o create mode 100644 lib/libssd1306/bld/lcd/oled_sh1106.d create mode 100644 lib/libssd1306/bld/lcd/oled_sh1106.o create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1306.d create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1306.o create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1325.d create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1325.o create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1327.d create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1327.o create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1331.d create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1331.o create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1351.d create mode 100644 lib/libssd1306/bld/lcd/oled_ssd1351.o create mode 100644 lib/libssd1306/bld/lcd/oled_template.d create mode 100644 lib/libssd1306/bld/lcd/oled_template.o create mode 100644 lib/libssd1306/bld/lcd/vga_monitor.d create mode 100644 lib/libssd1306/bld/lcd/vga_monitor.o create mode 100644 lib/libssd1306/bld/libssd1306.a create mode 100644 lib/libssd1306/bld/nano_engine/canvas.d create mode 100644 lib/libssd1306/bld/nano_engine/canvas.o create mode 100644 lib/libssd1306/bld/nano_engine/core.d create mode 100644 lib/libssd1306/bld/nano_engine/core.o create mode 100644 lib/libssd1306/bld/nano_gfx.d create mode 100644 lib/libssd1306/bld/nano_gfx.o create mode 100644 lib/libssd1306/bld/sprite_pool.d create mode 100644 lib/libssd1306/bld/sprite_pool.o create mode 100644 lib/libssd1306/bld/ssd1306_16bit.d create mode 100644 lib/libssd1306/bld/ssd1306_16bit.o create mode 100644 lib/libssd1306/bld/ssd1306_1bit.d create mode 100644 lib/libssd1306/bld/ssd1306_1bit.o create mode 100644 lib/libssd1306/bld/ssd1306_8bit.d create mode 100644 lib/libssd1306/bld/ssd1306_8bit.o create mode 100644 lib/libssd1306/bld/ssd1306_console.d create mode 100644 lib/libssd1306/bld/ssd1306_console.o create mode 100644 lib/libssd1306/bld/ssd1306_fonts.d create mode 100644 lib/libssd1306/bld/ssd1306_fonts.o create mode 100644 lib/libssd1306/bld/ssd1306_generic.d create mode 100644 lib/libssd1306/bld/ssd1306_generic.o create mode 100644 lib/libssd1306/bld/ssd1306_hal/arduino/platform.d create mode 100644 lib/libssd1306/bld/ssd1306_hal/arduino/platform.o create mode 100644 lib/libssd1306/bld/ssd1306_hal/avr/platform.d create mode 100644 lib/libssd1306/bld/ssd1306_hal/avr/platform.o create mode 100644 lib/libssd1306/bld/ssd1306_hal/energia/platform.d create mode 100644 lib/libssd1306/bld/ssd1306_hal/energia/platform.o create mode 100644 lib/libssd1306/bld/ssd1306_hal/linux/platform.d create mode 100644 lib/libssd1306/bld/ssd1306_hal/linux/platform.o create mode 100644 lib/libssd1306/bld/ssd1306_hal/mingw/platform.d create mode 100644 lib/libssd1306/bld/ssd1306_hal/mingw/platform.o create mode 100644 lib/libssd1306/bld/ssd1306_hal/stm32/platform.d create mode 100644 lib/libssd1306/bld/ssd1306_hal/stm32/platform.o create mode 100644 lib/libssd1306/bld/ssd1306_hal/template/platform.d create mode 100644 lib/libssd1306/bld/ssd1306_hal/template/platform.o create mode 100644 lib/libssd1306/bld/ssd1306_menu.d create mode 100644 lib/libssd1306/bld/ssd1306_menu.o create mode 100644 lib/libssd1306/bld/ssd1306_uart.d create mode 100644 lib/libssd1306/bld/ssd1306_uart.o create mode 100644 lib/libssd1306/src/Makefile.avr create mode 100644 lib/libssd1306/src/Makefile.common create mode 100644 lib/libssd1306/src/Makefile.energia create mode 100644 lib/libssd1306/src/Makefile.esp32 create mode 100644 lib/libssd1306/src/Makefile.linux create mode 100644 lib/libssd1306/src/Makefile.mingw32 create mode 100644 lib/libssd1306/src/Makefile.src create mode 100644 lib/libssd1306/src/Makefile.stm32 create mode 100644 lib/libssd1306/src/README.md create mode 100644 lib/libssd1306/src/doxygen.cfg create mode 100644 lib/libssd1306/src/font6x8.h create mode 100644 lib/libssd1306/src/intf/i2c/ssd1306_i2c.c create mode 100644 lib/libssd1306/src/intf/i2c/ssd1306_i2c.h create mode 100644 lib/libssd1306/src/intf/i2c/ssd1306_i2c_conf.h create mode 100644 lib/libssd1306/src/intf/i2c/ssd1306_i2c_embedded.c create mode 100644 lib/libssd1306/src/intf/i2c/ssd1306_i2c_embedded.h create mode 100644 lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.c create mode 100644 lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.h create mode 100644 lib/libssd1306/src/intf/spi/ssd1306_spi.c create mode 100644 lib/libssd1306/src/intf/spi/ssd1306_spi.h create mode 100644 lib/libssd1306/src/intf/spi/ssd1306_spi_avr.c create mode 100644 lib/libssd1306/src/intf/spi/ssd1306_spi_avr.h create mode 100644 lib/libssd1306/src/intf/spi/ssd1306_spi_conf.h create mode 100644 lib/libssd1306/src/intf/spi/ssd1306_spi_usi.c create mode 100644 lib/libssd1306/src/intf/spi/ssd1306_spi_usi.h create mode 100644 lib/libssd1306/src/intf/ssd1306_interface.c create mode 100644 lib/libssd1306/src/intf/ssd1306_interface.h create mode 100644 lib/libssd1306/src/intf/uart/ssd1306_uart_builtin.c create mode 100644 lib/libssd1306/src/intf/uart/ssd1306_uart_builtin.h create mode 100644 lib/libssd1306/src/intf/vga/atmega328p/vga128x64.c create mode 100644 lib/libssd1306/src/intf/vga/atmega328p/vga96x40.c create mode 100644 lib/libssd1306/src/intf/vga/atmega328p/vga_isr.h create mode 100644 lib/libssd1306/src/intf/vga/esp32/CompositeOutput.cpp create mode 100644 lib/libssd1306/src/intf/vga/esp32/CompositeOutput.h create mode 100644 lib/libssd1306/src/intf/vga/esp32/vga128x64.cpp create mode 100644 lib/libssd1306/src/intf/vga/vga.c create mode 100644 lib/libssd1306/src/intf/vga/vga.h create mode 100644 lib/libssd1306/src/lcd/composite_video.c create mode 100644 lib/libssd1306/src/lcd/composite_video.h create mode 100644 lib/libssd1306/src/lcd/lcd_common.c create mode 100644 lib/libssd1306/src/lcd/lcd_common.h create mode 100644 lib/libssd1306/src/lcd/lcd_il9163.c create mode 100644 lib/libssd1306/src/lcd/lcd_il9163.h create mode 100644 lib/libssd1306/src/lcd/lcd_ili9341.c create mode 100644 lib/libssd1306/src/lcd/lcd_ili9341.h create mode 100644 lib/libssd1306/src/lcd/lcd_pcd8544.c create mode 100644 lib/libssd1306/src/lcd/lcd_pcd8544.h create mode 100644 lib/libssd1306/src/lcd/oled_sh1106.c create mode 100644 lib/libssd1306/src/lcd/oled_sh1106.h create mode 100644 lib/libssd1306/src/lcd/oled_ssd1306.c create mode 100644 lib/libssd1306/src/lcd/oled_ssd1306.h create mode 100644 lib/libssd1306/src/lcd/oled_ssd1325.c create mode 100644 lib/libssd1306/src/lcd/oled_ssd1325.h create mode 100644 lib/libssd1306/src/lcd/oled_ssd1327.c create mode 100644 lib/libssd1306/src/lcd/oled_ssd1327.h create mode 100644 lib/libssd1306/src/lcd/oled_ssd1331.c create mode 100644 lib/libssd1306/src/lcd/oled_ssd1331.h create mode 100644 lib/libssd1306/src/lcd/oled_ssd1351.c create mode 100644 lib/libssd1306/src/lcd/oled_ssd1351.h create mode 100644 lib/libssd1306/src/lcd/oled_template.c create mode 100644 lib/libssd1306/src/lcd/oled_template.h create mode 100644 lib/libssd1306/src/lcd/pcd8544_commands.h create mode 100644 lib/libssd1306/src/lcd/ssd1306_commands.h create mode 100644 lib/libssd1306/src/lcd/ssd1331_commands.h create mode 100644 lib/libssd1306/src/lcd/ssd1351_commands.h create mode 100644 lib/libssd1306/src/lcd/vga_commands.h create mode 100644 lib/libssd1306/src/lcd/vga_monitor.c create mode 100644 lib/libssd1306/src/lcd/vga_monitor.h create mode 100644 lib/libssd1306/src/nano_engine.h create mode 100644 lib/libssd1306/src/nano_engine/README.md create mode 100644 lib/libssd1306/src/nano_engine/adafruit.h create mode 100644 lib/libssd1306/src/nano_engine/canvas.cpp create mode 100644 lib/libssd1306/src/nano_engine/canvas.h create mode 100644 lib/libssd1306/src/nano_engine/core.cpp create mode 100644 lib/libssd1306/src/nano_engine/core.h create mode 100644 lib/libssd1306/src/nano_engine/point.h create mode 100644 lib/libssd1306/src/nano_engine/rect.h create mode 100644 lib/libssd1306/src/nano_engine/sprite.h create mode 100644 lib/libssd1306/src/nano_engine/tiler.h create mode 100644 lib/libssd1306/src/nano_gfx.cpp create mode 100644 lib/libssd1306/src/nano_gfx.h create mode 100644 lib/libssd1306/src/nano_gfx_types.h create mode 100644 lib/libssd1306/src/sprite_pool.cpp create mode 100644 lib/libssd1306/src/sprite_pool.h create mode 100644 lib/libssd1306/src/ssd1306.h create mode 100644 lib/libssd1306/src/ssd1306_16bit.c create mode 100644 lib/libssd1306/src/ssd1306_16bit.h create mode 100644 lib/libssd1306/src/ssd1306_1bit.c create mode 100644 lib/libssd1306/src/ssd1306_1bit.h create mode 100644 lib/libssd1306/src/ssd1306_8bit.c create mode 100644 lib/libssd1306/src/ssd1306_8bit.h create mode 100644 lib/libssd1306/src/ssd1306_console.cpp create mode 100644 lib/libssd1306/src/ssd1306_console.h create mode 100644 lib/libssd1306/src/ssd1306_fonts.c create mode 100644 lib/libssd1306/src/ssd1306_fonts.h create mode 100644 lib/libssd1306/src/ssd1306_generic.c create mode 100644 lib/libssd1306/src/ssd1306_generic.h create mode 100644 lib/libssd1306/src/ssd1306_hal/Print_internal.h create mode 100644 lib/libssd1306/src/ssd1306_hal/README.md create mode 100644 lib/libssd1306/src/ssd1306_hal/UserSettings.h create mode 100644 lib/libssd1306/src/ssd1306_hal/arduino/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/arduino/platform.cpp create mode 100644 lib/libssd1306/src/ssd1306_hal/avr/arduino/Arduino.h create mode 100644 lib/libssd1306/src/ssd1306_hal/avr/arduino/Print.h create mode 100644 lib/libssd1306/src/ssd1306_hal/avr/arduino/Wire.h create mode 100644 lib/libssd1306/src/ssd1306_hal/avr/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/avr/platform.c create mode 100644 lib/libssd1306/src/ssd1306_hal/energia/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/energia/platform.cpp create mode 100644 lib/libssd1306/src/ssd1306_hal/esp/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/esp/platform.c create mode 100644 lib/libssd1306/src/ssd1306_hal/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/linux/arduino/Arduino.h create mode 100644 lib/libssd1306/src/ssd1306_hal/linux/arduino/Print.h create mode 100644 lib/libssd1306/src/ssd1306_hal/linux/arduino/Wire.h create mode 100644 lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/interrupt.h create mode 100644 lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/pgmspace.h create mode 100644 lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/sleep.h create mode 100644 lib/libssd1306/src/ssd1306_hal/linux/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/linux/platform.c create mode 100644 lib/libssd1306/src/ssd1306_hal/mingw/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/mingw/platform.c create mode 100644 lib/libssd1306/src/ssd1306_hal/stm32/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/stm32/platform.c create mode 100644 lib/libssd1306/src/ssd1306_hal/template/io.h create mode 100644 lib/libssd1306/src/ssd1306_hal/template/platform.c create mode 100644 lib/libssd1306/src/ssd1306_menu.c create mode 100644 lib/libssd1306/src/ssd1306_uart.c create mode 100644 lib/libssd1306/src/ssd1306_uart.h create mode 100644 src/main.c create mode 100644 src/sevenseg.c create mode 100644 src/sevenseg.h create mode 100644 src/twi.c create mode 100644 src/twi.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..08fe6ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +build diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..21b56d6 --- /dev/null +++ b/Makefile @@ -0,0 +1,95 @@ +# https://github.com/jkent/caterina-promicro + +MCU = atmega328p +F_CPU = 16000000 + +# AVRDUDE settings +PROG_BAUD = 57600 +PROG_DEV = /dev/ttyUSB0 +PROG_TYPE = arduino +# Build the final AVRDUDE arguments +PROG_ARGS = -c $(PROG_TYPE) -p $(MCU) -b $(PROG_BAUD) -P $(PROG_DEV) + +INCFLAGS += -Isrc -Ilib/libssd1306/src + +CFLAGS = -std=gnu99 -mmcu=$(MCU) -DF_CPU=$(F_CPU)UL +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wno-main -Wno-strict-prototypes -Wno-comment +CFLAGS += -g2 -Wextra -Wfatal-errors -Wno-unused-but-set-variable +CFLAGS += -ffunction-sections -fdata-sections -Os -Wno-array-bounds + +LFLAGS = -Wl,--gc-sections -Wl,--relax +#-Llib/libssd1306/bld/ -l:libssd1306.a + +# CFLAGS += -lm ## Math +# CFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +# CFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf + + +# --------------------------------------------------------------------------- + +APP = App +SRC_DIR = src +BUILD_DIR = build + +## Defined programs / locations +CC = avr-gcc +LD = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +SOURCES=$(wildcard $(SRC_DIR)/*.c) +OBJECTS=$(SOURCES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o) +DEPENDS=$(BUILD_DIR)/.depends + +TARGET=$(BUILD_DIR)/$(APP) + + +.PHONY: all clean eeprom size + + +all: $(TARGET).hex size + +debug: + @echo "SOURCES $(SOURCES)" + @echo "OBJECTS $(OBJECTS)" + @echo "TARGET $(TARGET)" + +eeprom: $(TARGET).eeprom + +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $< + +$(TARGET).elf: $(OBJECTS) | $(BUILD_DIR) + $(LD) $(CFLAGS) $(LFLAGS) -o $@ $^ lib/libssd1306/bld/libssd1306.a + +%.hex: %.elf + $(OBJCOPY) -R .eeprom -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR) + $(CC) -c $(CFLAGS) $(INCFLAGS) -o $@ $< + +$(DEPENDS): $(SOURCES) | $(BUILD_DIR) + $(CC) $(INCFLAGS) -MM $(SOURCES) | sed -e 's!^!$(BUILD_DIR)/!' >$@ + +$(BUILD_DIR): + mkdir -p $@ + +clean: + rm -rf $(BUILD_DIR) + +## === avrdude === + +flash: $(TARGET).hex + $(AVRDUDE) $(PROG_ARGS) -U flash:w:$< + +flashe: $(TARGET).eeprom + $(AVRDUDE) $(PROG_ARGS) -U eeprom:w:$< + +shell: + $(AVRDUDE) $(PROG_ARGS) -nt diff --git a/lib/libssd1306/README.txt b/lib/libssd1306/README.txt new file mode 100644 index 0000000..96c1b03 --- /dev/null +++ b/lib/libssd1306/README.txt @@ -0,0 +1,5 @@ +to build the lib, run + +make -f Makefile.avr MCU=atmega328p + +the output is in the bld directory diff --git a/lib/libssd1306/bld/intf/i2c/ssd1306_i2c.d b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c.d new file mode 100644 index 0000000..b60f223 --- /dev/null +++ b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c.d @@ -0,0 +1,15 @@ +../bld/intf/i2c/ssd1306_i2c.o: intf/i2c/ssd1306_i2c.c \ + intf/i2c/ssd1306_i2c.h intf/i2c/ssd1306_i2c_conf.h ssd1306_hal/io.h \ + ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h intf/i2c/ssd1306_i2c_embedded.h \ + intf/i2c/ssd1306_i2c_twi.h intf/ssd1306_interface.h diff --git a/lib/libssd1306/bld/intf/i2c/ssd1306_i2c.o b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c.o new file mode 100644 index 0000000000000000000000000000000000000000..669f4b21e66b1b931de826968f8a87565db63d41 GIT binary patch literal 7092 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 T#-VV|eZLUiiI+PgY!3b#KN0%M literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_embedded.d b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_embedded.d new file mode 100644 index 0000000..3504be0 --- /dev/null +++ b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_embedded.d @@ -0,0 +1,16 @@ +../bld/intf/i2c/ssd1306_i2c_embedded.o: intf/i2c/ssd1306_i2c_embedded.c \ + intf/i2c/ssd1306_i2c_embedded.h ssd1306_hal/io.h \ + ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h intf/i2c/ssd1306_i2c_conf.h \ + intf/ssd1306_interface.h intf/i2c/ssd1306_i2c.h \ + intf/i2c/ssd1306_i2c_twi.h diff --git a/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_embedded.o b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_embedded.o new file mode 100644 index 0000000000000000000000000000000000000000..df7463c1935f470736ce305fb2312bfb088ff121 GIT binary patch literal 20104 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 Gw)nr$vBK5> literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.d b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.d new file mode 100644 index 0000000..79f7ac8 --- /dev/null +++ b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.d @@ -0,0 +1,16 @@ +../bld/intf/i2c/ssd1306_i2c_twi.o: intf/i2c/ssd1306_i2c_twi.c \ + intf/i2c/ssd1306_i2c_twi.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h \ + intf/i2c/ssd1306_i2c_conf.h intf/ssd1306_interface.h \ + intf/i2c/ssd1306_i2c.h intf/i2c/ssd1306_i2c_embedded.h \ + /usr/avr/include/util/twi.h diff --git a/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.o b/lib/libssd1306/bld/intf/i2c/ssd1306_i2c_twi.o new file mode 100644 index 0000000000000000000000000000000000000000..f6ab8fb0e377bce9d7a76eced3e411fa1a264f7f GIT binary patch literal 16548 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/spi/ssd1306_spi.d b/lib/libssd1306/bld/intf/spi/ssd1306_spi.d new file mode 100644 index 0000000..5b62a8c --- /dev/null +++ b/lib/libssd1306/bld/intf/spi/ssd1306_spi.d @@ -0,0 +1,15 @@ +../bld/intf/spi/ssd1306_spi.o: intf/spi/ssd1306_spi.c \ + intf/spi/ssd1306_spi.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h \ + intf/spi/ssd1306_spi_avr.h intf/spi/ssd1306_spi_conf.h \ + intf/spi/ssd1306_spi_usi.h intf/ssd1306_interface.h lcd/lcd_common.h diff --git a/lib/libssd1306/bld/intf/spi/ssd1306_spi.o b/lib/libssd1306/bld/intf/spi/ssd1306_spi.o new file mode 100644 index 0000000000000000000000000000000000000000..f45442599937b59e162fbc36741df43bad3f985d GIT binary patch literal 5916 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 TmK@~K6!uF);qLu(b$<T@|COlT literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.d b/lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.d new file mode 100644 index 0000000..31a8d7a --- /dev/null +++ b/lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.d @@ -0,0 +1,15 @@ +../bld/intf/spi/ssd1306_spi_avr.o: intf/spi/ssd1306_spi_avr.c \ + intf/spi/ssd1306_spi_avr.h intf/spi/ssd1306_spi_conf.h ssd1306_hal/io.h \ + ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h intf/spi/ssd1306_spi.h \ + intf/ssd1306_interface.h lcd/lcd_common.h diff --git a/lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.o b/lib/libssd1306/bld/intf/spi/ssd1306_spi_avr.o new file mode 100644 index 0000000000000000000000000000000000000000..d2fa08d59f24997c448dd4ee2875b115d1f9838d GIT binary patch literal 16720 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.d b/lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.d new file mode 100644 index 0000000..483ce92 --- /dev/null +++ b/lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.d @@ -0,0 +1,15 @@ +../bld/intf/spi/ssd1306_spi_usi.o: intf/spi/ssd1306_spi_usi.c \ + intf/spi/ssd1306_spi_usi.h intf/spi/ssd1306_spi_conf.h ssd1306_hal/io.h \ + ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h intf/spi/ssd1306_spi.h \ + intf/ssd1306_interface.h lcd/lcd_common.h diff --git a/lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.o b/lib/libssd1306/bld/intf/spi/ssd1306_spi_usi.o new file mode 100644 index 0000000000000000000000000000000000000000..89428c36e501436a9fbd0652939356813330da6d GIT binary patch literal 2196 zcmbVN&2JM&6o2E5(?kyWfT*nql?{S6sNJ<4LJpA}5Gf53QHelR+taf4j_qyjU2AuZ zXnOz&ae^ZkE}Z!nIPnkk&OgD0b1Tu`n-6;(TD9tvX5R08&YPJxyAQ4(ej|h+OM>pu zR3ds?CVC9xwsP2{HCm+rxJ+V>RVAK2<H?c`^9+SpVCIy{QJj+~eWa9gNC(@TmKL<M zU?i2$gp)W=mC9blS;iV`;==N&ic{UFu6}})#=`m6F;oepf;qXOCgw797r{$H{IPrj z1*vUfa{yHxq^#A_irTRl$63^iWmw~i2T9zk&1j6V(+^T@{m^CNKXsbq3X^erAnD-S z?`r$aX05s9ZF!BFJB;1#AjtZyCga4-evU?Nd)$MhBU+cXfO##~D0a4?7<R_3;9h#U z=EC(>R&%pFZ1v(XQoG&mIPT<861$mH9OiBq<Uvu!TJnBJj@U1wX~Ak&Ts20wo{ge< zmW9nrjU6A@A7_!*p?W_V%6bxqX;42(lb^6kR!;^pbaR>I_09;o`XFlaFwy@j#+E=I zmOuyl`@6MG9Op%Img?e*Q?ZZd=-vCG&6(+PG?i&1>*GLk3c{XMApQ(+s~}$hzEY6A z31;x_{VwKd4ae7?ZCHoYtC?hQNIi;zyg0!O9I70Xm*`+dGf&^o$crRr<m2m~puag~ z-@kL@-|&4>;826x*AEoPha*3gJ%xXjX<`KLFqCLuKWMj8d9OiM9z?O6N>SWR8bthv z#i}k06_CJt=Q>X^UeWrG4c-7h&3H}g&oYL86@1g+Yv4NugQ@#spCjO}jh@%JX)u2i zZX5h1_>TrNziaTH;CwrRivpd);M#71e{S$2aBN5EpMsN@{W8phHh7+D-nS^1_jB_2 zJ(7p#L0&2cfu|3Rj|H~E0nV6%G>Ch0HiXaBhF}Q`S?w#ilMIIv5Bk3npELKZ?MVIY zpGMoBR_713V@&_#_XX^H&;RDfA8nhPQ*ypy&sy78&~x`*#b9~};Uze(S?Srfgu!ps z#sJcD48AW**2cYIG232ae9FL(wQ<iB*WE1Zb$DHVt#;iI*v0_T8;r{g3|X5GxtMPo z`OZVf`S`Wld?R3v;r?P;f}np{T4o!M-wd~Y8~Dk+&@O7Weov11y@DTq>nvG6<}gj@ rcL-OZ<Y&2#!S$_TaIN-k0ci<_jDaD}!^F?F==THm`%GE%Wc~gEKXfAb literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/ssd1306_interface.d b/lib/libssd1306/bld/intf/ssd1306_interface.d new file mode 100644 index 0000000..3242eee --- /dev/null +++ b/lib/libssd1306/bld/intf/ssd1306_interface.d @@ -0,0 +1,14 @@ +../bld/intf/ssd1306_interface.o: intf/ssd1306_interface.c \ + intf/ssd1306_interface.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h \ + intf/spi/ssd1306_spi.h diff --git a/lib/libssd1306/bld/intf/ssd1306_interface.o b/lib/libssd1306/bld/intf/ssd1306_interface.o new file mode 100644 index 0000000000000000000000000000000000000000..4e8142078142b3bbc4ae4197773ef625c43df2b1 GIT binary patch literal 8680 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 DC4=CK literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/uart/ssd1306_uart_builtin.d b/lib/libssd1306/bld/intf/uart/ssd1306_uart_builtin.d new file mode 100644 index 0000000..ef636ab --- /dev/null +++ b/lib/libssd1306/bld/intf/uart/ssd1306_uart_builtin.d @@ -0,0 +1,14 @@ +../bld/intf/uart/ssd1306_uart_builtin.o: intf/uart/ssd1306_uart_builtin.c \ + intf/uart/ssd1306_uart_builtin.h ssd1306_hal/io.h \ + ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h intf/ssd1306_interface.h ssd1306_uart.h diff --git a/lib/libssd1306/bld/intf/uart/ssd1306_uart_builtin.o b/lib/libssd1306/bld/intf/uart/ssd1306_uart_builtin.o new file mode 100644 index 0000000000000000000000000000000000000000..fdbdc96f927e1c20e286d7235dc93ba68b44fac2 GIT binary patch literal 10360 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 SiFaY2TGg(?o_0pq9Q<E0cCMcQ literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/vga/atmega328p/vga128x64.d b/lib/libssd1306/bld/intf/vga/atmega328p/vga128x64.d new file mode 100644 index 0000000..f460ef2 --- /dev/null +++ b/lib/libssd1306/bld/intf/vga/atmega328p/vga128x64.d @@ -0,0 +1,14 @@ +../bld/intf/vga/atmega328p/vga128x64.o: intf/vga/atmega328p/vga128x64.c \ + intf/vga/vga.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h \ + intf/ssd1306_interface.h lcd/lcd_common.h lcd/vga_commands.h diff --git a/lib/libssd1306/bld/intf/vga/atmega328p/vga128x64.o b/lib/libssd1306/bld/intf/vga/atmega328p/vga128x64.o new file mode 100644 index 0000000000000000000000000000000000000000..e7da81cdd439572338a2c7324c79b552ed7a8706 GIT binary patch literal 28540 zcmbV#3w%_?+5Vi}O*Ua61VXqO-Hm{Ffh1=WLQq7)P0%1H7x5YbNgx`Mm;?oDH3$k) zL?B?*Ql(0*T5HkT*0y|#wzaLbqSb!Y*4k*lUTpgpwYFYr<$IoaXZFk<vGw~8zjNk! z-g)Pp>pSN*S+1E`H_P)pWrL>{sDLT;!V0CXLt>RyI9~axLfv$zr&p=GU3t5<ZCC1! z)4X?tZ>#d&R0ozqM){obS-bde{;N%QZ1V<<9zD=My0mykUsYVac}M*=Sm=S)4a3x% zdArt@U(r$9H@{CEm@)9mU6FUX%U|;LEO~6+)Lrj;ee>U(I)7cyVRhi#ljg5a)t@%+ z`dxPp`$pV*M;%x=N*$mTmcO!osjk)bL689z?ocXa>QY+ay|Wz$c?FKy<@5Wd4O<Xb zy5`iD8s+UOou2~Zp$_agQjRxoI&|$o=1>QEk-ljl{|Vm-&QjHZV}Z6;r~?Cglf4If zf7|<4Z;O{Za9Hxdu;)<k-)=v+J-L10_PkwvsLPu;ZrGl`OC31a``*q?qu8#(9c^mJ z{&juV{nxPl!}kx}-_Y05x4CayU%^hLzW>^R-X3-1t3AEz)cU^decO6(K>IhLy`RIe zS*`24{(C*W?TUHUn>+`4_o>Z&J-rXAn|{~R`wg`b_+ho7ZzD82wB}Z$$y_%%xaU<V zb@(G|b{<5Hd$zZ!t=IJQwxN}F9`yCS*;jaN4|45TzivI_o$J@@_~!N3>3G}5jXK`3 zaoxteU2Mg=zWz89^=S0<9gpoexZ}4w4(&L+Bj~lq$2~Xh)p2i)yKnSeJ0Bd!k><?$ z)6n;G)jO)MuumO$&s*R3_g#P7wRxBK&R+-o>uAoFo^`i)V>>Fxe%a%ET9iByGit*q z^z57KU;D_*-zDdP^~rhGV&1S3n3bFRn0olop^=CCO?~wT1<#dWCg~hKuc-q}wIg?U z+o5g0-F9%>W81#IEq~|XALc5Rqr4b>q=cuVc?yRd4{A#3Q{?KQ(}9m3kJBKYa=bj8 z)iIHrmbPxA(=+rUrbOaQ$%*AiBrH!@o?*IZw}9w$op~_xoHPlisD|SR`z5E~{5>2g zHE18A0XS4_{0NGQ5;;|)umY5Jb+o9QNds6p72zr8)c&K9;0dYKBr0T9|0<;92$|pi zEReX6C0Z?C9UG_7e5%E?$@mH6bIA4SY!(q`_2QEt)V-8*Ui4`QboFvBE?EHi5OzuB zPM|1&IeQvM^f{`}F)@%kC3>mNH0#@;Oh#ovbPp1WhU6|e3su&&&b^?JB^YvX;Z|Zv zY0xAlq_h8WfLtM0>XzmS>Cqk1Psm2yA^nAH)hPu+cJ=Q9C={}{|9XJIDxXGUEHgN% zI4hS=?U?k`N^)k1v0W;@22keLm!sc@M0Z;5eM2`vJ_-sL5O!UBOzux1(VcXpZtF+Y zvO*4#o{;54Ia*!wiV*ihJRRbdAzl^m(JacFFqo53N*F^)UQ2F0%8Q)=tWT<d;+J{a zkHg!2EM|Lx^yNy<CmW6<*n(p)(u>!sR|e384PyzSOj)D)2DvFinQ}Z&-fP9Io((4u zM7F3uqdK0qGLkn+ooGbEOsvHz5J%vh43}ei^e%5D6v%ZGenDYB9NzAEsK{{As{lq2 zYz3flg;738p(s=5$jZJ_<EZCx1;V9`aQ8^UtwVUGb9=il!djvGYpWhTCNT8pX*SyS zB8$#l+3U6Rdfv%iZga1<0>}?EK5#WEkEBt8GBP%%97$t}t8tp6p}U;*$mE~uq^dGj z)4Of}BVup&7i@d3tLD;SLwRdc8x&91{$Yi>GtSqUQ_%HxpNgK+opFAdJJuDHXM(pp zf8d3VVBi9moZ%2Xc?wrLlEN;RT<sA5217=pp!8-#Dp{&Gdr0(V2##8#W>>RbN3B(} zYYD0(xsI6AL7h>+25NYwUY#|p({Ms{i}KDMEDf7TZLf9!Be*=;UPI_j9>7&rc@qbC zC+{<rpl^G-l{ZI4hF^`j78#(T1t%v?NlZ%2DXKw#MURJ|1OS(zIYn^T(JGOcl89nr z=MHsrvBC^giP8vl@~W6n>cL8B;hdrf?B*AHV@G&M>ldV<1Pn<|Mi)FX?Az1eQT=Co zpY^UOqW%D_Zz^=!h{^Dof->*45t#yV$Br1}4bGi9{7P+qV2<*wnZl|751OE>KUj*7 zv1&u-6tQ7NMP4GIn_QaD5{JaRDW!4Ul#@$yspwH$jGTGWsGy=l6W$`!cNput-a|Ww z&sMBCe4C<cy%EGC%RF1%M0RbDLhA#gxQQ6#jVUNfM3YA)7Y!Ta6~gw>$LWe6WBMHf zmh`+ix^GgY7`;-ASe`p##}=!x=%rCH6gnl5KxHMBjToKXn;e-jrZ;sLk3|Pl@3@4= zP9+@6CK4R)<~0L#f@wI@Ph`_|C!A#3uF1GErAN!yw_~N$cxthG%5?W+rC+6MQLcN( zjJ+wb;%Lt=I>&otT4K?#C5iJA=VAo?1Y|S}@8Xc-M!_|iO0arWdZHO)N=-;$RjAfu znvqQ`%S`BCn3Sq<#Y#<bX$r-kT!u1(cBu+DU5>)a=>+X=F*Vw(wz1LodAY5<-l|?N zcAxh>FSo7NYX|<Gx8IB5>T!p5T$8CFQgKJDV7Hfhaj#e3%Y{#0kuS+z+Uqq0d`LgP zM@<|#dXpM?N2X+BVz9R|Hh8a?j_vjC!38IFkGId1Wwh}$Xw(aBH48`DTBc64=)`f+ zE!W%;8&_ro%<X2Ct4OS{5DjU*BUV_Ji`Xv->I8kcSu^FD`<IxiL9J?L>-NWHF9TV& z(^Pq<_XMl_g!h!^HO8Lues1JH_g<mk74ID;zvF#G_K~+K0=6l#H6pgQM)p9UOEV2D zLHf9rVOcX}&DnY_l(o3Byxe8I-f|4q@P!5`j)}3HmvaLK;SMAUa0fE4pU=d+!y`vi z!C|Tq7PwYpoz-Wa^e7`1Id0ln41&HeBIZS&!RqlYfI(juoR~LHHgp5nxrwVOiz`73 zA=5ZFHl#Ur<pwX{BNu9}A2;NoLmo@^NK~d1_IXZvg~t7y^L|g=fl9Jm_GHBK{#h^p zb4I^@K%)SXwh^qy5ktgFMh50HNq2)j>7Kz2gy}Wi2t5w^6wg6BL}j9vlN0rj+si4+ zjVcX12y&H|4-L-?R3BGNfGnKwD`d7thFK$dFcw2Xer`0PK_&$fPfK!;5`jvd&7*Zu za?X%wQ+}Sd8qqZxZZ*nbl?eqV&M~&6Vsg&dGdi$3EW3fa1}vw)wL2i%oZk<Ep{8mB zkhed0c{ER#haA`Fx*pFQIxAvUzJvlcwA|Q&1<G|91O>JXEum(il^mTL{ft%~4jUYT zl4w*Hm$4<L2joVJvikuNPitm+20f9ZCE2~n@;=`4nW09m?9o95m?bazSskO!A_#iQ z<~S+S3RIqBGE_POXZDY-Ax&j!2wS==GfFwIj5bGOx@DPOGLsM1x^>rRJ2dzScEnor zYOS29Wl}|A9xKQi)LOzWt|T!v9%nF=fbg`;ngik4OIlBCW|$W1>2GGjk;_U$PZ!Lx zP9zblIr);HXFf!n8P)>2fHYHQk}{K(W+uBfQJ<@I2Y-B=tv%E|%W<#sGBwhz;Y9B* z)v{ygVe+8uw%xfHeo&@DnLU6y8C}3E>sv$Cp(*+qKcp{2b)5&=@-n`VEn&;8#B`F@ zq&zc2K8*zJ%x9fZ6S{H2maE&(+4P?zAJ4@po}G(x%l3H=ENf3WVu{qu&ifzg@Nar7 zvwEP!ew?OKqI=FNOV(IBh#ZRx^yId7WX$2g9Mu8#x^N1Ym#lIAA(HJXKlEe$nek5D z!|bcfs`GCo$7I=Iu8bWv3xe=$I~ddg3TQp%RaP~B@t+i44$ar0C^a9Q05cp!0bKt% zXtnT7cCoB!L&XuV(z=7VoE1O^D^x_!?(sHvCG<IgPB2z7YuGGaMp#g-u~=+03(*)( za&1(`RQq3!mR96OSL^DGG^+xu#swu3EzngMuW<)!LBx7+g27sUb|Q>xYtkk(5}A># z=Y+IQ&K!Uo)R0;95(PDM?(F&n=bbgZe*T=Z)biH$t|ryh)Lp--y%C_R(XXtiu5Vr5 zSl_J{pI%$PVCKU5b7n4>SGQ>4oOx%duKMNet*ckH)i<>@A{$PZuV{d*t-G_mwY90U zUJTYvpHaW?y!kWhr!QKtaNb<i*0iR(zN2A<6t%3iefgzoaZrn{da<%<RRb)xw6%1L zptHNav9sm!rp`>oLZ$iXnl;r`^*TpWTf?%}ruz2P-5smD>)YDvFKOxSMva<V)+n@R zHQqX-O{br=C^g;pQ+~QET~?7Azp8C~b8AD_%2R#f_VHbpwseeNwt59vWBY0tJhd_n z+}hr@V!RPlS3$69`RY>}F7KR>8V}WZU8(V1-HoTNXj=`_<C~jTw=M5(X>S|f)udx2 zH#atPH@F;SHLY3R)Iq&2Rj(VoY;|)p8q2EIpswuS`i_=0O|4z^lH`ZGyQ{ms!`1Vv zRi^LfPoGgUp{j~wwz{*cy|aEz0N1K3S{l1oD%Mo7aVdS`n|bD+J8#C!`UMMS=*cjB z-rV`M3p2BUX)vVcOK3QBg_o`EZW5EUW=6#si-yL=&Wy2Xb@Qg58B|#pS^2S6azLdY z6sBK0ri1RThRzkrh;{8{eAq}mN7d@Ku9g*TO^vDLD;qjL)^qG!*0oEyT0viAa<duT zYdf0M%BGeTE4u@;OyF4g)!BpPXQnF>n>w2tmN!wMyP>mNwKq4z+dwdGx>}jxGTrTt zW=+OWsG~n|-YZTsW#*CeQgdg+Dl}3zEUQf+n{*;)Bxd`5MKv8qk2LDPs-f#r&Dj^W z!M3De-N;lKZEwc#w9Vzh!lh)!oCWjiYR{|ZGGg=_o8W5o9i7m19H3sB7tF-7=AARQ zwl0$^RB^X6;P$crsF{mbG)!;TD@qrZl<wwoWGipzUe&asp)y_5K`J@RmaFoW?W>x~ z+uIsD8_MT*wqF9b?J93?ZE75k`O#gzyaTfG)|O>FOx^##@*JTas(f`<XE~OV@|L#c zt*g;jW#zVeRyMSP*-Qo^!l-0xF+V4Gra>;o$^;W-D^*K7PDsJomVgAAppbE_m!rqp z+eA$hEXZA;I;%Q;`t*}i$72aS!K|NrAT7jk7y(zRYex4^MfT!>Rlj&=A_AXxUC!rJ zm#3hgg3Ja!^w$<dw?%3TV%wv&1v$H8wFS9f%+as=jS^o7KxcQ@R=6y_C~(W-3xhD9 z3YiUjfdIRkS@!2x_7;|XV@_>Bd~0rPLEcUA+JgLTd9?-ow&&LtBzE_!E$IJ6yci1y z{mgEJG4<AAH$94Lx*MXI*B&B`;?ou1X!E0ygtrd!9sH@5!d?>iG>0Fb!31v|<}3A} zlyLbmRcrLwUlF{lSY)_FF?C^xFAeb(A>L*<%k=PV_$tKu&4iYVJ(eXQc=1CXh30yb z!tsoN-(t8#xuN>xs;pOR&}V&_S3*!Sc~r&K-6kc43P!*mGhCv0$bMWs8A|_Ih`#_H zv?8v44IZ>Fu6`Hde*q8XU0nSQ9N!g8h^v2wINPJYW^0YOilW}Z{EsWX(q)kT9<GLF z@e!&NyhK!Rjw^nNcDWzo{2o2p(XRy`=Wu?6vM=3e@9YpiFT@){yal|*v3FUBuMP2a z;KBTls~bXmJ2(R)PmNT!1I*SEo-p3vbq;?3e2K%q1-{hbkAg3A_><r(9sUgXB@X{@ za69K&-YX&g2k;I@{|)d?hyNqQKLWqpN#_T5m-A!#8Yg{dh#v#q<D?%K;$`3)ob>7t zpAzD;z!^|297m~n;9InWr?@&d#OuL#I_WDyyd6C7>A1Qg#IFJ0?d0DW;x~aaNPSAw zt>AmKgr~UrQi$IRzSl{A5d0p8e+T@2hd&<TKLO`8MnYUY7ve90KVp+n{;S~o9sWA_ z6Aph1JXllW>irPM<C%KO(Z};^79SMiBSO41#POi2o^|Z`;6HcxB=8p<j>p$5J_r0| zC;jXYKQF`^z+Z9nTSELY@YkI5wIRL^{LfDM4d8D$d^`9%4!;%rJ%@h@{6mM|8{!Xw zf8?ZpC&V8Ik8pD75LZ75@#nzvob;E#`#bzq@B)W(KZVQx243i-e+WL<;W@EvUJ&BL zz=u2fsSrN_yu?XQhxmnPSIS8@4b>6e45(9}&rpUV0=~#_Ed*!&AmpoyL+LBPd2b~l zUv+>NT8jK@L;PBBy{|y)<g3qt>wOG{?*vad`M(H$qQmb753W!7>gyrS`m!w&_|_u` zQEZNQ1o{m0@d)_ShHD{sc6$@*7oqf5z~RCsB-9_l1C@k&GsI~xxIaj!_mLj-S3*Vb zLC59TE8yH8B-D@)KN>vf--J3Y#PL1ZxqnEg8t~x$A)#tR{0#75JQ8X_h+hak+%^~e z(-h)u;KBGM)D_^zIr=>zegk+gehIZB#JT?^?d0DZ;$H&~?hg{`TOs}!_$(*?k3;-9 z@H3qBUxoPZz|V5h{|bJ-!~Y)QAAw)&q{nl!c_DbClRhHEj|IQPNk1vXtH3*)bZ+Hw z`7H2mCw*RsF9BcUq&I+XaQG$Q+Z@gfKD!-$Rft~)e!G*t6?~7wKM%gw;d?^-Uhv?0 zEdI97(a%5tJ`FtteFpka1U%b62dF1ax>hpjfxqefL6U@XR1H)Iv-Ags><v^ehSFaR z@jrtHqJipfA^stFL8iokDhJ<)U0whl_}f4=EW}gb$2j><2=O%daZdUvAwB~<SpTGb z6^?!e0z}myH5d9p7!>M{L27X*y&fD(m<ggEtY3p{f{vrANUhAuUlg)mq%I4kUzufJ z^aK0Y<Kl#<Dpu>W@)w8f7ppCy^j+XV{}-#<L;Nctz7ITD--^|Dz=QEAR!@MB&eW+` z{WQd101wu)V)YyF8b|*RA$|yahLipt_-u!BD|N6w6{~(BUIf0-(JujC>hLk(%N$+? z-t6#+;H?gy3f|`MIpD$bOtCr#{BkG#0`LtEZv@}$@KxZ!dQ+?}2fxKhzXm*5Uy9Wx z@H?IK?IC^}_}xzWUEudQ{C@C<9R5x4?>hWZ@cj<w`r`6T5<paT!e&HK=gLT7RCc>M z>A}pA^rJFq!b?K@=nxNPn&_uO>7^k)D#XWx_}CCXA;eGA{(~+tLEhg4_dD{w#l4?o ze+BD}+%LN8Inx7svVObk5z_<z4zDNT|NBjCut728-{aJeV7wrc9#=mF-|6s!;Ike6 zJa{la<LZ~-fxpDnZ@|xS^nVB5<M2O%2mTXRe+3WxIj-IU?{M`00lvrK{{(mM=W&ai z_58%|c|Ujb`++~@aBdI!$l*i4-*fl~aQFG+7;yLbV-$EQqo1#iXS&13gYV7ogi3=4 zvpAt9g1i1W8Qk^%TJXu4{Ke{YaE`HrVl@|hiKQ6N1>mm#F98qwvshgOKHAY=2JWs$ zE5L)0QdeZ<AEWq@HV9+Yjaj@{?F4t{*B8KtWHOYhyTJQ9{Hx&Z_2VIMw?DoEKF862 z9DJt3e*!){!^f!Sz=Qczs$K$Lnn^EJuYw<+;bYY6;KBM^s@?(*=3A+HAKYEP>0E(+ zv5JGc>uUk{=8XMfRSfR-M+tZkiqt6ZKvbko1c_x7ij*HpuL+c)HAtP7l|D$#%F2)X zkx=@=to#Gj1>o-bu`DY+p<2NAW$Keq9pGCsyi~0L-{9~b@Zf$bp*Dh_pGi-sty%gB zwF`WklfD~#x5MuO4?@1W58PcJ9|Y&0B1tG!kAOdDsVY^Ef&atdPlCVc@SlMPA+BBk zch}=zgQqjk`=#nN@L;_uRj-4WWDLaBA@E>+k5T^s-|gi87x*m>kKvogK8Gj3?|1lM z@E<sQ1o#1mr@&uy_*n2499{;_ccc<Zv4>fyw;etid~hU4pAIg6a70<DIs<&EO~(7V z`QX8L$JJu+Amplxz%%A>XWy8W9#fZsW63rlraH6Ii`80icRlC<ch|3t;Ah$FSnsxG z<;Q%=;`wTK7LTht!QJt?2RxYnarHo!{xNEQ79XI#4<6KifO-ntwf8J|aF<c6ei`DK zsslvjPk%C^D4yhBfxZoe0DlSbcSAfDOg4Sp>2EmOG#JlklMKhS10SR=$>K%oUc>k6 z^kQ|;a88jyxIcT@a8PakFCm`wt+c*=!TkE!_4U|<0Z=F4oSCO<(7mdozO!kC##c6V zwi|-4sP3*8{q4N0u6=n~g{rIYl!m@UX|r2_pH{iOMW<DUw<E~D8J$)oDigvg!R`vJ zRxN51C908Vl0<%miA^2+wBeN|Hf8t|xLZPYhpY|Y8lz>3@J$)MDa1FWq)jPl+fq|X z+LVGnQP4F_PcX5ump1m&#$I|-X3vJ+S0p`TjAJ*5aAUmE7_T(OD~<6=W4zKBuQbLh zO=YW$y((j`%Gj$i_OMY#ms4fzRT+C##$J`NS7q!?sK``WGEOjtCm6#MjNu8!@C0Lc zf-yY77@mM#9+~Ydx(X9a5!I&3)y8tQv0QB|<BvMDezmb&Z7f$C%hjgJ)yCdLV{f9d zH__OeXzWci_9hy86OFxz#@<9@Z=$hRW9-!!do{*hjj>l_?9~{1HO5|zu~%d4)fjt| zjJ-+5-XvphlCd|**qdbRO)~Z-8GDnAy-CKNUttXT6~>}pVNCiJ#-?9kjQSPED!0Ap zZuKjSUBAK@_A4fRqEmL6Oo8j!GBeKS+cJGyCj3u|!oDp7Y?&Env)<;z-Hx<1PV!kF z^wYM5)(d^>hQ9SfKW$61o``)TrhNFK7_78?XC2V5w3e+4`ql@1>x91bLf^WfZ~f4> zj_6xY^sOuU))#&2jK1|o-@2o3{n57$>06KVtxNjwNvXW`Mc+E3Z@tmC?&w>8^sPhs z)+2qmq_Jar!@8nxebKkh=v!~}tvmYGAARePzV%4ox}<M?(zj0OTd(x3Tl&^7eK=<5 zf}{73Ngb`X`qo{2>#x3bSl@cAZ(Y{6KI>bj^{v<X)@^<3x4v~;-+HcZUDvn1>s#mb zt@rxYeSPb{zI9;Vda!R@*tb6HTPOCd7pJWkr>z&Ktrw@Q7pJWkr>z&Ktrw@Q7pJWk zr{TrA>(bU&)4uW5wDr}r_0_cX)wK21wDr}ry)LG$ucoc9rZbmD>z8Tkmuc&lY3rA1 z>z8Tkmuc&lY3rA1>z8Tkmuc;nTuA85Ts1gp(-F4B*Jrj;H%vE57pq&PTclf~TcT^I zTcB&NYpyGzi_{g+MQQifo~pgnk8n9i>$4x>%BCG$`?U6X?ZUFbuVLA;&Zf)hoOS2a z>0T3gYfD=brL(5#R?V8Jqq+qPb+s2STA<@;)ATq^o2etFvSg+*rbU)cIeUY0#*}k) zrJOxPxsK~}^%vLa`XORBA(Aw`Ow5|5n?7r%juzMH)eR9<kj8#S8Y2i<HX;^@G>!w( zbTm!(A{g_r8f+@7q2oF&UR<Yj5s5ilqV$TM7%*Vkp;Z<wU<7lz-isD6LczNHnL0w6 zDT&dvIXX9bL$aB^(_Ob<p|1U+1*QW{|LN{qu#ovsT~oO3pG6ByTi8IPF`70_pJ$pj z(=e*6qiK3Ffk}(?H35AkP1TnHbUf>Y_Up3i^gLW#C;BD@=`vkf+M3&$g6Sfq=xEwB z))13~>WI?Wo2l(iNA8)lm^&&nTT`ttw89>FSLvrv&f15bDe~V~&&m+mxNgh)_Zwxi zHu~1rH@4&1q+@Np-U}?WwW*=A9$Q!OJjC}jF+QXr@R`@*T=E)u$mVmGl~Xl>SIE>I zj3dg;VhDWRjhR=;d^Z>~FQ}@4BPWZ_WJf-gSpUVoeA|eeB0BRSk4_f67&vmO;6~tl z^OAwzCi)rNO8qIKa~1VZ6MQx0Qw3j3Tr2o`;MiQ85H{nm_1s2m>VGqEbeibjM!D%9 zz9WmVQV4hAu=2Z!jr=~~$aKm30PzgL4^ihq?21MFErX+o58#N*6rCSXZtC`9V$+Au z5F7jd?dbf<(Rmp-I!o;I0Y^?3{6Ew&<^IWFmisn!W{b`Tl$){m5ZKyLNRDu`A3{Gw zwtu+S#p)DN$CNvSI;O9NIyxgAont6J11AK&Q;nP{_*mfBL-Gf>#~GZ9cpQ#so#>E9 z(DCfUJj&+=c?W+(FuTd(9tUr6FyAd(9gb1-EXnKo0>mm8^<iLnaf4Zh;pY7X>%eze z3<Wrbb8ryY1tSa|3Ot++!5GH~gZX}CI4gya!ZE^NwtcvH+05Y|5xjU-gCCaqunvR2 zfRhPFlG6^yoozbN;2gviI3n}JPBn0JzTjz;pDlPcu=TYwfUU1Brv5pib20V#14Rgp z#0v$l0k-pv{z%OEb}e-liO$Wy(Zz!I5T7fU{pl?c%&+v`NuJ)v#dXFTCvx^DaSAcJ z(&J`Rgky=%7kmOS@)n}tGK2RZX_mo%!hoJ*a2<4(8hje?3WJwJr_JEML%!Nz{&o@D zMf)X?uQ&L4$hn?Sz6tW145puPs3>Q++u-XFKW;F8%iuMGFGt=(2CoOEKQgZ#6X+4o z!l2T>h&lb(^~B4dztmvv$-3O&8zH~SVD3%5*5IR{v&rD?sQ*@jm%-*PgSi*%s|Mc# zjN#N}agXUE2A>4^(+1;@<J3zA=Rk*hUs<;r$p2<A`;SgVc_-iigBL+(q`~(<cdWs; zLtbU@vyj&s%$)@{7|gk_%iwcRpD!8wd*E*vydE+4da_*Zd40@a`q>W+?qXXEo{spJ z25*PXYs6-K`=gORf%t7=ItRkLM*dsG{DCgdtmkoJlzR$v1{0h0c9@YLLc5M7W@Qk@ z8u<s1r-{wAX`+$;3GobK4g$g)Bfk{&UurP-)in`cAUZ9;sS5>n8=VB|c{TAxBEOdS zV!<1U>ji%fIK|0@u$%G*!F!083H~zia>3ssZWR1o;wHh55jP9|0WtbyKk9Ihc!kKH zCtfM|MPhCkNB9fzC4#w!(z{e}4DIw<1s4&o5<H3+_P>F=#}l`Sd>nA9UGPN8I|NT9 zzD)3ZV&wfQ%HjS;uT$jb0jIhIH&Wg$cop$#!Jj2YUhXU0KukwO*aV!qLhwyShkv`U zi+GL5Z>0`5z$5H6I<4rR2Z*l}`9s8?5&UgpIyb^g#Ge)XPvWZubAO<Bjo{OWdjwxh zjC%e9_PK}8TPN}s;1m}Lgl?n5J*`(0uNV2X#2W;2zn*uU;G2oB7rdJo_RoO*JBc@n z{BGbB7aoKMjn2!k|2<-E?nmIBJ#VvM?$`4^C-`T?TLiyEe52ss5OV=T_yh4xg8xjs zP4M4{w+nukc!%H*iH*&iTwpH92>7#F<?R&AAKCG^C?X6czFBaR`168C5#J(s9PzD! zD}YnC37$eZ`s7aZ$wdZpy=gJ{YT#~zuR@<(V{kRbll$nHmrKg+#9t7bcLJw&3+7%r z>g)%7(BL@oK1%#W(RqUUw+k+YE$<G&yw-br1TQE4l3+e3cy|iEk@zmb`-%4oe%Ha3 z5P4q~Ig9k}7Obxw2LI5J>+8i=MCV<~4K6}oSd1zw{C*G4a(`vp!rLR;7T#akJ}IHx z^ht_xGxtVQZss1BT07@?pK0ej?~$xOR#9&Jv4-+{r4ExRzfbT~%8ifDpxpR4ui19p zsH5Dh8}lhQYtcf=&04gCa<f)nNcn|gU*8LTRWN@$&%0l+zR&rZVE)9J?GyejnC*v| z#HQ`6gKe+A|1oRMd6b)W)f1bxG!dJ1?^0q@=gWvqJ&z?G=jr`2#~Hi{G4DAk-;G$` zg8_dHIBn$o-d%0*lZa0?_-BZx82mh9-G|8gd*Hc7{uW|gf5`s@e6Eq_qAS>MEH?q% zVDKQ|W`oB7>$X5A4cuYmwZK;r_s0q0%Q!qb2g0K`yrVSKd)>Vo1@DJnd2ArU4opz* zMZtTCe=YdLIPhNupGo|-;8x=I1YeIR$p;7o-Zv%(YN$R>%$pp9FW^XyM<o&V5f9T) zJxp9C@}Cl$?P4zw^C1J_WgN+*hPoe<DZy`0UMiUWo8(|39LA9xrJ?>iha{Z_f&G{~ zPVfj~PC$fGVh%XMiNq%fX8$I~2|k&4yx{4?oD>Lih|2}fBc}5qEFty<^L8Z3iG#3$ zxKc1L+etbo0$nsYK`<{}Nlq>VUP6*|Tm&xnNjeGwm*XTS9RioO<SBybX35EdA0{?` zXvy_d|BNh>xOOG!WC+g?Pt{QGSxD9j{te~R1pk3}y5K{^TqF?QBc_8Qcv$O_vjpc8 zpDuV1F`WQ`_r}RNf>Xp?un|rmK2va-n2wHc3h`NjXAsX5JeQb@5W-^Ovjy|-wvu!# z1peG=a)IE>h`CT9TuHo0Fz=_6bUuVF#9Y7-b`Wz>LAZ_he8G1SUm*B?Vmd3rH;FG2 z{3!9of}bSjf`sr4@lp-d3&ahAe?z=X@E?eI;X*h>+$i|(#9Yh}{zcp@n7_uBTp<|0 zn4^*_1rH%^5nMuiiQqBBTs#oUh+75oo;<lq@TtUYf~OO=3+DZKl8X((ImDL<=1;#S zI|a8A^J0szhPYes2IAF%w-R42_!i<T1oPfIxkm8UiPsALCNUQ_ghz=#BlxGpR|)1l zcJi}=|A+W$!EX^?Blun79>IL6kX$D?m-t%2y!TG77n~&CAei^t$?F79Am)OHFok%d z;M0kD;XvTMck%|o3yI6&C<vDj-z0KArzN)u{tWSU!F=XP?hw40xL5Et;+=wdkDc5l zcn|T-g1<uidBMEjPTnGz_uI(|sl$(nZx{J<#CHh(CGj4?eZ*f9{5tVng5M_IE137^ zNnT_S_)FKxy9Ey*{)*tC#P<j;A--4e7~=Z`ml1ze@I>PK1y3dZn&3Ia4+uVo`0Ii% zAl@gqf%rkemk>WBxQqB3g0CWeSnzek-xR!+_*;TMPyB7cdx#$qd@u2L1V2RlUBSHP zPkvAE4~X{*=6!zhzXU%|{HWlUi60aEd*TCv-ynWmFz@Y?PYC88W+cBanD_I^9|-3C zeDa5ak0O3j@Mz*62_8@UW5LzLKM{Ny@l%3l68}{2nZ!>EKAZSwg3l*@M(}dtgMwR$ zpB22C_&LE>6aQTB2IA)hZzA?(9^OXG3oHWf^OL_3o$nIABKZ5nzZLv6ai8E{5Wgz; z72?+f|B?82g5M<mAHn$bd6oRVVE+7J@(+R&#D5e#g!oT_ONd_=%)ebp@__(hBJmp{ zKb829;9BA;(OE+Lj>s=2{=491#1lkk4e<veUq}2;!8Z_pD0m0)zXab#{E^^0i4P0D zhggZtZxVZgA0>_m{t<Ch@Uz4*!7mc$2<{{1%_qX^#BsrI6Xyy3fH+@pBoDZsVE(N} zk~gae{5y?gf59V&2MA6P7YIIqc%a}3#D#)uiFt#DFqe3+;3dRGf*Xj32wp*4EVzw$ zsNgGzhY9W>9xnKLV&3#2Y#|;gcqj2ug86qB$r8c06ITl!jy&E(!6n24Xa&zVJO&fV zerBsP4%{26#rl19iUtsBa9Ewm#59I56-R0_k$GM)Wz~UuTeVotN0ho%a4Y3Tr-S&5 zBIo5c^@89HlpCE*#J?2z7DTC+1n;EW=-fj5vdDKMO8r^zUdoNmJ;eV{<o6>=y(#!% z%8kw=#D5d{enhE%2<Eb7b$(3zzQ~_Olsa1aR+V+FUDe&N3~_g-#49c8#&2$^GW`v( zj9>oBI-6P>$|x-heT<adi$_W^yAnS!r?VyTKkH;w;fOn#KG_C;F3D+t{VW=4$dSL< z{@?OteU1G;mYJ0|^d<KQwfOfRbvbBdSzmUIB(q;Lo3Bxp2fxskC9&!3H2!p!o*Slw z%;r=*1i|NaDCwVQk{ukTJ4A#Zacgbq>b9e5^g0{bR^ZpBq_raJY+LbhMQ;7D#xY|p zq_|#l)~E?Tu;p6PKV>Ce@afJ+L5-e*%b5;UCbp6BB2@|janvMylHORPW10JpdOmc* z<uacQw%l<L#BfYC359c%-iKdi<V@?2gO7Tyy~*Ga95z^cd{lAurhunxqDf<(W*lz0 zB`CK823amHTRM&9^48n6$LDhD*kDa_DR%8`L4_+Iqi()QqdmRuA-3bO1qSwk+hFbS zcGb1FANH0)Mtcd9Mti(XVjgR6GTLyYetyQ}nTnX9q%P=ZUYcw_zYXl#<1;kdVS}w7 zmvpy&$HU$>$XLIDCXMyuyAju3H|+I;+y-lp@2FgRkH8);fwVUWhpk_8$R6JvAIV-r z$lkM#y&}inzK}isS1P;)*??pn_>RP_-=AQQW6Amz<FNI68G5dN=<ik9f}E_qH$J7_ zN1sxUfBW%i%H=zhPou}*%lR~Vr$Ucyvg^htwU_T)Y}?rrGm+sZcG7~|w6me-_Vez! z_%;BCWIrE+!}jyCkUjqW)?8Z&$KL9Y-UXQK{H|()EtkIUmRq<;{yv}Omg2DGZVuVI z36p)LHHO&QyDnt!5!m|>>9jWrhqZTm$lklKw+87pSbMjI>^;0#{@#lA#^A8_^mkvI z8F71|Qv6$B8?3ztLiXmLi@z^~!_pqtcxz98F9x@3z~B-1_RB;QXphHJrX5x<hQXR; z3o|;TzY6J{k;F3q<ThA)+^^tdS4*L19z(RMt-|j@?dV>P@jynlV;m0K4%&ihCN!q7 s?&9KD4hh!)>Y=OjTJ20DH3S!$56~|**gA1da`j$rREqE1Y_NL&3!$29i~s-t literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/vga/atmega328p/vga96x40.d b/lib/libssd1306/bld/intf/vga/atmega328p/vga96x40.d new file mode 100644 index 0000000..564111a --- /dev/null +++ b/lib/libssd1306/bld/intf/vga/atmega328p/vga96x40.d @@ -0,0 +1,14 @@ +../bld/intf/vga/atmega328p/vga96x40.o: intf/vga/atmega328p/vga96x40.c \ + intf/vga/vga.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h \ + intf/ssd1306_interface.h lcd/lcd_common.h lcd/vga_commands.h diff --git a/lib/libssd1306/bld/intf/vga/atmega328p/vga96x40.o b/lib/libssd1306/bld/intf/vga/atmega328p/vga96x40.o new file mode 100644 index 0000000000000000000000000000000000000000..d276c977268f73459ff0b37ee07c8f3816ff95b4 GIT binary patch literal 33624 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 JoPsvr{{z;bB%J^N literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/vga/esp32/CompositeOutput.d b/lib/libssd1306/bld/intf/vga/esp32/CompositeOutput.d new file mode 100644 index 0000000..c0b0061 --- /dev/null +++ b/lib/libssd1306/bld/intf/vga/esp32/CompositeOutput.d @@ -0,0 +1,14 @@ +../bld/intf/vga/esp32/CompositeOutput.o: \ + intf/vga/esp32/CompositeOutput.cpp intf/vga/esp32/CompositeOutput.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h diff --git a/lib/libssd1306/bld/intf/vga/esp32/CompositeOutput.o b/lib/libssd1306/bld/intf/vga/esp32/CompositeOutput.o new file mode 100644 index 0000000000000000000000000000000000000000..11b90f50442b2fe21a486b26a6b1459979895ec3 GIT binary patch literal 2304 zcmbVNOOM<{5U!rt4I53e+06qYA~6mGm{qX7vzzPzG9hRQ3u48t5)jEHBahwlNIbS> z_bdq<IC0{d69>dE;KWbh#-Bjq7v#(#eAVurv6mnaC3V+VkFM%RmHqAQ{f~qYWJ%Cn zT1Z6qP7r+u<2CKjp><lLA@DMZB~~?fdX*<jLSPAz5G%}@jpa$ANHkv3%BAI!mC{Nn ztr$rM)RT!p;tI7|H(SkBBw815uAXZ(+n3sFuOP0mAj#5u#13>GLvM$43{Iq}i+LHk z4e*8#f3BX!=Jb(qP=I#1NL$;DGy3!*l3}c#WU`aY;y6?J2F;RUGD>9R@Ok1i896nL zF^1zHFRg!fnfouC=CPu5Hi#wdefEX3d-ZC!>vXrgEpO9tr-?g^gJRt40+(LB?JZ!A z?;6F<H7KUxtQQ>R*By7{xCe#f7Aoq6I+!~g&XQ0~(!?#K<}eSVKm`@KmMKZy;?X2? z2Qvg4Ldunzlt?DSG!LaK$8M3ykR!n^ABQsI3<WKYr|*Ezh%xk!Mu9JjY<tV!O{ZB} zOq4vBscfdaFw4jvr&H;tNt6fvVV*w3J_|pMW#lSZC_l`g^W({YM^QxG?aiJ4wWhum zdeK&BZ+G`yr-R4XFz=uXsXA4AWQm?VuiBcm4nnP(va~);Xf8mwX%$%i8gQ>7zYY9; zMc$la2G5?~z`WSQ@%;4$Xp-*8d4wkEhO5XY=a@m0TF2y5^hr%~g6`MklQgQy$Mc`2 z7v6KffA_HealcO*?3duq?L7_DH0$Sbr194>PmSR1M-oNZ4+eu=9&M79<4GbH(gZcC zuZ%xJVy)a9c0mGPim$-WGCou4UpDv+aQ>8u^-_PCG5q-h(lPjR@EwCW2EQ5m48T7$ zxDEcP!5`p}?ikFzd~fXk2>gM;U?dH`0e^li!NEbVWAHw|1b@rm@4@+Stp5R=yyD4J z1p{!EmwarIl8+U6-09?@ZOF@I9C+mw@+HAmxz3t7$b)1g>r42S?GmK0kkx%Hhv{@G z(eVG3F2RxO*j8xypINMC8`EVB#!VJL|K!Jg!*Bj?e*C63HlU98kbxm<dj~RC^DU$Q z9l|fbctWjb+bIlP2jG@|1aPeYZsQ$RFq?nFxX8ee_2c@f=6#A^CFkM1+`Tq$1Z>v; z(jOSt85pv*KICe=pAhc~bR3Vn-^R;;c@5VW(?tjeHV9;fJiam9`i<}t{TVt-){kqI zvGu!vhdF1RjLrHY#GE?ty9EQc=y?p@-x>z*)xIqtjbWHEFvPK#xP_~Jzv8@4wWXY_ F-(N7&Lw^7O literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/vga/esp32/vga128x64.d b/lib/libssd1306/bld/intf/vga/esp32/vga128x64.d new file mode 100644 index 0000000..e9ebee4 --- /dev/null +++ b/lib/libssd1306/bld/intf/vga/esp32/vga128x64.d @@ -0,0 +1,14 @@ +../bld/intf/vga/esp32/vga128x64.o: intf/vga/esp32/vga128x64.cpp \ + intf/ssd1306_interface.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h intf/vga/vga.h \ + lcd/lcd_common.h lcd/vga_commands.h diff --git a/lib/libssd1306/bld/intf/vga/esp32/vga128x64.o b/lib/libssd1306/bld/intf/vga/esp32/vga128x64.o new file mode 100644 index 0000000000000000000000000000000000000000..02ca036160ef8152b584310d20a28fdf336f45e2 GIT binary patch literal 2540 zcmbW3&u`pB6vv;}Nt&{4nh+Ea0cC?|Nl9&IHz7(Jwp1)7iHOob+Db^3EU!KLqj+u0 z_C{%u-~<N{2c+Kl7kc2#2_!Du`42ev+(Y@k@yx~>34wUh_<i1+H*d!C%l`WI{>O%4 zkQRfE=+q+m=p4~EsN9eND>O&5^aFU3j0tv`{CJ%oS`1@~QPx(zTG#|nUdF>PrrAGL zne0b785Jakb7Hbkg*9DR)5?-L3NDgXIC!;=hbi$I<4a_`P1WknsyRbc*&uV~#<H<p zy}rD#H~&Tzp>xLNnfa=@w74|;Dh9T|5mf|K_vSISE5vF_rN9`^Z6g4AUqO+*6z>A7 zkQUS=eB00!!+1V(5$`6a5EBPjlEYTPQdNwl$|X5da%yE#GZ225KT5<(Gz`NePp{Gt z6SL*!G>o!-HxfaOCn}7it_0=tdtO>NgLv2uMZq#^tlh|v4eq-~pC7c`!@YwdepJg{ z>>S*ywN_W_^;*4QH|({VHHfTE=w-cT9bEL&TyKE6A4@qlH{clf!=`tfzE`ulHS11R zv$8yB`ZAf-=?o)3@5hmq38_)t3B24Z*<(FLv6X$%PptM3$vUvoJnt7IqE4Lp!V*0z zON7svP%ln=k#G+g$=BRH^O~c{!)tb&<F4n3ELm?b)f-zUn;W*DB;@qsfpFp|NImB; zjUQsLnG=U1uyT>*j-SBig#9*`EDP%EYn%V8&G;b5cC>?>VU{|WMtJ;i7zi34AS}B_ zm{~Lc&`zs$qqc%&yQ)^Kyx9sapWz95_M#kNj-7Bm!^Jk&F(y2hVBFLWw0{lUEZNK8 z4@&mCBW8H^f{*>_7|!-TenL!=H^wM~N%G8>?DHdLFbSu+Bqm)TK9r|2g<GsF=gBLZ zXAZPU7wOE5yYA7UyX(3nVZVUSZtqCQ2Z@`CuH?rejg?{V2Le0S_1f)J9IuhK!+s=A ztv)vL8WG=x#%wVt^iBqDobRAtX6DI<ETAyI3C&lmF^30)=bqz{hOQ{)cGnfV&^wB` z-GSnFpzkR@fqtOa#X|XtccC9Dejhqk3`NI^?;!q5#dpEqDjq=dN*X*E$Xh5p{!gLh zIKlia;l0BCC(yRypP;uCKZWMK#xcJ@f2jCZXtJ|MgWPLF=V_sPnsRZHlg$?l**K_V zry}(1Vo`Y7QCC`^v1%{%qOKTk!t17+pbL%ccBSpdgMq;P`Cnxbftaq*ZZE#6r>(h; zWf_H8elei`DUR2Z_tC$_@kdhU2FiRtGAPk?*I@I>yrujn_!|ES##WPluDgID*9Kb4 zZ-D#SfY$jAOU%`asNj1<i;nvQj&i?;*hJh9_schd?l%DIHb7d3!TVf`uH*e*&i4TM z?!w3U_$JZ$5-_*nbHwr(#y}^5&B#UWb!Z*;7p}`cU~AEF-^0PI<9^1%;MZa#I*v6` ujO2I3-GUR_UH)|N_-0Xfta@#M#D7OIgA&fe!q-AM?kV2)iL5CeI__`Bj$NGq literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/intf/vga/vga.d b/lib/libssd1306/bld/intf/vga/vga.d new file mode 100644 index 0000000..7443b2a --- /dev/null +++ b/lib/libssd1306/bld/intf/vga/vga.d @@ -0,0 +1,13 @@ +../bld/intf/vga/vga.o: intf/vga/vga.c ssd1306_hal/io.h \ + ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h intf/vga/vga.h diff --git a/lib/libssd1306/bld/intf/vga/vga.o b/lib/libssd1306/bld/intf/vga/vga.o new file mode 100644 index 0000000000000000000000000000000000000000..a2744dd1b735e8a837e97f9d2736c1599ebb50ce GIT binary patch literal 3256 zcmbVO-EUMy6hE`KErl(Gf)o(UE~I=Zdv{wZ5wL(X&^B42p#fvmtlQnYAF_M5?!AkE z26!=1A2cQ!AMhhlV|?J*S6_Ja#WxcDC;BW&{r%?7?A~2sG@fMU{LaUmIWu!+?!9+0 ze@Q7NmXxeWPZC+&Eb<|Yv)bXPOv)}9{qlQA!=i?$bl5$|Zjh83p(^saJ9!p(ID<~9 zQR+t$!*xFtmDof{4Gl*ul13wG)JQspiI<??3#ZUI8XhOy5;-2yGg7U-7BwZw<k_S% zE|QoPXZ-Ym#F^x&1CvWT_a`xULLD04nRHV7QrC7*sO`Iv=_I|9a7r%iM6!p4Y{Y~? z(wkg4x7WHH**l?jjGW(dXD_DPkEXMUmJ7+s8p<}XVPn&&Cge?{dYP_D{WZQ7JEM;R z2LO=LI~xtBM=G%`+6Joh8R;%DtYlbE?Hp2$!g;C95S8lqLA~mG<urG>gYKn5D2<k1 zP4`)}hAzgtR4cY62+GqZawiKntHmY1ZiYQQwi`$fx?Wg${qlTadFgUAO}W)sZFsV9 z`C58@dOAHl<IcFbbf)QNDve@Lo0}$XWr7>^wajX#3Mm>fcVY&Zvt^9p<SZ1;QfIDs zv;AT^1J^4-IunHDxvJkm=uD;3@k?R7<!1s<bC@gTVpxpJn9I9W^491Vh)#KNAm#36 zU_&Zdte(v+Nw(H%dfAp=ZWpu5?bbV(B*?ZJUO5wbL6|MAL6>dRSJ}+o{jV{0TFG{T zb{4D6*8NhWQ}!gvqu192%ZIyL6Iqy_Kb<~`eLiM3S!6qEWCNrmac^oYo%j*8GG=QD zJgU{00#KKeQ4PuZM%?Q3S$XUGBRJ5ou6fBLTHjy}b5=w=-jj1N`Cu0ltZ%sJdpQiw zKO|@R{D<VifP85{roES?zB^qH2e&a!QT9EJBl?Z%DjeC;#RN{@Zc@f86C(#VesKQ& zd?)19m_ObYc?)vyjJ8O*&psyYK6yxPLyoWSexH4CeLRgGIWi%i8j&$}@NJ5!t58^3 zE-V%bqCq|aS1>5H{BeZLg~F9k1Oof}3xZ+??cdN;I4XD|@)qh2rXJ+q;>AoWGhU zi`0#}?@_vRVMeoynnkv{Uuor@dV)lsh}sh+y%kJ7Bl3~X9e7uypQIj`@9ne1EIQCZ zG(`pI7#hdsz;(?5Gu|skUjn~kFqm97_y{=9h+{b&&xbgRqP<~o9-QYy{RiMYBjOZ% z?ixG={IS9Bf`4H!KLihm_n`xQhnC*2q42w=%vY8tX?+m7>!bI?jMeK!lJl@1ra$m| z;LjU;AAHu}&%sX_{1rIwF#W#)=Xl~Dz*(;fUry3%XemwzdIK%RjR)~~6h5USrmjpu zr-9S<inzh;W>{PmHwfDiuUQm&w?c9Ga*K<XR9q_D!OxM~_8LXES1lM3D>jLni|wLc z^$;jFr0rK5^&sq5vLbC9WMd)K1ud6a&8CO%WIR%(U2J+-+J7b<4~}1-CkOEi;zS$i z02;AF0rXFPtVzC9|K@ibK7;f2-j2uy7g;cV#H5pGKWP+oHoprH`J$eW)bbDo`UDvN zOZsJ{jYq$NX2$@^pJ)vNL)KP-Y%xuX5YhyOtgQ$+KJU-?=uAP!dASdE-aEi{44~8? z(8rRsb)bmH`wj7!H+}iy+jyS=+cALhK7_Xk3|ZSJkmK<lBi=3O7>{vnya&J>!#9ZZ z2ZT8r1TrBT_nzGP?ZH7mglx(B{Q^bY?-Be4*Gu~&<7dY|hToJGz?mQES2W`DXryIq zF8vsD0*yAVhcV-I^aSy?L!sX#<Hz?3zop$81(Y$=%eMrE7>C5z2+^ew^ZwqIqWLKP E4b47*1^@s6 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/lcd_common.d b/lib/libssd1306/bld/lcd/lcd_common.d new file mode 100644 index 0000000..82253f6 --- /dev/null +++ b/lib/libssd1306/bld/lcd/lcd_common.d @@ -0,0 +1,14 @@ +../bld/lcd/lcd_common.o: lcd/lcd_common.c lcd/lcd_common.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h intf/ssd1306_interface.h \ + intf/spi/ssd1306_spi.h diff --git a/lib/libssd1306/bld/lcd/lcd_common.o b/lib/libssd1306/bld/lcd/lcd_common.o new file mode 100644 index 0000000000000000000000000000000000000000..48cf0482fde35828862d045a32a1c4c20f5fbfb7 GIT binary patch literal 23528 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 ICYvn$ANi#y-~a#s literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/lcd_il9163.d b/lib/libssd1306/bld/lcd/lcd_il9163.d new file mode 100644 index 0000000..4749057 --- /dev/null +++ b/lib/libssd1306/bld/lcd/lcd_il9163.d @@ -0,0 +1,15 @@ +../bld/lcd/lcd_il9163.o: lcd/lcd_il9163.c lcd/lcd_il9163.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/lcd_common.h \ + intf/ssd1306_interface.h intf/spi/ssd1306_spi.h nano_gfx_types.h \ + ssd1306_hal/io.h diff --git a/lib/libssd1306/bld/lcd/lcd_il9163.o b/lib/libssd1306/bld/lcd/lcd_il9163.o new file mode 100644 index 0000000000000000000000000000000000000000..8ab3724915aa8e80da0d4cccdfe060ae3ba93dc0 GIT binary patch literal 51224 zcmdU&349gR+5gYnn}ra_LV$oQbHlzSx%aZVhSe=93Zhj@Sdu_ABp8AsRSb)QiV6a* zaidnPwU%02m%5-;YZZ5G)mj_(rMTN_Tb2Lscb;=*&K<Dr`+olKe>pIBzQ5<3Is0>F z?%aDPXHTo1?s=ZF!BaC;sFb?yKBdk<<QSb`n3|#{tBy@deS$4->s-7p>1eJw`=~aM zwO4h_=-Akix24n8r#Jt3^J5h+b=a64yVVY+%-d=$q8{D)?2KoN)s8=JdU{i*t!*7n ze23amxY^&#oOXE|yqv;Pe@E%Fx!xB{>u)MV`tvpwY(e#cbi*ntJD#i9IdtdHXIB2s zo8Ga$@CyI1t=<>whhDbiv5_y2oY^s;FzufJ%dk_^LmwLX{7BVN)bWzn<I)c|eZA?z zioC6sH&obC^0r7FdR3fPv7_Uejt^ITyDD!hUsstld0V88wq<!}2kT|^xo_reU8OCn zIue(8U$k|s-nzc9ZRJL%=gu1$wmfg^gO$%_Gu_6HjhmHf<Cej+NRK@^^1IWmMGs2d zU#jR?@$|=!6+T=z4e58F+y`ga+C^)7{u{QoHU&qe&8h2!g<)MYMht1#rcoG$VWksu z)h8^IM{d9onSFA>zb$1|q!i}E+|Mht^;$I}n(GFgtBhP1jDVd#ohts~J?{A*7Zr9d zJP$okgnWu;DD>hEY&O4WZvVcHZIL?KoNQgof}Zd{?xlNzt;+0)z4v$DisC~4V@@{L zXpdOCEp1@O&cZ+WBQU#%Uiw(+%em@{bseh;rO%?Jx;<66iG8(d#{a(AVrxc^vi$F7 z$_Av)?3=xhfX#7LBzN{h5chv&ZrIY>A~g%_s3FHAb6&6=neG19bHe5pZNIg*nNs#X zAEIULeJ0p-X9@gcF1AivJ32n;Sc6q))0(z5ZSQUD*t%xzn$2rguUX&0)rjlUWoyn| z!~LdpZR@z-yl%DLZ(X-m?=M?-uHJ9DpzQ)3f5GYtPI;Z=`s!m?tFkKAeWP}CDOX+o zls~UyNyk$j*V9bmakS12;%i@D(qXM(+P02MUccqt?Yfq1)pgjmW1CyCs)EPcb)I$L z*bJ{2HZ*~=RRUaztqR)=ZaAh2TP3yxwlzz(EIDr^+iv?k+OzAi8rit;9MHx*KUi0( zzId<Vla7uVpHx+?TC-$LrT0l$M`g!q>=W4k&Ks=HUi4;aTk1xX$1<6V&3i4*9hvjz zJg4NmEr~ZOb-$<`?H-RSt4!kT;^yk|nk8z-K&+9j&E>UoS^k<O?62sY;CyKNK;}l# zCI9_dvFIH;D|lvowBiLlA8KFccrAK29OdsC+r<?dg0W>iRaHlun!Cf>eQELT-9L|e zqekD(mtW-I1^@5xa(@-;5!(^p7F+wE_sB!B&gwU@^G7@!JO86cyn=)p=Oy;_vO9_j z_bKdEF)T5_?=x_`%8eDhUR2npurxhtczI>z#Di3BylD9D+LGO!i}&4~J!E&*j@_Mi z#~$1rdt~>F-6#Hbch$Jv8-{n9QJ_?|^0IhUHIOg;_!12{G{ny8p29BI(@IP$dmaW; z$wY1MgjY2vmfg_QswBFtXDwr5xs1up%H~dDR`*<~O%l^d$K-Z0O4r6MCqAj`(e}{z z6rE`w=A3>5FP*WOS5Gtg3n8vwv!uMN1LJqYrVpB)jq6JHAd_Tf{39gk+db>}b|la> z$~v)#B^WWM=%?VA#LUw|nv~Vj<>xpgM`BiVxf4Q~l-1Vdw=7L!)^&LuqKk-&bWDMW ztzAAvOp%Bix_B|Ax~W2Dn#D517nRS-4bJ}+UJIFZ7W-c1-%I@}wSGBX8>ca5Cu5j< zmKfimW&v632bKRfyy`K@`cb?X+>M83-O@7$N&4nzk6DKOkflo+RQANKx-4DE>;rTw zJrR?%h>Mu68<s6%hHi4Mh~ss#JSi^wd-49dnJ6xMPG1(Ii_V!)+yawkZ%8pKttZy- zB9@*V$BP(7L=7X0ug^>|$}#kthPc0@kp7%F`>2xl!8+se{xnO*I+c$ybgG4_q!6rA z9o3&^r}(p?#jkV>-BE_x-&>4BvW5U<l(e<XTSKcJCf%P!Oq(;U;L0E|k5Jm2TbFYy z&2$!HS(Nh|TIdh@#h4p%Udc4;!b-ePXpI(jWI+r*CY9>JtZ(#mBc}ts_MamzPpm_A zRmcd&Hf}GrX|4?=Ds>!Qn~;&`EsFopTjY85-c+Sy*v<<X)1`j1w{Ww!XtUR_*^6~r zF463ro8-XQ1{_`=yHKf~%#!s|y1JKox-Rpfz4mut?#g)fwwEK>$w2YwPK%Tp%4qLg zPxt8za(f?4Nu9~L-U#goOoE_G`j88ePuWZ#QM<5t?Q3(CDp(HFF#4no1!urAHp6l{ zER$VJY0GkTsweJaj?-Pi!P$U{pp(2xg;}UnyU19l5z-w@@-vepDM{|nJmM*H#D!R! zn8Tkkqdzp!8?YoYni<jqoid9=#yX7*lMFOTOqr?7BPN?8R+%!74x)oHY6Fw5RjWCo z(<m7%R)bYYnvR~WJGwt!y>@m#I(oJ@)a^uc^lWcThUIivCb<@N^zq-((SOaXP&Nud z1u`1lOKhl=uJceM&CrZDN3@wnPtS~=ZKBa9K_@h1CON|-aR+yUNn*;pD)We+m?LaQ z-xEX!Wjq;}WcbYyd+F$59Dgq%C-4q(`!C@4+6@w3nO==xWf;yEZ$M^Oj-WAt?FbxI z+NuV7-SjzyW`>|ja}n>%uO%X5orX!jwpl$cJY=&uBpI4+407qk-1T6gUU~)SDht+H z+S@-x3v?s8dV4NdUA;XQtghak3l>+^VaUa<AY6QMWQD?f&`sk~eE7dk!o{tDNir5U zH-in|kwK-D!3=KMGXt}BvIb9nM+T;nTtDAs63p#Yc&(4MnN^M5q=!#^LsE0GdF_L6 zDb$sc=MUTXVEOb8SE`J$U-D%DHm|)JM-)?jIXq+db-GU&F$bI1zQv~dWT-o}Mlyx> zS%G_OFu)fgZj?^&uCCNDrfq-4=Jf6up2}?K(pcA|-ks)VG@5Ztu6mPR<jZtyXlK5u z^@|y`DQAj(8q^=UxplPl!K$oO1(SF?be~;GY;Uu9?HK5uJJ5l$zRpFwJO4$-I*n7z zPcOlY#@dJfNP4esE8W*?*Y*At&C>Qead3*#%c<S$)ou1zrvwe#v7pI?5|&J)8n9e# zPh1a^IR_3nLv0_WwM=8_k}G)7x7fV)G8Efoxw<0beAeX*bw$SMtjp=@ij1?_K3HV0 z+WX1udtH!kcrt4cnQ<~Z(<CwL-36IPTp7rqGk+SG^!j$6$c%OS8I#21`RB|dJ_=-z zr-zn1^(+<{+sm4nW_NjQdVnf1_q=xWSX;)42|d=9ab7}?wPl=^*kh~r-eVVJ*5oQ% z6X#TXn@M6?cVFfaI|CWC?$3cq_t?iGGe#kX_kA)2b&_Hu&6zF{$RN*jVA2On5xKV> zQ{JH})@vnPD0YZ<mgkk=#6UQ^got-chhmrARmBVT&EGG7V*a5e6EJymdO8NYSsbMD z^AF6AqnJ)(7*pm++8FZ9%Qlv59vv&ab8;!(V-16`FLKH+RQY8w7J_$L@lN59lCCT3 zvfAr?HWJ|7mn3jAD(vA6?aitdm3s&EwzVAEdw*>#wq@&@o3gv<Dw@_Dgp_zsJVdv% zyUC+0YrpJ?WjQvN9@gx^oIkX8vDYo9s@Do#LeE1~P{C4UtXtq#uoqi^1+Lt){ZiJ| zW^ty@Vjp{$Tgg6I-hpMgx@-1Db@C^c>9Ofs;^pV-ktoY!tNVH0p?akHm!Sm}=uqDl zgcd{!N`&n|QMMA&jxu`~N(v5R2?K1eOYJbA1B<=E1ts}$zmI=xX|Y#?;T&Wp0ImTB z_fSL8qeC!dI=NG3s4gIX&mJ5W44l)sEP1#YC$~38<a_LWMvrud(G2Y<Q^+388_i+j zBr4DMjzxtlf<m37G8~mM{ju7Y2a`PPD=hD3O5%pbo~5116T)!3$H`WF|06-K{8_5l zTa;BiJqz!zuFZ@n@anS)CVP!plNnndi7obOvx=*{#aUI1t+lbt!epFdP9a%2MLF{~ zdkZ#uSw+KiIa$Lht)+5CSh6{8pgnHjE^jZ9avsW(NK>oeNIAQiNK+{jIUg;VztEen z8)<9>wy1(@VqsB13o6XDTUNy`FQ;*{w-`;><>{oE1y`8UYF34g%q;k1Z(i2P&6x$4 zqtnYf_H5oH^y-{NUM(t#Nvl*Z(@(n6LA}awblLG}&+%)WEQ0917`VPGQR+$^9UZwc zlu_2^d2_ScJe?r3x}9yGbRMvmE-6CMMJaE7R%(uo)fMe;`o~lh=LI_rifn#G``A8A z46rm{NPNTD*JceF<{a)GY6iQg2!+*Oi}{m-eX_5eZDtrdp;Dd3pg+b<_Zs>309i1Y z=vZvRwOO%2n5%<^#4luVqrjDzytcMBWudKW;c{EU<tubMvsPSbr+}MvI9I=QM#7Xk z&`zI$Ix=(0475{5A~VOJ9&M?QOqp=5ZvWSF^($M^tgk$sG_&AvuIk9lf}1dFnoh@D zy#cM%CuwKF;I$-!*yWm-+S+-=&M-iBir2XeyijD|r4Pd{*(ttJXVAClu%AnTuvT`e z!|Z36{d}{ZZuZ<=fXyyyxJiL)1N@JT!00Nxheh4=tK2;1du?l(qj`XSz0%XWZ)LY# z67Ldqji_!q#a#WmR$@A2H$&Uz>(}XOW}#Gv4jl8me-?DbT-37>Z3Xz+Sy+wl3Ng=* z73x&Fcl3+yaD5ep*0BHtJ;!qK&LLZ3f8}}E*>T>}^6=VOdD$a!;(SL-v!Wpnck_@a zIO1N9DPhY)4sOJYo);XNgCse~qqE7Ym)Rr5**f#QoOm1=c-g&k;xTRM5?`6u35KpT zWa;W4hn#qJUKd!AKBm(b*fRR%#9Ot+<V`y>#FdFYTq|Qko<CqDYK5GUVMfK@jZ~by zkdGsE@zNI_ssRZjj%Q`gva!gOjfL4%4CQ3x{z)Wvwy~#4i~Jz*IsnE3lY6$wFT2<_ zl_Q}GVAat=CO{=^dUPpU6)E@2NV#m)-g4wH=^P2!$P4>uUOOUru`8qsdYHke7hajg zer~PNI##x)O`qM##_9oOdf%}~`vMDkB3HM#$fQxRtSq!z53^?7@y5!L>6{Z^p`$V4 zGIF{cMg_UTvS&H5jB?PQ8Dn@wr2XtmTLMatp)8uRSrg`tcA4tIY$&v$ul|LtD2U}) z7fY7X7Tm+q?dKHg<FGDQW&^C87g87rePvP_V*QYTHo7(auhgoXN828@rJJUj-rZaN zSVT+*aRlW!nQxK)Zj1DH0h0fl{?0DgqfV>|N50E<#h5z&e?Laqz4vG#M&1lEd*NTq zsg&*nojPMqC5%0o*TGy0=NEku9V~@^=d9ZMs7vi)SV)mW)Zadi+0`^#uZFC|zZrjB zUA-n5`cM5WocI58{$@HUV`T`--CIq=*pR|e%s682{fi{gUj2QfSN~u0s<5S?|Dl!d zzdjP(gSB#xTK#YI9lK0NR^+{p?Z5P$?co(&wmol(7vZqb!qYVj(KG!w&e8TNMUH0c zdj)I0Ig4bMW?0a>*@YPvOvCIx85Y)JPfKui*8a{kgZDV9{~ne-kJ=}i1}El>Q~8B^ zae~Z?5;TIDV9k*w&zweZ{YjI)P(a_2<uW20SF&87a3yOloOwhq9nXg7D<D(?vFr_A zVqvtS&UsyoQT9R{$-@hlPB@Yo1(!12Y)Sf3CZj{O1q(%XUz5fhi*A+6Y&#`j*C$~! zkU@)3MQK;?N=qNS3-Gd&%riK3n|{g0z2Wd;ph&O2XXo_|yoS{aE{q_|^86i(naztG znv9>RPY!s`;=a!~H=cQNV1+PQI_q~4o#LnQ80jl^x1A!Wxv}ecAJ{p$%|#~44synY z<PY=#_OuiB{(q8V=H;Yr@}511>5$Q|OXI;52;L!tzL)7~?A1NJG1K?h-aS2SPm66( zxJvvF`QD9@kz*tF>U$Vc^DYoR5!aXI|ABYundy4hg2v{hb!ur{Yt7>3TENoUWV&)( zP2+;vnpU;6rn$bJamzzI1Bshz6~09_0V%4dOs$#qy&2PLrW`wS)=@{OhQ^7>ap@W+ znbEMku5sz)W%c!SEvog5C1K_Znw#ny7A|Y4o4KT6YQxecjq{jkYt8(|<^`wNERv}S z%dyooG&QtZ8xkGU+&Ztdp}9%b*6}c@bWO{``8D&A4%J?UnxSF`A9-wIN-~*9rpi<0 zm5I@dn?~0+&Re?ZfF!wj^wLurmW-aiY#~%_^RoGkbqAzV;Kt^rg`<sO+!z=ZFIaZK zywh67CPpLaQA-n}m$ud(u&`+vvL0PuzpQBiD>Hg&o!%q5zII;gJXfQvy5$S%mN4DY zupzd86zj{L40^70GP@zAySZkG?!=n;x)+nKEjcb2td=@-%#`M))|TeRMs#*CC^M!^ zoiKLH7}a7s%@op9x4d=6yoGh@^oH8jML|CJ8rf9T{s?y>ENE_QZc*%(gnr?-2bup7 zM@^kpGjrxtJzJ(6b;OKGv(%D?CVgy>5c8+8u2zraxJo^e%-=TE)&fm!9X~!jw#Ftz zJ!IH}hUkLQNqZ!kdz7A-n3h4?oSMo2A`-S`i<^-Dyp~qAtZ8Y(!lt^~#DYchT5Orf zO4{p0VHU|G3Y#4q%l31~(kbm9OW2Ex>KYa<a`I=ImU)ZCqnJ234v81kEuGPTy1+He zuwp!oyCF?oOZ~hBb<8wOFu`fC)UvgCiPF{2?3&7OGVH~<Qi_vO$s|&>4GSAu=QSSJ z($ET*l%7W~=vgNNozd8qrLC-XWO{~kY~~@!B#P&Pu^1DF4KR(uFdj<h<v7>qj?$|N zRs!2fQzMhN_4r`;ZALgO$P_(QkAbyOOp7HfTsDH0hyIb-xIN~XURr|5eB@Eb95Jby z3!R;_X7$l?wst{AFBtcoz;;)#S<;5`1*&3E^WwUS=BC<~c@;BSnoq{cu(X0%j&7}6 z+FG$-32YUO4fDB~R{Xb)VW(6qTiQ~A)v2PPX+h&MEZ^l7wqq8}YlLE=a>Sy~WLJR> z%S^@N_2>mH$Y>6hI~-oVNHsL$g;5Kd7cXvZg0Mvelh?7K7<-I5c*>N06T`3|4>zkZ z?y(kO+l_!rowEmZNyKiz-B{dm3<7U_yP9`m^|wAu3f`!mR1j~EO)AK`8uxD##?Bp& zMchWlZHiAS$ZpS?RFHFZc7l;6@P_){()6_nupc04HZh-e=5uvcMjdz)-mQasEN{#s zF5}n)Y&P(Q{l6=pH}n5h9=yrFw>;c_;|Bn)o(rA8X2V**zssWoY1};cp@FOCL;tI> zL3BnywS$nQKHVJ%KpYppZiojTiHJ3h6!_ACIxtA|>27?ws}68<0(_98hX+jfboW@i zhNVQy&%!SkC2$_a@Ttc!M$0ZseJ`TFAJMhY{ECx=EOiRN)h#B5b?`7-&%j=P9a!75 zRGZ#Q9X)*2kL9s060$7leH@=woM$Zbkr=f7a7fHKk^1JS>rHw$p2u2kiTgM{>$%w& z=yNgXdyJM{ZY2L)^<X6aF=$-In~<xXj_5x`^q(X8UFc5OB;=}(0j~ZMn(K*#T*V0$ z_Gd1B62Whj+mMT|*DE!|O0=gGdYGgAh#m?(!ilel=<(2_ocM#FD;<3>bjs03L633t zanR!&T?4(ZqdETUdkOmEFe@-Vd1@ijGq4RY=(CO1M(E7>ny1!9;xC2{=VzX}3_9%3 zJauhE-vq6{hph|9Q$K?a`!`SB37wF_@tUU|fF9uJ-$IA|pQoOV=*;<!x2#Txt9<nb zq-Wq79)o`0Xl;bfY;V5euPefkul^1l&YyhcVe-40_j|(j=c{7qaQyOBZ|HEm@>Lmh zI9~Z`ctj_m!}Tg(O@uxys8GI|1U<{qhe99k=%b-eax~k=woAY_fSeG=mqova^b7;A z#h@FF)<(t)nAfhVH4=X&bT}Wns<jcl0h(*Dgsy4}bm(tgRXcPzAG)d=pc6K^DSv>Y z0|dlXp}H06!%!HhZ=t#)5`QmrxV{vshoQsqD^xq7!}(gMUVt7D6i}#Mg%16{P`wq= zyP!jVE>vGYGjLjYs$6{w9r|aX!W|$rL#N<Np~8oj8M-I*Y$v{dL=S;x;59-_m8fyh z^TmYMLUmw7Pls-D;*X5z+0aXz_&LxFQvV9o0NpAkycVicp_e=Q4Cob(UKP>jL9cY; zH%0Un&<x*Vi{Y!uw?Ln-Eqp0dw@36n(3d*#4@ETR@0Ct`fPgsie;nz<P#l>*#p=08 zJil2T&i7*VMnr!A9nSA!^%-<Hzl+sBpa%s7^3zE7d{L}ALx<}{vFZlBzmvWX^dXKO z1kJ!{=Bd%D0y<m|iq!<@TAhL~#cEPS9|qm%#Lt8d$G2FW1RaiVv8sa($FErbE~w2p z{&d8zc61wbIDW<IJm`&1{3X!sj=l<do1<@lzRl4;g=UcUj#76)-!CS-7OMxLA9wWQ z5&b;$3r_s2&>fC`8~Pnbe+2!RqrZgy!qNN|$Uhv-`Np{`L4UR03e2|>e&5vzC6W17 zqPj)m`P-&&{VY*~B6>7*uOLVGKXiXb9~9AtKo4-@kB;aQpu_WRiCO?1u4g5x5jvco zC2AS;WGBCs(Bb?nQR|>*Iq@5zYaM+BbhzG>sBIDb6X<aMm8d(Q+nnR?gI??CN1?;{ zR-&GU-r&T)1bvaCUxyCYj}r9(bT}VN)aTGQJL$iM4(DTu%Erm$9w)vaqD!G4a^e%v z&pCQH^lOghkF#98AM`s;{8Z?V9DM}zSB{<y9nQxRRRgUTZ=I$@ErQPCVs7-Q&|Mt8 z0=k={*Ff7Zh~b;iY6En_iQfu6%+c3Ck8(8q!G7V4$Gahp-~Zf%^bEVO#h~vpS{tD= zuRnUI2P5&1Lx<~e5A}RRzY5)5GQ(>R^)__49`{fmK@W1`zl0v)Xk79;^Sy`4gAUi@ z9*W;c3+H<e)dxD9?>*EY=($dQqa%78^dcwzAn4E^dZ<I7Tb=l$p;tKi1n4szy#RWp zqZ^@DJ9-)PdPlE>-s0$W&{sNoBlL}qz5@DoM{k3^-_iV$+f$Cd1NsF=-v`~{=trU7 zaP-sA?>U;|&$%H%|6a@rtf!^wC8THI9F0N0XS7&LBlD+JeHw}X2XuiX#%n3QmY%7* zK!@vVsp<jU-$~y;qK85caN;W?dLr}?Cw?+?xW1OE!=c0VwN%Z5p6sOmKJ+1uu7?ii zTd8V>p6kRfhYrv0rD|0~pAQ|*uTsU|?uGNIRJB95Ir;qv`dmlf2EE?VcS48jZ>ib= zeUTIYJLqt}m8$2UuXE!62p!J1QuP*eINwUuhtQ8Y>Hh{DuBWAHcSLu>Tf$eI^u^HO zd@EJ^K!@|IR1Jg<*Vj@t3i=D@__5I8dRwXvg#L#Ue=u~o-j=Ev(Bb-u`3PMQtdFH? zK6Fn<p8~y)qdEV>^_O?A!Vt%=z*><$480@sy|+3m5`S()Ukr^dGoiP-Jfg3MF0#=m zkM-&1=l}t6)kpu{F|_rG)TfX7MMn93)V&e?2y~YqgFfo1i2eg~cPG9hqTh!O{k4z! zETaDj9r|w{m4%astGhyn{@F+MjA$Ra+$n!pL?@v`|Lvppjp!-R2Rg^|2biut7J9l9 zKPRFWLLceGFNx?gpl3VrtDzbCVDr>SJsxvu(1F%4#PP(CD@=N^_KS>PKea6q{}bqf zAd7zLj)=YwI-D>4)T7XSo%BybhyCAAy#yVupZ(P9(4(C6A3#rV^ykpw`q)o>4ITDR zKb4JJ9>+WB3nID{Iy~R@QwiwhPWs^yoq}HJ#P0{)=4kpycs-i=1eUn+)l{SpgCFT% zUmX#NpB>RP5xodH^j}|{3LW~7uU16#8tBk}e6=B>w?c>4L%zBuqHlr@$HQ0KBl_-$ zeh51B7hgRA9r}l_UVyF&I>c9hf)3}uuik+^#)<zJdXA&Ng06M6XByAbyr+h$eCTjI zebpU0yngakKj?5geKjPaE1<*cAzw{^-sY4y3HlaC9|nDoqh~_zaP&#gI~`pI{d-3@ zLBHZ?&ZiDX2MCC(GIcuAGt9sigFe@2ZG`6WVJK4<N8&Gsjs*$I)b$a43v`YX{|jjR zH=#`38_|zIhv$nj^%Qh3n;iA|LqvB#hx4sWy&ut^K@W3||7S#J;Rms!ocOL0-4nXf ziT9x=IC@w_C!wc0@%u*f6zFh%mZ@s!!<_W&Z;pk8G7EYiR|D0tNFRoQk?|R*=0xHb zM)VSBbb$#2)fo}J8anjvfr`ILcJ&tMaQz*qu8!y%p%XTH)c0o*eHU~%9s|{b5&bxH z*xv)y^AY_jblCp`)!PyM5p<PP{+AKWlg%Mcd|pI%gAV(Dpz0IRgP@Ohjvo!pun3!n zcYYkd`84P-(1PB_)nGN%q?d@nk?|X>j)=t1hVB&PGFa6_^djhRJO`^&q4D2@!D<CW zc>Wx$)<B2n%fV_xL~n%-*Vn=78t4OUcBubN5xpI{%89=lda|S0AK`o-9K;afSYO=` zcV>pf4|k)Hendo%jOfsl<@nK&`0|L>k8=oYacAbq@u?tAbULE>>24U}YJ4a_aWyfb z_lxNL_4tSWAfNZff>iQ(YS@4B`Dd73K5q-pXYzT}fZ%xf{3Sg9$mbj12Jv#g+P%NR z@!A!{%l#Ag{R88}`6So#bA$A9y}mZka{bp4Xt`bq{Y%a-^MiO<&%*Xb{o_FO5aw4n zKXcWi(4l|is>h*+1o`Evr=Syo&Qs4r7diSR=<xiKuU>-=XIZ{_3p!kn3f242D}v(- z)kn}xj{Y2aiKD-Q-Y3w->Ko|Qj*j7%hM_-}s9flag7^~E1^N?5cY}8CkCj5Z_v89P zhvoH9WzZ{w<9nzf&|!I{Y9#deL42vIgnrA><DlL5llwt`<-}J(hwEWKH4QrSLSG#Q zy*x<otD~UZ>y=s1VfmOJ&|&+1RRbN)UtiTihx5NoH9&{+rA#$JyVnCtp~LnLR?DHo zkW%ZR!*?;`)y9nYiRzjRJy`t+IxKInx)nN{Pib`rbhsX;)xFT+Dwb9cLx*RDwAu-M za8RMNdI5TpqhEy%{cW&%3)*eZF6aY;^n=wG&~E*{h7Q9(6-Q-Vf9o94-NMG;urk#f zdPa~znMy!61UjvTLDx9CGLn7*bQpT5gP`5@WjgfrL4ve868dUK&xXF=(Q}~hadbWO zA06EU&F^?fNUPJJ!}*$4E1|!z(JHOZg%16_hq@3tTwi*qEztW1>3gWFpbv5MHt1Q7 z{xS4iM{kD?{k?~}6MDT9e?RmVM?V4`&i5W_C-jX@{PWPaJNgyquzz}}*P&l<;@^kv zaP+6pZvX!sIt;i!gpZuu^*$Fmy#JI|h0vWmdqi55LXUK`4?Wn?L!oCmx&nHJqsK#^ z>ga=@7d!f3=x{tr)ltxsZSlC@dK`2(9;K=VIvkHuwGeu)lfD_c(b1<vhwDwLIvYA1 zk5aV``Z_25#n9n+l&Z_1!|^Cp*Frz)q`wLJIY<8t8W)Ntl&U+S!~QK*4?w%??QfYr z2)=p>y2H^gLZ1`lmsWp*UghYwp|5uIhtO9z`mfO8dgZHsLXUFt_ptczJ2w*2Di8Xn zjxL4{*Bf8;hCaq7$Nh>j=sAua4qfZ$B=inPPlVp-=t<CF=%)^WcCRmvg8q$DpW~qK zb94>#8;)KG9X>ZKt(u{|m@Of#PKW-dlm2Yz0X7=<x7I<2{nJlf3_Zb#zYIE@pZ(Oe z&__D)H$l7S%b!7q=f{5PPH4A%4?u^Zk9rh(ZeZx6o{Z=hGtzfeuR@3Q@2cK}PB`uT z0J^WEKg~EkUws7~j$gjo4Sk@KJ_jGkO>lHq=;IyT9eTE-`#>KS)IVPhfDS{R8V((v z-}6)@^b+Uz@zC{-J`nmRj-CenBS%+54+#p$Q!}B%kgHCB4(D&Kng{*7bNnLcCmr1k z9s0|7bsF?%PW)NW?>Txc^u9rXx#|MwFchjwpu_dPP+bAtH*Qm;)pgL_9eopYPaBQz zv)l$fz|p^i4*RcA-3uLt9Q7OMpnAA7^LR#lmU=eh_$>8OM8B4izPEZCI-D}S)vk>A zV)Z%nw?PH){T1jVoc4I#l{(bXouE&4bP;sDqkBQGb94flk2#cp>k;T199;>0ouel} zhv)lZbr5uTekoSdp~Lfiu{r`eJiipHS<vD7Rjf{g-e`-*$#Xt*yQ3SRw>f$V^lgql z9r|%cuY`Wb(dR&a=I9O3Zhvlu4nv8$654$~cRlo7PWyiheTSoe4*ds5-wpk&qaTD; zS+<0<`W^JwPW-db{hauhp?f>}b?C5vOVoSNlWlhRJpW_puzyR`-=JqX@!vo%adZ|w z!VUYkMCC)@?8JA24*R!6^@a|w7fVzE`ZXv0P-yr23gyt@^-qZ!3+=w&+8;U$xSx}u zaX&9Z_fRvT_X!T@p-#w%$LDv@{e$>Yb#g|$uUeqP^8@b3L!(Pf@YU*!^!?QN8M>?5 zl%ez0<<Q}Jl&`MMh|g0uX6RgXD|C)6PUWiGGvW)?-5I)A?SKy3TdaPY5nrO7f)3kT zqF&61uT*bByX6H%1LDp%?`e<YozMHu@w}A%TSUjg#ZtddD>C{@q{U;^l^=;u8_hMX z8$Pd`YV=&K`>5k1>06CntK<8r4UzaQ5q*6`-xSfmj_4<h?$G)B>NTV1YduhX7D-=d zKH}v$tsCyw4K*54xBsAsJ~E;+f1OiPGjm4GAvHBhL$$y$(+<|qx_C)VOWi`vE9zRB zjW9p3vOl;}<<-p#$}3ehRwa!|*`;Kc#&4kX&$V>inDA$Gk!(!zv2xV7@F!xyZyR+6 z<0XEA>?X=CS!wpB=%mRknKt$@W^Z!GueqeACby)?E@|>hnfy|=DJH*^$uDK{OPTyq zCcl))FXjBy&Q{<2bXAv|GUcRAIruH2wx?~MnR3#moU|z?ZOTcTa?+;W>4|%Emx&o; zN*H5G7-LEpV@kl!Id#cnObKI531dtNV{AUA#$!!>V@-ZzO@3q3d(^;o@>o;ESX0DU zQ^Z(P#8^|rSX0C}Q^Yt^#5hyLI8)_uCckkezi}qNaVEcUCckkezwworbM_~_y0PO; z&f`ta<4w-vP0r)ThK(`5WR&AfN#jjP<4sB9O-U1UN%q&V`j82xs0pU138ttCrl<*~ z5fhvVZ-25Y8JMyrn6f6AvL>2dnrI4`XbPBU3YcgLm}m-^XzD)E<TugeH__ymtTY)W zEAd0p@R!=U63I%Fd$Q7GpR6?bCo4?>{Mn{SY>G%$nlh4=wvf<KO|_GOs|LQBv^gio zh7~!(<ZUNaGHDA5eAhZ}(t2;wx^FUNt8X1RX+1b;T{vldIBA_2KOi-QT6e{-la0kX zY|?scGHpA?`fSoVZPI#e(z<QZ`fU=9D}84DG-(|*X+1S*T{UTaHEEqSX}vXR-8E_b zH95xSY&|w<T{dZbHVLPd(yfaot&b+HlP0Z~Cas$$t)C{Xqb9AVCatUDNBbsc>#RxZ ztx4;yN$amk>##}du}QjY^w+jhQ|r1(>$^$oyh-c5Nw}{`Y-gl(*rfH?q;=UOd{z=$ zPfc1^O<G?~T4zmKZ%x8o%~5t5TK`O12TfWJO<EUCS|3eXCrw%}O<FfiT0c!%M@?E! zO<Gq?SyxTLRdqE|@Xttx*$6WbDeJE(>#r&6uc=DYhLrW!l=at?_19F=mSp`kW&Jf} z{WS%DmD*S*O<5;RStm_dCrw!=O<5;RStm_dCrw!=O<5;RStm_dCrw!=O<5;RStm_d zCrw!=O<5;RStm_dCrw!=O<5;RStm_dCrw!=O<5;RStm_dCrw!=O<5;RStm_dCrw!= zO<5;RStm_dCrw!=O<5;RStm_dCrw!=O<5;RStm_dCrw!=O<5;RStm_dCrw!=O<5;R zStm_dCrw!=O<5;R!AWJftxu+`Po}I-rmRn<tWT!K<A?Nn|4qEf%uYt@swwNLDeI~! z>#8a1swwNLDeI~!>#8a1s;LP!XX~md>#8a1swwNLDeI~!>#8a1swwNLDeI~!>#8a1 zswwNLY3r(K>#AvcDoxu{Y1+DG+PWqlnIc`Awyv4Bu9>#3nYON(wyv4Bu9>#3nYON( zwyv3mYfhPY+^i{wl-oIzwoaP1PMWq(nzl}wwoaP1PMWq(nzl}wwoaP1PMWq(nue2x z%aeZegdXg)_1U!b*|hc9wDsAv_1U!b*|hc9wDsAv_1U!b*|hc9wDsAv_1U!b*|hc9 zwDsAv_1U!b*|hc9wDsAv_1U!b*|hc9wDsAv_1U!b*|hc9wDs9^(ErwF)7EFx)@Re! zXVcba)7EFx)@Re!XVcba)7EFx)@Re!XVcba)7EFx)@Re!XVcba)9_ixRozFf$mqe9 z4H(Z#Tc1r^pG{kzO<SK$Tc1r^pG{kzO<SK$Tc1r^pG{kzO>3X!6(S4g1)84z+8L5D zo}`j7UhL@!ug^nzdg~dj=dPZ&dWP!RnT+uSsZSz$GU{okr<|T#dSWGGEKg4@J+1V- z(NjfF6Fm>~^hm~d2GmnV52_wVJ*s-xYU}WXpqhE}=eN|I#<jEhm})(h#opM^R7dOd z$-2<#)AX)-<}6*M*~iY*durC0ntN*2j#}@llX_;%#-5eoo;}4quLzMlC33e`_8F{9 z3@dlclUC-b_c+$nj71<7cSxnX7OC`}n&UyuJvB?D<{nxvC(yF5)}uVTT8}Yy`rv9k zzO$?Kij19<uNPq`X`x<#p`-<R@r9DZ^}>tB>gASuP6qDTS!kx-O|xC6mo-+1#jt`p zH8l6srmOXyT2}z^QW1HB!`yX4F%{WO(0WdCZ%Wq-GPM~JJu#{2INVF+lhR?;@(u=e zsUP;HJiWxyuE%h)o)H)hTU(tAYR5fmYr0?WCr@VClc(7M)-}Zdn;PqxjGXo4<=)gt zuXfOSY2)7XBRdQw+kVsSLdhm~T|f3K>&cqvc0!x>+G!<IyIS5nA$L24^)#e5lT^C` zv|h|Hih4Fqvvt?)ojzGNbNV#BLz$*X?hwc3AkOrRsjjK5F67vmQkEWS9H5VzrgzB9 z%mePA%q%d2qO+bXLo&^_*mN&<aC6&DQ0x`%Fo@WpAXWl3Gj-A3e(X%Wt2W&u4qvT1 z2M4fN9H4iTrMlB(qUv&xLgze9c9ZoSLV8mNGbfBk%7lf7>Wac+nF>|Zd$d$0FtpTJ zpE_q(>je-y=>WYFLdn?b)o^yTJ||))$LU!ErTe{FpZTDqk$QbZrDaU@js=?@*L!MR z7AnF$wayCK^qY7Tw2Y!z1I-d>RzQ7ToL#Ng!P(XN#D|?Os9K-&prnTS{UVkmJ&M)( z)CDDNkvF**Khqk08bhpfhTIoHtiFWfl+`_o)RLFHt>@^=k|CZ_Z5&_LAIy7>Lba49 zZ05Q?|DdlWGrcOKK};wok%p%FX2wmPj5mbg)4=eItMEyD0m~!K%x&1<$z|c=wt}a( zg-OhF(u~1AVoN{y%9gN~Cx+R(X*PZENG|(`w~U8~$)ou8_E0Wc1di8_0t@REJjc&m zX6lm66^ql}JsuPoylu7z1XZ(TMW2ROQ&ZcFhgK~)qeedkO=M%;yp|d~e~b6v`PpmM z?ifD1kk2{D{J4ytDQDrk7Yw|mpJhHr<!32bNX^eg__+x=7yHg+9E+b5>+k!LnTDTR z#J`m<Fz9?ddCE~=Cw;;&(+?se4MRD$_-;9tpMl!^s|+*!RBZM+N&FltX1+Wz0Njm* zAPm74kFljv=U8005*iO@*LHpem4iAnu&i9eY?rmOPprKYnDt@pbYFpawEmnXF7@wa z(y&i#du<!LnKYvi7t5A%CouhDydZp6d->TU%Vi1GhB;pRj55Z*i;FNDTQ5Dj^4*T! zhEIasj@Mkntj~OGz3{sehFWaB4KD&SJ$_=QzoSHEyIW{K11|_?VvFTUxhuiF+VFzV zhOIYW5Y}R|<*ql(a?i)s%Y0t60o>a#Kfku+ZZXVqFUJ<|BxSLm`3D~u^t>{&pf9u? zmxN)a;v8`M+|DJ=0W#~u{<mokG<J^NWW!8z7<n^Z5coYBo6j+ZndSt?KF6`wJNA<u zdlT8zU-vDT<E#6&v$Rq7p(&SrW$Sr~$%pm4)G+IC4K|zR24iQMn+-F~cJem7Al!k? zw&gCvOtZtWKkV3dl2OYn?4Kc<e131zu&h@MGoLrG+4{U^>`b%EFw^`4n@z(pjpa+* z_hA~-KM8UPUJwRhvuo5avhl}JhIw=fo6S@E7t*lY{Y@H{JJm^}$JeB><I6O&ncnpO ze|3EIn3_CKV?JQ!xq@ukMc*NF+}C4^b&<AfUohoz{@b>2eC>E`Gt4}1ank7VHRamz zWg0z>JP6@2Y&IV~rlxK$IQEwe^Vkl@{+46cV~W~m!KTL)%zpkGwpdqb%eUkL;T$ZS zcFyqk!?s=BX*YH5WtipinG7~fIXGS@`E+BRMZ%mjwm<)mtOKT=d(0DKxATPcpU=7( zd%a=W^*VsQVhij#z&WrSTZ|9iLRgE<w*7pt&F3P+%;!=kO}mrkI>StJvtz&2vD>-9 z@w&^g?;x8o)pN$w-_9B4N#D11`#sZ}G_M$D8qN)yhGP`#ChgjXX-wM_<o{cK{a+X_ zJw_(I^=r2AG^Z`ruQ`q!yI6^|m%eQKf#YTS>Po}RXPcAeyT<EY=hz*Fd8{25j^lsg z%dhfSGrk>$dF%(+V%??ApOJeAe+{<vk2!v-eHneiI`FsuHcempX-_$puUtQ2(&_A4 z+L`ukVlOa^oenvu8v~EcHQX0$uaWwL?R8E9Y_D^M&~C0_hS6@goOWh_P>HR#;c?(z zd_kCit+(L=!M&!@s#F!W-iD`xdmV=tghR0PHhd(w7yi}{!whV_4IdBAIhHM#YlB?F zCqeU3{R~Ce;-ze<T%&fwL;V?8|89B0W5}I_SvPAx%(2gM?DN4{_(N3;^@drClMS;p zJ)e<=sammh>mupf$nvL_b^qJzJ&sqrm(){_7mlRjI?TDmqk9_Wxxo53=M~4xrWs(E z$8x-AXPOa)c`Vy&%jLMxUs(VB4fEK^*zA1cSXiH`Hk^Y!`^4Hg7G&DzVzbBU{xR3I zjj+e~phE=uc-~qWJN8d!!)JnH`$!t?<9&p;&~CoK+zz&L{yM|h=|6&J=lspIZ=+Qy zy(XLM|LxGW&UYAQo$tkF>-><D=20ijQ-(Pf&lzTazJ@K{PwGi+`<7!G>o4{$;9hZQ zFUPmHVLQHjuV=@X_36dU_!r08`kEbUzIPaajpN%1`ytrkzLdqWjwOUgfqU`crwHZP zdK*rGc`VDNTasBW=YxIkurJuYcc5P|4a=QunC0rZVaB%_x?5M7=Ro8q%$nGBM%Ukr zMFMu)Cj-E?PlnNM+RnDvwsUQ<>kR8}*BM=Bv$p6u8?It{v$n9#cAa6J?K*Q9?Pi_f z+R|&YjL|W)8$JP?!v~BaoP;gc@EmZrLTMw%I$p+>%KP+g#bW2!*|ml3vg-!Nh0I*p zE;5fEW0*&?Eq2{t{k!p@j|iQxc>|=Zu4Fu{^d;;$m%I<8o}5c$-fCbSyn&K_0C|w` zP%@5X|BW@w<&ovm&fk|DVfZgNgue-;eIC**G<-O?$?z<sS!#F;?5hkH!YS4p9)dI% z8}5fRml}QscK#lW`Tqj;ZHD=s_}dIWh5f^Z`CaG74ZnbTK4X~AG5o#ZtC8och7ZF2 zO~Z?k=I@3*ERMSkk3o8#b6JN&kcPj{A+xPR4fB@E7{gOhhe?Lnz9S7Uz_BM9=5sF> z8NL$xWri<-eYN4+u;=q~Sr&beZ~MvoNgpq9$nD6J^&`KH{UpP;A)g}+r;+|d!^@F= zkzttCX@*y_T*Egb%|(WP3BJ-WPeV5vegOO1$;QX;H1>y)=Wocymmf2BKFQ<-GOkG& zUN&~leb(FCrp*ec3f&g`ZEc0AuRL?^9!y3XzmNDN+4vftS4umdt2&unBKaI_><3^! zlWgv-9dGRSqF<W~{|@`LhWY%;s|??btbS^k&*6O7a5c*Mqv1xR`P49PZN+gs>vIm6 z&*Jn30}u+p2~KhZem|aR%CH|q9xC=><YB_2O&b0df^*m7gMJbACyx-GWYP>nUsaPw zihTxol<=|S(ZbE-a^Z`}6~Y{EuTuDSGV1mr_IH!{Kw*UYz=@RbW3;D*Um=^Zc$bW0 z|Bk4S$()!7pMw))g}*gv9)O+Cvh>D@y(@XVFrQ)RnI9GPB_mHhXA^%cTzL~E%@A;6 zU*Uae-%t2J^8Uir<O76fkj)R5=8z8(`+Rbh@Tp`v5CWe|=}i`1L7pOfA$h9s)#Pcy z+sV^~A0Qtr%;!gXhX}t$<^z`zJ|Z6`?7_Lc!-b2<oL~rp$VUjL$#iIhDdeMsk0H+x zt|RjS&IrrM#|WQ8Mj!6RT)KcfQ|uRm6SIVWNc*wEe5Rsjezf&V@^NCnn{0mE^;`1y z#Qp^N1mRc6Tx<|tBcCMvCYjEQ@Hg@t;T&9Ocs0Vk$#aGI2Y<bJ!V}2zg%2h#5I&Av zD||A!PIv{mUid=tLg98Y7e9ns$qmB4CZ8<)6!{e4*T{{+ACb|AH?scZ#bW34{}N5Y z**F0+&D&U8ipb4k?@nGK+}ot#Iy9Jks@R8<TZGHWONCS5M62*r+Ls9*LgwO)a3uM3 z;d$ic!l#nY5MD)IA-skB1L2#<XA0jzM*Y{q*M3btOY9GT6Dx%uH)*(by+}S=>@Sns zgkLjhxOTlyUL|%ud(Y!Z2H`W4hHKY1<TYZ~e{gNBa1JgiJuajO!^!6gSCiKXpG;ma zd?EQf;h&Jt7v?kIybFZiBX1Dqv)$O<OOXFp<O{|AH8{Z&AVMxK;Jk~4dz0<?h>T-@ zhkh7A-Y99x!HG@66HS`OA^F@k?-H>eOx`Sfgh^A5emI7_MeMV|iLJu(OqzGlpQn&7 z6?-%JGT~N}hGm^izFh2U$X5ujC-Y>Eu+^kL3fxY<O6=Ex6Yau$HXGac7nJ);^3`I$ zn|zJ%W8`avcapCYewKW_@E^&@rx||HLEa|zx4?-X3V&?Uu#JBw-yrsH$UhQ};o9H3 zQMizNlW+<7W?{ZR@O~^jn2d6-MV_O`w}`zGocM__pTEX5JReOX-zxS)$v+i7l6;%+ zJo3+k`K&bjX?Av}T17@abk+6bpNpN(M@!r;yxFAr2>oz5`4?huXPP^N`Fu3*m%?|M z^ep;*@~_0sXQCzU6#mGhIS+Y$PQFX*Uoy?z!kxRoevfbg`PagI$oC5S<okq2k?$9- zBtIa0AbE%IWb%W;2a_KXK7srj;giV^3!g=PM0f-FQQ@n|zZJfX{Fw0l<lhNDOXkEz z=pa8K{4sf_a13vFyeEabk)IMCK*qT6+G;rYX|az6C!P`BpY~^ktH{p@A3=Uz_-OJA z!hFV-_oDE8^6!QDY%T8(!mZ?&g!zmu?`7c)<X42-$$u2)bF#cwh3_Z-N%%?fYr-Am zKMQ|C?huX_fL|Bp^Q*i!gv-cp3XdVbB|Me<wlFV?y?2C1IDCl1CzIcmG~3AU3DajR z>-ST}F7KfvO;^lI?*n1}j?yxhQOhmlzet*M$-9KFA%7^mo&1sT!{m>J-*h+zleL$T zKan&Ckv|pw9{DrjQ^}tT)9o#Dn7uE=&S>wi!hB!q{Y{vE_rUv7_!NiNJNzT^SCZy# z^52DDa@fPXwD$hwe@Gf!A}Q~m!bN1WR&)p3wW1g8W}WFvyIE%vw3{_{5bb7-9Y(uZ z=SR_Q)_LA%u;(4#XRzlTzW=x9wf$+|B=xDH-K?ckX*X-Bo-=0ssixhmKQox#_}whp zjo%$l`$Wm}B--~Co=f{o;ab{f2`{4EtbvWRn>BC=?dIIwO8Z5UemU*t8s<#e%{5FL z?TaPNTH2e0*V8^mcmwTYg*Vck6y8F6O89cx2Mf2;K13L<sl2a+`;yJr4IrEG(qm!9 zsGN2)F6@6h7W#h6M#-m&cGKqvlTAM#Nj80ZEZON#+lLEiH~rQ?HhtAhHvMxN+4RX- zWYZ68$foV*kxhGbTW}v~8f-&o2lG~dUPHjlL$?cj5t#Son1=l{&hR$ubsJ&-F_`xf zndT1c^;`l!3O>TvpU0l}-<YNYd)}TSzmNS%hCjl7p5cFDUvIb&>%=LB`+=8{yWj=k zCTw1*Mzw>?n-vIWaBUec%)bNVO&2~2L*jArB5>F|b}*TKy-qlv@9%CioD1#{*4O7* z$P7VW2d0J3;dRdb!u33lA20kZxk;GMn)J2^dj(+LAVPS9{J8LHXdjw^^V#RkB7{xY z{34C&3NmjBB3zBl|BD=ZJGnQlO8p9(zf0^p$v&;P=EvqINJ{+)n_s3;y-gk<{1JJe z@RwvRLJY{xA1ugc2>C;Vi^)TUOUZN&g#P5=!o1Jsb8;c@`3C+-;fdr?!o26^j}|_J zTrNC=Tp>K0Tq%4KIVoI6<|IWph0L2~2)t(XKg0_HpR?mn)Tk~ZbMhiwN;Z%7<Fj`B z{l)$x@&Up>A#;Kw+(AA__}Anr;fKhRgnvh#Ec_&y7mWx!-}!V71P+gXsPJFOhY9of zHU8nk9_FWCEu2TDGa+;%A1U02%r^oE1IaUlN05&ePLt_;2wY<PnZlFEvxKLSKStpQ zCz4MPdoB4yVJ<N~ofTmj`TN3Wl6m7C;T&>}FqbNSt}stO{wI<@Fa7;Gv2Q2W3v-$C z7Yg4?UL^bwxj~qhnEuJa&yr6Oewo}T%u6f3Ntl;MJ{L;_UUv9Pgn4TBPZj1@==>I8 zeq`vk3YU<%*dXw^E<P7p1m4f|PZzEr^JImvA9;oFH1ZFGdA;GEDSRCHEaAE2mBJ0= zvxQs8tAu|*UM<Y~oc<c&3&}hIB5Wd?KVEhd`8=_2C!a6OYZ(6m;op!q2tPx<P?&$; z$iGPVE%L>}ACWf-e?{hkguuUF<X<A(g}g<$CwZ&zK=P%+{QE@yWy1TBc@joAn9PL@ z;b`)e!Y7ii66W6?^4o=%kgpbALB2+q_dfh<g?W$EzfSma^7X>o$UhXmm3)IR@0a>N z5`Khyqwq82n}m74)W2EyE%J|rKPBHH{0;dh!u%Y<|4in5DS5lt6Xc%@4=3L)oF@N5 zxQfh^DZ&xtUkaZ<<^qqfkbI|bEBP+rmE^mH*OTuNzJ&a1;db)9!Z(ud6Xv~8|9;_n z$PWnrmb^pwdGdq8e<nX9{1@_Xg#Su@Sa>)25n=wFcK=b~?&RMJ_a{FlJdFH1Vg5}V z|8e2{$xjF$O5Q1aEcr>{x#XvWPbNPtd^-6V;WgxEg?S&<e@^%+GA~pRcpue&LHOrn zo;(qLP5!;`qvSsbKSO>=nD<frmxbRYzasoO`H#ZikY5${a>1XQc|v|e><RLl!o$gL z38%?#3s;ff5k8FkuJA1Kd%|<b?+Y&?e<0jK{)_OL<Xyt&l0OvQO#VptTJp!j{97;n zC&G7<KNWtE{F(3*<j;j)B!3~?LH?`o2jssAe?k6I_*?Q<!ks#S|1R8({14&2<bMhe zA%88*zq{gpBfKy9Tj7JryM<?xc~OIK9Qh03#bkb9h;SM?SNLo)FMJTrBj*WUO71ND zLvp_Gc5)Zt`^bDVjlg@beu3}{WM14N@V={GB>Wzk7gh+o*Xo;x9DPkL5j*d%`rU<# z$UTJnk<A|!;eA)17i9?i+a*4~B#1DH+*|l?vUzCXvE)8tuOahGNeH}8>+`}Jfq!$v z=fxeuO0qA!o}3WAgj^=vP97k9BYB`O{}zZpNcaKrVBsgoLxlPFK73w0BD_f+Cj23J zxbT<c5yG*~;E}>z$h>KRz`x_+j}{(CE*GvKR|xZdug{B9gagRDC_|V<9xMEP@;Kpo z@_1q1%k?J+pHAk5Ey54Te-plhe4y}E<b#B7AXf?hl*|iZgkO;-3qL@fBFuZX{#0S! zr}d`^ze1ia{3iKe;ay~2P$T@6e5mlZ<imt>^TCG;7m=%l`5g`a2;l+bBZWtjj}jh3 z=0!Tf0pz2Fr<0EnK8ie3_;~Ux;giT;3b&9?5dH!AMB%k$UhE@WNdCU?7V;e7E6Fv& z*OTW8^M0&9Pxz<g`NF>-FA%<)Tr2z_xlZ_Ta=q~L<b}d7lNSlUL2eL!k9@N5C*)Iv zzaW1l%)dwBFA**#pDMf$nK#l929TEuk0iGWk0CD;K7f3h@O1L&!bg#p3m;EDLwF8( zh44c14}_PH&lEn5e3tOp<dwqbkk1yrfZQg$iM&eqGV*HStI2DGe@H$@_*U|{!grI` z2|r3+FZ>+&JmFW#=L_@iLiiU5e@@;Y{0;d+;oPp^i-dU(*}qtLAM!@w{^Y+4k0D<w zd;s|};pybdg^wg(A$%P9O5wTWtAy*x?ZVCEtA&@7uMu8FzE=1m@^!+Ok*^oNj=W9y z$K)Rh-%h?kn16r4|B*2N_JV(-F#qm?f0Ho(=7N8-F#q0y|6}2I$hQc8PX387|Hgv< z58;9W@OI%+^3R16<lBXZlYb$cBHtmrANiNUyhrW-N|=8W!M{_Oe-FXGOPGHP!M|IW ze+R+8N0@&D!T+@||Neo0ukaf3eZu^^2mbxS{F?{<1H$}!2mTIW{;dQ5L1F%#1OFjm z{*43wH^O`#z5lTA6XZvPUm!m!%xBE|{}kr);{Bb%Uy`2`=9hZ>r-bv!PYV~3pAqJ> z-u-8Vd0)qWPIwskdEq4a1>y1J7lo_HzZafP{)6z5<d=kxA%8903+ssYjc{Kw#+V_& ztvgA+D{Iq?g7$b2LM67uJ{t9R$ZVSZVe<Nmy$ZX;7~xsi*)+$KCy4zd>=ILim(y<Q zb0+y<vA1EDI99kFJDcV@^7q7k19pjd!uQf{^4USI6+7Q%B+e0jiFT9bRq}eVcVL&e zRro9HY?`mhKNGt`mnHrr+!t)qB*?FeeGt=lctO~oc2iarIa};gu}dU{=hAM{)RM=D zou`n*zQQ~u*fd=3y#vI~r93fPxQ%v`&sy^L#LlHN(I|Wa?IsPE0Iyl>w_=yrBusa; zY3PdHR<YB~5=@BjFzqIv$H+euJEwkv1_Vx1n}$=+dqV85VwZSXSd}k5V{z-e`PjF% z$bONf*1F}bs$BojvYbD!EN`i6oL5e3x%us9_z=RqS@FZzJ&ssfXP?OTFC*>a`o8;k z{CxSlBl$bzy~MW4!%y}WGr6&O!6|#Muzdzycv$!}l|2uO#O=Kv=7+p{*3te(SO2E> zyQ72O$?lm1za$QRj_bsR)r$7P-hQ*Y=Yf0tLbtr7nKPr@d7cgCNV$F5q%eNtyliok zDqqslyl`>dVm+6Tq`9%K)@I0-@~6(<ohUV-CQKyxHrLmqoi%4D&P!$}db!M27=i~5 zN_<Q3R6sq5;jguEfb&=oGgxB6glKG7+G?l0N!K#3X<=Qat)*$<o(cIp5t}*u$s)}) zS}$l`ytu9j{^iuDzGdFxI_<ju(Munsq8H;fg$`!9H%j6t%CIqAoC4vy(hWr%-oF0Z zbV;O%mOBhK8yLsHb5<6%Dr^j|w#nyCRbbk=;qp-beGWIjlVFQsv%%)K00uYR9O&sb zk%^<E-7R;}D*4?~73{cW5tQ2ocJsRddT;IcfjOoMdxo2l-yrO(u;Hz3klzo%ZhkwV zSr;1^$8Zfcw|+a3AJ6Gk*zi^)$ZrSO&2I$60N8A>`TZIOH@~luUoY6Iu<^2jaqQ>U zu(|nFLtF`)4K_dC7IX9KzFMg^L{`C$OPC-(eU65<^Y0y``4-v+n;&m4x%q8bqg02< zuh_(~e%)c?F*ZMboubla0=vaRfSX?{t}BKiZ57g#V6*M5Ksp{{^Xra?UC=hz{MfH< ze(me<TVmL%kgx|fo8RHE@fe#Qf8f)f1`{k!2e|oFpNH?i!B&NIrPyqK^|0|6n;-A5 zc7wKoaSZbSZhliQ2<J<0#M}J%_Rh_(68X(#1}512&WhyMiu`z+unHU36r11mk^D9y zzqN?B!RFT<$**>UJVU$+3HxEQ`RQvGXxrZIaK;X38*F}jtH5KbY{Z3fEko^Nv-!P& zbUeo9$9t1Aplz`E{V9^)3m3`XSgAt7GHf=#uaS<&*!=i?(D~3dFpl9%fLp&;FAn=} zAmVL){M^sY??&V|UFRS#Hou-o=jOL_qdcFW3dsgzv-$CJK^}vh4!e*anj8e1-{DAr zs9+uc9KyyivE}3b!*q3#a+%+vpwuwG^CRg_#Nx>LWP>gDXOVJGLpqp(VAJtyac(=l zD;>X{!DHek2d1-m&}5lk?Q-)w{X5d}t4a149?x{M@Ltje8^_No-Eo_+3FlU%t3pDq z=XTs!F?$U2cmj(6e=}i&jpJvTmKoO{oyXrP*kI!dkj^c)5uc}Bj>sw`Ok=a<4vXY> zIGpEZn;G^tzk!kbvaZMP@=ShXo&5HX<o7x9!_*Ig&2M}pza87;Z=O{l<#=qien&_0 zTb;mtex6`Vu=!O-^1I=OSU0fHS0UX*Y&O5|oBY`K3@=w84c2HIm>;)Ak#xP$$N{!6 zlZJA6B;9`F<otpt9c+H*nsnAa1L<}-`LTWstB{UdMS-yPPJD+XCi*~V+YTNIa}f5Q wfHb)1ngq*kL@-?uHcZQ4&I8q%4N85VCm0iK6?l$C(Lv~Pk5Zc*gH89p0BZXswEzGB literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/lcd_ili9341.d b/lib/libssd1306/bld/lcd/lcd_ili9341.d new file mode 100644 index 0000000..38ca25c --- /dev/null +++ b/lib/libssd1306/bld/lcd/lcd_ili9341.d @@ -0,0 +1,15 @@ +../bld/lcd/lcd_ili9341.o: lcd/lcd_ili9341.c lcd/lcd_ili9341.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/lcd_common.h \ + intf/ssd1306_interface.h intf/spi/ssd1306_spi.h nano_gfx_types.h \ + ssd1306_hal/io.h diff --git a/lib/libssd1306/bld/lcd/lcd_ili9341.o b/lib/libssd1306/bld/lcd/lcd_ili9341.o new file mode 100644 index 0000000000000000000000000000000000000000..f99a00c24b816f32b5055cbc3ba93b56e65f5eeb GIT binary patch literal 38508 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/lcd_pcd8544.d b/lib/libssd1306/bld/lcd/lcd_pcd8544.d new file mode 100644 index 0000000..b2db64a --- /dev/null +++ b/lib/libssd1306/bld/lcd/lcd_pcd8544.d @@ -0,0 +1,14 @@ +../bld/lcd/lcd_pcd8544.o: lcd/lcd_pcd8544.c lcd/lcd_pcd8544.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/pcd8544_commands.h \ + intf/ssd1306_interface.h intf/spi/ssd1306_spi.h diff --git a/lib/libssd1306/bld/lcd/lcd_pcd8544.o b/lib/libssd1306/bld/lcd/lcd_pcd8544.o new file mode 100644 index 0000000000000000000000000000000000000000..78c145c35d58fb2b58bddebf786b8dd772c94c06 GIT binary patch literal 15596 zcmbVT3v^voncn9<lHA@jP1DdeZRx$~gQiN8+&tStA9)o5w@GZ$7ie$O+?xmFHF-d( zKm%5Bq-blXA{HuA0byqFEhD~`u!^IOxRwm+_@E-{a%Snk%&3FTz<l4{|GsDE79H38 zYn`*d@Bjb(@8{WPpPiedZOI*;=P4_m>Q+8eD%q&iJ7KKT4i##RTCECBEtrkXK0Euu z?DwnARlUdCKC9FWu7kMFpH%8)T#-{V=Zo(4`Ry-y)eFPk%QG)VPFbJ3s%8d#cD!mP z9XWN|`4>(;dop%%!O248o<XGBs=b$Oj>xI)&~%+Yi2L~YvDDE{dYm{<--1)D(QW5X zoIfG;IreiO&-~2Cel%0Z87I#i%-Fmno-WJfPQI_6|IYc>ykjT**ySI1`TSR_U�V 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/oled_sh1106.d b/lib/libssd1306/bld/lcd/oled_sh1106.d new file mode 100644 index 0000000..1141e8f --- /dev/null +++ b/lib/libssd1306/bld/lcd/oled_sh1106.d @@ -0,0 +1,16 @@ +../bld/lcd/oled_sh1106.o: lcd/oled_sh1106.c lcd/oled_sh1106.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/ssd1306_commands.h \ + intf/ssd1306_interface.h intf/i2c/ssd1306_i2c.h \ + intf/i2c/ssd1306_i2c_conf.h intf/i2c/ssd1306_i2c_embedded.h \ + intf/i2c/ssd1306_i2c_twi.h intf/spi/ssd1306_spi.h diff --git a/lib/libssd1306/bld/lcd/oled_sh1106.o b/lib/libssd1306/bld/lcd/oled_sh1106.o new file mode 100644 index 0000000000000000000000000000000000000000..d9d1e39143399884d23ad3045a1ae50fd08136ff GIT binary patch literal 17052 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 ULPh_DkFB>H=g-Hi2D|Wo0nQOte*gdg literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/oled_ssd1306.d b/lib/libssd1306/bld/lcd/oled_ssd1306.d new file mode 100644 index 0000000..7fec160 --- /dev/null +++ b/lib/libssd1306/bld/lcd/oled_ssd1306.d @@ -0,0 +1,16 @@ +../bld/lcd/oled_ssd1306.o: lcd/oled_ssd1306.c lcd/oled_ssd1306.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/ssd1306_commands.h \ + intf/ssd1306_interface.h intf/i2c/ssd1306_i2c.h \ + intf/i2c/ssd1306_i2c_conf.h intf/i2c/ssd1306_i2c_embedded.h \ + intf/i2c/ssd1306_i2c_twi.h intf/spi/ssd1306_spi.h diff --git a/lib/libssd1306/bld/lcd/oled_ssd1306.o b/lib/libssd1306/bld/lcd/oled_ssd1306.o new file mode 100644 index 0000000000000000000000000000000000000000..b425ac75f984f77840e3b7667591b9b3f141d4c7 GIT binary patch literal 32172 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/oled_ssd1325.d b/lib/libssd1306/bld/lcd/oled_ssd1325.d new file mode 100644 index 0000000..1aad19c --- /dev/null +++ b/lib/libssd1306/bld/lcd/oled_ssd1325.d @@ -0,0 +1,14 @@ +../bld/lcd/oled_ssd1325.o: lcd/oled_ssd1325.c lcd/oled_ssd1325.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/lcd_common.h \ + intf/ssd1306_interface.h intf/spi/ssd1306_spi.h diff --git a/lib/libssd1306/bld/lcd/oled_ssd1325.o b/lib/libssd1306/bld/lcd/oled_ssd1325.o new file mode 100644 index 0000000000000000000000000000000000000000..5799f31558033f0cb7c261e0fba3c8e6f6a3f153 GIT binary patch literal 25464 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 NXV1j5AEyDU_rJ;O(qI4p literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/oled_ssd1327.d b/lib/libssd1306/bld/lcd/oled_ssd1327.d new file mode 100644 index 0000000..02535ff --- /dev/null +++ b/lib/libssd1306/bld/lcd/oled_ssd1327.d @@ -0,0 +1,14 @@ +../bld/lcd/oled_ssd1327.o: lcd/oled_ssd1327.c lcd/oled_ssd1327.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/lcd_common.h \ + intf/ssd1306_interface.h intf/spi/ssd1306_spi.h diff --git a/lib/libssd1306/bld/lcd/oled_ssd1327.o b/lib/libssd1306/bld/lcd/oled_ssd1327.o new file mode 100644 index 0000000000000000000000000000000000000000..7365e98850766cc266ee035da786958e7be55f54 GIT binary patch literal 26560 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/oled_ssd1331.d b/lib/libssd1306/bld/lcd/oled_ssd1331.d new file mode 100644 index 0000000..971b619 --- /dev/null +++ b/lib/libssd1306/bld/lcd/oled_ssd1331.d @@ -0,0 +1,15 @@ +../bld/lcd/oled_ssd1331.o: lcd/oled_ssd1331.c lcd/oled_ssd1331.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/lcd_common.h \ + lcd/ssd1331_commands.h intf/ssd1306_interface.h intf/spi/ssd1306_spi.h \ + nano_gfx_types.h ssd1306_hal/io.h diff --git a/lib/libssd1306/bld/lcd/oled_ssd1331.o b/lib/libssd1306/bld/lcd/oled_ssd1331.o new file mode 100644 index 0000000000000000000000000000000000000000..53379469882f8902114f5f4b78714bc9d86e1e5b GIT binary patch literal 46700 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 KI|A0n^uGYGe=axx literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/oled_ssd1351.d b/lib/libssd1306/bld/lcd/oled_ssd1351.d new file mode 100644 index 0000000..06555c2 --- /dev/null +++ b/lib/libssd1306/bld/lcd/oled_ssd1351.d @@ -0,0 +1,15 @@ +../bld/lcd/oled_ssd1351.o: lcd/oled_ssd1351.c lcd/oled_ssd1351.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/lcd_common.h \ + lcd/ssd1351_commands.h intf/ssd1306_interface.h intf/spi/ssd1306_spi.h \ + nano_gfx_types.h ssd1306_hal/io.h diff --git a/lib/libssd1306/bld/lcd/oled_ssd1351.o b/lib/libssd1306/bld/lcd/oled_ssd1351.o new file mode 100644 index 0000000000000000000000000000000000000000..71577edac80c7bc628a139b63dd2df36080ec446 GIT binary patch literal 32348 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 E2Y{|b=>Px# literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/oled_template.d b/lib/libssd1306/bld/lcd/oled_template.d new file mode 100644 index 0000000..64f3d6b --- /dev/null +++ b/lib/libssd1306/bld/lcd/oled_template.d @@ -0,0 +1,14 @@ +../bld/lcd/oled_template.o: lcd/oled_template.c lcd/oled_template.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/lcd_common.h lcd/lcd_common.h \ + intf/ssd1306_interface.h intf/spi/ssd1306_spi.h diff --git a/lib/libssd1306/bld/lcd/oled_template.o b/lib/libssd1306/bld/lcd/oled_template.o new file mode 100644 index 0000000000000000000000000000000000000000..24886e4d3f5c8d9559dc8e14f3d8ae6cddf20e88 GIT binary patch literal 22540 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/lcd/vga_monitor.d b/lib/libssd1306/bld/lcd/vga_monitor.d new file mode 100644 index 0000000..3964c98 --- /dev/null +++ b/lib/libssd1306/bld/lcd/vga_monitor.d @@ -0,0 +1,14 @@ +../bld/lcd/vga_monitor.o: lcd/vga_monitor.c lcd/vga_monitor.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h lcd/vga_commands.h lcd/lcd_common.h \ + intf/ssd1306_interface.h diff --git a/lib/libssd1306/bld/lcd/vga_monitor.o b/lib/libssd1306/bld/lcd/vga_monitor.o new file mode 100644 index 0000000000000000000000000000000000000000..a0085450551b96d23c5b7269bed6a3ddbca15bd1 GIT binary patch literal 20376 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 NU54>>g(!3IKLOATO)dZc literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/libssd1306.a b/lib/libssd1306/bld/libssd1306.a new file mode 100644 index 0000000000000000000000000000000000000000..c11f68020976b9031eb615062b88e7b33776e420 GIT binary patch literal 1573852 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⪼0_J{r-6TC;6E7nufW}! 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⪼*23VrF~` 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�T+LtQhk1> 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�W2rS#_%^B%_O^dr7e<!S2NthmC{;Uh=D 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μLD&a>oT5odtP&U-gkK#S~{muQbSAUx2cf|byd=R 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	P&`*!6SmLtmEyTFn_$&A6wj611gm_dc&_{= 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∋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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/nano_engine/canvas.d b/lib/libssd1306/bld/nano_engine/canvas.d new file mode 100644 index 0000000..6f46457 --- /dev/null +++ b/lib/libssd1306/bld/nano_engine/canvas.d @@ -0,0 +1,21 @@ +../bld/nano_engine/canvas.o: nano_engine/canvas.cpp nano_engine/canvas.h \ + nano_engine/point.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h nano_engine/rect.h \ + ssd1306_hal/Print_internal.h /usr/avr/include/stdio.h \ + /usr/lib/gcc/avr/12.2.0/include/stdarg.h nano_gfx_types.h \ + ssd1306_hal/io.h lcd/lcd_common.h ssd1306.h nano_gfx_types.h \ + ssd1306_generic.h ssd1306_1bit.h ssd1306_8bit.h ssd1306_16bit.h \ + ssd1306_fonts.h lcd/lcd_common.h lcd/oled_ssd1306.h lcd/oled_ssd1325.h \ + lcd/oled_ssd1327.h lcd/oled_ssd1331.h lcd/oled_ssd1351.h \ + lcd/oled_sh1106.h lcd/lcd_pcd8544.h lcd/lcd_il9163.h lcd/lcd_ili9341.h \ + lcd/composite_video.h lcd/oled_template.h diff --git a/lib/libssd1306/bld/nano_engine/canvas.o b/lib/libssd1306/bld/nano_engine/canvas.o new file mode 100644 index 0000000000000000000000000000000000000000..054cbf34cd4dc71f83d1b3fc6b8f8200edabd249 GIT binary patch literal 377256 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 GbpH=fnO{o) literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/nano_engine/core.d b/lib/libssd1306/bld/nano_engine/core.d new file mode 100644 index 0000000..9dba390 --- /dev/null +++ b/lib/libssd1306/bld/nano_engine/core.d @@ -0,0 +1,17 @@ +../bld/nano_engine/core.o: nano_engine/core.cpp nano_engine/core.h \ + nano_engine/tiler.h nano_engine/canvas.h nano_engine/point.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h nano_engine/rect.h \ + ssd1306_hal/Print_internal.h /usr/avr/include/stdio.h \ + /usr/lib/gcc/avr/12.2.0/include/stdarg.h nano_gfx_types.h \ + ssd1306_hal/io.h lcd/lcd_common.h diff --git a/lib/libssd1306/bld/nano_engine/core.o b/lib/libssd1306/bld/nano_engine/core.o new file mode 100644 index 0000000000000000000000000000000000000000..3f9cba127a771fbc77e29c08c03d865859e6d1f0 GIT binary patch literal 23308 zcmb_^34EPZnfH0`%}tZ0O`D`k(w5$v?pyY>P0H4$qzi<$bYoL)v)nd;G>KUXtt_S1 zvGOrmz{+C%SZ2PF57A*592r1GP(cPabX-uGxG~Crf-;Vx1M~l%=Q;OXazpw2eFxt6 z{GaDM=YO8_yyu*EIXAtowQYmvdB!Er>@dD$%+U*sc|Qspt-%s=ra8kL9W6L<*dE76 zi$7w_2bX)VPQBTf!=oZ!KYIKoV{R%jj~^aAHiiG$(srr!ja#0s8AbW4I0{ePR&#Rx z^`j@t4v&80rh*f>%5Ex=vg5a)1sr5KJ{pjy4{2OkSj)P5aI76;Pw#?9!HHw@y;o`9 zT{AFx?AN#0Ua~GdTnoRq;n;&?fX9hFC$^nfcOt#Df9rKy4?}Z&^sdndM!z_^Y39Wf zE}!t;3Fh_3M{lfQ|6IRoZ}na+JYgQ6TlqKn#w3iF$MDYKX%<h>R7geanrZdO;vT9X zbUekbopCO*)0%OLdj(X@jU{^ehD|&+fl@p#!Ay*g%owyPDJife@dA~s2T2-h192}# zDgW<qO69lWY+2$<%O0lsb2wG9UD2+XdN=UA39*Zi#T&c{7(|v*&eFk{)#TZ8fjv*P z=aiX>T4rq;EtU{%;AuW6mf|R-+LTeXg{M1ktb^WT>!ROHME%8C{UoaPOyik$wwFDW zuBOTTL{>LIbUa(lRydF?y`Jb{S87}I7G+Cut&Mq>rJo?O@jo$-ko*$~Zp(UL#oO&Q zrnMFC2$y~=ES}7YlS%b)p4b;F{qK-;XGprsNhY7y!3Ot}O>u;jqVa5uKTV?#Ahdst zqm-q_w)YVAHZ+eAeG;V-X&ccmWPP&YQ(^I0%ghU537#Xt%OrS$$j0Y;GYHuYEB+uX z{xB^5*ou3d@xRStUCWi<1=<*6KYwO|zMI$|AuKFZp#a5;oG=r@Vki6%W@kC!B?z4* zQfE3@?wrAqJ~u|M?<rEUKSB6gCrm_Zf9He>2=_W+355HmNSy^F`*$cjo=pBhoEB1d z0gkt_`r@yG`cdjRw7rvyF&}K7KR1z4%%;SxuzN6{GGpMKya0xa_6`gg@4@8^W;V^_ z<@^-IQXJmN#5TxB>?Gyt;hp?3YA$BEcXS$Siodqe_fHN|E$QsN!gzlrx}~h~GW`A$ zs+Z??-{SS$;z?DrjAh?PSwwFVcObln0$!)E<`mKTP(!e#DOS}=mA6-fU7TfJms#Ed z_r1Qt)u>rPvjJN%!8w_+%=FwlxyLbQ)^K)Z(~3sc-(Kil<p_2P0hfU`OCWK&+Yz+Y zSOdq9SOkK#Hh$<iT6z+OcBr%z@>&`*ldFfVQ)~?q-H;nCH7B`u@=vH?d)2s>>w*T) z6mt=)fx<5Q-pTo>VuMo?zM{ok1Z|ADcz7qzb9T#?ggmVxRo<TRy~yHrrljfMAk1eE z^z@nZeCw|*xs32eS8~|`TT;y+x+I;g*)J+DVK!q0jy0N%Wos(E(~FvmV&!ONfhj6F zt0<0+=Pfbu;yLg?QSD`IO1#qiwdIE@Jk-sfVu~tbWSLOyom~+xUQ-zdPi0A8aebwC zhP5eZ1c~U2`ieJ~on29189So_H<=kMC}O*0m^j9cMnwr*+j_UTEH?AAEi;XoRBimm zEU9e`t7x#GavGZ>NwM#KWxn`-we@XEm>s>J8uQ}CMU|d*WCD9x66#xmeM1Mj%2-y) zAU2|nvXBu1u(>Q7f@vYQTyQYtq|4el26{$FqurfZoxMWN{X=N6e6xv_Ukjfr{7RLR z8OmAJ=){`JJYI@vo6Ay_ak@Gioh=Zp4fvcAZ((s+Q9L<2xoc*LHx+?BZIK-kb9D${ zHBX+7_~T)Lv!imlEuEL=omEr>3b}Tqo<9dAO-1$S!2*dxV})G(g(5OWqF7|T(5tQ; zTx>hwbm-9%C<@%rU|g1N@~-i&vk_k=(3s`+s@hugVTCWIim0fn4veo9NUE#7y0X4v zH-Irw8%<pq>CG!R68dms<e|&NYV94^P9DrEKKo4dy7Q(^^Y-RVE0=XLuY6YC-+0}3 z^7%T3Ma8ILDJtic&Vc!h^29N-w(?F`dfj8VX6bUv0<Ahp*OI(RGsYGcfU%%7pwCvD zjFQQ-yxzQ7bHpRtmLnZgdKAU<*FDh%5tj)j-dmWQY@c%=yWBqRK;{z3#6_3M-gl7O zRSCJ%J9!I@G`$<S3%q^4$P1k719*<ba-L{$u|1dC^9*~Q70?LYViv)BHqeTOVxIS> z;>iZ@Mz~zOWB^ImJ9UUw$ru&}v9M+uDpoS_gl7^qa`DHFmq^4t+($e)C+5WY=<FrD z{P+ZdLXdk9U5)1gH7446F=uaSqV`8nSzAb~&KGhM%ZmX`B2_-x1qk{OFDfiWQL$Q! zO&&CbacL`|IeZk?O<@e4qDyG3(0TgGSm&3ahIG%iOU`nqnT?W(P%K5x0=kqB$AaA1 zDAfG_B5L%bQ{p^f%LUo~WZP^W#}v`iu4hf3h5s(-3mk2>%dVk7M{_jyivY)x07o8u zOT06VHv$|}0~{PxUSi5S(7dyDJ{1^bWsa3$oH{l(4+d;GphBJ$azs%x&#_cWlr&Zx zBr-T`#c13gRc?&N#B#@QHtNh}Ajn+~fUzUvcqS%-7r&OnEHTYuV}qOI1YvbHwa^Ki zl?f4e!M((!K#6$Lx@F_$Ev@NuS~slQ)wVOeVcQO~Kh4MSmR&n{ZrzeTXX}MqOkd`z z;SGcB`!gne$(FiRTiW~jTl@C)^kp{p4U7yA)z$4!_xH7o3=jAB4Yiu~zV_b!ecLnb zU8c9cZ(quuM*4<&_Vs1DQhcYs;$UN~np?(3pK*QvU}k+|>w$4vTHV>-*O%!WUOzH4 z+`s?4%)z17Z5z4|w8H7mfswX;wCQt+cL68Zwz|>T-9BjcWu#l%+lMn|r(bbnW;p0x zjt=h|=;?PI9?#b%^>y7~*GNbILF?=|w#`Fn#w6V}+&WIjR}H1vCP)U_ySDW(&Ni;> zQoA(ZT;AE%-#@Uvy|=fcz4Hna@DxGnMUlI-+c$6Aw3E8_Aqm6IA+vGIuGISF%j@b= zb@kQt)wQXr{e4w?VbOhN9dK9wNJnqx%!YbkHeaQRRgF;W?;JU^{lMVLRMoyz)z+a@ z)zEO)nVpubYVY2WzRuyE{=TXqTs`C{-rLna+#ZlaE%o(R4PDVQP}MO4vb~T7hlhIv zW%~B^4|Zm%GTl`}1DQ@Tp*(X{XJ)`MoBch#y*)!Z4iPKUAwx6QSgWfK4g!ojjDC*v zb4CW+$#(t_;v5KP&Iz!3U@$W@l<8{iHlcCek-;R9>lD_DKRbpw?#LLK04wbj9B(MN zIj}K19$L4Z*KN}2&a2wf`$jMt(u0}aO#4ty?z)E16(6q=H+avxxUn|V*V*5d8EozD zZqMayb9U~HM^>*Fz;+lh*0p8VHq+7H-)qLs6VsLH>>WNhkXh0<(%U;QJh&8VP^N3w z0ESG)bhr0)^=2@AB>+R?OqoXIy+kGrE{?Xl&Vd%WHZq8v8~)OgtFtTZHP!Vga@p$Y zhXM-<+RHgu>S}ee<EsP$7PxBdo$ndx8O)fz{^4yhpmKRow|dMF9WU;U;gw<BRkeO7 zedr3evItqEYpZ1GXf@Gg$RF@_MU@M^yS;ZL<KpQLQ&hIA+|ZR=dDrWDon89I3zr`b z{}OK5x~0`!#kSTBJIx3d!iM_v@Hixm+CN<*5efey80$GcEOe&fS=i8ZA}|fcX`wD~ zQv*HRX&TQPx7rU~*=ls<$a$gbgDVg2a|dvrV?Rj@cRO&q2;A*>=gdh{>j#_t4h+#; z=FQogJ&bv4Nb~DiSI@ql;r3p8Q_nf7?L9m27=ZZtL&`-_XCj?%x3qnDl1OLlqeM+7 z{IBjD7%(;6{rfXD{e4}7?KRs5`!B~0W2mOTH`7%$oEaLf=^TKrrnjeq$Iwt$T|@1v zzo<^2aZ@ugG+2Y1R}Dr%??_k1RM#kVy1TuXCFq0tmj$@L;c8TOOHsG!=?69&*RNlb zT7nztQoV=Dck8#1JQKTa!K75|Z}C!PzdG~X3W;xHZzuDeG+J)ISF<t_-%ZyQ$4~MN zZ9ILjKHp)3GT&u`GT&W;GT&{3GT&)~a@3yXK|lEJ>-+-@CHsD<nmqH`TfxFOUsnSu zu5a&76*qCa{cx63pgz8VU~kW**WO}m&UPZo7iKZRYj4%z?6(qaKhOBww3k<EB1w5> zvx7FzGutBag%SC(h|E`X|83kyG>hXUJ`=J}*jIXAl`y@&0F*F85&2L=zCI#{+fRf_ z<M@(tETqYgw4ZN|N6K%D$akrX&uWPCJo6lKf9&L&=e3;Iz%%pBL;!pY)0A&YBl4_> zJP)${rfh5En`IHX9&)v#Lx0vp<d%qhZbaS=xi(Or@#1`xWItay0oSV_5}yKd3F`Yv z%KfX%sQ3x*Z>A$;Ul`#lG?z!p2O;}>h2~I1J_4EZTT-F90W#;SlW&IX$Ggzn0h#mH zm9xL@+n4T<x<d4~$lL>aKNUs%Ei(5-${&R6`&(oliO5et_Wdm~&p`J5Ei%tR_Wdm~ z&qMb8mG*sq`I*yCaqKw$6!w0a9PxLuc_~u<+lc%IWdEv3efLdJcQmu~aqO1Z52RVm zlt_D1%tZMhsTNaAX+)j{*`F^`-;a;ojmfgdvFSW7RKFzBUWr*2DX)*nYasjAr^ImE zDkz@|+3$ae*$&z6%UUm_J^y-@WPKxuW0U(5*!!t0;$NBRh?HL*kq06B?U$KD5%~yY zKVD_#2FU)sNZNDXYIV~+>rNc|VK>9xPtzm*O*eN$%I}HD_d)jKHQhWIkspEV`#;@0 z5s{yP?E636JQtClhwR6Dy7?(&e?Ex6{(P|ed)e;9%}nzW?EN$|(!ZJJw~_KUA~HV1 z2HKbU{`JOoN+89t)5%?CKUGB9t1zXJ@>!7m_*IyB5qTM8KYkUaJ|eGy?8mRdv_SUb zRbkGB?2m^EvmLS@Kk?6xA9kDqDQ;$)OJMJ(*^&OtHXSJULpIx79+3wjr?LdI%^}E5 z0r^Noz5%lT3^Lo?40%Jq{tn3J2IPAp@_mro0_6`zWUlX90_9l<5I3g<MaXj_axx;P zB64L!o)?klN8|+&d0|9e6p<H4<RuY#X+-v)6j%^9D<b7~>p827%dU1n=F_5|;-<kD zfZ}FlL|$dbhd-X>`O%l<d9FTNOP;U%a(Q0x?`QHn;LCEq3*LWtJ%jfL%KrS6^*Oly zvD_c;vVQpXGQa(DnIFON!uoz{GLK+<`SU5?d>*oYRrAdgq4Emz6y)Ieeim|YK70$Z zpH`TkK=$W%o%v;`yutiFB+oW)LJs<ykKp?8sWOux`+QYqnjd^LTVduv4)%Wm<W$z7 zDzhB2-`^@zAF4motbrViXG^F&-<%6Mc>T9S_TMS0%*Bw`1=`yK*<b(i&0ffU`}w99 zvY)1#VaUG!)6Lb8d$R^r=6#U61M&@_`eo*3$ieY)2jrsx`@10@4#@XH_EU*@0J7iz z67w+RyR!yW<_nPR55laj%6uhMKhJy}vaiZB-}MF5m||Xl>|f6*=EYF?Wb<pt!TIs~ zP<fGg6LN4q<tOxaOzO{M$e#)LI}Ng*3e6nIe*HqT0P+vA1{fcZza5b4L-iA84P@V? zglT~s9RHg`_7!GZNS<yk49R8YvXES2G9kIh^oHa@GZ>PWnZqHuz#N0@`{$25b}4RF zXL}}clR2*SS*H{=9}dY0GpaJjd@0_?5`kAJ-lr=fa+S)$S75fQ%$S$reTlycV&Xlw z#4I%*4VB~lLS>GDQau0vN@b3jQjDMJcKe)|M~OL8WzX_0G#x5)4wT~g^}{Mldkf6N zDszsN;`#B#Q2iy`p0i2#7Mo=ud679!Wodt=*{3r5TY~%T|591_E6m@A>Zi;zDzg#B z@4KP$O7o`5Tmwt-{4y7N?@Z$VX=aVe;$PBStTJuL*Bz1l?_lZlj&12p=`_A!1GEX) z-n!9(;r#>Hh1h5Dq0C^v3e|1>oz=Cbt=2OZ)=5?`S%YMalC6|%m1L_WYm%&4vbtK$ zm8Y&ApENh_&b>()`as*-l>N3Tjx?a=Us6w<ty6F7)ZIGuw@w|dQ;+M_<9gR~?RvfT zy<Yk1m9Jj;>Xolv`RbLgLHQb#ufc^<`5Kh3LHQb#uR-}5ln*~+v~g%uzDDJ1RK7-c zZIrK3`5Kk4QTZB`uTl9{D&I=wTd902m2ai;tyI31%C}PaRx000<y)nEtCVk*@~u+7 zRm!(Y`Bo|4D&<?He5;giweqc2zSYXNTKQHh-)iMst$eGMZ?*ERR=y_XYf`=@<!e&D zCgp2Vz9!{sQobhTYf`>u<!e^HX60*EzGmfXR=#HCYgWEy<!dG%ZE0r*n;kKBICW*P z%bITQ=ori#U~_HT+gMA~z1Zfbazjg<9kUx+C2!lYlTGa2wSyT;trbcw#g3hH1f|SS zYR5n7N)DMVP-YG;R)V$7+Ste4ZR{ayT7FnEhb21zOJ*#!IZBzMlwCwAGnQHolrl#t zGn6`JwnHCm4r|7kvdtlDk0fuYt7QyPZga3%H+SvO+O^svo1>H@Xv=X~kHBpmY_rpR zcbkpX?lv0)WHw}NYGPa6-Ns(amFU5~xAh3I)_x(+xf@eAcE4*JyLY%l7}?#*wQCvF z1^1u-vR_XGw$yWb9{$ZqZkyWB)?scNx0~*7`|2-Ba+|w-@pY&EQAgd_4d~pQIksQN z2F>~DZ>P$xf6jYWj$e!9ZrXJxu)mqz<{#@rc;`A-%Wi9P+#j+y1MYp&rN}<>+itJt z`sG5Te$FlUh)wp_73r>?1N-~Cx_cUPxiaoPdxS2uVVa{$*{$;&Wuc!=q`Uglo&5s` z)BIfw9;ztfXB>lR>~ivH48MBS&n<j*o1oY}7wg}>@fkPvd0NUlQC_8BKF7Jbe9m-r z`5mk@#wR~{hjI2P$nh^wi(eSyaC$yE=Ox6RZ4px%PftH{*+6Z|-{M)GLn{<J9&$Q< zXOlNk+GT&s-=tRBtx)XjX~k!I=cn~yQov7OCO#II#|5))g<@BiC5%;wr&#Q*pHuw0 zc~b@RI|6>LhqL%lq1f@Tgzpg{&Qh_roWPW9Ux4Ym^#_=rH7Lg(#|g>WPm{X5zNOOz zTmBh>8LK?yXMc%VLO+Sg$GXJipGT~98-ZhA#0hCFj=XZ=JV!C5O*mpt;DpqMBd(Zj zc~4R+J0c$bjAu$r;^}=_^z@UMU#R(R<9$i=^N7DJcrh{RUW9ilepw@a4fz_y4?usu z;&lkfrHZ$qGaZT_g`@ivKMk7^#htLZTJg`2zfbXH$Zt^m76SNT#kT@~R55?9&2JX; z=Q`+-S<E5&q~dP_|5)(@XqRo!o?n!IrT8)Ef1~(y*#D>E5pe!V@hiZb-mJ@S7X^x+ zLpd)k^~5t3Hz4@S6d#74HHvHF#<VE@2;RXrD(2tLT%vdcHhUCrMO!_J@%JdEPx0+& z>l(#-(bf^gUxxinijM++RB<cvk10;UpSu*tVDrz4FNF`ESNw7K@HNHfgP(C^ANlu1 zKT>=#^gmVn8~FAgifh61n&O+0bFYqd{|G$?JMp_=Z-4p<d<1%qOX}YP+j7PGp`WWb z4WAb)E&*Pl_*<}9srXB%yGHR-;9sx!C(v(FoC3Z;F~{I;#SP%hD1IFHKmfm2@%6C( zkm7eEKDQ`74Q<_~_%+o1xZ-B$?^pcasLMSl_VE?uk1D<r{(n*NH&B=RPPADF`)?|K z6Z#)0o{x54P<#w}a?!p7`rj$O6Yc(4aT$1GD5DMcG>Q~I4L$2nUyCs?OELdQH>LOm z<oHp&wRr_`t5G}+K5rn_d(aMIU6c0^>zcfuSl49kuXuXz_yDo4|2GoD2d2A-b=~_E zv97E9mhDx*0VIB>_Bi2?zC*0*;SY$x^9=G=6!RNe0)6woV$J!hY?FFQFuyO;{{JGM zOU!^E%_IJ*;A-M$1oL}x>R$wJqW)RIZNy&_d?E4I1z$@0ZwT(D{+ojNT{!hE!B<ib zALe2najtrmqW_@ke}QXp3o#cKB(8m)e#E5T-giXLZ?~R4hj9LT|0??L1@u2B{;ueM z37q<#;NMXXA4cHAe-nRS^!Nik<LL)fev73Izp<4mE(ESpOh3;eeqQSG+iB{Dg3ni* z$H2{Rq~4E2e<?8+W~4r~A<uQhFNpqqz^Q)|{2{gZA#83V9u@sb;-3h<m-wfG?*~r( zOz>x^hyPnKZof+WbJ2f|Hop-3JoPUMeu4Ub7yK*gQTHLn2KBvPik{y~Q@nv7O{E?- z^nVudOQN4k{2zjs62B~%-%?Yr2yUWY>$VX8TJ#%;c~e5-pOw<)JK(=q@eb&R6fefL zyGb$Ey%WT*+N$Pu;1qAxNK<flzqQbCsCmB=%x4TY*Ulx@@w1=!b+LIbvCi@L6Z0mC zbQ=ygm+v9|J+;O>fWyuA$B6%nT4R4_<o!V~Tr=Ju1@rmGUAt+(?%I`8uYKXSX4jV# z_20w^X#oy5r<MSFZ%`}G%qiZ$k!o?c__M#+_*1Xf^bG3tny#h(MVye%!QsZkCSW&y z_^jo|&o=6H-0q}a$L&Sb>%4du^*S&1P_Of`i+Y`p-PG$E(o4OrAp_LwS~N_(u0>Z- z{}r5&uEyckx5>aRp1cRR81lKt#f?jbi`7D69iPjIH749?b#dS>gX{a5#M<BW#M;Nr z#M-Z|#M+l##OnX0#Om`r;!n$7+akr+AYZ2VgUG8D-+{bI@%_lH52*VY;1<<?9{EPa zPa)?uBLCNs?<Ow73F#OP{-Gw*!#KRz7Mgn8TD%&;d}i|M1%HT`4I+Jym;(VRhB@i6 zqexZ6Yy{~&#Ct3>pCP_n@M*j^@uDGZCcaMa{~^9na3``PFCbD6j%2Zg<~_ty1Ro-v zD)?IBzZZOhc)H+^5zi2OH}Oot_Ys#1Mrcg(0l{A;K20#=m7FX1`@|{1KOvqcm`h}G zzTj7gIT4Y#tRy+0kp7G#$qS3b$A#o#!IO!X2<9tOa;f0C#Ju=O3y3)wk(LnugW%JN z9~8Wem=hX_|5!(IrQi<YRe~=k=HNvdByJLXh`3qsVd6D{j}rf*;M<AM7JLu!TEU+r zUMKh;iCYBoJtw(d@RP(`JdnOh+$xyQ)yanh|BU!t!7me^Cz$UcNe*75KM-?}BNbyT zB`*-ne}*EtU2u|khv50d|0I~t!^w*T^LaRVvEVl1O9byC=A=Zrl$Z+@QYZ1d1@9yN ztl(>jI|TC|{77=ZA{{5@Vuo}(aYpc+#CrvQf_R@`{!<{yhXwQZSIJ(%|3b{04-)Tr z$v(k9ChiyfA~6?5q~8#8av=SIcu+9@1k@yl1WzF5!ihA6ctmg+@jnY*M$CzY)Ij`R z!KV{*aYe%41e)X{f_D>NFZeRzBZBu4zfbT0@lnACiQg~ydg8wl`~l(*2>viJ7bm1! ziMaqGeT?`~!Tjw|@<W0jCH}DBCy9>>=I=L>Hwpe%;+qBYcN@uD1oJsL`4Pcy5T6h{ zArJVYg87`Byj5@|@oj<^5<e!m9GUky!E=Zw2~HtPl?dikcQz}Cr-{B6S&BC$q$V8B z<_uzzA+5!cVkIOlyUwPKxSCr03raXrBtyCghqHMXaRaq@r^b;woe2Nz2M%Y$Vd0%c ztua^ONNuoC?h)Fr8=>+xi~cxm&KG<e^=fmHn2sRbg(J0-2>+l94rg;e@rBgNGg9g@ z!4D&IHjfdvi~ezBscykfBXc&-5?>+uZz4+_5d3}W)t?^`9~Av4veY$#e~HZ5yi9yp z^sgdI-5~f6$ehieiT_&k25V93cE#002lo%RcbMv-;X%o}9U8{ps+wy13ALIZPOGV? z&i(a!>@LaMT94T)sm4A>``cBCY@58TDgT<y|MR3%Q3v)%PGwpb-Ud0Px!Y+Nvm<iK znr=5Cyg72pYGe0FPFcnI7}*UuWj*I%biX4~G4hE&yDRbbW@9!V-rhX4alo-^M`@(# z?C!yM24nu7b3DV~UW1(<xteo(BjXz6+!fI#|DS(&A$`uZk5m_)Il*6RxIm5Fp31T7 zl?}#N>&UL#_?E#ft5aKX=WBec@E?D^ja_(qQwEa14U7dYuxD?A#l8KV_~YkcEPQrx zQoF(SzI~anZm@6PSVQjiJ94b34pN=Aa%cbk{Tcktd63=y!L+W-?<kuMD=g=B4}%pN zc?u+!F;(Iq#v_7F<Js}iz5vIm>{h@g+Aba^vdOi}$J3x)6XaZWyfp>w&VXEx!zIUe z3<}m?s|BNYKR61!21h;)mQBK8@5QP^X88D-t6h5^4cPIqa}ExdT)RJmBG_&h-bKox zW4nb~#&*k4A=nQ-;^pGwXP6-0)d4=f-nxFYMELmLHxY+RY>Vm42;WBne3Mb``0T%Q z2$`{BdI(3cMRIa{S4Q~m2VX5r*k8WBIzGNPv5w<=0=N{1OOEf;5xyURkJp%de7tmg zFGl#jgR&VoTylKe4`7|OT2PLGwF#JfWjGw4-FtxS{Cf#_77mvjUqvj;w+DPXVMM;^ zI2_-Fuwxy^mj@wNf44{Y9s-|>-^>6X-@}4@{B)knzk?CJp9lE(=<WRbRD=(|4h;Ne zTiSxTxi`YcfA;Sx=-FScDUR>kunVpS*MbkKY@+W>ujjBMhfB_m-%g@@u8g)0uY(=2 zTZh=LD+}6nMC`5`$L@Hf-NUe>A1*oWr*hc2GTJ))=Nxvq;<5}u2=<rlI*uUU&Ua{c z=pEYK^$zWx&S96UAKWhu`ptfP!cBreTwa46{x@scIiwpguBIXY99PS5u#D?uED`48 z_wPxFsY|Y{=@GjIERL@^BjnC*D(r&oo?M4-87ODFRXAL`%OZRW;LI_UyX5#5M)+2= z81pU^lCK7b<Fk7vt}^ob!Pg#;9Uu1*gZ>>`FYlD(tHa^=c0~M}jK!N{$R)?OCBj#G z4*nTV=*Y)cWyhCRKCV4XtFhQ#%K@p0d^|3X*nI|z%D0`7+R*M$#O~NES#O=G<Ku7L ziCsDgJKZj{D%U0M4-v0b!`JbC&TnPx2bQ>OKgbmvm-k|kdK`V>r+_!rZYpx#ivz>R abmQV*Nu?&|6RL*nUdA`O6Y#|)XZJtYn4mlW literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/nano_gfx.d b/lib/libssd1306/bld/nano_gfx.d new file mode 100644 index 0000000..7c9306f --- /dev/null +++ b/lib/libssd1306/bld/nano_gfx.d @@ -0,0 +1,18 @@ +../bld/nano_gfx.o: nano_gfx.cpp nano_gfx.h nano_gfx_types.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h font6x8.h ssd1306_fonts.h ssd1306.h \ + ssd1306_generic.h ssd1306_1bit.h ssd1306_8bit.h ssd1306_16bit.h \ + lcd/lcd_common.h ssd1306_hal/io.h lcd/oled_ssd1306.h lcd/oled_ssd1325.h \ + lcd/lcd_common.h lcd/oled_ssd1327.h lcd/oled_ssd1331.h \ + lcd/oled_ssd1351.h lcd/oled_sh1106.h lcd/lcd_pcd8544.h lcd/lcd_il9163.h \ + lcd/lcd_ili9341.h lcd/composite_video.h lcd/oled_template.h diff --git a/lib/libssd1306/bld/nano_gfx.o b/lib/libssd1306/bld/nano_gfx.o new file mode 100644 index 0000000000000000000000000000000000000000..8ce4e4b1a80d926a7f1ada25a860406e9e247e70 GIT binary patch literal 107164 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
X(j0521 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/sprite_pool.d b/lib/libssd1306/bld/sprite_pool.d new file mode 100644 index 0000000..1e0dd04 --- /dev/null +++ b/lib/libssd1306/bld/sprite_pool.d @@ -0,0 +1,19 @@ +../bld/sprite_pool.o: sprite_pool.cpp sprite_pool.h nano_gfx.h \ + nano_gfx_types.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h font6x8.h \ + ssd1306_fonts.h ssd1306.h ssd1306_generic.h ssd1306_1bit.h \ + ssd1306_8bit.h ssd1306_16bit.h lcd/lcd_common.h ssd1306_hal/io.h \ + lcd/oled_ssd1306.h lcd/oled_ssd1325.h lcd/lcd_common.h \ + lcd/oled_ssd1327.h lcd/oled_ssd1331.h lcd/oled_ssd1351.h \ + lcd/oled_sh1106.h lcd/lcd_pcd8544.h lcd/lcd_il9163.h lcd/lcd_ili9341.h \ + lcd/composite_video.h lcd/oled_template.h diff --git a/lib/libssd1306/bld/sprite_pool.o b/lib/libssd1306/bld/sprite_pool.o new file mode 100644 index 0000000000000000000000000000000000000000..a7402b887536f359259acc21c4e3a0a256c8f60d GIT binary patch literal 36140 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 P_1@cn@0^_mtls|vRP&)U literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_16bit.d b/lib/libssd1306/bld/ssd1306_16bit.d new file mode 100644 index 0000000..0969b28 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_16bit.d @@ -0,0 +1,14 @@ +../bld/ssd1306_16bit.o: ssd1306_16bit.c ssd1306_16bit.h nano_gfx_types.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h ssd1306_generic.h intf/ssd1306_interface.h \ + ssd1306_hal/io.h lcd/lcd_common.h diff --git a/lib/libssd1306/bld/ssd1306_16bit.o b/lib/libssd1306/bld/ssd1306_16bit.o new file mode 100644 index 0000000000000000000000000000000000000000..434b94dd471c930bfeef613a82e714cf0e20155c GIT binary patch literal 62876 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	I=Du%OgH=$hFR*MSCpM4 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 C%0UnS literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_1bit.d b/lib/libssd1306/bld/ssd1306_1bit.d new file mode 100644 index 0000000..6f8b05a --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_1bit.d @@ -0,0 +1,21 @@ +../bld/ssd1306_1bit.o: ssd1306_1bit.c ssd1306.h nano_gfx_types.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h ssd1306_generic.h ssd1306_1bit.h \ + ssd1306_8bit.h ssd1306_16bit.h ssd1306_fonts.h lcd/lcd_common.h \ + ssd1306_hal/io.h lcd/oled_ssd1306.h lcd/oled_ssd1325.h lcd/lcd_common.h \ + lcd/oled_ssd1327.h lcd/oled_ssd1331.h lcd/oled_ssd1351.h \ + lcd/oled_sh1106.h lcd/lcd_pcd8544.h lcd/lcd_il9163.h lcd/lcd_ili9341.h \ + lcd/composite_video.h lcd/oled_template.h intf/i2c/ssd1306_i2c.h \ + intf/i2c/ssd1306_i2c_conf.h intf/i2c/ssd1306_i2c_embedded.h \ + intf/i2c/ssd1306_i2c_twi.h intf/spi/ssd1306_spi.h \ + intf/ssd1306_interface.h lcd/ssd1306_commands.h diff --git a/lib/libssd1306/bld/ssd1306_1bit.o b/lib/libssd1306/bld/ssd1306_1bit.o new file mode 100644 index 0000000000000000000000000000000000000000..58a2c5250277f3c5985aa5940211d4c5f9f025c0 GIT binary patch literal 195580 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%0DSHLq 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 S6S4UFdg45mF<h?=>-!(gG_p$o literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_8bit.d b/lib/libssd1306/bld/ssd1306_8bit.d new file mode 100644 index 0000000..add99dc --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_8bit.d @@ -0,0 +1,15 @@ +../bld/ssd1306_8bit.o: ssd1306_8bit.c ssd1306_8bit.h nano_gfx_types.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h ssd1306_generic.h intf/ssd1306_interface.h \ + ssd1306_hal/io.h intf/spi/ssd1306_spi.h lcd/ssd1331_commands.h \ + lcd/lcd_common.h diff --git a/lib/libssd1306/bld/ssd1306_8bit.o b/lib/libssd1306/bld/ssd1306_8bit.o new file mode 100644 index 0000000000000000000000000000000000000000..b8d6660cf25a6e59a5da6496e7828c8fafd5967f GIT binary patch literal 62976 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_console.d b/lib/libssd1306/bld/ssd1306_console.d new file mode 100644 index 0000000..7b79d10 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_console.d @@ -0,0 +1,20 @@ +../bld/ssd1306_console.o: ssd1306_console.cpp ssd1306_console.h ssd1306.h \ + nano_gfx_types.h ssd1306_hal/io.h ssd1306_hal/UserSettings.h \ + ssd1306_hal/avr/io.h /usr/avr/include/avr/io.h \ + /usr/avr/include/avr/sfr_defs.h /usr/avr/include/inttypes.h \ + /usr/lib/gcc/avr/12.2.0/include/stdint.h /usr/avr/include/stdint.h \ + /usr/avr/include/avr/iom328p.h /usr/avr/include/avr/portpins.h \ + /usr/avr/include/avr/common.h /usr/avr/include/avr/version.h \ + /usr/avr/include/avr/fuse.h /usr/avr/include/avr/lock.h \ + /usr/avr/include/avr/interrupt.h /usr/avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/12.2.0/include/stddef.h /usr/avr/include/avr/sleep.h \ + /usr/avr/include/avr/eeprom.h /usr/avr/include/util/delay.h \ + /usr/avr/include/util/delay_basic.h /usr/avr/include/math.h \ + /usr/avr/include/stdlib.h /usr/avr/include/string.h ssd1306_generic.h \ + ssd1306_1bit.h ssd1306_8bit.h ssd1306_16bit.h ssd1306_fonts.h \ + lcd/lcd_common.h ssd1306_hal/io.h lcd/oled_ssd1306.h lcd/oled_ssd1325.h \ + lcd/lcd_common.h lcd/oled_ssd1327.h lcd/oled_ssd1331.h \ + lcd/oled_ssd1351.h lcd/oled_sh1106.h lcd/lcd_pcd8544.h lcd/lcd_il9163.h \ + lcd/lcd_ili9341.h lcd/composite_video.h lcd/oled_template.h \ + ssd1306_hal/Print_internal.h /usr/avr/include/stdio.h \ + /usr/lib/gcc/avr/12.2.0/include/stdarg.h diff --git a/lib/libssd1306/bld/ssd1306_console.o b/lib/libssd1306/bld/ssd1306_console.o new file mode 100644 index 0000000000000000000000000000000000000000..2d26c39777148f9d517b1e1f2b55b73c2e96bdd9 GIT binary patch literal 15248 zcmbVS36xw_nZB>Kbf?#JXWyy<*^^$X*MvZp?yS&|n9j;psZ>{Y7wN8QswzOjk_1F# zQ$iCLKu`m2h&rN11sO&hMh+v(FruR#$Z?x-!4pwj28H>)d;eQ?yAqu_bNjq^zwiJ5 z``zW;_wIYQ>(IKM^`7S`n>^L4icG1pPNi;!vrPvqRI}7fRWlkMePQ&qQT3vFvF7gY zoOt!b)TTR|z2Dc~trU;LC+|90bC>;l?dS_f!$)h5mK}>6g%8JFIBuMAw4A(|c*^KF zb!vLEcj`z}^*u_xf7OS^d8eNAGO<IO$t#b{I<g0GBRFn4dDXFjW49gie!uw0rXy5i z#G)g&A6Zz_x}Y^&&_^Th8by6Lj-Wm2Dcd^MT8uh6%SKU$ExWbmNSiu!c-z9J=97gu z-NItTVI4tkBM!G64YJhHa;vuoT5R#CZt=ZnaRh8Nj>9KelKoXrsi%ndoE$mHQL6-g z&ilH@d~-;tpz;D7_-Q;%=czRLJ%lNxqkK0^UI|>&fRo=VqkXzBm`dlxeR%RNdVJ&P z@dtt?Gpx+8GR?G_|CK2^yiBthI@qZ!(5=;ikH9grJP>58dL4(4Ah^4Vtq^jtCZ6$J zqKVItOEvME1_m$le->rRD}q<B>{iUfS%WILZwh5aYDgCdn9{?V1Pw`R5;7z+k)_8O za-}BaD!3dnx;Md`|IfhX!Qj=Deh9H9^cpQ9<bWp9?1P#}v#-^Pw%OPD6A<v5z*-JO zD^-8W77&=Tr?Cva46|-bXr=!ILUqCQ46i_2+=8afp<e$fgq2SW?Pky?5Tx52x}=sh z3Aw!XUSi{kYhnf~l&yRmRx>`KgO#5^SeXesT=^WpctdWfJPA-~$osUX+K^+FrvPdV zd8ktPm8w%^6!lnV@uY%mTp2|@Jqv<QkyF>>W$}6tu7WSpNJ-&8Bd4mz0Z_p=aW(_= zuzw2hc$Nx%W^xcA8hbP9Sh2w~9XxBwPE=FH_;KUB&~9oLny6;eUbd=Q`^(~9^?T`O zLrYI=teU{^^6MX95F73hsUYV}Si9~WPxIHTh^e>iZm;@>)>NWvB*%Z{*VeBh6dM0{ zIU6yDcqKZ17J;`@-{0P380O=sqsQsY**fT5CaBW}pnZRWcnyQ+@)5FwrLs89V|+J2 z{WWUmVh&3E0kyM}K+R_bx8h)`#o^umJFo?$EMn8bjY2p)suG8{t@;<RO&sJYhEoMA zv}qE-8nh=A8XWafqn_6s3iXeA14KqZ@fxW`4D{ycC)c&aNEe|J@BTOOcv_qogmXT} z$fjz7wbgn)iERmUZ+(rvr|<A4lYR)t7oniTmrigMw0|P}AGZG1Nv@y0Q@l_b@QNBl z(-iu6-9z3WJ2I90IQTQrg3WhCY@A@P(I&n29lgpFj<axR&!`t4^?Zj>dZ`^+N^u;# z`^OAr1qaur3J$kTrwy|IxYuth1nxti7gU?-@pPzC{_1loR#Ysn*i^r)0*|h_s-j|L zg&*S+nC$p4jcQcI93KmXHYwlK8_>mZ3lT9BrOGCG9vtQMUPXmgo8zUcX&K+<Xsnuc zE>^FKpo-S}rkv=)m{o36*L#N$SJmjPnx<P4TwZbRG#0JaMdx^?ZBn3SzHWAHz*{+I zoNmrJb3%x)^-U<~z!ow>b?j;zYOW6|f7v-!5z~_`naP`M(njxk??!JLn=-k=o8Z-j z*n}xG(>B!r+NMqL=2h2M_`@^8+ow$MYSD}7GG@3)GghF#SOs|rW?^j0+_9bAsHBq^ zZVpA*X)VUzG&kZ#(TL}O&+}Is?^$k<bae}K`s&%Pv(MzfE#K&EsPC(fR4`^92B6xE z#e8FDPghSps0Vz3^~zW;oaII9w|Zags$kTvirp1EwaTKgHEpVQMHcHZmI)<7OWaA| z!@ODA2<3FOEr+rCPaHw>hzG(H<0+v0@{|bpYXir<!3Xg^s-FmzhADYlmFS2!7>Kla z@j%-$?GG$_-si<3q|4NZ7L~1j9ZJ;A@b=o6a&ORe`)u{TGO5t@2ILkF1jgC8ag6JK z(2W`w>KpZvqh3J!`W{qE;l&b$RJ>*RWMkr!mPt3*K)hrZhep2&Ja1kcYBecSbMWBc z&<!BY=Xq~oF~eIt1#tj`@w7QT`Mj{N26wKTbR%@rAStQXMr%R4gPt;PTK+j+$gj%z zI0=UQUin0Ta=))UfP9+ul+#lNORcqd{zVKy$y%7lhy1&BiM7_>1`j31Bd<h$f${|y zU5zdoL@#QbsjH6Ka=Hy62z%w`%!W-L;~fvn6l+<8Kq^h~A1bdiia}lBSvG<#@xilD z@=3@cUF>b8jYKam)vnX~z1YS~LuuBhM}%Y5VLcmM4=bpWQJiTbP{ya5GN)iMWpL); zR?*Lr1<g&O36CC+;Dl05U54GWn#ET5^vKS3>l#zbtb&L2@**`^%M7S+G<7d=$<RE^ z!{VHI3BDkj#EUc47SflFV-xcG&3u9^BkaXO9b;6!r|i^2b?k#yAh0D&XCQ)diOha{ z`$XG%*Qc&Y_N~vP^PAHB88wnk4ac(wV)^*qp`^;C4klxHl}jcv>As@5r+aN|+wLvv zV!gd<qpht`H4-04=2ZT`NKy?Y`u5|i3Z;fJ>4Ato?N8@Y1L<U6gr8fvk$57N9&p^+ zY6232@vMq=_Od-2lkvV}b}Q=6_NhXZTe{aSYj0~a#aS}ij4ETpnLf6ZRYyAj@`I_I z+HleKNcWN@(P$*v(%9129BCL%H}nt1bA#taf%`K1(aG~#TY%Zl1~GKB!7!ZIe_s5m zY<r|(Akwfo7iq}l`_4;fv4;Ns{pmzLl}R^XWSGO<-xtrv9X_U}bfzJ<FE!GzcR$4X z!Ls>$%Ah1hJ)1~2BnKOEBgq7n;7?wYNRDV_4rq)ci%!KZz6cjA*B5PV?&wCXnW5zJ zTr%IiKby;B*IjXiinivAH>OLeu>+sX>tRy8-56zkwNJk~r;q%=(1DRbm5cS;d7`dP z_2mcE*mhu!r2Aqch#AU7m2E|0C>hW8CbG$7+6`D%2pB-?(U`7OemFj&_GU6eZd`2d z{{H@CHmdrPi6M@`!u0;3p^<!ckxD18$;UYDl&-@}2Xp-j;)S7EhJi>WFhdG1GdzV! z)xEuU+vW=uXJ0JE+kl=6H?Lh6yJ+*)3)l1%xt{UO9kK4s7j9XzO)W2urJ09vr3wSD zC$t{I7;h$YF`v&2_a@@$o>V%i;<-dB70dMZqpgL;0r%$P*}RS@45hi=JF}^LGFu2u z=u5w=gzqkJ^b@nDC3;4cLET|J!K4L+0qNZsjW&1STI6GUhcbzM#rsbNfG#ud3U%oV z(WRp~ymCjDJYU>t(s8B<-L7TUU8Qg3WtjA~>6j{~k4j%Qezi=V!DMP+uox~^Jle57 zn;G7o?=Q|dJj;0JG$uwyRMTK)IN5}UTQ=UbC7Zbdw{xxu&c23xGM8^kjKJ13l-kQf z8uI@uvp<(@!sDbVl}-%p$3$$Rfx-icgm#!GRKah1Js2P21uBe!+jtu@#+L8HBd`%S zY`(8A*$<G);FON1GqHjGYxI*O2LrEAA~QUkNi$X+8q4;kbWx$vv2-ArPG(aH#B+dR zQV3LS=<YrzvJg+(Me?A<3d0w-caZRYa%gU4#K%w0g~c}}{pq@<+JBdCO?BX?e@%7p z{=k~*&_{yZ)fHV;c*E15loC%Zm%A^6R#LyJ2??m*zGLmo{bP1*$<6Dgjq$_6?-Oni zn)KUuxDj%mrO;adyvpJDq;=A7-#Hho*oM;j18S2K%@^G*C45^6r(bX0XuF9ojzK_O z0y{s=O$sQ!vFmSaZ3w7T2_FHEXdh1j#l5`<p-usH1M<1T=)W1b&Ea<dFLU^43BM1V zV_;H19S7KGDfAuz-r?}afG>9V<0bs*68;?c9vmhG)XM<<mO}rBCHyBP{8!){1Cs*k zcK|Mb3p_7g_TP_-`5uQ?fMfe!Qb5(0@EPFuSU1X_4gLX#F9E;b;jQ3baQKQ6-VOd0 z$A3Wy?*)I-@n2HHx$F8($G;E!6^G|a__g3aaQrucpLF=`;6HWvXbHa${O6AUcnN<5 z{FjdZG4MAW{y6xb9R73(e-8XFj{jwF9}bgn{eeRc|49k|6?mEB|6K`x3%t_t`|*fy zIk#P1UJpLeiJt*J-Qj1K@Fn2$9e-;HUje?%@ppr-clZ``^!yTTKax3L-Q>sD`~@gq zOretJO-S{Y_%A8p3Gkw7NbM`(xe|VD31@q23k}fw5e4SQ=lo5GFQ&4R_LZsIOZ=nY zMN^r&52V<>GIhL!KLTD{Cyc(!i*<87C_ZUv_m5d^$gA9N@R|~?_rVJ`zp5`_0<*dl zO@1|5_t(9CrQ=2JwwJt^rmDx#Klgcj0^EIGJPsZy6bPt)1m`o}q=5Qo@VS;^B%cL$ z@89o$yYu}eaQFWCF1S0Ne*oU>%uoJ9!+pN<9~i|{srV0!;(9hg{bh{5USX%hNg*`> z+?`KT$M7l@1~2MWsrlf=`4LhLB^>)0WAs*lFD}$rrMkcuIvjfkW8$}fyZSr9iz%Qk z2Y0V;5`1MLph^vacQ`x;e!0UBf?w+JBjE1!y#?IWzY~1KiN6PY$l>>ayU*8;fxFlD zli)Wx@t*@f?C>vxyU*VzO3FVC?yeutg1gVJ7s2-w^aAP?@M3!d>PO)2`ubz=Vk%R= z0C(?)Q{e9}1XQU%g5U1&x4|EEcn}xslMb&0=R1T+RjMBR1xs<iPX~AFn*&}<A+>M} z52!})lZAkQY6ExIrxj!3%T(7GUi$pe|2-+F`SE7AMdEqQ>oD{7Ipuj@TwB6#DdD3f z{LvErbP0dCg#WyRzg5C(olRA?=WOA`by$y9mH2y0c)xItIsS913Lhoz*G(+eyCt?U z7E>DZ7_fES1`YDVBe869K;whSY(_|9PbSgWta|Wp(lBbW7L&D_tj%QYChIU+r^%L? zY`Mvz&60~wRD`0U6cwqcXhlUVDr!-Yi;7;0=(X5(iC&B7wTNDe=(UJmi|Dn8UW@3p ziXL|5baz{AM@6qy^jbx)RrFd#uT}I~MXyct+C;BS^xEvmiC&xNwTWJv=(UMno9MNR zUc2bEi(b3vwToW6=(USpyXduxUc2aZh+c>2b%<Vv=yix*hv;>PUWe#)h+c>2b&6i6 z=yi%-r|5NxUZ?1Fie4x67)w86qdqF|pog`v20eYEJ_bhV>q}x!Fc#mtH=DeQHTP`Q zVa7a!Eg~A%cj?}(U#GL4-fgU7$M#-kU7Pd_?CLVvI-Mbe%|nRJdh}%5(WB=c#I)u* zogtD8k-GNYZEO@6v#u`ot!o|6h+~`KVb;~f{&cP586I{Q9-Z~*2B0oeGb2DKu|p5d zjvnKn1x=wE`o#=FI&6EdRLF6IEHn7D()L~>sP7Kw>X07Y13hjqnO5lA%8Vj6^qT+P zE|}f^C~T%Vd!5$j?!o-+t);QsnYOIaEpEy=n^rdDjGJ3$-UsBCs@Y{b!*+0C_sj~9 z*@2aPox;}LvNLVKjone!YasuD%fwa6FR#9nfqk-oPX`Ws!R&v`7K}`tL;MfM&Uc@{ z7tK3-mtZW>>U?69Wx5E5)!7E@yOLI=cHyv???iQv(W+D*4qsM7{jO8@C4;X*7WlHk z2L<!h^xZgoIb-L3hOPH~z;*I+^?+mlxL}t3jDtVt#IQ<#9w(%);;`+1LNM)55n~+q ziu)~MY1_92Q~yN=|GN|O3UJ*CoREHmgJa00_s2MV`*A}0H4dwJN-#D5fWybZK;pZf z)p;A(wkLo<A2)-L_<mo<P9RkSTg^Jb$kbGveAnm@6>;oy1=F+8!AqT(4q)E_Q}!I% zWlUBQ+qnT;_car<k@1^xfb!ed&x?uFLoC;wypEekNPPdV<G>?vj4b9mg?BBj=7&$- z6=pA^4&2+P&G;fScp`GnXYV>=Ka2Q!gBKB_EZ;jD1%C_`tr5(3{tE^3x?LjpXK3$U z!A~LQ-W+xKFXIuxN09R}(9T#^PdpF#ZGvAwJnN?YQQ!{<=DY2Ef_EY3?Zg<`IF!V_ z$e$6s0%iH`OZ!VGds6Uw(Ei^D=8ww$DwtpI6VM07GtCyvzAh2W?-}l2Fotih>jW<a z-X)kn$r%v59`PfB*`DhKvpu&7=2ZEh;6;deSTOf$xPQdD?t%Rqg5L$rX9PDv=U)YX z9y<RfcoOX27kn=4uL=&JEUyzaKaKnkf}ceUHnFvRHez_q7}E&M9|96z2F)3Qzl+$p zf;r|<!R+Ho!R#aVXIOR~@GimpMo$Xff;=nu!^jT_z7qKzg0Dtd`l#~;>czi~HU0x^ zb%I|-&UQ2AN#u(KKaadaa1-MBy~~&%0$(inGT^;}pF~}^3cdmMhXj8g_OA;*ADG{9 z)EPzoy5LX4{%65!P}T>|nAOPf?|+TIg!V5G%)JPHPci0Z<U0kwhVkTgj&}n9(jnl; zA%kyoV(unBZ0sK(K4S2L#5WrJ5b;e0e+oGAZiBx``^^SFL;N0tpCi7-;9nBI*Wlk1 zqn)2Z|M*Qr{7YazzGu8!P0Tpp$ZZDCq+LE#Bg9;Yknl?+UG_KVdlT`U#@<TI1qx}I z#7u<#24X%8kS+j@+-2}KiMbjvmlGc~_PxY+8$3WfYVbbb$UO$<X-E6VqaQaAA2aqF ziTSWWx`p_I2H!>eA%pKF{;<KviSIS|F=9T5kp6}EeuGaEf5hPbCPuxS18);^5k~Ui z!4rAV;3{D6qXthP{+Pkji9c@eY~tevFCc!%;3dQl8{AC%34<pf^JG(C39(#L{-4MD zl!=KEOZ%@R{<N{*MEn_pIrQEm2J_v(Vy@#Bqgv&C*2L5j%iQ34W9P<H+GTFfq+RBA zgmxK|xwP9cq21B3W%c?c@n<mxYurZU^96HlSuB{-Os{2#c@(%s>|8had}P^gAYUW+ zCFJV`{|xyBg1K&N5&TEw+Xepx`Ne{(aDDZ7LX&&tePUk(oD$46BrTY0K3_Gw3Y?HW zi+jV{YVaGxmm17#5w0?rw^Nt{jKpaj=0!&0R10&#N8;rV*K4S_HiUT*kWSzTPts8L zIn0*=q-Su1xu_w%fFsNch4eif;b|JG*N8drNWa1no}r<7lX#}VZxhclcpUl`o^5a~ zaoFI=#1VsM63;Ps9x*Q_QX}!%26qy3QXs7&o@ej|VqS2hEyN29-c7vF;5hLjgHyzu z6i8PRFERKaF&A+p{!b{}VDKHpoH$6wh?@+4fVkP<PZCEB{yZ@!7t&XWTMhmv;x>by zC2lvE>vg!p;2#io8qELegqIooYvSbwze#+K!G9%QVXz<bB+QA7#PvFSp23rdR~kHv zc$LBPiB}ukNW8}2PU0?uR}*&|yoq?N!JCQK8O$|3%o_zMPQ1b36fti`B(Cq_O$J{} ze7?c&CcePnJBfP?K1O_@!4D8$Wbns{hYbE2@iv3MNz5A&={e#Z2ER<a(_pUm;avv* zlz6wn|3y4(@Y}?f8_f5lFmGa{D&jpFs>#H0gJ%-&H8?`d8ybnXjhE3-|A^D8G&q7R z!iNVEhtkGym^{8jA#n&Ie2^fqdp3qm_b#K=?3YIp2CK&0fnofL4S7Cm@<EI8`0<cx z<PWw~BYxJQ8nelvcq6Tif9J<CW1>#`Ay(nb`|pR1{kk@>#cc{S%GnQ+cFA5)CNY%C z<!xgnE*nqtmv^pCHa&29Aa|0iI7Y!jnq!*tw;)OUn$A_~&&G$7GMfLVjE_9rdgiyp z$mO;!l%<bp4h~{W4W0g093NR_IR3XdK4MDiE&gxB_*l_W9044waWDl?!ACK-`PinN z2d5-&4Oj0*5Lr^-De7@4a`hg<vy^k3dLi*q?*<&M-rXSVmre9B9l+u0JpnzIryk>N z`}o>n%K)l-L3&xCB<p(^+|~Ow+lM&njTayFzk<V-0aUM#!*?de#U|@}76yyyyAC2; z>uj>VZ^7W!dlGBI5NxcM%e3vstH8Dlpc<%9N|p}Ng6}_oT|I30>1P1-YQ)EWyn(~j z`ylipu-RmNufyQ#eH40gVWS>j7i{~uM%ywls}s<hXD1`L_3{5auHLtxcLxmA<7<Z1 zs~0`n#~)Rr&2&nl9uNI}joijP4-u~0HrY772N2u11$cL1eKy&+b0yB&&qdrGOOV?p z@Lhs<wfMGREw<N<^V;@<y3X`a_e1X_#)kL*=OwNdc{vVexYTuX%=ZJ#I#Gv-WA4U1 MfqFMtCwvzE4<p`}L;wH) literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_fonts.d b/lib/libssd1306/bld/ssd1306_fonts.d new file mode 100644 index 0000000..c27dfbe --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_fonts.d @@ -0,0 +1,13 @@ +../bld/ssd1306_fonts.o: ssd1306_fonts.c ssd1306_fonts.h ssd1306_hal/io.h \ + ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h nano_gfx_types.h diff --git a/lib/libssd1306/bld/ssd1306_fonts.o b/lib/libssd1306/bld/ssd1306_fonts.o new file mode 100644 index 0000000000000000000000000000000000000000..ae5f3b43f71b27082b53dcaf8c703b1d7501f6d1 GIT binary patch literal 16688 zcmeHOe|%fjbwBsLC+W!+mYjq{NnGpMaTA9oj+_Kn1jmxWA$AtPX$b|&YCDdT7#v5~ z4)LfPy%<QnE`==6HZVS|VOeV!V_DaBl&(}HX_{^nXg_N|?Ut>A(l*^#s}u$TRC(WX z-+QtwC(tss&;ICj?z`vLJ@?#m?>*-}NlC2Rc!dyxoFeFhG=&je*GP0Hn5(5gErqC( zloB7&gB?UlDQQ{>`CKJ57u9f=&@$npI<1r%TpC^KDWNviOIK@N`jAVf8&#b;G&gl? z8f{nIbQAgvq1}Ueo2t>rTt51^tCap!@z6brk3OTg=|1%T9QuC&y1tBh9QC`<|09g` zQ`EDlzj2ocFY1M;ReFi2clpGnt`f0MD-l<s{Sa!GS|YZi?gYFCbsuCuiS{$752F4h z>X%W!f%<LDE57S475@tO=cs2<-*lBIE>yo(qRc~Eg?1@wJ?bUEFGsx+@Mcem(yjTF zn*k4^eiZd~@II-QDEFY=2mC?Qhe7*W)UN~nChB)kzYqM!sK0P|m6u(m%5St1)rEQi z>V>WnHRSTCOEsU0`Ke8TgXBpa4F*W4B9^|cHK?eHq6AWg@f@i_D6Q9};;kgW71Zd@ zOzcQ%E|*8wN!Qc*EBD^3WdwIn#f}|uY=BfC1yv+sC`r>a8<*7tA*x4eBZiSN42UX9 z&FW>#maQgTOA)2WkKRgrIHPBXJmiVRh;*OcINUl6eNdNzItmP%v7@K3Re-31v3P5e zG4#Fex=aC&4#IE^TO;|^`%^4Iq*C(n`=8IlPu%xH9{$>WFQ~T6u_q3{pxE%YzW%wX zzDLJ0t*x!h;hCm0x*iZ}S(%{MH?+1&TBdbF8}sOmwhb2LjSa0Eq$i2Q8*ITF0uNGN zSEN0pC>e+|DVAx~A5XIyRb&=+jlKz*s;1|c1k-|P>0rrx8(QF9U_%SN3tpDoUoX%X z{8~arGHJj>k=9Q|DpD@!6O<7OSAZGJ*oG9LSkM~^DQ`%w9!{?GN^3F)({UI;X?;h= zRAHt%eq<uW#*L3pylAzLN}L`&GVzi$dtzezjLs~2?2*SL&ln$1jgKeU1`M9;Gz?K% zrX-I{BqcsRal&dJmH4TN@l!ezh_o|o#TktqLoZpb(o;GU&F8KgK7+lc3VNxg79)e0 zs;QOZrHoo>Tgq4_aa#f=ovAf!+hVcy_89ylDA}2cCxu5<MM~4H{-j&|$tUqMI@!HC zlllpRydL;6)|vA2K0igLY9$5cDJ2M90jPC*5x%@M7a^t+b+M<ER-<k7dg&^(*MirH zdK2mpWKEBk?gD%m^&!+pA@e1)Pokaz?+2(aLN4ttrL4;<+`3oH^_GfSw^yw8c*SL) zZA85m^lfP42sOiKN6~&l^@@WCI}ZRp0@*L3eFF6u>OY`<4|1oW=M3O9YDV)aq?IZ< z+5kev0)&hjPpPsJ_!_`1Xg9jO%5|V^Lpy-F7qtDTcX_-D#!)^`sT()OOℜwx;IA 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 X4?9i+&jE3Zo+ft+^F3HFfFt+cUP&|e literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_generic.d b/lib/libssd1306/bld/ssd1306_generic.d new file mode 100644 index 0000000..622dde2 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_generic.d @@ -0,0 +1,21 @@ +../bld/ssd1306_generic.o: ssd1306_generic.c ssd1306.h nano_gfx_types.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h ssd1306_generic.h ssd1306_1bit.h \ + ssd1306_8bit.h ssd1306_16bit.h ssd1306_fonts.h lcd/lcd_common.h \ + ssd1306_hal/io.h lcd/oled_ssd1306.h lcd/oled_ssd1325.h lcd/lcd_common.h \ + lcd/oled_ssd1327.h lcd/oled_ssd1331.h lcd/oled_ssd1351.h \ + lcd/oled_sh1106.h lcd/lcd_pcd8544.h lcd/lcd_il9163.h lcd/lcd_ili9341.h \ + lcd/composite_video.h lcd/oled_template.h intf/i2c/ssd1306_i2c.h \ + intf/i2c/ssd1306_i2c_conf.h intf/i2c/ssd1306_i2c_embedded.h \ + intf/i2c/ssd1306_i2c_twi.h intf/spi/ssd1306_spi.h \ + intf/ssd1306_interface.h diff --git a/lib/libssd1306/bld/ssd1306_generic.o b/lib/libssd1306/bld/ssd1306_generic.o new file mode 100644 index 0000000000000000000000000000000000000000..e716c3b2f43f79b40d1d54d6416736bec91b1e8c GIT binary patch literal 64856 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 V$V5%J4V$RCF3UHNE5jKS_douQ!_5Ey literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_hal/arduino/platform.d b/lib/libssd1306/bld/ssd1306_hal/arduino/platform.d new file mode 100644 index 0000000..7062b72 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_hal/arduino/platform.d @@ -0,0 +1,16 @@ +../bld/ssd1306_hal/arduino/platform.o: ssd1306_hal/arduino/platform.cpp \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h intf/ssd1306_interface.h \ + intf/i2c/ssd1306_i2c.h intf/i2c/ssd1306_i2c_conf.h \ + intf/i2c/ssd1306_i2c_embedded.h intf/i2c/ssd1306_i2c_twi.h \ + intf/spi/ssd1306_spi.h lcd/lcd_common.h diff --git a/lib/libssd1306/bld/ssd1306_hal/arduino/platform.o b/lib/libssd1306/bld/ssd1306_hal/arduino/platform.o new file mode 100644 index 0000000000000000000000000000000000000000..57986e1c6d40480822b6c0c3ae09975605720a06 GIT binary patch literal 2292 zcmbVNPjA#l6o0c$XwX7P08s>oH7IQpfxX!PIka60q%^IFAOdmdrN(Q|?i#$dWqT>m zLr;}Jy>e|oK+iq!9k})z^b>II0e){hvumfVsQRRt_j~{6&l~&4n|oggA;^%Rdo-7b z_6`yK1mk7puuiMALPOw15(}(q@pOhKLqZ^gNQfn7R%<azN)oLPlyYIQVwJR1NlRK% z3Du-?kXWO3`)b=-Mxj;l(ejD5)j8W)`4D-v1w|G<BX*#Z7-~7Ba&RF<J<N;HZGg9g z_-pwn7N@q1jRJJ4AZ6{ej;Y;?PzG`NG?VMeG>)?}-=JwyM59E8Ht#1+labxfXk#$; z^U4~g(?KjN{CD?R>^y+;?%uv{?_9Xh>)E|6cgx+hok`*hW4{>pd%#uB{-rHo&gp2y z_GKt0!L;u`&ac?c$ad}&wo{a0KTye>;c%J+Wt1jPAr*&t82Y7OlN*(i)F~cCnKPIo z*$`4*mQjUdGEDP8I&$n3nG84+?D9z<Gp<n3d`oKIysx4NdzUu1y|Ev6{XCpTN!ra~ zzeJ{q8)O-E$LU0N(<IFO?tY#=#43w!8q3frWl?s647zR{4S48e|10Jn7DA1M(C*I8 zr}jE7Vng47YNGm7e;*6<=55_(HC_+;RJWw@v7q5*y=oMQM>|u$CfmSY)MRelIlXy% z1;Ts{2kSSR-y-!IXW<s9$5xXM&oBdv+6Uw#bfcj;M0XqVVS3Pz57s|Q%>(wld;8wk zo<|DoRp9Q;T?NWX=H+sv@H3gGT5$J5iB9zV!6289H_6Cxl*qXhp)ohH7XI*vm1<F_ zP67x1J@|3P$143Pjn9Ge=S!?sdY0LrKN{;AKLFp>m~-%5u}=d2rN$lbTN+=-<?tD? z&o|)TYRqxpX$(eE<ImyGw<I_@=sX6m^FH{;8ovPNy|MlmaB_>MlhPl6mwCm<29@$j zNiM%`a`9Nm&1LMn)d}($!B#uXhS|^kWF(s*e8?sQB@AS>r{o}=Oe7xpf2Ff<#Fl5B zS^Zn)(QIQnhr!rl0rYQvpTNd<{ysmxQ<ED|<$K6Lld)Zd%w2p<>;Hi8J20+O>DhJ! zL-hf;p<e+UBY>NH`!&qw*BGZ6Xfl4>KlQrL@q6StT$f+1sT%^D7(n_HgTD!ejLn0h zp6?~{twG26_|=<y88F9ie=(hgaK|Kp%#g<qnj60new@ESXUO>d3<YE3w~C87VVtzh v_#(xO*5G#y27aO^F?f9|7`#?<w}2GFkTB51xtRC~*Zp2$zb}=gnvCB&;E6rx literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_hal/avr/platform.d b/lib/libssd1306/bld/ssd1306_hal/avr/platform.d new file mode 100644 index 0000000..60db732 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_hal/avr/platform.d @@ -0,0 +1,13 @@ +../bld/ssd1306_hal/avr/platform.o: ssd1306_hal/avr/platform.c \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h diff --git a/lib/libssd1306/bld/ssd1306_hal/avr/platform.o b/lib/libssd1306/bld/ssd1306_hal/avr/platform.o new file mode 100644 index 0000000000000000000000000000000000000000..53f2b0f23021df3d96784f371dd0e4ae54013571 GIT binary patch literal 11416 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_hal/energia/platform.d b/lib/libssd1306/bld/ssd1306_hal/energia/platform.d new file mode 100644 index 0000000..9e507c0 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_hal/energia/platform.d @@ -0,0 +1,13 @@ +../bld/ssd1306_hal/energia/platform.o: ssd1306_hal/energia/platform.cpp \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h diff --git a/lib/libssd1306/bld/ssd1306_hal/energia/platform.o b/lib/libssd1306/bld/ssd1306_hal/energia/platform.o new file mode 100644 index 0000000000000000000000000000000000000000..9500e5d7674fbbf1b4d0a5c1c9e02efc9e71cfb3 GIT binary patch literal 2292 zcmbVN&5qPY5Uw8Yl0^f{Za@hNhcVG6?26d4v%nr810)OCNLj%O!hs8p$L^Uicx=n| z5J(Q3kP>m_nmj<xIpiI3<qdcO&K$^B?d}<SAxcC^?fR<f>#F{#o_TV8?;9Zm84+}w z<`&W3A)==Uo>zo*TBQ{l0xyzSU{{MjpYX?s5ST(F#1bp3wHPHOiPi_oxv*HN%37+d zC2gsM>Z5azSfh6Pa@$%)p;htO^6|FSIn`PD7<qLBMHVg*6X*nnS`MikTu4a|-$nQ~ zpj$$`UOtM&sV!rp0G(=*igsGZ)b2$ngSdR0$@OF!$61+g&@?HcQ6fW|_Y<ed$ZmLa zFc|xJ6@8mB<IhR6TwyvL#FBPz+_87gp6&JQ-j=)NZraWyafY#9jQc&{iq${21<d&! z?btpK$0V5c{fGGl+Zox;&BAtyGVBK`nKK+tlc0>!#3`iG2oFQQ^lNsbQj$8wgD7(b zQzRS0%F8mUkW7YY9!N)yog$L~XF^;)3S`C=3Yu?EodNH$D8k;k&24Y&$6cAod=&ZJ zEcQ!enz%uhQFok9WH(L1-0$w^>3yuS=%%p@ol+KMH^|`Y#?gR>PWE1N-mwsBEQEG< zb}riMxQGpX2datcpZfb)pjU6|F{|-<(5Jd34ab6qoAt7BU_RQJ`Ze1IzEZQfap&^t z%>@|qH5{zpY<`Q>Yn)BDNIkZieRzf$SkyjXAEB=so<nr2VIQU+8ur2ZN2z(ho_BlS z`_}VFfxQacy1uJGImx_Sjuie$=BYN^y-=bPJ%2FB<-<)fb{r*gZbfL!O{|4~c*IJz zC{!nb1OE~FL&nD{|3@01hUT9yv0C}rW<LLDtZV!|^tQ&FgYSwt1L$iScc8!1_$yov zpAmDIdspKJ(DyWkBB}A0;PWjBP7e7LgV%Wn`g4tch337n|2JrIi^r4FA3&FRrN;)9 z@=-}Hzix8zSjf#~?7P(o@);pkJIzMe&;4X1n^X9Z%@mX{klmiLgLE>Hc;x?APJxIm z&pNaEZ<){L7|Ur4#ugipf8(7&jPLxvczmZOH=xRQpMe$=`vNw1@m1}A0pm|#T&MDL z><EVH185_^131QjHu?5zn8SZ#oMfQI@VI~Kb$`L%BiG@&{Ax|z5ZKHCq?Z`{n_$Gm zJUHt4o+IBHe4LM8y~&pW^BnFkmXk1Unk29p^7vV6!yC1T{(#Sj;XQ+cvEi-aVvZY< xju|de%w!F`s|fHDJ%PdNTfyM9n!5$05P^h&7S6@OPq@ze3;TVpBGt$6{sG~sJ;VS2 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_hal/linux/platform.d b/lib/libssd1306/bld/ssd1306_hal/linux/platform.d new file mode 100644 index 0000000..642c222 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_hal/linux/platform.d @@ -0,0 +1 @@ +../bld/ssd1306_hal/linux/platform.o: ssd1306_hal/linux/platform.c diff --git a/lib/libssd1306/bld/ssd1306_hal/linux/platform.o b/lib/libssd1306/bld/ssd1306_hal/linux/platform.o new file mode 100644 index 0000000000000000000000000000000000000000..970a36e74b6a27e5e6d43128ce81b7fb4dc8720d GIT binary patch literal 1124 zcmah|&5qMB5T4TIAE8|#P9PLcED}kYc3G{E0!Y<T4l5{B+>oL)aoR!>N3pXiTsZLz zyaaE;OYjPPg7P`FH)$on(qz7G=JVJdJKs*vUUfPhGNVHiY8cVaOGMw1JgNnUbdzq- z=*<Uf=y{gcclu7xva{Sy(ooEOPhoD0&x^vIRx_}eSJRaFgFbM|^O>y!$43ZcQRRo{ z<x|Us^sTULA!C1*S14^KNtH)(!E;-%+9RFBp$yv`Yq4d-3Z)YyMC=WE$H6>I-E@&x zOSecvneZ}mB68<EV=m9*GIYl!|AeB#<tdA8$%J&H0x`^*D$|9CM#JGV>k!9%tj}t? z)cAI<_Gq<kGDO|2PAZOOwni6`Tj0+xVypFCV86v50KaJQM;BOu)p~$$vxnXF_qNns zy1c`$?C`5Zt)2zJWE{K>0;<8;2E0EV)j(!NP_kK#zp|2RLXP;7$#4oU%Z;BKB-v7u zqb`vgG#QZLl?1peW-z1%s&G*Ah-Vqg<<?&RMeZS~dSXtudArRF)31kG*VU=N=~U0J z!TzUvqU-5$`kyhZxu+AY>*<tQ_eUeE_pbIhgeh-yzkuJt%uqRH6YY)eK7x0QNau{U s{Q`Rk{zm>f>^4ljmVM35SwU$ZlU^#IhpMH<0j#YXL-(=HY(7T!2ddYe<NyEw literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_hal/mingw/platform.d b/lib/libssd1306/bld/ssd1306_hal/mingw/platform.d new file mode 100644 index 0000000..74d5baa --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_hal/mingw/platform.d @@ -0,0 +1 @@ +../bld/ssd1306_hal/mingw/platform.o: ssd1306_hal/mingw/platform.c diff --git a/lib/libssd1306/bld/ssd1306_hal/mingw/platform.o b/lib/libssd1306/bld/ssd1306_hal/mingw/platform.o new file mode 100644 index 0000000000000000000000000000000000000000..8d7da5dddfb814c3ec8b2c76fed1194845a01613 GIT binary patch literal 1124 zcmah|&5qMB5T4QnmLH)-Xitk!II&1LY1(DALJA;NOF68dP;o=D(!@yvaU8`CEL=G8 z47>zy!b|W9eS$Jh?M+$<7-=%!H}hp|Pn>V3XD@oa9$4$a3|a>8^Af;!EFLw2L%0Fg zVe;yoGxmMQAG$+#;1FJrBoE~x@HG}he#}ZTuTx~PsOLEgMnlB8C{kh)$48jpQ5}Sz zs>cpN>1*i_sp23lYHUrCq%I<riGoPhL@Xz9sKPGCwb*&YO0AP1W$cdz$8-_q9?y#O zvsdP!N<_uo2)u>h%o9aih2FFhAF!$PM9yNOm{eX=V$RF6xpvbCU@{&*aSrjg56xNa zl-k&x)ebCIZ3UpeF-gsFm>uh5<|gu|7rEtXA92v(_Ygnp@CO%IgXL<3&vp;n>+fu+ z`*3-SU)kbU0Xj3IbT*|gDTM}{t-;&VNdpuwX~oh8e`S?01YG%rt8k7{RqMF0NU?JT zuKtMN;*b$Cyd^Zx3T81%E!1h+@JMjZ3bnD<e~|+$>Y3Qnt?zF8hMm`aqwAZ}-*kHB zyXgPZJu>}FJM+(2)_$iGqZ^o#UiU{UYxb`9I7Zje>V6@9gKkaNw9ibmy1SUXV@0NB uwcQ&yz~pbNUqiozu5Zhp;r6UZVGmz=u7NS#OWSSqu5OCD_f2K}u)05aPoCBQ literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_hal/stm32/platform.d b/lib/libssd1306/bld/ssd1306_hal/stm32/platform.d new file mode 100644 index 0000000..cf8be48 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_hal/stm32/platform.d @@ -0,0 +1,13 @@ +../bld/ssd1306_hal/stm32/platform.o: ssd1306_hal/stm32/platform.c \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h diff --git a/lib/libssd1306/bld/ssd1306_hal/stm32/platform.o b/lib/libssd1306/bld/ssd1306_hal/stm32/platform.o new file mode 100644 index 0000000000000000000000000000000000000000..f657f0d886c5ec8976aab75e78293bd3e62922c8 GIT binary patch literal 2192 zcmbVNOK%)S5U$y=gQInvH3<)4!7j)FM=<-a6CaQ^SeRfWEHFtpaABC;>3zUFRx`6v zcu1T$aYaI0Iq@eDe}Nl+fosknh41U>-ko(oAWG_~uO3}h(_J<5_3hKQ9mf$%j@*@{ zB=Y;Z$Tu+F&<=aDEe#2P*Tq?*s>a9jd{}av3xtldLFU%hr%54B?Fp@1Lpa#hN@=5% zHjJbLn(gB3O1*xo?rtH+wsURkO5JVlG#k$#q_HsmRV-bC=*<kSsfXt}bl1Uaj`PRX zB^0Dz6E6qQEH`Ouvvyg(u`^Hd={Qkgixo#{GH$JCjBz*#veNpv%ff%@w1^d^^FgHK z<h>7D$Gu*wx8L4xcUxYZc%vxDC;c9A>gAtJXWn2whE(q8AM67&muD1*H=u}z^L}tY zyV>&K`hMQ>@*?bylQ}|rqtQGW7SlBGa-})UqcA9fs*GIf!BEZUm&>wX{Z_0x&%@q9 z_t2jNQ713rgZ<7d3W`yh#qFVVCTXlXX%c2Z=PXM<MV`EqMk@3Ql^31i47yG<9dMaI z|7*`<MM$LxIXOOly|srUy>8A^Uw-vb?d3Ij_^4`gS2`VyWm?JlxX^4uxMdaC{}gb) zBEJCqMn!&Qfe9WyI>2*T!}<KHP3wxDoJ9mz^k7uviwjKPO8uO?DMu@s3v#w1UzCqm z<n#G2N%eSr|L&Rpj_->GrzN;^`$U5xp81&?Yy5@EQX{laLxt}3gTWwE_q$@{Xqu>{ zG)+cnS2(~<qbvxS#lfsA@F$5cm-?p-<|pPk;_XuZA~F1%;ClwY34UlWn7$|a@C@EE zdggi8V15to82l>uM+TFBV(_2fycLH<fnLI5Z6AQYY%sr%U4y>|mv;VnTm%E~A}jgC zqC!0=q|I5BHU>l5nTmpTd1gEn*ed6@Vh*w(8LQPTJXX5}DJ-Pg*YYrpV})V<ue1Y4 z_N(p0^1Hv>ZF^atKh&-<{gWT(f%p7xe*9qD*bK>d>;+5K_8JuI+9PB53c^poxMr=V zjWf#`wR-^N2Q1!~C2M1ESWMe5SkDp|vNrZiHSaEdUChJ0oKl-N1h#ts<u|OG1ct25 zhg^-<MZ8_;7>`qK<IRA%hy6v`gi!vjN|`pUFAcYTJ2jCXOBemLe&3$+`x$;${>G2~ tFfHg;2uDzIEU#j*z6KU+wRa0B4HzN<LySY>*jD}S;eEf;mhxf!{sN+pA#nfz literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_hal/template/platform.d b/lib/libssd1306/bld/ssd1306_hal/template/platform.d new file mode 100644 index 0000000..8a6f1db --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_hal/template/platform.d @@ -0,0 +1,13 @@ +../bld/ssd1306_hal/template/platform.o: ssd1306_hal/template/platform.c \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h diff --git a/lib/libssd1306/bld/ssd1306_hal/template/platform.o b/lib/libssd1306/bld/ssd1306_hal/template/platform.o new file mode 100644 index 0000000000000000000000000000000000000000..7b559eca43713c4e8eab9f53060b6cc7ad976005 GIT binary patch literal 2200 zcmbVNOK%)S5U$>_gQImEn*<VJ!44=8M`UJq?Zk?ZHdr{pNLa*5$RSe1FuT+HfO)KD zW}^fSxqyVkl?w;%{0k2J2>2P~3{v>2AG<S#C{ar4uCE?lRnuLy`}pSJ$3h6QB<Kz; zB%;5TiN1&NigMVZ4O*uVc$vf!s~Wt$$(to1PB0W=g_+Y>o}?v-#w$v>gmADeX=z1E zD@IZQ&2bVJsM);Ubk>k#L%h3ors=dcTkGc#(pWhDSu9loslyyxQ5X9%beF&zLj1jU z3I(ap#K!@&^dV(!HBPH97PGXNj8Yl7TydPGBe$k8#=$tuwe`O)bN_|YJXVy=`mv;g z&+fYW-LBi+_P70x>m{i-jKgBw>oU%~;_J!O>(54z^oiciHZbS%jAHi+6v<%L3m@cH zT@S9e3fC*js5eSy2<;7rvvg2SveYZ2;xG@Runem*a><7SIc2|s76q%X;;M@x>h5%Q zgK-$QOPNgLu#|1yhgqKZ18R@6M7Fau%ER_io_&Q>MLUaS<dw20+k+`|?Re7XWn#V5 zng6SUDs|Ao{{9E<7B2RZxmDEy^{v{|OZ4Pv)#}tb9t~z%%KA9atU|bM6*&JIaIYf2 z1^i(}zBtDWo;=;bzNq1N{(AE|q$X${!67vu75U^GGjOPROkSnEn&t!@)#Q`(MNK}Q z{}fd(I0)_>1)l@~DR8L4?VAS*l*u&6<w)UgWS$wpKa3>0I0*awTt4WKmE%b&7t$mh zW*y=|7VEkoWF~=`m*B55KCShy8|;F=!FU53=xr?aZ-H+a{1N!B!C>m0*oW`nhS77L zPYveZh1&+d4}Q;J=3g584>-Sy;G#h9U~z4qgTH6+58xexe*q`Ic$Ac3AH2*pA6rz) zhb8$uljLJM$j@aQ`ufiJR$!~#U(FomVLFoaBYds)2vS(c>OjeZEJ-AW`bB9Ij@+-d z6ZP-^;<W8$b^lO1#`G*do(F#C=lSsuw~fsqIUe_dC2PA31$XV9F?<K%S71D|(zA_c zmS@zS0i>U?_`NJy8~29AZ2JxCJOe}4#ywNbdl`RWoQL!Bl-j%zuss7ve_&l@V9446 z$klk)5bpwX9FM2m#+w538SXEpRS5cTOUrEI^{wI7Z?mEAMSE!<_WSXe-|z4{W1Wo6 v#)N53e?r)UfyeSJ7T33q#kJbE1*G#Z#0(5^EG8b?s^5Kl?@!92H|zH=%1tE- literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_menu.d b/lib/libssd1306/bld/ssd1306_menu.d new file mode 100644 index 0000000..4126594 --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_menu.d @@ -0,0 +1,18 @@ +../bld/ssd1306_menu.o: ssd1306_menu.c font6x8.h ssd1306_fonts.h \ + ssd1306_hal/io.h ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h nano_gfx_types.h ssd1306.h ssd1306_generic.h \ + ssd1306_1bit.h ssd1306_8bit.h ssd1306_16bit.h lcd/lcd_common.h \ + ssd1306_hal/io.h lcd/oled_ssd1306.h lcd/oled_ssd1325.h lcd/lcd_common.h \ + lcd/oled_ssd1327.h lcd/oled_ssd1331.h lcd/oled_ssd1351.h \ + lcd/oled_sh1106.h lcd/lcd_pcd8544.h lcd/lcd_il9163.h lcd/lcd_ili9341.h \ + lcd/composite_video.h lcd/oled_template.h diff --git a/lib/libssd1306/bld/ssd1306_menu.o b/lib/libssd1306/bld/ssd1306_menu.o new file mode 100644 index 0000000000000000000000000000000000000000..8303a4f80f570fa1682f78c25c4c9b7563e9d175 GIT binary patch literal 51752 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/bld/ssd1306_uart.d b/lib/libssd1306/bld/ssd1306_uart.d new file mode 100644 index 0000000..8214b7c --- /dev/null +++ b/lib/libssd1306/bld/ssd1306_uart.d @@ -0,0 +1,13 @@ +../bld/ssd1306_uart.o: ssd1306_uart.c ssd1306_uart.h ssd1306_hal/io.h \ + ssd1306_hal/UserSettings.h ssd1306_hal/avr/io.h \ + /usr/avr/include/avr/io.h /usr/avr/include/avr/sfr_defs.h \ + /usr/avr/include/inttypes.h /usr/lib/gcc/avr/12.2.0/include/stdint.h \ + /usr/avr/include/stdint.h /usr/avr/include/avr/iom328p.h \ + /usr/avr/include/avr/portpins.h /usr/avr/include/avr/common.h \ + /usr/avr/include/avr/version.h /usr/avr/include/avr/fuse.h \ + /usr/avr/include/avr/lock.h /usr/avr/include/avr/interrupt.h \ + /usr/avr/include/avr/pgmspace.h /usr/lib/gcc/avr/12.2.0/include/stddef.h \ + /usr/avr/include/avr/sleep.h /usr/avr/include/avr/eeprom.h \ + /usr/avr/include/util/delay.h /usr/avr/include/util/delay_basic.h \ + /usr/avr/include/math.h /usr/avr/include/stdlib.h \ + /usr/avr/include/string.h /usr/avr/include/util/setbaud.h diff --git a/lib/libssd1306/bld/ssd1306_uart.o b/lib/libssd1306/bld/ssd1306_uart.o new file mode 100644 index 0000000000000000000000000000000000000000..dd4a820f1ae1b3bae10d680f97cf791b3f211fad GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/lib/libssd1306/src/Makefile.avr b/lib/libssd1306/src/Makefile.avr new file mode 100644 index 0000000..cce4c3a --- /dev/null +++ b/lib/libssd1306/src/Makefile.avr @@ -0,0 +1,47 @@ +# MIT License +# +# Copyright (c) 2018, Alexey Dynda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +################################################################# +# Makefile to build ssd1306 library for AVR controllers +# +# Accept the following parameters: +# CC +# CXX +# STRIP +# AR +# MCU +# FREQUENCY + +CC = avr-gcc +CXX = avr-g++ +STRIP = avr-strip +AR = avr-ar +MCU ?= atmega328p +FREQUENCY ?= 16000000 + +CCFLAGS += -mmcu=$(MCU) -DF_CPU=$(FREQUENCY) -Wno-array-bounds + +ifeq ($(ADAFRUIT),y) +INCLUDES += -I./ssd1306_hal/avr/arduino +endif + +include Makefile.common diff --git a/lib/libssd1306/src/Makefile.common b/lib/libssd1306/src/Makefile.common new file mode 100644 index 0000000..189bdf4 --- /dev/null +++ b/lib/libssd1306/src/Makefile.common @@ -0,0 +1,107 @@ +# MIT License +# +# Copyright (c) 2018, Alexey Dynda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +################################################################# +# Makefile containing common logic for all systems +# +# Accepts the following parameters: +# CC +# CXX +# STRIP +# AR + +default: all + +DESTDIR ?= +BLD ?= ../bld +BACKSLASH?=/ +MKDIR?=mkdir -p +convert=$(subst /,$(BACKSLASH),$1) + +.SUFFIXES: .c .cpp .ino + +$(BLD)/%.o: %.c + -$(MKDIR) $(call convert,$(dir $@)) + $(CC) -std=gnu11 $(CCFLAGS) -c $< -o $@ + +$(BLD)/%.o: %.ino + -$(MKDIR) $(call convert,$(dir $@)) + $(CXX) -std=c++11 $(CCFLAGS) $(CXXFLAGS) $(CCFLAGS-$(basename $(notdir $@))) -x c++ -c $< -o $@ + +$(BLD)/%.o: %.cpp + -$(MKDIR) $(call convert,$(dir $@)) + $(CXX) -std=c++11 $(CCFLAGS) $(CXXFLAGS) $(CCFLAGS-$(basename $(notdir $@))) -c $< -o $@ + +################ OPTIONS ########################## + +ifeq ($(ADAFRUIT),y) +ADAFRUIT_DIR ?= $(shell readlink -f ~)/Arduino/libraries/Adafruit_GFX_Library + +INCLUDES += -I$(ADAFRUIT_DIR) \ + +# -I$(shell readlink -f ../src)/ssd1306_hal/linux/arduino + +CCFLAGS-Adafruit_GFX= -DARDUINO=100 + +SRCS += \ + $(ADAFRUIT_DIR)/Adafruit_GFX.cpp +endif + +# ************* Common defines ******************** + +INCLUDES += \ + -I. + +CCFLAGS += -MD -g -Os $(INCLUDES) -Wall -Werror -ffunction-sections -fdata-sections \ + -fno-exceptions + +CXXFLAGS += -fno-rtti + +ifeq ($(SDL_EMULATION),y) + CCFLAGS += -DSDL_EMULATION -I../tools/sdl +endif + +.PHONY: clean ssd1306 all help + +include Makefile.src + +####################### Compiling library ######################### + +$(BLD)/libssd1306.a: $(OBJS) + $(AR) rcs $@ $(OBJS) + +ssd1306: $(BLD)/libssd1306.a + +all: ssd1306 + +clean: + rm -rf $(BLD) + +help: + @echo "Makefile accepts the following options:" + @echo " ADAFRUIT=y/n Enables compilation of Adafruit GFX library" + @echo " ADAFRUIT_DIR=path Path to Adafruit GFX library" + @echo " SDL_EMULATION=y/n Enables SDL emulator in the library" + @echo " FREQUENCY=N Frequency in Hz" + @echo " MCU=mcu_code Specifies MCU to compile for (valid for AVR)" + +-include $(OBJS:%.o=%.d) diff --git a/lib/libssd1306/src/Makefile.energia b/lib/libssd1306/src/Makefile.energia new file mode 100644 index 0000000..840c85c --- /dev/null +++ b/lib/libssd1306/src/Makefile.energia @@ -0,0 +1,4 @@ +# NO MAKEFILE REQUIRED FOR ENERGIA PLATFORM +# +# For using ssd1306 library just copy it to the libraries folder +# located in the Energia folder in Documents. diff --git a/lib/libssd1306/src/Makefile.esp32 b/lib/libssd1306/src/Makefile.esp32 new file mode 100644 index 0000000..ac1f970 --- /dev/null +++ b/lib/libssd1306/src/Makefile.esp32 @@ -0,0 +1,5 @@ +# NO MAKEFILE REQUIRED FOR ESP32 IDF platform, as Makefile.esp32 in examples +# generates all required mk file to compile sketches and library. +# +# For using ssd1306 library as IDF component module, there is component.mk, +# located in root folder of ssd1306 library diff --git a/lib/libssd1306/src/Makefile.linux b/lib/libssd1306/src/Makefile.linux new file mode 100644 index 0000000..4a7de73 --- /dev/null +++ b/lib/libssd1306/src/Makefile.linux @@ -0,0 +1,38 @@ +# MIT License +# +# Copyright (c) 2018, Alexey Dynda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +################################################################# +# Makefile to build ssd1306 library for AVR controllers +# +# Accept the following parameters: +# CC +# CXX +# STRIP +# AR +# MCU +# FREQUENCY + +ifeq ($(ADAFRUIT),y) +INCLUDES += -I./ssd1306_hal/linux/arduino +endif + +include Makefile.common diff --git a/lib/libssd1306/src/Makefile.mingw32 b/lib/libssd1306/src/Makefile.mingw32 new file mode 100644 index 0000000..eb01c2b --- /dev/null +++ b/lib/libssd1306/src/Makefile.mingw32 @@ -0,0 +1,42 @@ +# MIT License +# +# Copyright (c) 2018, Alexey Dynda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +################################################################# +# Makefile to build ssd1306 library for AVR controllers +# +# Accept the following parameters: +# CC +# CXX +# STRIP +# AR +# MCU +# FREQUENCY + +CC=gcc +MKDIR=mkdir +BACKSLASH=\\ + +ifeq ($(ADAFRUIT),y) +INCLUDES += -I./ssd1306_hal/mingw/arduino +endif + +include Makefile.common diff --git a/lib/libssd1306/src/Makefile.src b/lib/libssd1306/src/Makefile.src new file mode 100644 index 0000000..7bb1317 --- /dev/null +++ b/lib/libssd1306/src/Makefile.src @@ -0,0 +1,80 @@ +# MIT License +# +# Copyright (c) 2018-2019, Alexey Dynda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# + +SRCS_C = \ + ssd1306_fonts.c \ + ssd1306_generic.c \ + ssd1306_1bit.c \ + ssd1306_8bit.c \ + ssd1306_16bit.c \ + ssd1306_menu.c \ + ssd1306_hal/avr/platform.c \ + ssd1306_hal/linux/platform.c \ + ssd1306_hal/mingw/platform.c \ + ssd1306_hal/stm32/platform.c \ + ssd1306_hal/template/platform.c \ + intf/i2c/ssd1306_i2c.c \ + intf/i2c/ssd1306_i2c_embedded.c \ + intf/i2c/ssd1306_i2c_twi.c \ + intf/spi/ssd1306_spi.c \ + intf/spi/ssd1306_spi_avr.c \ + intf/spi/ssd1306_spi_usi.c \ + intf/ssd1306_interface.c \ + intf/uart/ssd1306_uart_builtin.c \ + lcd/lcd_common.c \ + lcd/lcd_pcd8544.c \ + lcd/lcd_il9163.c \ + lcd/lcd_ili9341.c \ + lcd/oled_sh1106.c \ + lcd/oled_ssd1306.c \ + lcd/oled_ssd1325.c \ + lcd/oled_ssd1327.c \ + lcd/oled_ssd1331.c \ + lcd/oled_ssd1351.c \ + lcd/oled_template.c \ + lcd/vga_monitor.c \ + intf/vga/vga.c \ + intf/vga/atmega328p/vga128x64.c \ + intf/vga/atmega328p/vga96x40.c \ + ssd1306_uart.c \ + +SRCS_CPP = \ + nano_engine/canvas.cpp \ + nano_engine/core.cpp \ + nano_gfx.cpp \ + sprite_pool.cpp \ + ssd1306_console.cpp \ + ssd1306_hal/arduino/platform.cpp \ + ssd1306_hal/energia/platform.cpp \ + intf/vga/esp32/vga128x64.cpp \ + intf/vga/esp32/CompositeOutput.cpp \ + +SRCS = $(SRCS_C) $(SRCS_CPP) + +# Due to absence of Print class tiny_ssd1306.cpp cannot be compiled without Arduino libs. +# tiny_ssd1306.cpp \ + +OBJS_C = $(addprefix src/, $(addsuffix .o, $(basename $(SRCS_C)))) + +OBJS = $(addprefix $(BLD)/, $(addsuffix .o, $(basename $(SRCS)))) + diff --git a/lib/libssd1306/src/Makefile.stm32 b/lib/libssd1306/src/Makefile.stm32 new file mode 100644 index 0000000..b9dfc92 --- /dev/null +++ b/lib/libssd1306/src/Makefile.stm32 @@ -0,0 +1,49 @@ +# MIT License +# +# Copyright (c) 2018, Alexey Dynda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +################################################################# +# Makefile to build ssd1306 library for STM32 controllers +# +# Accept the following parameters: +# CC +# CXX +# STRIP +# AR +# MCU +# FREQUENCY + +CC = arm-none-eabi-gcc +CXX = arm-none-eabi-g++ +STRIP = arm-none-eabi-strip +AR = arm-none-eabi-ar +CORE ?= cortex-m3 +MCU ?= stm32f4x +FREQUENCY ?= 16000000 + +CCFLAGS += -DSTM32F4 +CCFLAGS += -mlittle-endian -mthumb -mthumb-interwork -mcpu=$(CORE) -DF_CPU=$(FREQUENCY) + +ifeq ($(ADAFRUIT),y) +INCLUDES += -I./ssd1306_hal/avr/arduino +endif + +include Makefile.common diff --git a/lib/libssd1306/src/README.md b/lib/libssd1306/src/README.md new file mode 100644 index 0000000..d1775d1 --- /dev/null +++ b/lib/libssd1306/src/README.md @@ -0,0 +1,169 @@ +# ssd1306 library introduction # {#index} + +*** + +[tocstart]: # (toc start) + + * [Introduction](#introduction) + * [Key Features](#key-features) + * [Supported displays](#supported-displays) + * [Supported platforms](#supported-platforms) + * [Setting up](#setting-up) + * [License](#license) + +[tocend]: # (toc end) + + +<a name="introduction"></a> +## Introduction + +SSD1306 driver is Arduino style C/C++ library with unicode support. The library can be compiled for plain Linux +(for example, raspberry spi), or you can use it with plain avr-gcc compiler without Arduino IDE, or with +ESP32 IDF. It supports monochrome and RGB oleds and has debug mode, allowing to execute code on PC, using SDL2.0. +Initially the library is intended for very small microcontrollers (with a little of RAM). It was developed to use as +few resources as possible, but still has powerful capabilities, allowing to develop nice animation. +It works on any powerful devices like raspberry pi, esp32; and can be easily ported to new platform. + +Since ssd1306 library supports different display types: monochrome, 8-bit color, 16-bit color displays, - +there are several group of API functions: + + * Generic API functions (font specific, cursor positioning, menu implementation) + * 1-bit API functions for monochrome displays (these ones can be used both for color and mono lcd) + * 8-bit API functions for color displays (these ones work only for color displays) + * 16-bit API functions for color displays (only color displays) + +Also, for graphics animation there special C++ API, called [Nano Engine](nano_engine/README.md). + +<a name="key-features"></a> +## Key Features + + * Supports color, monochrome OLED displays, and VGA monitor + * The library has modular structure, and some modules can be excluded from compilation at all to reduce flash usage. + * Needs very little RAM (Attiny85 with Damellis package needs minimum 25 bytes of RAM to communicate with OLED) + * Fast implementation to provide reasonable speed on slow microcontrollers + * Supports i2c and spi interfaces: + * i2c (software implementation, Wire library, AVR Twi, Linux i2c-dev) + * spi (4-wire spi via Arduino SPI library, AVR Spi, AVR USI module) + * Primitive graphics functions (lines, rectangles, pixels, bitmaps) + * Printing text to display (using fonts of different size, you can use GLCD Font Creator to create new fonts) + * Includes [graphics engine](https://github.com/lexus2k/ssd1306/wiki/Using-NanoEngine-for-systems-with-low-resources) to support + double buffering on tiny microcontrollers. + * Can be used for game development (bonus examples): + * Arkanoid game ([arkanoid](examples/games/arkanoid) in old style API and [arkanoid8](examples/games/arkanoid8) in new style API) + * Simple [Lode runner](examples/games/lode_runner) game. + * [Snowflakes](examples/nano_engine/snowflakes) + +The i2c pins can be changed via API functions. Please, refer to documentation. Keep in mind, +that the pins, which are allowed for i2c or spi interface, depend on the hardware. +The default spi SCLK and MOSI pins are defined by SPI library, and DC, RST, CES pins are configurable +through API. + +<a name="supported-displays"></a> +## Supported displays: + +| **Display** | **I2C** | **SPI** | **Orientation** | **Comments** | +| :-------- |:---:|:---:|:---:|:---------| +| sh1106 128x64 | X | | | | +| ssd1306 128x64 | X | X | | | +| ssd1306 128x32 | X | X | | | +| ssd1325 128x64 | | X | | | +| ssd1327 128x128 | | X | | | +| ssd1351 128x128 | | X | | | +| il9163 128x128 | | X | X | | +| st7735 128x160 | | X | X | | +| ili9341 240x320 | | X | X | | +| pcd8544 84x48 | | X | | Nokia 5110 | +| vga 96x40 color | | | | direct D-sub output, atmega328p only | +| vga 128x64 bw | | | | direct D-sub output, atmega328p only | + +<a name="supported-platforms"></a> +## Supported platforms + +| **Platforms** | **I2C** | **SPI** | **Comments** | +| :-------- |:---:|:---:|:---------| +| **Arduino** | | | | +| Attiny85, Attiny45 | X | X | Refer to [Damellis attiny package](https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json) | +| Attiny84, Attiny44 | X | X | Refer to [Damellis attiny package](https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json) | +| Atmega328p, Atmega168 | X | X | | +| Atmega32u4 | X | X | | +| Atmega2560 | X | X | | +| Digispark, including PRO version | X | X | check [examples compatibility list](examples/Digispark_compatibility.txt) | +| ESP8266 | X | X | check [examples compatibility list](examples/ESP8266_compatibility.txt) | +| ESP32 | X | X | check [examples compatibility list](examples/ESP8266_compatibility.txt) | +| STM32 | X | X | [stm32duino](https://github.com/stm32duino/wiki/wiki) | +| Arduino Zero | X | X | | +| Nordic nRF5 (nRF51, nRF52) | X | X | nRF users, enable c++11 in platform.txt `-std=gnu++11` | +| Nordic nRF5 (nRF51, nRF52) | X | X | via [Sandeep Mistry arduino-nRF5](https://github.com/sandeepmistry/arduino-nRF5) package | +| **Plain AVR** | | | | +| Attiny85, Attiny45 | X | X | | +| Atmega328p, Atmega168 | X | X | | +| Atmega32u4 | X | X | | +| **Plain ESP32** | | | | +| ESP32 | X | X | library can be used as IDF component | +| **Linux** | | | | +| Raspberry Pi | X | X | i2c-dev, spidev, sys/class/gpio | +| [SDL Emulation](https://github.com/lexus2k/ssd1306/wiki/How-to-run-emulator-mode) | X | X | demo code can be run without real OLED HW via SDL library | +| **Windows** | | | | +| [SDL Emulation](https://github.com/lexus2k/ssd1306/wiki/How-to-run-emulator-mode) | X | X | demo code can be run without real OLED HW via MinGW32 + SDL library | + +Digispark users, please check compilation options in your Arduino prior to using this library. +Ssd1306 library requires at least c++11 and c99 (by default Digispark package misses the options +-std=gnu11, -std=gnu++11). + +<a name="setting-up"></a> +## Setting up + +*i2c Hardware setup is described [here](https://github.com/lexus2k/ssd1306/wiki/Hardware-setup)* + +*Setting up for Arduino from github sources)* + * Download source from https://github.com/lexus2k/ssd1306 + * Put the sources to Arduino/libraries/ssd1306/ folder + +*Setting up for Arduino from Arduino IDE library manager* + * Install ssd1306 library (named ssd1306 by Alexey Dynda) via Arduino IDE library manager + +*Using with plain avr-gcc:* + * Download source from https://github.com/lexus2k/ssd1306 + * Build the library (variant 1) + * cd ssd1306/src && make -f Makefile.avr MCU=\<your_mcu\> + * Link library to your project (refer to [Makefile.avr](examples/Makefile.avr) in examples folder). + * Build demo code (variant 2) + * cd ssd1306/tools && ./build_and_run.sh -p avr -m \<your_mcu\> ssd1306_demo + + *For esp32:* + * Download source from https://github.com/lexus2k/ssd1306 + * Put downloaded sources to components/ssd1306/ folder. + * Compile your project as described in ESP-IDF build system documentation + +For more information about this library, please, visit https://github.com/lexus2k/ssd1306. +Doxygen documentation can be found at [github.io site](http://lexus2k.github.io/ssd1306). +If you found any problem or have any idea, please, report to Issues section. + +<a name="license"></a> +## License + +The library is free. If this project helps you, you can give me a cup of coffee. [Donate via Paypal](https://www.paypal.me/lexus2k) + +MIT License + +Copyright (c) 2016-2019, Alexey Dynda + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + diff --git a/lib/libssd1306/src/doxygen.cfg b/lib/libssd1306/src/doxygen.cfg new file mode 100644 index 0000000..e326b30 --- /dev/null +++ b/lib/libssd1306/src/doxygen.cfg @@ -0,0 +1,2499 @@ +# Doxyfile 1.8.12 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "SSD1306 OLED display driver" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 1.8.3 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "This library is developed to control SSD1306/SSD1331/SSD1351/IL9163/PCD8554 RGB i2c/spi LED displays" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = ../docs + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +# TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +# GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if <section_label> ... \endif and \cond <section_label> +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +# WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = . README.md nano_engine/README.md ssd1306_hal/README.md + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = *.cpp + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# <filter> <input-file> +# +# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +# CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +# CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = . + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use <access key> + S +# (what the <access key> is depends on the OS and browser, but it is typically +# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down +# key> to jump into the search results window, the results can be navigated +# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel +# the search. The filter options can be selected when the cursor is inside the +# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> +# to select a filter and <Enter> or <escape> to activate or cancel the filter +# option. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. There +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH +# setting. When disabled, doxygen will generate a PHP script for searching and +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing +# and searching needs to be provided by external tools. See the section +# "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain the +# search results. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). +# +# See the section "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will return the search results when EXTERNAL_SEARCH is enabled. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). See the section "External Indexing and +# Searching" for details. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. +# The default file is: searchdata.xml. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of +# to a relative location where the documentation can be found. The format is: +# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. +# The default value is: YES. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. +# +# Note that when enabling USE_PDFLATEX this option is only used for generating +# bitmaps for formulas in the HTML output, but not in the Makefile that is +# written to the output directory. +# The default file is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate +# index for LaTeX. +# The default file is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used by the +# printer. +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x +# 14 inches) and executive (7.25 x 10.5 inches). +# The default value is: a4. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names +# that should be included in the LaTeX output. The package can be specified just +# by its name or with the correct syntax as to be used with the LaTeX +# \usepackage command. To get the times font for instance you can specify : +# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} +# To use the option intlimits with the amsmath package you can specify: +# EXTRA_PACKAGES=[intlimits]{amsmath} +# If left blank no extra packages will be included. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the +# generated LaTeX document. The header should contain everything until the first +# chapter. If it is left blank doxygen will generate a standard header. See +# section "Doxygen usage" for information on how to let doxygen write the +# default header to a separate file. +# +# Note: Only use a user-defined header if you know what you are doing! The +# following commands have a special meaning inside the header: $title, +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty +# string, for the replacement values of the other commands the user is referred +# to HTML_HEADER. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the +# generated LaTeX document. The footer should contain everything after the last +# chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. +# +# Note: Only use a user-defined footer if you know what you are doing! +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_FOOTER = + +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_STYLESHEET = + +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the LATEX_OUTPUT output +# directory. Note that the files will be copied as-is; there are no commands or +# markers available. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_FILES = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is +# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will +# contain links (just like the HTML output) instead of page references. This +# makes the output suitable for online browsing using a PDF viewer. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate +# the PDF file directly from the LaTeX files. Set this option to YES, to get a +# higher quality PDF documentation. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode +# command to the generated LaTeX files. This will instruct LaTeX to keep running +# if errors occur, instead of asking the user for help. This option is also used +# when generating formulas in HTML. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BATCHMODE = NO + +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# index chapters (such as File Index, Compound Index, etc.) in the output. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HIDE_INDICES = NO + +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source +# code with syntax highlighting in the LaTeX output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. See +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# The default value is: plain. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BIB_STYLE = plain + +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +# LATEX_TIMESTAMP = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The +# RTF output is optimized for Word 97 and may not look too pretty with other RTF +# readers/editors. +# The default value is: NO. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: rtf. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will +# contain hyperlink fields. The RTF file will contain links (just like the HTML +# output) instead of page references. This makes the output suitable for online +# browsing using Word or some other Word compatible readers that support those +# fields. +# +# Note: WordPad (write) and others do not support links. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's config +# file, i.e. a series of assignments. You only have to provide replacements, +# missing definitions are set to their default value. +# +# See also section "Doxygen usage" for information on how to generate the +# default style sheet that doxygen normally uses. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an RTF document. Syntax is +# similar to doxygen's config file. A template extensions file can be generated +# using doxygen -e rtf extensionFile. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_EXTENSIONS_FILE = + +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code +# with syntax highlighting in the RTF output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# classes and files. +# The default value is: NO. + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. A directory man3 will be created inside the directory specified by +# MAN_OUTPUT. +# The default directory is: man. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to the generated +# man pages. In case the manual section does not start with a number, the number +# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is +# optional. +# The default value is: .3. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_EXTENSION = .3 + +# The MAN_SUBDIR tag determines the name of the directory created within +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by +# MAN_EXTENSION with the initial . removed. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_SUBDIR = + +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# will generate one additional man file for each entity documented in the real +# man page(s). These additional files only source the real man page, but without +# them the man command would be unable to find the correct page. +# The default value is: NO. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that +# captures the structure of the code including all documentation. +# The default value is: NO. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: xml. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_OUTPUT = xml + +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program +# listings (including syntax highlighting and cross-referencing information) to +# the XML output. Note that enabling this will significantly increase the size +# of the XML output. +# The default value is: YES. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- + +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files +# that can be used to generate PDF. +# The default value is: NO. + +GENERATE_DOCBOOK = NO + +# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. +# The default directory is: docbook. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_OUTPUT = docbook + +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO + +#--------------------------------------------------------------------------- +# Configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sf.net) file that captures the +# structure of the code including all documentation. Note that this feature is +# still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module +# file that captures the structure of the code including all documentation. +# +# Note that this feature is still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary +# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI +# output from the Perl module output. +# The default value is: NO. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely +# formatted so it can be parsed by a human reader. This is useful if you want to +# understand what is going on. On the other hand, if this tag is set to NO, the +# size of the Perl module output will be much smaller and Perl will parse it +# just the same. +# The default value is: YES. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file are +# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful +# so different doxyrules.make files included by the same Makefile don't +# overwrite each other's variables. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all +# C-preprocessor directives found in the sources and include files. +# The default value is: YES. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be +# performed. Macro expansion can be done in a controlled way by setting +# EXPAND_ONLY_PREDEF to YES. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then +# the macro expansion is limited to the macros specified with the PREDEFINED and +# EXPAND_AS_DEFINED tags. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES, the include files in the +# INCLUDE_PATH will be searched if a #include is found. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by the +# preprocessor. +# This tag requires that the tag SEARCH_INCLUDES is set to YES. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will be +# used. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that are +# defined before the preprocessor is started (similar to the -D option of e.g. +# gcc). The argument of the tag is a list of macros of the form: name or +# name=definition (no spaces). If the definition and the "=" are omitted, "=1" +# is assumed. To prevent a macro definition from being undefined via #undef or +# recursively expanded use the := operator instead of the = operator. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +PREDEFINED = __AVR_ATtiny85__ __cplusplus \ + DOXYGEN_SHOULD_SKIP_THIS \ + CONFIG_AVR_UART_AVAILABLE CONFIG_AVR_UART_ENABLE \ + CONFIG_SOFTWARE_I2C_ENABLE CONFIG_SOFTWARE_I2C_AVAILABLE \ + CONFIG_TWI_I2C_ENABLE CONFIG_TWI_I2C_AVAILABLE \ + CONFIG_AVR_SPI_ENABLE CONFIG_AVR_SPI_AVAILABLE \ + CONFIG_USI_SPI_ENABLE CONFIG_USI_SPI_AVAILABLE \ + CONFIG_VGA_ENABLE CONFIG_VGA_AVAILABLE \ + CONFIG_PLATFORM_I2C_ENABLE CONFIG_PLATFORM_I2C_AVAILABLE \ + CONFIG_PLATFORM_SPI_ENABLE CONFIG_PLATFORM_SPI_AVAILABLE \ + CONFIG_ADAFRUIT_GFX_ENABLE \ + CONFIG_SSD1306_UNICODE_ENABLE \ + + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this +# tag can be used to specify a list of macro names that should be expanded. The +# macro definition that is found in the sources will be used. Use the PREDEFINED +# tag if you want to use a different macro definition that overrules the +# definition found in the source code. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# remove all references to function-like macros that are alone on a line, have +# an all uppercase name, and do not end with a semicolon. Such function macros +# are typically used for boiler-plate code, and will confuse the parser if not +# removed. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tag files. For each tag +# file the location of the external documentation should be added. The format of +# a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where loc1 and loc2 can be relative or absolute paths or URLs. See the +# section "Linking to external documentation" for more information about the use +# of tag files. +# Note: Each tag file must have a unique name (where the name does NOT include +# the path). If a tag file is not located in the directory in which doxygen is +# run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# tag file that is based on the input files it reads. See section "Linking to +# external documentation" for more information about the usage of tag files. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. +# The default value is: NO. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will be +# listed. +# The default value is: YES. + +EXTERNAL_GROUPS = YES + +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in +# the related pages index. If set to NO, only the current project's pages will +# be listed. +# The default value is: YES. + +EXTERNAL_PAGES = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of 'which perl'). +# The default file (with absolute path) is: /usr/bin/perl. + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to +# NO turns the diagrams off. Note that this option also works with HAVE_DOT +# disabled, but it is recommended to install and use dot, since it yields more +# powerful graphs. +# The default value is: YES. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see: +# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# If set to YES the inheritance and collaboration graphs will hide inheritance +# and usage relations if the target is undocumented or is not a class. +# The default value is: YES. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz (see: +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# Bell Labs. The other options in this section have no effect if this option is +# set to NO +# The default value is: NO. + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed +# to run in parallel. When set to 0 doxygen will base this on the number of +# processors available in the system. You can set it explicitly to a value +# larger than 0 to get control over the balance between CPU load and processing +# speed. +# Minimum value: 0, maximum value: 32, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NUM_THREADS = 0 + +# When you want a differently looking font in the dot files that doxygen +# generates you can specify the font name using DOT_FONTNAME. You need to make +# sure dot is able to find the font, which can be done by putting it in a +# standard location or by setting the DOTFONTPATH environment variable or by +# setting DOT_FONTPATH to the directory containing the font. +# The default value is: Helvetica. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of +# dot graphs. +# Minimum value: 4, maximum value: 24, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the default font as specified with +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set +# the path where dot can find it using this tag. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for +# each documented class showing the direct and indirect inheritance relations. +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH = YES + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# http://www.graphviz.org/)). +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not seem +# to support this out of the box. +# +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# files that are used to generate the various graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_CLEANUP = YES diff --git a/lib/libssd1306/src/font6x8.h b/lib/libssd1306/src/font6x8.h new file mode 100644 index 0000000..a1492e1 --- /dev/null +++ b/lib/libssd1306/src/font6x8.h @@ -0,0 +1,23 @@ +/* + * SSD1306xLED - Drivers for SSD1306 controlled dot matrix OLED/PLED 128x64 displays + * + * @created: 2014-08-12 + * @author: Neven Boyanov + * + * Copyright (c) 2015 Neven Boyanov, Tinusaur Team. All Rights Reserved. + * Distributed as open source software under MIT License, see LICENSE.txt file. + * Please, as a favour, retain the link http://tinusaur.org to The Tinusaur Project. + * + * Source code available at: https://bitbucket.org/tinusaur/ssd1306xled + * + */ +/** + * @file font6x8.h Fonts 6x8. Header file is here only for compatibility with previous library releases + */ + +#ifndef FONT6x8_H +#define FONT6x8_H + +#include "ssd1306_fonts.h" + +#endif // FONT6x8_H diff --git a/lib/libssd1306/src/intf/i2c/ssd1306_i2c.c b/lib/libssd1306/src/intf/i2c/ssd1306_i2c.c new file mode 100644 index 0000000..cf4224c --- /dev/null +++ b/lib/libssd1306/src/intf/i2c/ssd1306_i2c.c @@ -0,0 +1,65 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_i2c.h" +#include "intf/ssd1306_interface.h" + +void ssd1306_i2cInitEx(int8_t scl, int8_t sda, int8_t sa) +{ +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) + ssd1306_platform_i2cConfig_t cfg; + cfg.scl = scl; + cfg.sda = sda; + ssd1306_platform_i2cInit(-1, sa, &cfg); +#elif defined(CONFIG_TWI_I2C_AVAILABLE) && defined(CONFIG_TWI_I2C_ENABLE) + ssd1306_i2cConfigure_Twi(0); + ssd1306_i2cInit_Twi(sa); +#elif defined(CONFIG_SOFTWARE_I2C_AVAILABLE) && defined(CONFIG_SOFTWARE_I2C_ENABLE) + ssd1306_i2cInit_Embedded(scl, sda, sa); +#else + #warning "ssd1306 library: no i2c support for the target platform" +#endif +} + +void ssd1306_i2cInitEx2(int8_t busId, int8_t scl, int8_t sda, int8_t sa) +{ +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) + ssd1306_platform_i2cConfig_t cfg; + cfg.scl = scl; + cfg.sda = sda; + ssd1306_platform_i2cInit(busId, sa, &cfg); +#elif defined(CONFIG_TWI_I2C_AVAILABLE) && defined(CONFIG_TWI_I2C_ENABLE) + ssd1306_i2cConfigure_Twi(0); + ssd1306_i2cInit_Twi(sa); +#elif defined(CONFIG_SOFTWARE_I2C_AVAILABLE) && defined(CONFIG_SOFTWARE_I2C_ENABLE) + ssd1306_i2cInit_Embedded(scl, sda, sa); +#else + #warning "ssd1306 library: no i2c support for the target platform" +#endif +} + +void ssd1306_i2cInit() +{ + ssd1306_i2cInitEx(-1, -1, SSD1306_SA); +} diff --git a/lib/libssd1306/src/intf/i2c/ssd1306_i2c.h b/lib/libssd1306/src/intf/i2c/ssd1306_i2c.h new file mode 100644 index 0000000..cc18d74 --- /dev/null +++ b/lib/libssd1306/src/intf/i2c/ssd1306_i2c.h @@ -0,0 +1,112 @@ +/* + MIT License + + Copyright (c) 2016-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_i2c.h SSD1306 i2c communication functions + */ + + +#ifndef _SSD1306_I2C_H_ +#define _SSD1306_I2C_H_ + +#include "ssd1306_i2c_conf.h" +#include "ssd1306_i2c_embedded.h" +#include "ssd1306_i2c_twi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Inits display interface to use i2c bus. + * The function automatically selects available type of i2c implementation + * 1. Wire library + * 2. sw i2c implementation + * In case of using Wire library this function calls Wire.begin() and + * sets speed to fast i2c (400kHz). If you prefer to use your own Wire settings + * or avoid reinitializing of Wire library, please use ssd1306_i2cInit_Wire(). + * If you want to use embedded i2c (if it is supported), use ssd1306_i2cInit_Embedded(). + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_i2cInit(void); + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Inits display interface to use i2c bus. + * The function automatically selects available type of i2c implementation + * 1. Wire library + * 2. sw i2c implementation + * In case of using Wire library this function calls Wire.begin() and + * sets speed to fast i2c (400kHz). If you prefer to use your own Wire settings + * or avoid reinitializing of Wire library, please use ssd1306_i2cInit_Wire(). + * If you want to use embedded i2c (if it is supported), use ssd1306_i2cInit_Embedded(). + * + * @param scl - i2c clock pin. Use -1 if you don't need to change default pin number + * @param sda - i2c data pin. Use -1 if you don't need to change default pin number + * @param sa - i2c address of lcd display. Use 0 to leave default + * + * @note scl and sda parameters depend on used hardware. For many hardware boards these + * parameters do not have any effect. ESP8266 allows to specify these parameters + * + * @note scl and sda for Linux systems should be the same, and should contain i2c bus id. + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_i2cInitEx(int8_t scl, int8_t sda, int8_t sa); + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Inits display interface to use i2c bus. + * The function automatically selects available type of i2c implementation + * 1. Wire library + * 2. sw i2c implementation + * In case of using Wire library this function calls Wire.begin() and + * sets speed to fast i2c (400kHz). If you prefer to use your own Wire settings + * or avoid reinitializing of Wire library, please use ssd1306_i2cInit_Wire(). + * If you want to use embedded i2c (if it is supported), use ssd1306_i2cInit_Embedded(). + * + * @param busId - number of i2c bus if there are multiple hw blocks avialable. + * @param scl - i2c clock pin. Use -1 if you don't need to change default pin number + * @param sda - i2c data pin. Use -1 if you don't need to change default pin number + * @param sa - i2c address of lcd display. Use 0 to leave default + * + * @note scl and sda parameters depend on used hardware. For many hardware boards these + * parameters do not have any effect. ESP8266 allows to specify these parameters + * + * @note scl and sda for Linux systems should be the same, and should contain i2c bus id. + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_i2cInitEx2(int8_t busId, int8_t scl, int8_t sda, int8_t sa); + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _SSD1306_I2C_H_ diff --git a/lib/libssd1306/src/intf/i2c/ssd1306_i2c_conf.h b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_conf.h new file mode 100644 index 0000000..403470c --- /dev/null +++ b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_conf.h @@ -0,0 +1,77 @@ +/* + MIT License + + Copyright (c) 2016-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_i2c_conf.h SSD1306 library basic i2c definitions + */ + +#ifndef _SSD1306_I2C_CONF_H_ +#define _SSD1306_I2C_CONF_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SSD1306_SA + /** + * @ingroup LCD_HW_INTERFACE_API + * + * SSD1306_SA defines default i2c address of LCD display. Please, check your device. + * If you LCD device has different address, you can set different one via + * ssd1306_i2cInit_Wire() or ssd1306_i2cInit_Embedded() functions. + * Write command will be SSD1306_SA<<1 and read will be SSD1306_SA<<1 | 1 + */ + #define SSD1306_SA 0x3C // Slave address +#endif + +#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + #ifndef SSD1306_SCL + #define SSD1306_SCL 3 ///< SCL, Pin 3 on SSD1306 Board + #endif + #ifndef SSD1306_SDA + #define SSD1306_SDA 4 ///< SDA, Pin 4 on SSD1306 Board + #endif +#elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + #ifndef SSD1306_SCL + #define SSD1306_SCL 4 ///< SCL, Pin 4 - physical pin 9 of Attiny84 + #endif + #ifndef SSD1306_SDA + #define SSD1306_SDA 6 ///< SDA, Pin 6 - physical pin 7 of Attiny84 + #endif +#else + #ifndef SSD1306_SCL + #define SSD1306_SCL 5 // SCL, Pin A5 on SSD1306 Board + #endif + #ifndef SSD1306_SDA + #define SSD1306_SDA 4 // SDA, Pin A4 on SSD1306 Board + #endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/lib/libssd1306/src/intf/i2c/ssd1306_i2c_embedded.c b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_embedded.c new file mode 100644 index 0000000..24a37ab --- /dev/null +++ b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_embedded.c @@ -0,0 +1,191 @@ +/* + MIT License + + Copyright (c) 2016-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_i2c_embedded.h" +#include "intf/ssd1306_interface.h" +#include "ssd1306_i2c.h" + +#include "ssd1306_hal/io.h" + +#if defined(CONFIG_SOFTWARE_I2C_AVAILABLE) && defined(CONFIG_SOFTWARE_I2C_ENABLE) + +#include <util/delay_basic.h> + +/** + * Port registers, containing pins, which SSD1306 display is connected to. + * For ATtiny controllers it is standard PORTB + * For ATmega328p, it is PORTC, which corresponds to Analog inputs/outputs + */ + +static uint8_t s_scl = (1<<SSD1306_SCL); +static uint8_t s_sda = (1<<SSD1306_SDA); +static uint8_t s_sa = SSD1306_SA; + +#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + // at 8Mhz each command takes ~ 0.125us + #define DDR_REG DDRB + #define PORT_REG PORTB +#elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + // For AttinyX4 controllers + // at 8Mhz each command takes ~ 0.125us + #define DDR_REG DDRA + #define PORT_REG PORTA +#else // For Atmega + // at 16Mhz each command takes ~ 0.0625us + #define DDR_REG DDRC + #define PORT_REG PORTC +#endif + + +#ifndef F_CPU + #warning "F_CPU is not defined, there can be I2C issues" + #define F_CPU 8000000 +#endif +#define CPU_CYCLE_NS (1000000000/F_CPU) + +#define DELAY_LOOP_CYCLES 4 +#define ssd1306_delay(x) _delay_loop_2(x) + +/** + * Section, which defines I2C timings for SSD1306 display from datasheet + */ +#define SSD1306_I2C_START_STOP_DELAY 600 +#define SSD1306_I2C_RISE_TIME 300 +#define SSD1306_I2C_FALL_TIME 300 +#define SSD1306_I2C_DATA_HOLD_TIME 300 +#define SSD1306_I2C_IDLE_TIME 1300 +#define SSD1306_I2C_CLOCK 2500 + + +#define I2C_START_STOP_DELAY ((SSD1306_I2C_START_STOP_DELAY/CPU_CYCLE_NS + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) + +#define I2C_RISE_TIME ((SSD1306_I2C_RISE_TIME/CPU_CYCLE_NS)/DELAY_LOOP_CYCLES) + +#define I2C_DATA_HOLD_TIME ((SSD1306_I2C_DATA_HOLD_TIME/CPU_CYCLE_NS + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) + +#define I2C_IDLE_TIME (((SSD1306_I2C_IDLE_TIME/CPU_CYCLE_NS) + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) + +#define I2C_HALF_CLOCK (((SSD1306_I2C_CLOCK - SSD1306_I2C_FALL_TIME - SSD1306_I2C_RISE_TIME - SSD1306_I2C_FALL_TIME)/CPU_CYCLE_NS/2 \ + )/DELAY_LOOP_CYCLES) + + +/* I2C HIGH = PORT as INPUT(0) and PULL-UP ENABLE (1) */ +//#define DIGITAL_WRITE_HIGH(DREG, PREG, BIT) { DREG &= ~(1 << BIT); PREG |= (1 << BIT); } +#define DIGITAL_WRITE_HIGH(DREG, PREG, BIT) { DREG &= ~BIT; PREG |= BIT; } + +/* I2C LOW = PORT as OUTPUT(1) and OUTPUT LOW (0) */ +//#define DIGITAL_WRITE_LOW(DREG, PREG, BIT) { DREG |= (1 << BIT); PREG &= ~(1 << BIT); } +#define DIGITAL_WRITE_LOW(DREG, PREG, BIT) { DREG |= BIT; PREG &= ~BIT; } + +static uint8_t oldSREG; +static uint8_t interruptsOff = 0; + +/** + * Inputs: SCL is LOW, SDA is has no meaning + * Outputs: SCL is LOW + */ +static void ssd1306_i2cSendByte_Embedded(uint8_t data) +{ + uint8_t i; + for(i=8; i>0; i--) + { + if(data & 0x80) + DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda) + else + DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda); + data<<=1; + ssd1306_delay(I2C_RISE_TIME); // Fall time is the same as rise time + + DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl); + ssd1306_delay(I2C_HALF_CLOCK); + + DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl); + ssd1306_delay(I2C_HALF_CLOCK); + } + // generating confirmation impulse + DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda); + ssd1306_delay(I2C_RISE_TIME); // Fall time is the same as rise time + DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl); + ssd1306_delay(I2C_HALF_CLOCK); + DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl); + ssd1306_delay(I2C_HALF_CLOCK); +} + +static void ssd1306_i2cSendBytes_Embedded(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + ssd1306_i2cSendByte_Embedded(*buffer); + buffer++; + } +} + +/** + * SCL remains HIGH on EXIT, Low SDA means start transmission + */ +static void ssd1306_i2cStart_Embedded(void) +{ + oldSREG = SREG; + cli(); + interruptsOff = 1; + DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda); // Set to LOW + ssd1306_delay(I2C_START_STOP_DELAY); + DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl); // Set to LOW + ssd1306_delay(I2C_HALF_CLOCK); + ssd1306_i2cSendByte_Embedded((s_sa << 1) | 0); +} + +static void ssd1306_i2cStop_Embedded(void) +{ + DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda); // Set to LOW + ssd1306_delay(I2C_RISE_TIME); // Fall time is the same as rise time + DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl); // Set to HIGH + ssd1306_delay(I2C_START_STOP_DELAY); + DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda); // Set to HIGH + ssd1306_delay(I2C_IDLE_TIME); + if (interruptsOff) + { + SREG = oldSREG; + interruptsOff = 0; + } +} + +static void ssd1306_i2cClose_Embedded() +{ +} + +void ssd1306_i2cInit_Embedded(int8_t scl, int8_t sda, uint8_t sa) +{ + if (scl>=0) s_scl = (1<<scl); + if (sda>=0) s_sda = (1<<sda); + if (sa) s_sa = sa; + ssd1306_intf.spi = 0; + ssd1306_intf.start = ssd1306_i2cStart_Embedded; + ssd1306_intf.stop = ssd1306_i2cStop_Embedded; + ssd1306_intf.send = ssd1306_i2cSendByte_Embedded; + ssd1306_intf.send_buffer = ssd1306_i2cSendBytes_Embedded; + ssd1306_intf.close = ssd1306_i2cClose_Embedded; +} + +#endif diff --git a/lib/libssd1306/src/intf/i2c/ssd1306_i2c_embedded.h b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_embedded.h new file mode 100644 index 0000000..68b3a04 --- /dev/null +++ b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_embedded.h @@ -0,0 +1,63 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_i2c_embedded.h embedded SSD1306 i2c communication functions + */ + +#ifndef _SSD1306_I2C_EMBEDDED_H_ +#define _SSD1306_I2C_EMBEDDED_H_ + +#include "ssd1306_hal/io.h" +#include "ssd1306_i2c_conf.h" + +#if defined(CONFIG_SOFTWARE_I2C_AVAILABLE) && defined(CONFIG_SOFTWARE_I2C_ENABLE) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Initializes software implementation of i2c. + * If you do not know i2c parameters, try ssd1306_i2cInit_Embedded(0,0,0). + * @warning the function disables interrupts. + * @param scl - i2c clock pin. Use -1 if you don't need to change default pin number + * @param sda - i2c data pin. Use -1 if you don't need to change default pin number + * @param sa - i2c address of lcd display. Use 0 to leave default + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_i2cInit_Embedded(int8_t scl, int8_t sda, uint8_t sa); + +#ifdef __cplusplus +} +#endif + +#endif + +#endif /* _SSD1306_I2C_EMBEDDED_H_ */ + + diff --git a/lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.c b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.c new file mode 100644 index 0000000..23ea2f9 --- /dev/null +++ b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.c @@ -0,0 +1,173 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_i2c_twi.h" +#include "intf/ssd1306_interface.h" +#include "ssd1306_i2c.h" + +#if defined(CONFIG_TWI_I2C_AVAILABLE) && defined(CONFIG_TWI_I2C_ENABLE) + +#include <avr/io.h> +#include <util/twi.h> + +/* Max i2c frequency, supported by OLED controllers */ +#define SSD1306_TWI_FREQ 400000 +#define MAX_RETRIES 64 + +static uint8_t s_sa = SSD1306_SA; + +static uint8_t ssd1306_twi_start(void) +{ + uint8_t twst; + uint8_t iters = MAX_RETRIES; + do + { + TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); + while ( (TWCR & (1<<TWINT)) == 0 ); + twst = TWSR & 0xF8; + if (!--iters) + { + break; + } + } while (twst == TW_MT_ARB_LOST); + if ((twst != TW_START) && (twst != TW_REP_START)) + { + return twst; + } + return 0; +} + +static uint8_t ssd1306_twi_send(uint8_t data) +{ + uint8_t twsr; + uint8_t iters = MAX_RETRIES; + do + { + TWDR = data; + TWCR = (1<<TWINT) | (1<<TWEN); + while ( (TWCR & (1<<TWINT)) == 0 ); + twsr = TWSR & 0xF8; + if ((twsr == TW_MT_SLA_ACK) || (twsr == TW_MT_DATA_ACK)) + { + return 0; + } + if (twsr == TW_MT_ARB_LOST) + { + return twsr; + } + iters++; + if (!--iters) + { + break; + } + } while (twsr != TW_MT_ARB_LOST); + return twsr; +} + + +static void ssd1306_twi_stop(void) +{ + TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); +} + +static void ssd1306_i2cStart_Twi(void) +{ + do + { + if (ssd1306_twi_start() != 0) + { + /* Some serious error happened, but we don't care. Our API functions have void type */ + return; + } + } while (ssd1306_twi_send(s_sa << 1) == TW_MT_ARB_LOST); +} + +static void ssd1306_i2cStop_Twi(void) +{ + ssd1306_twi_stop(); +} + +void ssd1306_i2cConfigure_Twi(uint8_t arg) +{ +#if defined(__AVR_ATmega328P__) + /* Enable internal pull-ups */ + DDRC &= ~(1<<PINC4); PORTC |= (1<<PINC4); + DDRC &= ~(1<<PINC5); PORTC |= (1<<PINC5); +#endif +#if defined(TWPS0) + TWSR = 0; +#endif + TWBR = ((F_CPU / SSD1306_TWI_FREQ) - 16) / 2 / (1); // Always use prescaler 1 (TWSR 0x00) + TWCR = (1 << TWEN) | (1 << TWEA); +} + +static void ssd1306_i2cSendByte_Twi(uint8_t data) +{ + for(;;) + { + if (ssd1306_twi_send(data) != TW_MT_ARB_LOST) + { + break; + } + if (ssd1306_twi_start() != 0) + { + /* Some serious error happened, but we don't care. Our API functions have void type */ + break; + } + if (ssd1306_twi_send(s_sa << 1) != TW_MT_ARB_LOST) + { + /* Some serious error happened, but we don't care. Our API functions have void type */ + break; + } + } +} + +static void ssd1306_i2cSendBytes_Twi(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + ssd1306_i2cSendByte_Twi(*buffer); + buffer++; + } +} + + +static void ssd1306_i2cClose_Twi() +{ +} + +void ssd1306_i2cInit_Twi(uint8_t sa) +{ + if (sa) s_sa = sa; + ssd1306_intf.spi = 0; + ssd1306_intf.start = ssd1306_i2cStart_Twi; + ssd1306_intf.stop = ssd1306_i2cStop_Twi; + ssd1306_intf.send = ssd1306_i2cSendByte_Twi; + ssd1306_intf.send_buffer = ssd1306_i2cSendBytes_Twi; + ssd1306_intf.close = ssd1306_i2cClose_Twi; +} + +#endif + + diff --git a/lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.h b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.h new file mode 100644 index 0000000..9b569ac --- /dev/null +++ b/lib/libssd1306/src/intf/i2c/ssd1306_i2c_twi.h @@ -0,0 +1,72 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_i2c_twi.h SSD1306 i2c communication functions for standard AVR TWI interface + */ + +#ifndef _SSD1306_I2C_TWI_H_ +#define _SSD1306_I2C_TWI_H_ + +#include "ssd1306_hal/io.h" +#include "ssd1306_i2c_conf.h" + +#if defined(CONFIG_TWI_I2C_AVAILABLE) && defined(CONFIG_TWI_I2C_ENABLE) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Configures standard TWI AVR module (at 400kHz). + * This function is called by ssd1306_i2cInit(). + * @param arg - has no meaning for now. Should be zero + * + * @note scl and sda pins depend on used hardware. + */ +void ssd1306_i2cConfigure_Twi(uint8_t arg); + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Initializes ssd1306 library to use TWI AVR module for i2c. + * If you do not know i2c parameters, try ssd1306_i2cInit_Twi(0). + * SCL and SDA pins depend on platform. + * @param sa - i2c address of lcd display. Use 0 to leave default + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_i2cInit_Twi(uint8_t sa); + +#ifdef __cplusplus +} +#endif + +#endif + +#endif /* _SSD1306_I2C_TWI_H_ */ + + diff --git a/lib/libssd1306/src/intf/spi/ssd1306_spi.c b/lib/libssd1306/src/intf/spi/ssd1306_spi.c new file mode 100644 index 0000000..59042ed --- /dev/null +++ b/lib/libssd1306/src/intf/spi/ssd1306_spi.c @@ -0,0 +1,56 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + + +#include "ssd1306_spi.h" +#include "ssd1306_spi_avr.h" +#include "ssd1306_spi_usi.h" +#include "intf/ssd1306_interface.h" +#include "lcd/lcd_common.h" +#include "ssd1306_hal/io.h" + +int8_t s_ssd1306_cs = 4; +int8_t s_ssd1306_dc = 5; +uint32_t s_ssd1306_spi_clock = 8000000; + +void ssd1306_spiInit(int8_t cesPin, int8_t dcPin) +{ +#if defined(CONFIG_AVR_SPI_AVAILABLE) && defined(CONFIG_AVR_SPI_ENABLE) + ssd1306_spiInit_avr(cesPin, dcPin); +#elif defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + ssd1306_platform_spiInit(-1, cesPin, dcPin); +#elif defined(CONFIG_USI_SPI_AVAILABLE) && defined(CONFIG_USI_SPI_ENABLE) + ssd1306_spiInit_Usi(cesPin, dcPin); +#else + #warning "ssd1306 library: no spi support for the target platform" +#endif +} + +void ssd1306_spiDataMode(uint8_t mode) +{ + if (s_ssd1306_dc) + { + digitalWrite(s_ssd1306_dc, mode ? HIGH : LOW); + } +} diff --git a/lib/libssd1306/src/intf/spi/ssd1306_spi.h b/lib/libssd1306/src/intf/spi/ssd1306_spi.h new file mode 100644 index 0000000..555e534 --- /dev/null +++ b/lib/libssd1306/src/intf/spi/ssd1306_spi.h @@ -0,0 +1,85 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_spi.h SSD1306 spi communication functions + */ + +#ifndef _SSD1306_SPI_H_ +#define _SSD1306_SPI_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * chip enable pin to controll lcd display over spi + */ +extern int8_t s_ssd1306_cs; + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * data/command control pin for spi interface of lcd display + */ +extern int8_t s_ssd1306_dc; + +/** + * @ingroup LCD_HW_INTERFACE_API + * maximum SPI clock, supported by OLED display + */ +extern uint32_t s_ssd1306_spi_clock; + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Inits lcd interface to use hardware spi for communication. + * The function automatically selects available type of spi implementation + * 1. SPI library (ssd1306_spiInit_hw()) + * @param cesPin - pin, controlling chip enable of LCD + * @param dcPin - pin, controlling data/command mode of LCD + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_spiInit(int8_t cesPin, int8_t dcPin); + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Switches spi to data(1) or command(0) mode. + * @param mode - 1 data mode + * 0 command mode + */ +void ssd1306_spiDataMode(uint8_t mode); + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _SSD1306_SPI_H_ diff --git a/lib/libssd1306/src/intf/spi/ssd1306_spi_avr.c b/lib/libssd1306/src/intf/spi/ssd1306_spi_avr.c new file mode 100644 index 0000000..0b329ea --- /dev/null +++ b/lib/libssd1306/src/intf/spi/ssd1306_spi_avr.c @@ -0,0 +1,150 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_spi_avr.h" +#include "ssd1306_spi.h" + +#include "intf/ssd1306_interface.h" +#include "lcd/lcd_common.h" +#include "ssd1306_hal/io.h" + +#if defined(CONFIG_AVR_SPI_AVAILABLE) && defined(CONFIG_AVR_SPI_ENABLE) + +#include <stdlib.h> + +#define PORT_SPI PORTB +#define DDR_SPI DDRB + +#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) + #define DD_MISO DDB3 + #define DD_MOSI DDB2 + #define DD_SCK DDB1 + #define DD_SS DDB0 +#else + #define DD_MISO DDB4 + #define DD_MOSI DDB3 + #define DD_SCK DDB5 + #define DD_SS DDB2 +#endif + +#define SPI_CLOCK_MASK 0x03 +#define SPI_2XCLOCK_MASK 0x01 + +extern uint32_t s_ssd1306_spi_clock; + +static void ssd1306_spiConfigure_avr() +{ + uint8_t clockDiv; + uint32_t clockSetting = F_CPU / 2; + clockDiv = 0; + while ((clockDiv < 6) && (s_ssd1306_spi_clock < clockSetting)) + { + clockSetting /= 2; + clockDiv++; + } + if (clockDiv == 6) + { + clockDiv = 7; + } + // Invert the SPI2X bit + clockDiv ^= 0x1; + + // SS pin must be HIGH, when enabling MASTER SPI mode + // Otherwise, SPI will drop automatically to SLAVE mode + DDR_SPI &= ~((1<<DD_SCK)|(1<<DD_SS)|(1<<DD_MOSI)); + PORT_SPI |= (1<<DD_SS); + /* Define the following pins as output */ + DDR_SPI |= ((1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS)); + PORT_SPI |= (1<<DD_SS); + + SPCR = (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)| + ((clockDiv >> 1) & SPI_CLOCK_MASK); + SPSR = clockDiv & SPI_2XCLOCK_MASK; // Double Clock Rate + // Wait for some time to give SPI HW module to initialize + delay(10); +} + +static void ssd1306_spiClose_avr() +{ +} + +static void ssd1306_spiStart_avr() +{ + if (s_ssd1306_cs >= 0) + { + digitalWrite(s_ssd1306_cs,LOW); + } +} + +static void ssd1306_spiSendByte_avr(uint8_t data) +{ + SPDR = data; + asm volatile("nop"); + while((SPSR & (1<<SPIF))==0); +} + +static void ssd1306_spiSendBytes_avr(const uint8_t * buffer, uint16_t size) +{ + while (size--) + { + SPDR = *buffer; + asm volatile("nop"); // to improve speed + while((SPSR & (1<<SPIF))==0); + SPDR; // read SPI input + buffer++; + } +} + +static void ssd1306_spiStop_avr() +{ + if (ssd1306_lcd.type == LCD_TYPE_PCD8544) + { + digitalWrite(s_ssd1306_dc, LOW); + ssd1306_spiSendByte_avr( 0x00 ); // Send NOP command to allow last data byte to pass (bug in PCD8544?) + // ssd1306 E3h is NOP command + } + if (s_ssd1306_cs >= 0) + { + digitalWrite(s_ssd1306_cs, HIGH); + } +} + +void ssd1306_spiInit_avr(int8_t cesPin, int8_t dcPin) +{ + if (cesPin >=0) pinMode(cesPin, OUTPUT); + if (dcPin >= 0) pinMode(dcPin, OUTPUT); + if (cesPin) s_ssd1306_cs = cesPin; + if (dcPin) s_ssd1306_dc = dcPin; + ssd1306_intf.spi = 1; + ssd1306_spiConfigure_avr(); + ssd1306_intf.start = ssd1306_spiStart_avr; + ssd1306_intf.stop = ssd1306_spiStop_avr; + ssd1306_intf.send = ssd1306_spiSendByte_avr; + ssd1306_intf.send_buffer = ssd1306_spiSendBytes_avr; + ssd1306_intf.close = ssd1306_spiClose_avr; +} + +#endif + + diff --git a/lib/libssd1306/src/intf/spi/ssd1306_spi_avr.h b/lib/libssd1306/src/intf/spi/ssd1306_spi_avr.h new file mode 100644 index 0000000..af2e8fb --- /dev/null +++ b/lib/libssd1306/src/intf/spi/ssd1306_spi_avr.h @@ -0,0 +1,60 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_spi_avr.h SSD1306 AVR spi communication functions + */ + +#ifndef _SSD1306_AVR_SPI_H_ +#define _SSD1306_AVR_SPI_H_ + +#include "ssd1306_spi_conf.h" +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(CONFIG_AVR_SPI_AVAILABLE) && defined(CONFIG_AVR_SPI_ENABLE) + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Inits lcd interface to use hardware SPI for communication (SPI.h library). + * It uses standard MOSI, SCLK pins to send data to LCD. + * @param cesPin - pin, controlling chip enable of LCD + * @param dcPin - pin, controlling data/command mode of LCD + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_spiInit_avr(int8_t cesPin, int8_t dcPin); + +#endif + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _SSD1306_AVR_SPI_H_ diff --git a/lib/libssd1306/src/intf/spi/ssd1306_spi_conf.h b/lib/libssd1306/src/intf/spi/ssd1306_spi_conf.h new file mode 100644 index 0000000..16eabdc --- /dev/null +++ b/lib/libssd1306/src/intf/spi/ssd1306_spi_conf.h @@ -0,0 +1,34 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_spi_conf.h SSD1306 library basic spi definitions. Only for compatibility + */ + +#ifndef _SSD1306_SPI_CONF_H_ +#define _SSD1306_SPI_CONF_H_ + +// TODO: Remove this module completely + +#endif diff --git a/lib/libssd1306/src/intf/spi/ssd1306_spi_usi.c b/lib/libssd1306/src/intf/spi/ssd1306_spi_usi.c new file mode 100644 index 0000000..a0fc066 --- /dev/null +++ b/lib/libssd1306/src/intf/spi/ssd1306_spi_usi.c @@ -0,0 +1,136 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_spi_usi.h" +#include "ssd1306_spi.h" + +#include "intf/ssd1306_interface.h" +#include "lcd/lcd_common.h" +#include "ssd1306_hal/io.h" + +#if defined(CONFIG_USI_SPI_AVAILABLE) && defined(CONFIG_USI_SPI_ENABLE) + +#include <stdlib.h> +#include <util/atomic.h> + +#define PORT_SPI PORTB +#define DDR_SPI DDRB +#define DD_DI DDB0 +#define DD_DO DDB1 +#define DD_SCK DDB2 + +static void ssd1306_spiConfigure_Usi() +{ + DDR_SPI |= (1<<DD_DO); // as output (DO) - data out + DDR_SPI |= (1<<DD_SCK); // as output (USISCK) - clock + /* DI pin is still used by USI, although ssd1306 library doesn't need it */ +// DDR_SPI &= ~(1<<DD_DI); // as input (DI) - data in +// PORT_SPI|= (1<<DD_DI); // pullup on (DI) +} + +static void ssd1306_spiClose_Usi() +{ +} + +static void ssd1306_spiStart_Usi() +{ + if (s_ssd1306_cs >= 0) + { + digitalWrite(s_ssd1306_cs,LOW); + } + USICR = (0<<USIWM1) | (1<<USIWM0) | + (1<<USICS1) | (0<<USICS0) | (1<<USICLK); +} + +static void ssd1306_spiSendByte_Usi(uint8_t data) +{ + USIDR = data; + USISR = (1<<USIOIF); + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + while ( (USISR & (1<<USIOIF)) == 0 ) + { + USICR |= (1<<USITC); + } + } +} + +static void ssd1306_spiSendBytes_Usi(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + USIDR = *buffer; + USISR = (1<<USIOIF); + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + while ( (USISR & (1<<USIOIF)) == 0 ) + { + USICR |= (1<<USITC); + } + } + buffer++; + }; +} + +static void ssd1306_spiStop_Usi() +{ + if (s_ssd1306_cs >= 0) + { + digitalWrite(s_ssd1306_cs, HIGH); + } + if (ssd1306_lcd.type == LCD_TYPE_PCD8544) + { + digitalWrite(s_ssd1306_dc, LOW); + ssd1306_spiSendByte_Usi( 0x00 ); // Send NOP command to allow last data byte to pass (bug in PCD8544?) + // ssd1306 E3h is NOP command + } +// USICR &= ~((1<<USIWM1) | (1<<USIWM0)); +} + +void ssd1306_spiInit_Usi(int8_t cesPin, int8_t dcPin) +{ + if (cesPin >=0) + { + pinMode(cesPin, OUTPUT); + digitalWrite(cesPin, HIGH); + } + if (dcPin >= 0) pinMode(dcPin, OUTPUT); + if ((cesPin >= 0) || (dcPin >= 0)) + { + /* Even if CS pin is not used we need still to set it to value passed to the function */ + s_ssd1306_cs = cesPin; + s_ssd1306_dc = dcPin; + } + ssd1306_spiConfigure_Usi(); + ssd1306_intf.spi = 1; + ssd1306_intf.start = ssd1306_spiStart_Usi; + ssd1306_intf.stop = ssd1306_spiStop_Usi; + ssd1306_intf.send = ssd1306_spiSendByte_Usi; + ssd1306_intf.send_buffer = ssd1306_spiSendBytes_Usi; + ssd1306_intf.close = ssd1306_spiClose_Usi; +} + +#endif + + diff --git a/lib/libssd1306/src/intf/spi/ssd1306_spi_usi.h b/lib/libssd1306/src/intf/spi/ssd1306_spi_usi.h new file mode 100644 index 0000000..3a99197 --- /dev/null +++ b/lib/libssd1306/src/intf/spi/ssd1306_spi_usi.h @@ -0,0 +1,60 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_spi_usi.h SSD1306 SPI USI communication functions + */ + +#ifndef _SSD1306_SPI_USI_H_ +#define _SSD1306_SPI_USI_H_ + +#include "ssd1306_spi_conf.h" +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(CONFIG_USI_SPI_AVAILABLE) && defined(CONFIG_USI_SPI_ENABLE) + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Inits lcd interface to use USI for SPI communication. + * It uses standard USI CLK, USI DO, USI DI pins to send data to LCD. + * @param cesPin - pin, controlling chip enable of LCD + * @param dcPin - pin, controlling data/command mode of LCD + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_spiInit_Usi(int8_t cesPin, int8_t dcPin); + +#endif + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _SSD1306_SPI_USI_H_ diff --git a/lib/libssd1306/src/intf/ssd1306_interface.c b/lib/libssd1306/src/intf/ssd1306_interface.c new file mode 100644 index 0000000..0dcd3a1 --- /dev/null +++ b/lib/libssd1306/src/intf/ssd1306_interface.c @@ -0,0 +1,68 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_interface.h" +#include "spi/ssd1306_spi.h" +#include <stddef.h> + +static void ssd1306_send_buffer_generic(const uint8_t* buffer, uint16_t size); + +ssd1306_interface_t ssd1306_intf = +{ + .send_buffer = ssd1306_send_buffer_generic +}; + +void ssd1306_commandStart(void) +{ + ssd1306_intf.start(); + if (ssd1306_intf.spi) + ssd1306_spiDataMode(0); + else + ssd1306_intf.send(0x00); +} + +void ssd1306_dataStart(void) +{ + ssd1306_intf.start(); + if (ssd1306_intf.spi) + ssd1306_spiDataMode(1); + else + ssd1306_intf.send(0x40); +} + +void ssd1306_sendCommand(uint8_t command) +{ + ssd1306_commandStart(); + ssd1306_intf.send(command); + ssd1306_intf.stop(); +} + +void ssd1306_send_buffer_generic(const uint8_t* buffer, uint16_t size) +{ + while (size--) + { + ssd1306_intf.send(*buffer); + buffer++; + } +} diff --git a/lib/libssd1306/src/intf/ssd1306_interface.h b/lib/libssd1306/src/intf/ssd1306_interface.h new file mode 100644 index 0000000..0986b94 --- /dev/null +++ b/lib/libssd1306/src/intf/ssd1306_interface.h @@ -0,0 +1,152 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_interface.h SSD1306 interface functions. + */ + + +#ifndef _SSD1306_INTERFACE_H_ +#define _SSD1306_INTERFACE_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup LCD_HW_INTERFACE_API I2C/SPI: physical interface functions + * @{ + * + * @brief i2c/spi initialization functions for different platforms + * + * @details This group of API functions serves to prepare the library to work via specific hardware + * interface. There are a bunch of functions for different platforms. In general display + * initialization goes in two steps: hardware interface initialization, and then display + * driver initialization. But there are functions, which combine 2 steps in single call: + * ssd1306_128x64_i2c_initEx(), ssd1351_128x128_spi_init(), etc. + */ + +/** Describes low level hardware API */ +typedef struct +{ + /** + * Indicates if spi or i2c interface is used. + */ + uint8_t spi; + /** + * Starts communication with SSD1306 display. + */ + void (*start)(void); + /** + * Ends communication with SSD1306 display. + */ + void (*stop)(void); + /** + * Sends byte to SSD1306 device + * @param data - byte to send + */ + void (*send)(uint8_t data); + /** + * @brief Sends bytes to SSD1306 device + * + * Sends bytes to SSD1306 device. This functions gives + * ~ 30% performance increase than ssd1306_intf.send. + * + * @param buffer - bytes to send + * @param size - number of bytes to send + */ + void (*send_buffer)(const uint8_t *buffer, uint16_t size); + /** + * @brief deinitializes internal resources, allocated for interface. + * + * Deinitializes internal resources, allocated for interface. + * There is no need to use this function for microcontrollers. In general + * the function has meaning in Linux-like systems. + */ + void (*close)(void); +} ssd1306_interface_t; + +/** + * Holds pointers to functions of currently initialized interface. + */ +extern ssd1306_interface_t ssd1306_intf; + +/** + * Deprecated + */ +#define ssd1306_dcQuickSwitch ssd1306_intf.spi + +/** + * Deprecated + */ +#define ssd1306_startTransmission ssd1306_intf.start + +/** + * Deprecated + */ +#define ssd1306_endTransmission ssd1306_intf.stop + +/** + * Deprecated + */ +#define ssd1306_sendByte ssd1306_intf.send + +/** + * Deprecated + */ +#define ssd1306_sendBytes ssd1306_intf.send_buffer + +/** + * Deprecated + */ +#define ssd1306_closeInterface ssd1306_intf.close + +/** + * Sends command to SSD1306 device: includes initiating of + * transaction, sending data and completing transaction. + * @param command - command to send + */ +void ssd1306_sendCommand(uint8_t command); + +/** + * Starts transaction for sending commands. + */ +void ssd1306_commandStart(void); + +/** + * Starts transaction for sending bitmap data. + */ +void ssd1306_dataStart(void); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _SSD1306_INTERFACE_H_ diff --git a/lib/libssd1306/src/intf/uart/ssd1306_uart_builtin.c b/lib/libssd1306/src/intf/uart/ssd1306_uart_builtin.c new file mode 100644 index 0000000..20cc85a --- /dev/null +++ b/lib/libssd1306/src/intf/uart/ssd1306_uart_builtin.c @@ -0,0 +1,75 @@ +/* + MIT License + + Copyright (c) 2016-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + + +#include "ssd1306_uart_builtin.h" +#include "intf/ssd1306_interface.h" + +#include "ssd1306_hal/io.h" + +#if defined(CONFIG_AVR_UART_AVAILABLE) && defined(CONFIG_AVR_UART_ENABLE) + +#include "ssd1306_uart.h" + +static void ssd1306_uartStart(void) +{ +} + +static void ssd1306_uartStop(void) +{ + uart_send_byte(0x7E); +} + +static void ssd1306_uartSendByte(uint8_t data) +{ + if ((data == 0x7E) || (data == 0x7D)) + { + uart_send_byte(0x7D); + data ^= 0x20; + } + uart_send_byte(data); +} + +static void ssd1306_uartSendBytes(const uint8_t * buffer, uint16_t len) +{ + while (len--) + { + ssd1306_uartSendByte(*buffer); + buffer++; + } +} + +void ssd1306_uartInit_Builtin(uint32_t baud) +{ + if (!baud) baud = 115200; + uart_init(baud); + ssd1306_intf.spi = 0; + ssd1306_intf.start = ssd1306_uartStart; + ssd1306_intf.stop = ssd1306_uartStop; + ssd1306_intf.send = ssd1306_uartSendByte; + ssd1306_intf.send_buffer = ssd1306_uartSendBytes; + ssd1306_intf.close = ssd1306_uartStart; +} + +#endif diff --git a/lib/libssd1306/src/intf/uart/ssd1306_uart_builtin.h b/lib/libssd1306/src/intf/uart/ssd1306_uart_builtin.h new file mode 100644 index 0000000..645a8c9 --- /dev/null +++ b/lib/libssd1306/src/intf/uart/ssd1306_uart_builtin.h @@ -0,0 +1,59 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_uart_builtin.h embedded SSD1306 uart communication functions + */ + +#ifndef _SSD1306_UART_BUILTIN_H_ +#define _SSD1306_UART_BUILTIN_H_ + +#include "ssd1306_hal/io.h" + +#if defined(CONFIG_AVR_UART_AVAILABLE) && defined(CONFIG_AVR_UART_ENABLE) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_HW_INTERFACE_API + * + * Initializes built-in implementation of uart functions, based on USART hw module. + * If you do not know uart parameters, try ssd1306_uartInit_Builtin(0). + * @param baud uart baud rate + * + * @note: after call to this function you need to initialize lcd display. + */ +void ssd1306_uartInit_Builtin(uint32_t baud); + +#ifdef __cplusplus +} +#endif + +#endif + +#endif /* _SSD1306_UART_BUILTIN_H_ */ + + diff --git a/lib/libssd1306/src/intf/vga/atmega328p/vga128x64.c b/lib/libssd1306/src/intf/vga/atmega328p/vga128x64.c new file mode 100644 index 0000000..9cdfae0 --- /dev/null +++ b/lib/libssd1306/src/intf/vga/atmega328p/vga128x64.c @@ -0,0 +1,243 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "intf/vga/vga.h" +// Never include vga128x64_isr.h here!!! +#include "intf/ssd1306_interface.h" +#include "lcd/lcd_common.h" +#include "lcd/vga_commands.h" + +#if defined(CONFIG_VGA_AVAILABLE) && defined(CONFIG_VGA_ENABLE) && defined(__AVR_ATmega328P__) + +extern uint16_t ssd1306_color; + +/* This buffer fits 128x64 pixels + Each 8 pixels are packed to 3 bytes: + + BYTE1: B7 R2 G2 B2 B8 R1 G1 B1 + BYTE2: G7 R4 G4 B4 G8 R3 G3 B3 + BYTE3: R7 R6 G6 B6 R8 R5 G5 B5 + + Yeah, a little bit complicated, but this allows to quickly unpack structure +*/ + +// Set to ssd1306 compatible mode by default +static uint8_t s_mode = 0x01; +static uint8_t s_vga_command = 0xFF; +static uint8_t s_vga_arg = 0; +static uint8_t s_column = 0; +static uint8_t s_column_end = 0; +static uint8_t s_cursor_x = 0; +static uint8_t s_cursor_y = 0; +volatile uint8_t s_vga_frames; + +static void vga_controller_init(void) +{ + s_vga_command = 0xFF; +} + +static void vga_controller_stop(void) +{ + s_vga_command = 0xFF; +} + +static void vga_controller_close(void) +{ +} + +/* + * Function sends 8 vertical pixels to buffer + */ +static inline void vga_controller_put_pixels(uint8_t x, uint8_t y, uint8_t pixels) +{ + uint16_t addr = (x >> 3) + (uint16_t)(y * 16); + uint8_t offset = x & 0x07; + uint8_t mask = 1 << offset; + if (addr >= 16*64) + { + return; + } + for (uint8_t i=8; i>0; i--) + { + if (pixels & 0x01) __vga_buffer[addr] |= mask; + else __vga_buffer[addr] &= ~mask; + addr += 16; + pixels >>= 1; + } +} + +static void vga_controller_send_byte(uint8_t data) +{ + if (s_vga_command == 0xFF) + { + s_vga_command = data; + return; + } + if (s_vga_command == 0x40) + { + vga_controller_put_pixels(s_cursor_x, s_cursor_y, data); + s_cursor_x++; + if (s_cursor_x > s_column_end) + { + s_cursor_x = s_column; + s_cursor_y += 8; + } + return; + } + // command mode + if (!s_vga_command) + { + s_vga_command = data; + s_vga_arg = 0; + } + if (s_vga_command == VGA_SET_BLOCK) + { + // set block + if (s_vga_arg == 1) + { + s_column = data >= ssd1306_lcd.width ? ssd1306_lcd.width - 1 : data ; + s_cursor_x = s_column; + } + if (s_vga_arg == 2) { s_column_end = data >= ssd1306_lcd.width ? ssd1306_lcd.width - 1 : data; } + if (s_vga_arg == 3) { s_cursor_y = (data << 3); } + if (s_vga_arg == 4) { s_vga_command = 0; } + } + if (s_vga_command == VGA_SET_MODE) + { + if (s_vga_arg == 1) { s_mode = data; s_vga_command = 0; } + } + s_vga_arg++; +} + +static void vga_controller_send_bytes(const uint8_t *buffer, uint16_t len) +{ + while (len--) + { + ssd1306_intf.send(*buffer); + buffer++; + } +} + +static inline void init_vga_crt_driver(uint8_t enable_jitter_fix) +{ + cli(); + if (enable_jitter_fix) + { + // Configure Timer 0 to calculate jitter fix + TIMSK0=0; + TCCR0A=0; + TCCR0B=1; + OCR0A=0; + OCR0B=0; + TCNT0=0; + } + else + { + // Sorry, we still need to disable timer0 interrupts to avoid wake up in sleep mode + TIMSK0 &= ~(1<<TOIE0); + } + + // Timer 1 - vertical sync pulses + pinMode (V_SYNC_PIN, OUTPUT); + TCCR1A=(1<<WGM10) | (1<<WGM11) | (1<<COM1B1); + TCCR1B=(1<<WGM12) | (1<<WGM13) | (1<<CS12) | (1<<CS10); //1024 prescaler + OCR1A = 259; // 16666 / 64 us = 260 (less one) + OCR1B = 0; // 64 / 64 us = 1 (less one) + TIFR1 = (1<<TOV1); // clear overflow flag + TIMSK1 = (1<<TOIE1); // interrupt on overflow on timer 1 + + // Timer 2 - horizontal sync pulses + pinMode (H_SYNC_PIN, OUTPUT); + TCCR2A=(1<<WGM20) | (1<<WGM21) | (1<<COM2B1); //pin3=COM2B1 + TCCR2B=(1<<WGM22) | (1<<CS21); //8 prescaler + OCR2A = 63; // 32 / 0.5 us = 64 (less one) + OCR2B = 7; // 4 / 0.5 us = 8 (less one) +// if (enable_jitter_fix) + { + TIFR2 = (1<<OCF2B); // on end of h-sync pulse + TIMSK2 = (1<<OCIE2B); // on end of h-sync pulse + } +// else +// { +// TIFR2 = (1<<TOV2); // int on start of h-sync pulse +// TIMSK2 = (1<<TOIE2); // int on start of h-sync pulse +// } + + // Set up USART in SPI mode (MSPIM) + + pinMode(14, OUTPUT); + pinMode(15, OUTPUT); + pinMode(16, OUTPUT); + PORTC = 0; + + sei(); +} + +void ssd1306_vga_controller_128x64_init_no_output(void) +{ + ssd1306_intf.spi = 0; + ssd1306_intf.start = vga_controller_init; + ssd1306_intf.stop = vga_controller_stop; + ssd1306_intf.send = vga_controller_send_byte; + ssd1306_intf.send_buffer = vga_controller_send_bytes; + ssd1306_intf.close = vga_controller_close; +} + +void ssd1306_vga_controller_128x64_init_enable_output(void) +{ + ssd1306_vga_controller_128x64_init_no_output(); + init_vga_crt_driver(1); +} + +void ssd1306_vga_controller_128x64_init_enable_output_no_jitter_fix(void) +{ + ssd1306_vga_controller_128x64_init_no_output(); + init_vga_crt_driver(0); +// set_sleep_mode (SLEEP_MODE_IDLE); +} + +void ssd1306_debug_print_vga_buffer_128x64(void (*func)(uint8_t)) +{ + for(int y = 0; y < ssd1306_lcd.height; y++) + { + for(int x = 0; x < ssd1306_lcd.width; x++) + { + uint8_t color = __vga_buffer[(x >> 3) + y * 16] & (1<< (x&0x07)); + if (color) + { + func('#'); + func('#'); + } + else + { + func(' '); + func(' '); + } + } + func('\n'); + } + func('\n'); +} + +#endif diff --git a/lib/libssd1306/src/intf/vga/atmega328p/vga96x40.c b/lib/libssd1306/src/intf/vga/atmega328p/vga96x40.c new file mode 100644 index 0000000..550ca7a --- /dev/null +++ b/lib/libssd1306/src/intf/vga/atmega328p/vga96x40.c @@ -0,0 +1,292 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "intf/vga/vga.h" +// Never include vga96x40_isr.h here!!! +#include "intf/ssd1306_interface.h" +#include "lcd/lcd_common.h" +#include "lcd/vga_commands.h" + +#if defined(CONFIG_VGA_AVAILABLE) && defined(CONFIG_VGA_ENABLE) && defined(__AVR_ATmega328P__) + +extern uint16_t ssd1306_color; + +/* This buffer fits 96x40 pixels + Each 8 pixels are packed to 3 bytes: + + BYTE1: B7 R2 G2 B2 B8 R1 G1 B1 + BYTE2: G7 R4 G4 B4 G8 R3 G3 B3 + BYTE3: R7 R6 G6 B6 R8 R5 G5 B5 + + Yeah, a little bit complicated, but this allows to quickly unpack structure +*/ + +// Set to ssd1306 compatible mode by default +static uint8_t s_mode = 0x01; +static uint8_t s_vga_command = 0xFF; +static uint8_t s_vga_arg = 0; +static uint8_t s_column = 0; +static uint8_t s_column_end = 0; +static uint8_t s_cursor_x = 0; +static uint8_t s_cursor_y = 0; +volatile uint8_t s_vga_frames; + +static void vga_controller_init(void) +{ + s_vga_command = 0xFF; +} + +static void vga_controller_stop(void) +{ + s_vga_command = 0xFF; +} + +static void vga_controller_close(void) +{ +} + +/* This buffer fits 96x40 pixels + Each 8 pixels are packed to 3 bytes: + + BYTE1: B7 R2 G2 B2 B8 R1 G1 B1 + BYTE2: G7 R4 G4 B4 G8 R3 G3 B3 + BYTE3: R7 R6 G6 B6 R8 R5 G5 B5 + + Yeah, a little bit complicated, but this allows to quickly unpack structure +*/ +static inline void vga_controller_put_pixel3(uint8_t x, uint8_t y, uint8_t color) +{ + uint16_t addr = (x >> 3)*3 + (uint16_t)y*36; + uint8_t offset = x & 0x07; + if (addr >= 36*40) + { + return; + } + if (offset < 6) + { + if (x&1) + { + __vga_buffer[addr + (offset>>1)] &= 0x8F; + __vga_buffer[addr + (offset>>1)] |= (color<<4); + } + else + { + __vga_buffer[addr + (offset>>1)] &= 0xF8; + __vga_buffer[addr + (offset>>1)] |= color; + } + } + else if (offset == 6) + { + __vga_buffer[addr+0] &= 0x7F; + __vga_buffer[addr+0] |= ((color & 0x01) << 7); + __vga_buffer[addr+1] &= 0x7F; + __vga_buffer[addr+1] |= ((color & 0x02) << 6); + __vga_buffer[addr+2] &= 0x7F; + __vga_buffer[addr+2] |= ((color & 0x04) << 5); + } + else // if (offset == 7) + { + __vga_buffer[addr+0] &= 0xF7; + __vga_buffer[addr+0] |= ((color & 0x01) << 3); + __vga_buffer[addr+1] &= 0xF7; + __vga_buffer[addr+1] |= ((color & 0x02) << 2); + __vga_buffer[addr+2] &= 0xF7; + __vga_buffer[addr+2] |= ((color & 0x04) << 1); + } +} + +static void vga_controller_send_byte4(uint8_t data) +{ + if (s_vga_command == 0xFF) + { + s_vga_command = data; + return; + } + if (s_vga_command == 0x40) + { + uint8_t color = ((data & 0x80) >> 5) | ((data & 0x10) >> 3) | ((data & 0x02)>>1); + vga_controller_put_pixel3(s_cursor_x, s_cursor_y, color); + if (s_mode == 0x00) + { + s_cursor_x++; + if (s_cursor_x > s_column_end) + { + s_cursor_x = s_column; + s_cursor_y++; + } + } + else + { + s_cursor_y++; + if ((s_cursor_y & 0x07) == 0) + { + s_cursor_y -= 8; + s_cursor_x++; + } + } + return; + } + // command mode + if (!s_vga_command) + { + s_vga_command = data; + s_vga_arg = 0; + } + if (s_vga_command == VGA_SET_BLOCK) + { + // set block + if (s_vga_arg == 1) { s_column = data; s_cursor_x = data; } + if (s_vga_arg == 2) { s_column_end = data; } + if (s_vga_arg == 3) { s_cursor_y = data; } + if (s_vga_arg == 4) { s_vga_command = 0; } + } + if (s_vga_command == VGA_SET_MODE) + { + if (s_vga_arg == 1) { s_mode = data; s_vga_command = 0; } + } + s_vga_arg++; +} + +static void vga_controller_send_bytes(const uint8_t *buffer, uint16_t len) +{ + while (len--) + { + ssd1306_intf.send(*buffer); + buffer++; + } +} + +static inline void init_vga_crt_driver(uint8_t enable_jitter_fix) +{ + cli(); + if (enable_jitter_fix) + { + // Configure Timer 0 to calculate jitter fix + TIMSK0=0; + TCCR0A=0; + TCCR0B=1; + OCR0A=0; + OCR0B=0; + TCNT0=0; + } + else + { + // Sorry, we still need to disable timer0 interrupts to avoid wake up in sleep mode + TIMSK0 &= ~(1<<TOIE0); + } + + // Timer 1 - vertical sync pulses + pinMode (V_SYNC_PIN, OUTPUT); + TCCR1A=(1<<WGM10) | (1<<WGM11) | (1<<COM1B1); + TCCR1B=(1<<WGM12) | (1<<WGM13) | (1<<CS12) | (1<<CS10); //1024 prescaler + OCR1A = 259; // 16666 / 64 us = 260 (less one) + OCR1B = 0; // 64 / 64 us = 1 (less one) + TIFR1 = (1<<TOV1); // clear overflow flag + TIMSK1 = (1<<TOIE1); // interrupt on overflow on timer 1 + + // Timer 2 - horizontal sync pulses + pinMode (H_SYNC_PIN, OUTPUT); + TCCR2A=(1<<WGM20) | (1<<WGM21) | (1<<COM2B1); //pin3=COM2B1 + TCCR2B=(1<<WGM22) | (1<<CS21); //8 prescaler + OCR2A = 63; // 32 / 0.5 us = 64 (less one) + OCR2B = 7; // 4 / 0.5 us = 8 (less one) +// if (enable_jitter_fix) + { + TIFR2 = (1<<OCF2B); // on end of h-sync pulse + TIMSK2 = (1<<OCIE2B); // on end of h-sync pulse + } +// else +// { +// TIFR2 = (1<<TOV2); // int on start of h-sync pulse +// TIMSK2 = (1<<TOIE2); // int on start of h-sync pulse +// } + + // Set up USART in SPI mode (MSPIM) + + pinMode(14, OUTPUT); + pinMode(15, OUTPUT); + pinMode(16, OUTPUT); + PORTC = 0; + + sei(); +} + +void ssd1306_vga_controller_96x40_init_no_output(void) +{ + ssd1306_intf.spi = 0; + ssd1306_intf.start = vga_controller_init; + ssd1306_intf.stop = vga_controller_stop; + ssd1306_intf.send = vga_controller_send_byte4; + ssd1306_intf.send_buffer = vga_controller_send_bytes; + ssd1306_intf.close = vga_controller_close; +} + +void ssd1306_vga_controller_96x40_init_enable_output(void) +{ + ssd1306_vga_controller_96x40_init_no_output(); + init_vga_crt_driver(1); +} + +void ssd1306_vga_controller_96x40_init_enable_output_no_jitter_fix(void) +{ + ssd1306_vga_controller_96x40_init_no_output(); + init_vga_crt_driver(0); +// set_sleep_mode (SLEEP_MODE_IDLE); +} + +void ssd1306_debug_print_vga_buffer_96x40(void (*func)(uint8_t)) +{ + for(int y = 0; y < ssd1306_lcd.height; y++) + { + for(int x = 0; x < ssd1306_lcd.width; x++) + { + uint8_t color = (__vga_buffer[(y*ssd1306_lcd.width + x)/2] >> ((x&1)<<2)) & 0x0F; + if (color) + { + func('#'); + func('#'); + } + else + { + func(' '); + func(' '); + } + } + func('\n'); + } + func('\n'); +} + +void ssd1306_vga_delay(uint32_t ms) +{ + while (ms >= 16) + { + uint8_t vga_frames; + vga_frames = s_vga_frames; + while (vga_frames == s_vga_frames); + ms-=16; + } +} + +#endif diff --git a/lib/libssd1306/src/intf/vga/atmega328p/vga_isr.h b/lib/libssd1306/src/intf/vga/atmega328p/vga_isr.h new file mode 100644 index 0000000..51516c4 --- /dev/null +++ b/lib/libssd1306/src/intf/vga/atmega328p/vga_isr.h @@ -0,0 +1,312 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file vga_isr.h VGA ISR code to communicate with VGA-monitor from the sketch directly + * + * @details Please, include this file only once in your sketch, if you want to control + * vga monitor directly from your sketch. + * This header supports different modes: VGA_CONTROLLER_DEBUG, SSD1306_VGA_SLEEP_MODE. + * If you want to use vga_controller module in debug mode without producing VGA output, + * define VGA_CONTROLLER_DEBUG before including this header. If you want to use library with + * AVR sleep mode, then jitter fix is not required, you will able to use TIMER0, so define + * SSD1306_VGA_SLEEP_MODE before including this header. + */ + +#ifndef _SSD1306_VGA_ATMEGA328P_ISR_H_ +#define _SSD1306_VGA_ATMEGA328P_ISR_H_ + +#include "intf/vga/vga.h" +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Including this header defines ISR handlers in your application automatically +#if defined(CONFIG_VGA_AVAILABLE) && defined(CONFIG_VGA_ENABLE) && defined(__AVR_ATmega328P__) + +#ifndef DEJITTER_OFFSET +#define DEJITTER_OFFSET -4 +#endif + +#if defined(CONFIG_VGA_128X64_ENABLE) + +static const uint16_t __VGA_VERTICAL_PIXELS = 64; +static const uint16_t __VGA_LINE_BYTES = 16; +static const uint16_t __VGA_PIXEL_HEIGHT = 7; +volatile uint8_t __vga_buffer[16*64] = {0}; +static const volatile uint8_t *__VGA_BUFFER_PTR = &__vga_buffer[0]; + +void ssd1306_vga_controller_128x64_init_no_output(void); +void ssd1306_vga_controller_128x64_init_enable_output(void); +void ssd1306_vga_controller_128x64_init_enable_output_no_jitter_fix(void); +void ssd1306_debug_print_vga_buffer_128x64(void (*func)(uint8_t)); + +#elif defined(CONFIG_VGA_96X40_ENABLE) + +static const uint16_t __VGA_VERTICAL_PIXELS = 40; +static const uint16_t __VGA_LINE_BYTES = 36; +static const uint16_t __VGA_PIXEL_HEIGHT = 10; +volatile uint8_t __vga_buffer[36*40] = {0}; +static const volatile uint8_t * __VGA_BUFFER_PTR = &__vga_buffer[0]; + +void ssd1306_vga_controller_96x40_init_no_output(void); +void ssd1306_vga_controller_96x40_init_enable_output(void); +void ssd1306_vga_controller_96x40_init_enable_output_no_jitter_fix(void); +void ssd1306_debug_print_vga_buffer_96x40(void (*func)(uint8_t)); + +#else + #error "Please, define one of VGA options" +#endif + +#if !defined(VGA_CONTROLLER_DEBUG) + +// Total number of lines used in specific scan mode +static const uint16_t VGA_TOTAL_MODE_LINES = __VGA_VERTICAL_PIXELS*__VGA_PIXEL_HEIGHT; + +// Lines to skip before starting to draw first line of the screen content +// This includes V-sync signal + front porch +static const uint8_t V_BACKPORCH_LINES = 40; + +// Lines to skip before starting to draw first line of the screen content +// This includes V-sync signal + front porch +volatile int s_current_scan_line; + +volatile uint8_t s_lines_to_skip; +volatile uint8_t s_scan_line_index; +volatile const uint8_t * volatile s_current_scan_line_data = __VGA_BUFFER_PTR; +extern volatile uint8_t s_vga_frames; +extern unsigned long timer0_millis; +// ISR: Vsync pulse +ISR(TIMER1_OVF_vect) +{ + s_current_scan_line = 0; + s_scan_line_index = 0; + s_current_scan_line_data = __VGA_BUFFER_PTR; + s_lines_to_skip = V_BACKPORCH_LINES; + s_vga_frames++; + timer0_millis += 16; +} // end of TIMER1_OVF_vect + +#if defined(CONFIG_VGA_128X64_ENABLE) +static inline void /*__attribute__ ((noinline))*/ do_scan_line() +{ + // output all pixels + + asm volatile( + ".rept 16\n\t" + + "ld r24, Z+\n\t" + "out %[port], r24\n\t" + "lsr r24\n\t" + "nop\n\t" + "out %[port], r24\n\t" + "lsr r24\n\t" + "out %[port], r24\n\t" + "lsr r24\n\t" + "nop\n\t" + "out %[port], r24\n\t" + "lsr r24\n\t" + "nop\n\t" + "out %[port], r24\n\t" + "lsr r24\n\t" + "nop\n\t" + "out %[port], r24\n\t" + "lsr r24\n\t" + "nop\n\t" + "out %[port], r24\n\t" + "lsr r24\n\t" + "nop\n\t" + "out %[port], r24\n\t" + + ".endr\n\t" + "nop\n\t" + "ldi r24,0\n\t" + "out %[port], r24 \n\t" + "nop\n\t" + : + : [port] "I" (_SFR_IO_ADDR(PORTC)), + "z" "I" ((uint8_t *)s_current_scan_line_data ) + : "r24", "memory" + ); +} +#elif defined(CONFIG_VGA_96X40_ENABLE) +static inline void /*__attribute__ ((noinline))*/ do_scan_line() +{ + // output all pixels + + asm volatile( + ".rept 12\n\t" + + "ld r24, Z+\n\t" // r24 = 82227111 +// "nop\n\t" // to make pixel wider in 96x40 mode + "out %[port], r24\n\t" // 111 + + "ld r25, Z+\n\t" // r25 = 84447333 + "swap r24\n\t" // r24 = 71118222 + "out %[port], r24\n\t" // 222 + + "andi r24, 0x88\n\t" // r24 = 70008000 + "ld r20, Z+\n\t" // r20 = 86667555 + "out %[port], r25\n\t" // 333 + + "swap r25\n\t" // r25 = 73338444 + "lsr r24\n\t" // r24 = 00080007 + "lsr r24\n\t" // r24 = 00800070 + "out %[port], r25\n\t" // 444 + + "andi r25, 0x88\n\t" // r25 = 70008000 + "lsr r24\n\t" // r24 = 08000700 + "lsr r25\n\t" // r25 = 00080007 + "out %[port], r20\n\t" // 555 + + "swap r20\n\t" // r20 = 75558666 + "lsr r25\n\t" // r25 = 00800070 + "or r24, r25\n\t" // r24 = 08800770 + "out %[port], r20\n\t" // 666 + + "andi r20, 0x88\n\t" // r20 = 70008000 + "lsr r20\n\t" // r20 = 00080007 b + "or r24, r20\n\t" // r24 = 08880777 rgb + "out %[port], r24\n\t" // 777 + + "swap r24\n\t" // r24 = 07770888 +// "nop\n\t" // to make pixel wider in 96x40 mode + "nop\n\t" + "out %[port], r24\n\t" // 888 + + ".endr\n\t" +// "nop\n\t" // to make pixel wider in 96x40 mode + "nop\n\t" + "ldi r24,0\n\t" + "out %[port], r24 \n\t" + "nop\n\t" + : + : [port] "I" (_SFR_IO_ADDR(PORTC)), + "z" "I" ((uint8_t *)s_current_scan_line_data ) + : "r24", "r25", "r20", "memory" + ); +} +#endif + +//#ifdef SSD1306_VGA_SLEEP_MODE +//ISR(TIMER2_OVF_vect) // for start of h-sync pulse +//#else +ISR(TIMER2_COMPB_vect) // for end of h-sync pulse +//#endif +{ + // ISR should work as fast as possible + if (s_lines_to_skip) + { + s_lines_to_skip--; + return; + } + else if (s_current_scan_line >= VGA_TOTAL_MODE_LINES) + { + return; + } + #ifndef SSD1306_VGA_SLEEP_MODE + // This is dejitter code, it purpose to start pixels output at the same offset after h-sync + asm volatile( + " lds r24, %[timer0] \n\t" // + " subi r24, %[toffset] \n\t" // some offset, calculated experimentally + " andi r24, 7 \n\t" // use module 8 value from Timer 0 counter + " ldi r31, pm_hi8(LW) \n\t" // load label address + " ldi r30, pm_lo8(LW) \n\t" // + " add r30, r24 \n\t" // no need to multiply by 2 since AVR addresses are half-values + " adc r31, __zero_reg__ \n\t" // + " ijmp \n\t" // + "LW: \n\t" // + " nop \n\t" // + " nop \n\t" // + " nop \n\t" // + " nop \n\t" // + " nop \n\t" // + " nop \n\t" // + " nop \n\t" // + : + : [timer0] "i" (&TCNT0), + [toffset] "i" ((uint8_t)DEJITTER_OFFSET) + : "r30", "r31", "r24", "r25"); + #endif + do_scan_line(); + s_current_scan_line++; + s_scan_line_index++; + if ( s_scan_line_index >= __VGA_PIXEL_HEIGHT ) + { + s_scan_line_index=0; + s_current_scan_line_data += __VGA_LINE_BYTES; + } +} + +#endif // VGA_CONTROLLER_DEBUG + +#if defined(CONFIG_VGA_128X64_ENABLE) + +static inline void ssd1306_vga_controller_init(void) +{ + // if there is no builtin support then only debug mode is available +#if defined(VGA_CONTROLLER_DEBUG) + ssd1306_vga_controller_128x64_init_no_output(); +#elif defined(SSD1306_VGA_SLEEP_MODE) + ssd1306_vga_controller_128x64_init_enable_output_no_jitter_fix(); +#else + ssd1306_vga_controller_128x64_init_enable_output(); +#endif +} + +void ssd1306_debug_print_vga_buffer(void (*func)(uint8_t)) +{ + ssd1306_debug_print_vga_buffer_128x64(func); +} + +#elif defined(CONFIG_VGA_96X40_ENABLE) + +static inline void ssd1306_vga_controller_init(void) +{ + // if there is no builtin support then only debug mode is available +#if defined(VGA_CONTROLLER_DEBUG) + ssd1306_vga_controller_96x40_init_no_output(); +#elif defined(SSD1306_VGA_SLEEP_MODE) + ssd1306_vga_controller_96x40_init_enable_output_no_jitter_fix(); +#else + ssd1306_vga_controller_96x40_init_enable_output(); +#endif +} + +void ssd1306_debug_print_vga_buffer(void (*func)(uint8_t)) +{ + ssd1306_debug_print_vga_buffer_96x40(func); +} + +#endif // CONFIG_VGA_XXX_ENABLE + +#endif // SSD1306_BUILTIN_VGA_SUPPORT + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/lib/libssd1306/src/intf/vga/esp32/CompositeOutput.cpp b/lib/libssd1306/src/intf/vga/esp32/CompositeOutput.cpp new file mode 100644 index 0000000..470eed5 --- /dev/null +++ b/lib/libssd1306/src/intf/vga/esp32/CompositeOutput.cpp @@ -0,0 +1,286 @@ +/* + * Credits to https://github.com/bitluni/ESP32CompositeVideo + */ + +#include "CompositeOutput.h" + +#if defined(CONFIG_VGA_AVAILABLE) && defined(CONFIG_VGA_ENABLE) && defined(__XTENSA__) + +#include "driver/i2s.h" + +#define I2S_VGA_SAMPLE_RATE (4000000) +static const i2s_port_t I2S_PORT = (i2s_port_t)I2S_NUM_0; + +const TechProperties PALProperties = { + .lineMicros = 64, + .syncMicros = 4.7, + .blankEndMicros = 10.4, + .backMicros = 1.65, + .shortVSyncMicros = 2.35, + .overscanLeftMicros = 1.6875, + .overscanRightMicros = 1.6875, + .syncVolts = -0.3, + .blankVolts = 0.0, + .blackVolts = 0.005,//specs 0.0, + .whiteVolts = 0.7, + .lines = 625, + .linesFirstTop = 23, + .linesOverscanTop = 9, + .linesOverscanBottom = 9, + .imageAspect = 4./3. +}; + +const TechProperties NTSCProperties = { + .lineMicros = 63.492, + .syncMicros = 4.7, + .blankEndMicros = 9.2, + .backMicros = 1.5, + .shortVSyncMicros = 2.3, + .overscanLeftMicros = 0,//1.3, + .overscanRightMicros = 0,//1, + .syncVolts = -0.286, + .blankVolts = 0.0, + .blackVolts = 0.05, //specs 0.054, + .whiteVolts = 0.714, + .lines = 525, + .linesFirstTop = 20, + .linesOverscanTop = 6, + .linesOverscanBottom = 9, + .imageAspect = 4./3. +}; + +CompositeOutput::CompositeOutput(Mode mode, double Vcc) + :properties((mode==NTSC) ? NTSCProperties: PALProperties) +{ + double dacPerVolt = 255.0 / Vcc; + levelSync = 0; + levelBlank = (properties.blankVolts - properties.syncVolts) * dacPerVolt + 0.5; + levelBlack = (properties.blackVolts - properties.syncVolts) * dacPerVolt + 0.5; + levelWhite = (properties.whiteVolts - properties.syncVolts) * dacPerVolt + 0.5; + grayValues = levelWhite - levelBlack + 1; +} + +void CompositeOutput::init(int xres, int yres, int bpp) +{ + const int LINES_SYNC_TOP = 5; + const int LINES_SYNC_BOTTOM = 3; + + m_buffer_width = xres; + m_buffer_height = yres; + m_bpp = bpp; + + linesOdd = properties.lines / 2; + linesEven = properties.lines - linesOdd; + linesEvenActive = linesEven - properties.linesFirstTop - LINES_SYNC_BOTTOM; + linesOddActive = linesOdd - properties.linesFirstTop - LINES_SYNC_BOTTOM; + linesEvenVisible = linesEvenActive - properties.linesOverscanTop - properties.linesOverscanBottom; + linesOddVisible = linesOddActive - properties.linesOverscanTop - properties.linesOverscanBottom; + + targetYresOdd = (yres / 2 < linesOddVisible) ? yres / 2 : linesOddVisible; + targetYresEven = (yres - targetYresOdd < linesEvenVisible) ? yres - targetYresOdd : linesEvenVisible; + targetYres = targetYresEven + targetYresOdd; + + linesEvenBlankTop = properties.linesFirstTop - LINES_SYNC_TOP + properties.linesOverscanTop + (linesEvenVisible - targetYresEven) / 2; + linesEvenBlankBottom = linesEven - linesEvenBlankTop - targetYresEven - LINES_SYNC_BOTTOM; + linesOddBlankTop = linesEvenBlankTop; + linesOddBlankBottom = linesOdd - linesOddBlankTop - targetYresOdd - LINES_SYNC_BOTTOM; + + double samplesPerSecond = I2S_VGA_SAMPLE_RATE; + double samplesPerMicro = samplesPerSecond * 0.000001; + m_samples_per_line = (int)(samplesPerMicro * properties.lineMicros + 1.5) & ~1; + samplesSync = samplesPerMicro * properties.syncMicros + 0.5; + samplesBlank = samplesPerMicro * (properties.blankEndMicros - properties.syncMicros + properties.overscanLeftMicros) + 0.5; + samplesBack = samplesPerMicro * (properties.backMicros + properties.overscanRightMicros) + 0.5; + samplesActive = m_samples_per_line - samplesSync - samplesBlank - samplesBack; + + targetXres = xres < samplesActive ? xres : samplesActive; + + samplesVSyncShort = samplesPerMicro * properties.shortVSyncMicros + 0.5; + + samplesBlackLeft = (samplesActive - targetXres) / 2; + samplesBlackRight = samplesActive - targetXres - samplesBlackLeft; + +// pixelAspect = (float(samplesActive) / (linesEvenVisible + linesOddVisible)) / properties.imageAspect; + + line = (uint16_t*)malloc(sizeof(uint16_t) * m_samples_per_line * 2); + m_ptr = line; + m_end = line + m_samples_per_line * 2; + + init_hardware(); +} + +void CompositeOutput::init_hardware() +{ + i2s_config_t i2s_config = { + .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN), + .sample_rate = I2S_VGA_SAMPLE_RATE, //not really used + .bits_per_sample = (i2s_bits_per_sample_t)I2S_BITS_PER_SAMPLE_16BIT, + .channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT, + .communication_format = I2S_COMM_FORMAT_I2S_MSB, + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, + .dma_buf_count = 2, + .dma_buf_len = m_samples_per_line //a buffer per line + }; + + i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL); //start i2s driver + i2s_set_pin(I2S_PORT, NULL); //use internal DAC + i2s_set_sample_rates(I2S_PORT, I2S_VGA_SAMPLE_RATE); //dummy sample rate, since the function fails at high values +} + +void CompositeOutput::fillValues(uint8_t value, int count) +{ + for(int j = 0; j < count; j++) + { + *m_ptr = ((uint16_t)value << 8); + m_ptr++; + } +} + +void CompositeOutput::sendFrameHalfResolution(const uint8_t *frame) +{ + generate_long_sync(); // 1 + generate_long_sync(); // 2 + generate_long_short_sync(); // 3 + generate_short_sync(); // 4 + generate_short_sync(); // 5 + for (int y = 0; y < linesEvenBlankTop; y++) + { + generate_blank_line(); // top blank lines + } + + for (int y = 0; y < targetYresEven; y++) + { + generate_line_from_buffer( &frame[(y >> 3)*(m_buffer_width * m_bpp / 8)] ); // real data + } + for (int y = 0; y < linesEvenBlankBottom; y++) + { + generate_blank_line(); // bottom blank lines + } + generate_short_sync(); // 311 + generate_short_sync(); // 312 + + generate_short_long_sync(); // 313 + generate_long_sync(); // 314 + generate_long_sync(); // 315 + generate_short_sync(); // 316 + generate_short_sync(); // 317 + + generate_short_blank_sync(); // 318 + for (int y = 0; y < linesOddBlankTop; y++) + { + generate_blank_line(); // top blank lines + } + for (int y = 0; y < targetYresOdd; y++) + { + generate_line_from_buffer( &frame[(y>>3)*(m_buffer_width * m_bpp / 8)] ); // real data + } + for(int y = 0; y < linesOddBlankBottom; y++) + { + generate_blank_line(); // bottom blank lines + } + generate_blank_short_sync(); // 623 + generate_short_sync(); // 624 + generate_short_sync(); // 625 + if (m_ptr != line) // force to send data + { + size_t bytes_written; + i2s_write(I2S_PORT, (char*)line, (m_ptr - line) * sizeof(uint16_t), &bytes_written, portMAX_DELAY); + m_ptr = line; + } +} + +void CompositeOutput::generate_long_sync() +{ + for (int i = 0; i < 2; i++) + { + fillValues(levelSync, m_samples_per_line / 2 - samplesVSyncShort); + fillValues(levelBlank, samplesVSyncShort); + } + check_buffer(); +} + +void CompositeOutput::generate_short_sync() +{ + for (int i = 0; i < 2; i++) + { + fillValues(levelSync, samplesVSyncShort); + fillValues(levelBlank, m_samples_per_line / 2 - samplesVSyncShort); + } + check_buffer(); +} + +void CompositeOutput::generate_long_short_sync() +{ + fillValues(levelSync, m_samples_per_line / 2 - samplesVSyncShort); + fillValues(levelBlank, samplesVSyncShort); + fillValues(levelSync, samplesVSyncShort); + fillValues(levelBlank, m_samples_per_line / 2 - samplesVSyncShort); + check_buffer(); +} + +void CompositeOutput::generate_short_long_sync() +{ + fillValues(levelSync, samplesVSyncShort); + fillValues(levelBlank, m_samples_per_line / 2 - samplesVSyncShort); + fillValues(levelSync, m_samples_per_line / 2 - samplesVSyncShort); + fillValues(levelBlank, samplesVSyncShort); + check_buffer(); +} + +void CompositeOutput::generate_short_blank_sync() +{ + fillValues(levelSync, samplesVSyncShort); + fillValues(levelBlank, m_samples_per_line / 2 - samplesVSyncShort); + fillValues(levelBlank, m_samples_per_line / 2); + check_buffer(); +} + +void CompositeOutput::generate_blank_short_sync() +{ + fillValues(levelSync, samplesSync); + fillValues(levelBlank, m_samples_per_line / 2 - samplesSync); + fillValues(levelSync, samplesVSyncShort); + fillValues(levelBlank, m_samples_per_line / 2 - samplesVSyncShort); + check_buffer(); +} + +void CompositeOutput::generate_blank_line() +{ + fillValues(levelSync, samplesSync); + fillValues(levelBlank, samplesBlank); + fillValues(levelBlack, samplesActive); + fillValues(levelBlank, samplesBack); + check_buffer(); +} + +const uint8_t* CompositeOutput::generate_line_from_buffer(const uint8_t *pixels) +{ + fillValues(levelSync, samplesSync); + fillValues(levelBlank, samplesBlank); + fillValues(levelBlack, samplesBlackLeft); + for (int x = 0; x < targetXres; x++) + { + uint8_t color = pixels[(x >> 3)] & (1<< (x&0x07)); +// *m_ptr = (levelBlack + pixels[x]) << 8; + *m_ptr = (levelBlack + (color ? 0x80: 0x00 )) << 8; + m_ptr++; + } + fillValues(levelBlack, samplesBlackRight); + fillValues(levelBlank, samplesBack); + check_buffer(); + return pixels + m_buffer_width * m_bpp / 8; +// return pixels + targetXres; +} + +void CompositeOutput::check_buffer() +{ + if (m_ptr == m_end) + { + size_t bytes_written; + i2s_write(I2S_PORT, (char*)line, sizeof(uint16_t) * (m_end - line), &bytes_written, portMAX_DELAY); + m_ptr = line; + } +} + +#endif + diff --git a/lib/libssd1306/src/intf/vga/esp32/CompositeOutput.h b/lib/libssd1306/src/intf/vga/esp32/CompositeOutput.h new file mode 100644 index 0000000..7bac8a0 --- /dev/null +++ b/lib/libssd1306/src/intf/vga/esp32/CompositeOutput.h @@ -0,0 +1,112 @@ +/* + * Credits to https://github.com/bitluni/ESP32CompositeVideo + */ + +#pragma once + +#include "ssd1306_hal/io.h" + +#if defined(CONFIG_VGA_AVAILABLE) && defined(CONFIG_VGA_ENABLE) && defined(__XTENSA__) + +#include <stdint.h> +#include "driver/i2s.h" + +typedef struct +{ + float lineMicros; + float syncMicros; + float blankEndMicros; + float backMicros; + float shortVSyncMicros; + float overscanLeftMicros; + float overscanRightMicros; + float syncVolts; + float blankVolts; + float blackVolts; + float whiteVolts; + short lines; + short linesFirstTop; + short linesOverscanTop; + short linesOverscanBottom; + float imageAspect; +} TechProperties; + +class CompositeOutput +{ +public: + + enum Mode + { + PAL, + NTSC + }; + + CompositeOutput(Mode mode, double Vcc = 3.3); + + void init(int xres, int yres, int bpp); + + void fillValues(uint8_t value, int count); + + void sendFrameHalfResolution(const uint8_t *frame); + +private: + const TechProperties &properties; + + int m_samples_per_line = 0; + int samplesSync = 0; + int samplesBlank = 0; + int samplesBack = 0; + int samplesActive = 0; + int samplesBlackLeft = 0; + int samplesBlackRight = 0; + + int samplesVSyncShort = 0; + int samplesVSyncLong = 0; + + uint8_t levelSync = 0; + uint8_t levelBlank = 0; + uint8_t levelBlack = 0; + uint8_t levelWhite = 0; + uint8_t grayValues = 0; + + int targetXres = 0; + int targetYres = 0; + int targetYresEven = 0; + int targetYresOdd = 0; + + int linesEven = 0; + int linesOdd = 0; + int linesEvenActive = 0; + int linesOddActive = 0; + int linesEvenVisible = 0; + int linesOddVisible = 0; + int linesEvenBlankTop = 0; + int linesEvenBlankBottom = 0; + int linesOddBlankTop = 0; + int linesOddBlankBottom = 0; + + int m_buffer_width = 0; + int m_buffer_height = 0; + int m_bpp = 0; + +// float pixelAspect; + + uint16_t *line = nullptr; + uint16_t *m_end = nullptr; + uint16_t *m_ptr = nullptr; + + void init_hardware(); + void check_buffer(); + void generate_vsync(); + void generate_long_sync(); + void generate_short_sync(); + void generate_long_short_sync(); + void generate_short_long_sync(); + void generate_short_blank_sync(); + void generate_blank_short_sync(); + void generate_blank_line(); + const uint8_t * generate_line_from_buffer(const uint8_t * buffer); +}; + +#endif + diff --git a/lib/libssd1306/src/intf/vga/esp32/vga128x64.cpp b/lib/libssd1306/src/intf/vga/esp32/vga128x64.cpp new file mode 100644 index 0000000..941e074 --- /dev/null +++ b/lib/libssd1306/src/intf/vga/esp32/vga128x64.cpp @@ -0,0 +1,211 @@ +/* + MIT License + + Copyright (c) 2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "intf/ssd1306_interface.h" +#include "intf/vga/vga.h" +#include "lcd/lcd_common.h" +#include "lcd/vga_commands.h" + +#if defined(CONFIG_VGA_AVAILABLE) && defined(CONFIG_VGA_ENABLE) && defined(ESP32) + +#include "CompositeOutput.h" + +//#define VGA_CONTROLLER_DEBUG + +static uint8_t *__vga_buffer = nullptr; +extern uint16_t ssd1306_color; + +// Set to ssd1306 compatible mode by default +static uint8_t s_mode = 0x01; +static uint8_t s_vga_command = 0xFF; +static uint8_t s_vga_arg = 0; +static uint8_t s_column = 0; +static uint8_t s_column_end = 0; +static uint8_t s_cursor_x = 0; +static uint8_t s_cursor_y = 0; +static uint8_t s_width = 0; +static uint8_t s_height = 0; +static uint8_t s_bpp = 0; + +static CompositeOutput output(CompositeOutput::PAL); + +static void compositeCore(void *data) +{ + while (true) + { + //just send the graphics frontbuffer whithout any interruption + output.sendFrameHalfResolution(__vga_buffer); + } +} + +static void vga_controller_init(void) +{ + s_vga_command = 0xFF; +} + +#ifdef VGA_CONTROLLER_DEBUG +#include <stdio.h> +void uart_send_byte(uint8_t data) +{ + printf("%c", data); +} +#endif + +static void vga_controller_stop(void) +{ + s_vga_command = 0xFF; + #ifdef VGA_CONTROLLER_DEBUG + ssd1306_debug_print_vga_buffer( uart_send_byte ); + #endif +} + +static void vga_controller_close(void) +{ +} + +/* + * Function sends 8 vertical pixels to buffer + */ +static inline void vga_controller_put_pixels(uint8_t x, uint8_t y, uint8_t pixels) +{ + uint16_t addr = (x >> 3) + (uint16_t)(y * 16); + uint8_t offset = x & 0x07; + uint8_t mask = 1 << offset; + if (addr >= 16*64) + { + return; + } + for (uint8_t i=8; i>0; i--) + { + if (pixels & 0x01) __vga_buffer[addr] |= mask; + else __vga_buffer[addr] &= ~mask; + addr += 16; + pixels >>= 1; + } +} + +static void vga_controller_send_byte(uint8_t data) +{ + if (s_vga_command == 0xFF) + { + s_vga_command = data; + return; + } + if (s_vga_command == 0x40) + { + vga_controller_put_pixels(s_cursor_x, s_cursor_y, data); + s_cursor_x++; + if (s_cursor_x > s_column_end) + { + s_cursor_x = s_column; + s_cursor_y += 8; + } + return; + } + // command mode + if (!s_vga_command) + { + s_vga_command = data; + s_vga_arg = 0; + } + if (s_vga_command == VGA_SET_BLOCK) + { + // set block + if (s_vga_arg == 1) + { + s_column = data >= ssd1306_lcd.width ? ssd1306_lcd.width - 1 : data ; + s_cursor_x = s_column; + } + if (s_vga_arg == 2) { s_column_end = data >= ssd1306_lcd.width ? ssd1306_lcd.width - 1 : data; } + if (s_vga_arg == 3) { s_cursor_y = (data << 3); } + if (s_vga_arg == 4) { s_vga_command = 0; } + } + else if (s_vga_command == VGA_SET_MODE) + { + if (s_vga_arg == 1) { s_mode = data; s_vga_command = 0; } + if (s_vga_arg == 2) { s_vga_command = 0; } + } + else if (s_vga_command == VGA_SET_RESOLUTION ) + { + if (s_vga_arg == 1) { s_width = data; } + if (s_vga_arg == 2) { s_height = data; } + if (s_vga_arg == 3) { s_bpp = data; s_vga_command = 0; } + } + else if (s_vga_command == VGA_DISPLAY_ON ) + { + __vga_buffer = (uint8_t *) malloc(s_width * s_height * s_bpp / 8); + output.init(s_width, s_height, s_bpp); + xTaskCreatePinnedToCore(compositeCore, "c", 1024, NULL, 1, NULL, 0); + s_vga_command = 0; + } + s_vga_arg++; +} + +static void vga_controller_send_bytes(const uint8_t *buffer, uint16_t len) +{ + while (len--) + { + ssd1306_intf.send(*buffer); + buffer++; + } +} + +extern "C" void ssd1306_CompositeVideoInit_esp32(void); +void ssd1306_CompositeVideoInit_esp32(void) +{ + ssd1306_intf.spi = 0; + ssd1306_intf.start = vga_controller_init; + ssd1306_intf.stop = vga_controller_stop; + ssd1306_intf.send = vga_controller_send_byte; + ssd1306_intf.send_buffer = vga_controller_send_bytes; + ssd1306_intf.close = vga_controller_close; +} + +void ssd1306_debug_print_vga_buffer_128x64(void (*func)(uint8_t)) +{ + for(int y = 0; y < ssd1306_lcd.height; y++) + { + for(int x = 0; x < ssd1306_lcd.width; x++) + { + uint8_t color = __vga_buffer[(x >> 3) + y * 16] & (1<< (x&0x07)); + if (color) + { + func('#'); + } + else + { + func(' '); + } + } + func('\n'); + } + func('\n'); +} + +void ssd1306_debug_print_vga_buffer(void (*func)(uint8_t)) +{ + ssd1306_debug_print_vga_buffer_128x64(func); +} + +#endif diff --git a/lib/libssd1306/src/intf/vga/vga.c b/lib/libssd1306/src/intf/vga/vga.c new file mode 100644 index 0000000..a51bf01 --- /dev/null +++ b/lib/libssd1306/src/intf/vga/vga.c @@ -0,0 +1,41 @@ +/* + MIT License + + Copyright (c) 2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_hal/io.h" +#include "vga.h" + +#if defined(CONFIG_VGA_AVAILABLE) && defined(CONFIG_VGA_ENABLE) && defined(ESP32) +extern void ssd1306_CompositeVideoInit_esp32(void); +void ssd1306_vgaInit() +{ + ssd1306_CompositeVideoInit_esp32(); +} + +#else + +void ssd1306_vgaInit() +{ +} + +#endif diff --git a/lib/libssd1306/src/intf/vga/vga.h b/lib/libssd1306/src/intf/vga/vga.h new file mode 100644 index 0000000..a7f217f --- /dev/null +++ b/lib/libssd1306/src/intf/vga/vga.h @@ -0,0 +1,86 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file vga.h VGA basic data. Do not include this header in your project!!! + */ + +#ifndef _SSD1306_VGA_H_ +#define _SSD1306_VGA_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ssd1306_hal/io.h" + +#if defined(CONFIG_VGA_AVAILABLE) && defined(CONFIG_VGA_ENABLE) + +#ifndef DOXYGEN_SHOULD_SKIP_THIS + +#if defined(__AVR_ATmega328P__) +/* TODO: Move defines out of this file */ +static const uint8_t H_SYNC_PIN = 3; +static const uint8_t V_SYNC_PIN = 10; +extern volatile uint8_t __vga_buffer[]; + +/** + * Make ms milliseconds delay. This function has very low precision: 16ms. + * + * @param ms time in milliseconds + */ +void ssd1306_vga_delay(uint32_t ms); + +#elif defined(ESP32) + +#endif + +#endif // DOXYGEN_SHOULD_SKIP_THIS + +/** + * Prints vga buffer in text form using passed callback + * + * @param func callback to use for printing single character + */ +void ssd1306_debug_print_vga_buffer(void (*func)(uint8_t)); + +/** + * Initializes hardware VGA controller + * Be careful, this function reinitialized Atmega328p timers. + * delay() function will not work after call. + */ +//void ssd1306_vga_controller_init(void); + +#endif + +/** + * + */ +void ssd1306_vgaInit(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/lib/libssd1306/src/lcd/composite_video.c b/lib/libssd1306/src/lcd/composite_video.c new file mode 100644 index 0000000..3a599d1 --- /dev/null +++ b/lib/libssd1306/src/lcd/composite_video.c @@ -0,0 +1,142 @@ +/* + MIT License + + Copyright (c) 2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "composite_video.h" +#include "vga_commands.h" +#include "lcd_common.h" +#include "intf/ssd1306_interface.h" +#include "ssd1306_hal/io.h" +#include "intf/vga/vga.h" + +static const uint8_t PROGMEM s_composite128x64_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SSD1306, + 0x00, +#endif + VGA_SET_RESOLUTION,128,64,1, + VGA_DISPLAY_ON, +}; + +static uint8_t s_column = 0; +static uint8_t s_page = 0; + +extern uint16_t ssd1306_color; + +static void vga_set_block1(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + s_column = x; + s_page = y; + ssd1306_intf.start(); + ssd1306_intf.send(0x00); + ssd1306_intf.send(VGA_SET_BLOCK); + ssd1306_intf.send(s_column); + ssd1306_intf.send(rx); + ssd1306_intf.send(s_page * 8); + ssd1306_intf.stop(); + ssd1306_intf.start(); + ssd1306_intf.send(0x40); +} + +static void vga_next_page1(void) +{ + ssd1306_intf.stop(); + vga_set_block1(s_column,s_page+1,0); +} + +static void vga_set_block2(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + ssd1306_intf.start(); + ssd1306_intf.send(0x00); + ssd1306_intf.send(VGA_SET_BLOCK); // set block + ssd1306_intf.send(x); + ssd1306_intf.send(rx); + ssd1306_intf.send(y); + ssd1306_intf.stop(); + ssd1306_intf.start(); + ssd1306_intf.send(0x40); +} + +static void vga_next_page2(void) +{ +} + +#if 0 + +static void vga_send_pixels(uint8_t data) +{ + for (uint8_t i=8; i>0; i--) + { + if ( data & 0x01 ) + { + ssd1306_intf.send( (uint8_t)ssd1306_color ); + } + else + { + ssd1306_intf.send( 0B00000000 ); + } + data >>= 1; + } +} + +#endif + +static void vga_set_mode(lcd_mode_t mode) +{ + if (mode == LCD_MODE_NORMAL) + { + ssd1306_lcd.set_block = vga_set_block2; + ssd1306_lcd.next_page = vga_next_page2; + } + else if (mode == LCD_MODE_SSD1306_COMPAT) + { + ssd1306_lcd.set_block = vga_set_block1; + ssd1306_lcd.next_page = vga_next_page1; + } + ssd1306_intf.start(); + ssd1306_intf.send( 0x00 ); + ssd1306_intf.send( VGA_SET_MODE ); + ssd1306_intf.send( (uint8_t)mode ); + ssd1306_intf.stop(); + // empty for a while +} + +void composite_video_128x64_mono_init(void) +{ + // init vga interface + ssd1306_vgaInit(); + // init display + ssd1306_lcd.type = LCD_TYPE_SSD1306; + ssd1306_lcd.width = 128; + ssd1306_lcd.height = 64; + ssd1306_lcd.set_block = vga_set_block2; + ssd1306_lcd.next_page = vga_next_page2; + ssd1306_lcd.send_pixels1 = ssd1306_intf.send; + ssd1306_lcd.send_pixels_buffer1 = ssd1306_intf.send_buffer; + ssd1306_lcd.set_mode = vga_set_mode; + ssd1306_configureI2cDisplay( s_composite128x64_initData, sizeof(s_composite128x64_initData)); +} + diff --git a/lib/libssd1306/src/lcd/composite_video.h b/lib/libssd1306/src/lcd/composite_video.h new file mode 100644 index 0000000..bff6e31 --- /dev/null +++ b/lib/libssd1306/src/lcd/composite_video.h @@ -0,0 +1,63 @@ +/* + MIT License + + Copyright (c) 2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file vga_monitor.h Interface to vga_monitor + */ + +#ifndef _SSD1306_COMPOSITE_VIDEO_H_ +#define _SSD1306_COMPOSITE_VIDEO_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Inits 128x64 monochrome VGA display. + * + * Inits 128x64 monochrome VGA display. This mode supports 2 colors: black and white. + * User must init communication interface (uart) for vga client mode or init vga + * interface for host mode prior to calling this function. + * + * @see ssd1306_uartInit_Builtin() + * @see ssd1306_vga_controller_init() + */ +void composite_video_128x64_mono_init(void); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/lib/libssd1306/src/lcd/lcd_common.c b/lib/libssd1306/src/lcd/lcd_common.c new file mode 100644 index 0000000..f8ca675 --- /dev/null +++ b/lib/libssd1306/src/lcd/lcd_common.c @@ -0,0 +1,150 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "lcd/lcd_common.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include <stddef.h> + +#define CMD_ARG 0xFF +#define CMD_DELAY 0xFF + +ssd1306_lcd_t ssd1306_lcd = { 0 }; + +void ssd1306_sendData(uint8_t data) +{ + ssd1306_dataStart(); + ssd1306_lcd.send_pixels1( data ); + ssd1306_intf.stop(); +} + +void ssd1306_configureI2cDisplay(const uint8_t *config, uint8_t configSize) +{ + ssd1306_commandStart(); + for( uint8_t i=0; i<configSize; i++) + { + uint8_t data = pgm_read_byte(&config[i]); + ssd1306_intf.send(data); + } + ssd1306_intf.stop(); +} + +void ssd1306_configureSpiDisplay(const uint8_t *config, uint8_t configSize) +{ + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + for( uint8_t i=0; i<configSize; i++) + { + uint8_t data = pgm_read_byte(&config[i]); + if (data == CMD_ARG) + { + data = pgm_read_byte(&config[++i]); + ssd1306_spiDataMode(1); + ssd1306_intf.send(data); + ssd1306_spiDataMode(0); + } + else + { + ssd1306_intf.send(data); + } + } + ssd1306_intf.stop(); +} + +void ssd1306_configureSpiDisplay2(const uint8_t *config, uint8_t configSize) +{ + uint8_t command = 1; + int8_t args = -1; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + for( uint8_t i=0; i<configSize; i++) + { + uint8_t data = pgm_read_byte(&config[i]); + if ( command ) + { + if ( command == CMD_DELAY ) + { + command = 1; + delay( data == 0xFF ? 500: data ); + } + else + { + ssd1306_intf.send(data); + command = 0; + args = -1; + } + } + else + { + if (args < 0) + { + if ( data >= 128 ) + { + command = data; + } + else if ( data > 0 ) + { + args = data; + ssd1306_spiDataMode(1); + } + else + { + command = 1; + } + } + else + { + args--; + ssd1306_intf.send(data); + if ( !args ) + { + command = 1; + ssd1306_spiDataMode(0); + } + } + } + } + ssd1306_intf.stop(); +} + +void ssd1306_setMode(lcd_mode_t mode) +{ + if (ssd1306_lcd.set_mode) + { + ssd1306_lcd.set_mode( mode ); + } +} + +void ssd1306_resetController(int8_t rstPin, uint8_t delayMs) +{ + pinMode(rstPin, OUTPUT); + digitalWrite(rstPin, HIGH); + /* Wait at least 10ms after VCC is up for LCD */ + delay(10); + /* Perform reset operation of LCD display */ + digitalWrite(rstPin, LOW); + delay(delayMs); + digitalWrite(rstPin, HIGH); +} + diff --git a/lib/libssd1306/src/lcd/lcd_common.h b/lib/libssd1306/src/lcd/lcd_common.h new file mode 100644 index 0000000..2744cb0 --- /dev/null +++ b/lib/libssd1306/src/lcd/lcd_common.h @@ -0,0 +1,459 @@ +/* + MIT License + + Copyright (c) 2017-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file lcd_common.h global lcd settings + */ + +#ifndef _LCD_COMMON_H_ +#define _LCD_COMMON_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup LCD_INTERFACE_API OLEDs: initialization and service functions + * @{ + * @brief LCD initialization and service functions + * + * @details This group contains API functions for OLED displays initialization and + * direct programming of GDRAM. This API can be used to create your own + * graphics functions. + */ + +/** + * Enumeration, describing display type + */ +typedef enum +{ + /** Default type of LCD display: ssd1306 oled */ + LCD_TYPE_SSD1306, + /** Experimental type of LCD display: pcd8544 led */ + LCD_TYPE_PCD8544, + /** Support for sh1106 OLED display */ + LCD_TYPE_SH1106, + /** Default type of LCD display: ssd1331 oled */ + LCD_TYPE_SSD1331, + /** User LCD type */ + LCD_TYPE_CUSTOM, +} lcd_type_t; + +/** + * Available lcd modes used by the library. + * LCD_MODE_SSD1306_COMPAT is compatible mode, which should be used + * with standard monochrome functions. + */ +typedef enum +{ + /** + * Normal mode RGB displays. All ssd1306 monochrome direct draw + * functions do not work in this mode. + */ + LCD_MODE_NORMAL = 0, + + /** + * ssd1306 compatible mode. This is special mode, that allows + * to use ssd1306 monochrome direct draw functions, but RGB + * functions will not work. + */ + LCD_MODE_SSD1306_COMPAT = 1, +} lcd_mode_t; + +/** + * Structure, describing display driver configuration + */ +typedef struct +{ + /** Current selected lcd display type */ + lcd_type_t type; + + /** Current display width */ + lcduint_t width; + + /** Current display height */ + lcduint_t height; + + /** + * @brief Sets block in RAM of lcd display controller to write data to. + * + * Sets block in RAM of lcd display controller to write data to. + * For ssd1306 it uses horizontal addressing mode, while for + * sh1106 the function uses page addressing mode. + * Width can be specified as 0, thus the library will set the right boundary to + * region of RAM block to the right column of the display. + * @param x - column (left region) + * @param y - page (top page of the block) + * @param w - width of the block in pixels to control + * + * @warning - this function initiates session (i2c or spi) and do not close it. + * To close session, please, use ssd1306_intf.stop(). + */ + void (*set_block)(lcduint_t x, lcduint_t y, lcduint_t w); + + /** + * Switches to the start of next RAM page for the block, specified by + * set_block(). + * For ssd1306 it does nothing, while for sh1106 the function moves cursor to + * next page. + */ + void (*next_page)(void); + + /** + * Sends 8 monochrome vertical pixels to OLED driver. + * @param data - byte, representing 8 pixels. + */ + void (*send_pixels1)(uint8_t data); + + /** + * Sends buffer containing 8 monochrome vertical pixels, encoded in each byte. + * @param buffer - buffer containing monochrome pixels. + * @param len - length of buffer in bytes. + */ + void (*send_pixels_buffer1)(const uint8_t *buffer, uint16_t len); + + /** + * @brief Sends RGB pixel encoded in 3-3-2 format to OLED driver. + * Sends RGB pixel encoded in 3-3-2 format to OLED driver. + * @param data - byte, representing RGB8 pixel. + */ + void (*send_pixels8)(uint8_t data); + + /** + * @brief Sends RGB pixel encoded in 5-6-5 format to OLED driver. + * Sends RGB pixel encoded in 5-6-5 format to OLED driver. + * @param data 16-bit word, representing RGB16 pixel + */ + void (*send_pixels16)(uint16_t data); + + /** + * @brief Sets library display mode for direct draw functions. + * + * Sets library display mode for direct draw functions. + * There are currently 2 modes supported: LCD_MODE_SSD1306_COMPAT and + * LCD_MODE_NORMAL. In general, ssd1306 compatible mode uses different GDRAM + * addressing mode, than normal mode, intended for using with RBG full-color functions. + * + * @param mode lcd mode to activate. + * @see LCD_MODE_SSD1306_COMPAT + * @see LCD_MODE_NORMAL + * @see lcd_mode_t + */ + void (*set_mode)(lcd_mode_t mode); +} ssd1306_lcd_t; + +/** + * Structure containing callback to low level function for currently enabled display + */ +extern ssd1306_lcd_t ssd1306_lcd; + +/** + * Current display height + * @deprecated Use ssd1306_lcd.height instead. + */ +#define s_displayHeight ssd1306_lcd.height + +/** + * Current display width + * @deprecated Use ssd1306_lcd.width instead. + */ +#define s_displayWidth ssd1306_lcd.width + +/** + * Current selected lcd display type + * @deprecated Use ssd1306_lcd.type instead. + */ +#define g_lcd_type ssd1306_lcd.type + +/** + * Sends byte data to SSD1306 controller memory. + * Performs 3 operations at once: ssd1306_intf.start(), ssd1306_intf.send(), ssd1306_intf.stop(); + * @param data - byte to send to the controller memory + * @note At present this function is used only in Arkanoid demo. + * @deprecated There is wide variaty of functions, that can be used for this. + */ +void ssd1306_sendData(uint8_t data) __attribute__ ((deprecated)); + +/** + * @brief Sets block in RAM of lcd display controller to write data to. + * + * Sets block in RAM of lcd display controller to write data to. + * For ssd1306 it uses horizontal addressing mode, while for + * sh1106 the function uses page addressing mode. + * Width can be specified as 0, thus the library will set the right boundary to + * region of RAM block to the right column of the display. + * @param x - column (left region) + * @param y - page (top page of the block) + * @param w - width of the block in pixels to control + * + * @deprecated Use ssd1306_lcd.set_block() instead. + * @warning - this function initiates session (i2c or spi) and do not close it. + * To close session, please, use ssd1306_intf.stop(). + */ +#define ssd1306_setRamBlock ssd1306_lcd.set_block + +/** + * Switches to the start of next RAM page for the block, specified by + * ssd1306_setRamBlock(). + * For ssd1306 it does nothing, while for sh1106 the function moves cursor to + * next page. + * @deprecated Use ssd1306_lcd.next_page() instead. + */ +#define ssd1306_nextRamPage ssd1306_lcd.next_page + +/** + * Sends 8 monochrome vertical pixels to OLED driver. + * @param data - byte, representing 8 pixels. + * @deprecated Use ssd1306_lcd.send_pixels1() instead. + */ +#define ssd1306_sendPixels ssd1306_lcd.send_pixels1 + +/** + * Sends buffer containing 8 monochrome vertical pixels, encoded in each byte. + * @param buffer - buffer containing monochrome pixels. + * @param len - length of buffer in bytes. + * @deprecated Use ssd1306_lcd.send_pixels_buffer1() instead. + */ +#define ssd1306_sendPixelsBuffer ssd1306_lcd.send_pixels_buffer1 + +/** + * @brief Sends RGB pixel encoded in 3-3-2 format to OLED driver. + * Sends RGB pixel encoded in 3-3-2 format to OLED driver. + * @param data - byte, representing RGB8 pixel. + * @deprecated Use ssd1306_lcd.send_pixels8() instead. + */ +#define ssd1306_sendPixel8 ssd1306_lcd.send_pixels8 + +/** + * @brief Sends configuration being passed to lcd display i2c/spi controller. + * + * Sends configuration being passed to lcd display i2c/spi controller. + * The data bytes are sent to lcd controller as is. In case of spi display + * this function sends cmd arguments in command mode. If lcd controller requires + * arguments to be sent in data mode, please use ssd1306_configureSpiDisplay(). + * + * @param config configuration, located in flash, to send to i2c/spi controller. + * @param configSize - size of configuration data in bytes. + */ +void ssd1306_configureI2cDisplay(const uint8_t *config, uint8_t configSize); + +/** + * @brief Sends configuration being passed to lcd display spi controller. + * + * Sends configuration being passed to lcd display spi controller. If data byte value + * to be sent is less than 255, then data byte is sent in command mode. If data byte + * is 0xFF, the function does't send it to controller, but switches to spi data mode, + * and next byte after will be sent in data spi mode. Then the function will switch back + * to command mode. If lcd controller requires cmd arguments to be sent in command mode, + * please use ssd1306_configureI2cDisplay(). + * + * @param config configuration, located in flash, to send to i2c/spi controller. + * @param configSize - size of configuration data in bytes. + */ +void ssd1306_configureSpiDisplay(const uint8_t *config, uint8_t configSize); + +/** + * @brief Sends configuration being passed to lcd display spi controller. + * + * Sends configuration being passed to lcd display spi controller. If data byte value + * to be sent is less than 255, then data byte is sent in command mode. Each command has + * additional parameter: number of arguments. + * If lcd controller requires cmd arguments to be sent in command mode, + * please use ssd1306_configureI2cDisplay(). + * + * @param config configuration, located in flash, to send to i2c/spi controller. + * @param configSize - size of configuration data in bytes. + */ +void ssd1306_configureSpiDisplay2(const uint8_t *config, uint8_t configSize); + +/** + * @brief Sets library display mode for direct draw functions. + * + * Sets library display mode for direct draw functions. + * There are currently 2 modes supported: LCD_MODE_SSD1306_COMPAT and + * LCD_MODE_NORMAL. In general, ssd1306 compatible mode uses different GDRAM + * addressing mode, than normal mode, intended for using with RBG full-color functions. + * + * @param mode lcd mode to activate. + * @see LCD_MODE_SSD1306_COMPAT + * @see LCD_MODE_NORMAL + * @see lcd_mode_t + */ +void ssd1306_setMode(lcd_mode_t mode); + +/** + * @brief Does hardware reset for oled controller. + * + * Does hardware reset for oled controller. The function pulls up rstPin + * for 10 milliseconds, then pulls down rstPin for delayMs milliseconds + * and then finally pulls rstPin up. + * + * @param rstPin reset pin number + * @param delayMs delay in milliseconds to hold rstPin in low state + */ +void ssd1306_resetController(int8_t rstPin, uint8_t delayMs); + +/** + * Macro SSD1306_COMPAT_SPI_BLOCK_8BIT_CMDS() generates 2 static functions, + * applicable for many oled controllers with 8-bit commands: + * set_block_compat(), next_page_compat(). These functions are to be used + * when working in ssd1306 compatible mode. + * @param column_cmd command opcode for setting column address according to + * oled controller datasheet + * @param row_cmd command opcode for setting row address according to + * oled controller datasheet + * @note It is assumed that column and row commands accept 2 single byte + * arguments: start and end of region + */ +#define SSD1306_COMPAT_SPI_BLOCK_8BIT_CMDS(column_cmd, row_cmd) \ + static uint8_t __s_column; \ + static uint8_t __s_page; \ + static void set_block_compat(lcduint_t x, lcduint_t y, lcduint_t w) \ + { \ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); \ + __s_column = x; \ + __s_page = y; \ + ssd1306_intf.start(); \ + ssd1306_spiDataMode(0); \ + ssd1306_intf.send(column_cmd); \ + ssd1306_intf.send(x); \ + ssd1306_intf.send(rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)); \ + ssd1306_intf.send(row_cmd); \ + ssd1306_intf.send(y<<3); \ + ssd1306_intf.send(((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1)); \ + ssd1306_spiDataMode(1); \ + } \ + static void next_page_compat(void) \ + { \ + ssd1306_intf.stop(); \ + set_block_compat(__s_column,__s_page+1,0); \ + } \ + +/** + * Macro CONTROLLER_NATIVE_SPI_BLOCK_8BIT_CMDS() generates 2 static functions, + * applicable for many oled controllers with 8-bit commands: + * set_block_native(), next_page_native(). These functions are to be used + * when working in oled controller native mode. + * @param column_cmd command opcode for setting column address according to + * oled controller datasheet + * @param row_cmd command opcode for setting row address according to + * oled controller datasheet + * @note It is assumed that column and row commands accept 2 single byte + * arguments: start and end of region + */ +#define CONTROLLER_NATIVE_SPI_BLOCK_8BIT_CMDS(column_cmd, row_cmd) \ + static void set_block_native(lcduint_t x, lcduint_t y, lcduint_t w) \ + { \ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); \ + ssd1306_intf.start(); \ + ssd1306_spiDataMode(0); \ + ssd1306_intf.send(column_cmd); \ + ssd1306_intf.send(x); \ + ssd1306_intf.send(rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)); \ + ssd1306_intf.send(row_cmd); \ + ssd1306_intf.send(y); \ + ssd1306_intf.send(ssd1306_lcd.height - 1); \ + ssd1306_spiDataMode(1); \ + } \ + static void next_page_native(void) \ + { \ + } \ + +/** + * Macro SSD1306_COMPAT_SEND_PIXELS_RGB8_CMDS() generates 2 static functions, + * applicable for many oled controllers in 8-bit RGB mode: + * send_pixels_compat(), send_pixels_buffer_compat(). These functions are to be used + * when working in ssd1306 compatible mode. + */ +#define SSD1306_COMPAT_SEND_PIXELS_RGB8_CMDS() \ + extern uint16_t ssd1306_color; \ + static void send_pixels_compat(uint8_t data) \ + { \ + for (uint8_t i=8; i>0; i--) \ + { \ + if ( data & 0x01 ) \ + { \ + ssd1306_intf.send( (uint8_t)ssd1306_color ); \ + } \ + else \ + { \ + ssd1306_intf.send( 0B00000000 ); \ + } \ + data >>= 1; \ + } \ + } \ + static void send_pixels_buffer_compat(const uint8_t *buffer, uint16_t len) \ + { \ + while(len--) \ + { \ + send_pixels_compat(*buffer); \ + buffer++; \ + } \ + } + +/** + * Macro SSD1306_COMPAT_SEND_PIXELS_RGB16_CMDS() generates 2 static functions, + * applicable for many oled controllers in 16-bit RGB mode: + * send_pixels_compat16(), send_pixels_buffer_compat16(). These functions are to be used + * when working in ssd1306 compatible mode. + */ +#define SSD1306_COMPAT_SEND_PIXELS_RGB16_CMDS() \ + extern uint16_t ssd1306_color; \ + static void send_pixels_compat16(uint8_t data) \ + { \ + for (uint8_t i=8; i>0; i--) \ + { \ + if ( data & 0x01 ) \ + { \ + ssd1306_intf.send( (uint8_t)(ssd1306_color >> 8 ) ); \ + ssd1306_intf.send( (uint8_t)(ssd1306_color & 0xFF) ); \ + } \ + else \ + { \ + ssd1306_intf.send( 0B00000000 ); \ + ssd1306_intf.send( 0B00000000 ); \ + } \ + data >>= 1; \ + } \ + } \ + static void send_pixels_buffer_compat16(const uint8_t *buffer, uint16_t len) \ + { \ + while(len--) \ + { \ + send_pixels_compat16(*buffer); \ + buffer++; \ + } \ + } + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _LCD_COMMON_H_ */ diff --git a/lib/libssd1306/src/lcd/lcd_il9163.c b/lib/libssd1306/src/lcd/lcd_il9163.c new file mode 100644 index 0000000..ea66a7b --- /dev/null +++ b/lib/libssd1306/src/lcd/lcd_il9163.c @@ -0,0 +1,434 @@ +/* + MIT License + + Copyright (c) 2018-2020, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "lcd_il9163.h" +#include "lcd_common.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#include "nano_gfx_types.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + +#define CMD_ARG 0xFF +#define CMD_DELAY 0xFF + +extern uint16_t ssd1306_color; +extern uint32_t s_ssd1306_spi_clock; + +static uint8_t s_rotation = 0x00; +static uint8_t s_rgb_bit = 0b00001000; +static lcdint_t s_offset_x = 0; +static lcdint_t s_offset_y = 0; + +static const PROGMEM uint8_t s_oled128x128_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_IL9163, + 0x00, +#endif +// 0x01, // sw reset. not needed, we do hardware reset + 0x11, // exit sleep mode + 0x3A, CMD_ARG, 0x05, // set 16-bit pixel format + 0x26, CMD_ARG, 0x04, // set gamma curve: valid values 1, 2, 4, 8 +// 0xF2, CMD_ARG, 0x01, // enable gamma adjustment, 0 - to disable +// 0xE0, CMD_ARG, 0x3F, CMD_ARG, 0x25, CMD_ARG, 0x1C, +// CMD_ARG, 0x1E, CMD_ARG, 0x20, CMD_ARG, 0x12, +// CMD_ARG, 0x2A, CMD_ARG, 0x90, CMD_ARG, 0x24, +// CMD_ARG, 0x11, CMD_ARG, 0x00, CMD_ARG, 0x00, +// CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x00, // positive gamma correction +// 0xE1, CMD_ARG, 0x20, CMD_ARG, 0x20, CMD_ARG, 0x20, +// CMD_ARG, 0x20, CMD_ARG, 0x05, CMD_ARG, 0x00, +// CMD_ARG, 0x15, CMD_ARG, 0xA7, CMD_ARG, 0x3D, +// CMD_ARG, 0x18, CMD_ARG, 0x25, CMD_ARG, 0x2A, +// CMD_ARG, 0x2B, CMD_ARG, 0x2B, CMD_ARG, 0x3A, // negative gamma correction +// 0xB1, CMD_ARG, 0x08, CMD_ARG, 0x08, // frame rate control 1, use by default +// 0xB4, CMD_ARG, 0x07, // display inversion, use by default + 0xC0, CMD_ARG, 0x0A, CMD_ARG, 0x02, // power control 1 + 0xC1, CMD_ARG, 0x02, // power control 2 + 0xC5, CMD_ARG, 0x50, CMD_ARG, 0x5B, // vcom control 1 + 0xC7, CMD_ARG, 0x40, // vcom offset +// 0x2A, CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x7F, // set column address, not needed. set by direct API +// 0x2B, CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x9F, // set page address, not needed. set by direct API + 0x36, CMD_ARG, 0b10001100, // enable fake "vertical addressing" mode (for il9163_setBlock() ) + 0x29, // display on +}; + +static const PROGMEM uint8_t s_oled128x160_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_ST7735, 0x00, + 0b00000011, 0x00, +#endif + 0x01, CMD_DELAY, 150, // SWRESET sw reset. not needed, we do hardware reset + 0x11, CMD_DELAY, 255, // SLPOUT exit sleep mode + 0xB1, 0x03, 0x01, 0x2C, 0x2D, // FRMCTR1 frame rate control 1, use by default + 0xB2, 0x03, 0x01, 0x2C, 0x2D, // FRMCTR2, Frame Rate Control (In Idle mode/ 8-colors) + 0xB3, 0x06, // FRMCTR3 (B3h): Frame Rate Control (In Partial mode/ full colors) + 0x01, 0x2C, 0x2D, + 0x01, 0x2C, 0x2D, + 0xB4, 0x01, 0x07, // INVCTR display inversion, use by default + 0xB6, 0x02, 0x15, 0x02, // DISSET5 + 0xC0, 0x03, 0xA2, 0x02, 0x84, // PWCTR1 power control 1 + 0xC1, 0x01, 0xC5, // PWCTR2 power control 2 + 0xC2, 0x02, 0x0A, 0x00, // PWCTR3 power control 3 + 0xC3, 0x02, 0x8A, 0x2A, // PWCTR4 (C3h): Power Control 4 (in Idle mode/ 8-colors) + 0xC4, 0x02, 0x8A, 0xEE, // PWCTR5 (C4h): Power Control 5 (in Partial mode/ full-colors) + 0xC5, 0x01, 0x0E, // VMCTR vcom control 1 + 0x20, 0x00, // INVOFF (20h): Display Inversion Off +// 0xFC, 0x02, 0x11, 0x15, // PWCTR6 + + 0x36, 0x01, 0b00100000, // MADCTL // enable fake "vertical addressing" mode (for il9163_setBlock() ) + 0x3A, 0x01, 0x05, // COLMOD set 16-bit pixel format + +// 0x26, 1, 0x08, // GAMSET set gamma curve: valid values 1, 2, 4, 8 +// 0xF2, 1, 0x01, // enable gamma adjustment, 0 - to disable + 0xE0, 0x10, // GMCTRP1 positive gamma correction + 0x0F, 0x1A, 0x0F, 0x18, + 0x2F, 0x28, 0x20, 0x22, + 0x1F, 0x1B, 0x23, 0x37, + 0x00, 0x07, 0x02, 0x10, + 0xE1, 0x10, // GMCTRN1 negative gamma correction + 0x0F, 0x1B, 0x0F, 0x17, + 0x33, 0x2C, 0x29, 0x2E, + 0x30, 0x30, 0x39, 0x3F, + 0x00, 0x07, 0x03, 0x10, +// 0xC7, 1, 0x40, // vcom offset +// 0x2A, CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x7F, // set column address, not needed. set by direct API +// 0x2B, CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x9F, // set page address, not needed. set by direct API + 0x29, CMD_DELAY, 100, // DISPON display on + 0x13, CMD_DELAY, 10, // NORON +}; + +static uint8_t s_column; +static uint8_t s_page; + +static void il9163_setBlock(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + s_column = x; + s_page = y; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2B); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(0); + ssd1306_intf.send(x + s_offset_x); + ssd1306_intf.send(0); + ssd1306_intf.send((rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)) + s_offset_x); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2A); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(0); + ssd1306_intf.send((y<<3) + s_offset_y); + ssd1306_intf.send(0); + ssd1306_intf.send((((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1)) + s_offset_y); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2C); + ssd1306_spiDataMode(1); +} + +static void il9163_setBlock2(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2A); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(0); + ssd1306_intf.send(x + s_offset_x); + ssd1306_intf.send(0); + ssd1306_intf.send((rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)) + s_offset_x); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2B); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(0); + ssd1306_intf.send(y + s_offset_y); + ssd1306_intf.send(0); + ssd1306_intf.send(ssd1306_lcd.height - 1 + s_offset_y); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2C); + ssd1306_spiDataMode(1); +} + +void il9163_setOffset(lcdint_t x, lcdint_t y) +{ + s_offset_x = x; + s_offset_y = y; +} + +static void il9163_nextPage(void) +{ + ssd1306_intf.stop(); + ssd1306_lcd.set_block(s_column,s_page+1,0); +} + +static void il9163_nextPage2(void) +{ +} + +void il9163_setMode(lcd_mode_t mode) +{ + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send( 0x36 ); + ssd1306_spiDataMode(1); + ssd1306_intf.send( ( mode ? 0b00100000 : 0b00000000 ) | s_rgb_bit ); + ssd1306_intf.stop(); + if (mode == LCD_MODE_SSD1306_COMPAT ) + { + ssd1306_lcd.set_block = il9163_setBlock; + ssd1306_lcd.next_page = il9163_nextPage; + } + else if ( mode == LCD_MODE_NORMAL ) + { + ssd1306_lcd.set_block = il9163_setBlock2; + ssd1306_lcd.next_page = il9163_nextPage2; + } + s_rotation = mode ? 0x00 : 0x04; +} + +static void il9163_sendPixels(uint8_t data) +{ + for (uint8_t i=8; i>0; i--) + { + if ( data & 0x01 ) + { + ssd1306_intf.send( (uint8_t)(ssd1306_color>>8) ); + ssd1306_intf.send( (uint8_t)(ssd1306_color) ); + } + else + { + ssd1306_intf.send( 0B00000000 ); + ssd1306_intf.send( 0B00000000 ); + } + data >>= 1; + } +} + +static void il9163_sendPixelsBuffer(const uint8_t *buffer, uint16_t len) +{ + while(len--) + { + il9163_sendPixels(*buffer); + buffer++; + } +} + +static void il9163_sendPixel8(uint8_t data) +{ + uint16_t color = RGB8_TO_RGB16(data); + ssd1306_intf.send( color >> 8 ); + ssd1306_intf.send( color & 0xFF ); +} + +static void il9163_sendPixel16(uint16_t color) +{ + ssd1306_intf.send( color >> 8 ); + ssd1306_intf.send( color & 0xFF ); +} + +void il9163_128x128_init() +{ + ssd1306_lcd.type = LCD_TYPE_SSD1331; + ssd1306_lcd.height = 128; + ssd1306_lcd.width = 128; + s_rgb_bit = 0b00001000; // set BGR mode mapping + ssd1306_lcd.set_block = il9163_setBlock; + ssd1306_lcd.next_page = il9163_nextPage; + ssd1306_lcd.send_pixels1 = il9163_sendPixels; + ssd1306_lcd.send_pixels_buffer1 = il9163_sendPixelsBuffer; + ssd1306_lcd.send_pixels8 = il9163_sendPixel8; + ssd1306_lcd.send_pixels16 = il9163_sendPixel16; + ssd1306_lcd.set_mode = il9163_setMode; + ssd1306_configureSpiDisplay(s_oled128x128_initData, sizeof(s_oled128x128_initData)); +} + +void il9163_128x128_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + pinMode(rstPin, OUTPUT); + digitalWrite(rstPin, HIGH); + /* Wait at least 1ms after VCC is up for LCD */ + delay(1); + /* Perform reset operation of LCD display */ + digitalWrite(rstPin, LOW); + delay(20); + digitalWrite(rstPin, HIGH); + } + /* ssd1351 cannot work faster than at 4MHz per datasheet */ + s_ssd1306_spi_clock = 8000000; + ssd1306_spiInit(cesPin, dcPin); + il9163_128x128_init(); +} + +void il9163_setRotation(uint8_t rotation) +{ + uint8_t ram_mode; + if ((rotation^s_rotation) & 0x01) + { + uint16_t t = ssd1306_lcd.width; + ssd1306_lcd.width = ssd1306_lcd.height; + ssd1306_lcd.height = t; + } + s_rotation = (rotation & 0x03) | (s_rotation & 0x04); + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x28); + ssd1306_intf.send(0x36); + ssd1306_spiDataMode(1); + switch (s_rotation) + { + case 0: + ram_mode = 0b00000000; + break; + case 1: // 90 degree CW + ram_mode = 0b01000000; + break; + case 2: // 180 degree CW + ram_mode = 0b11100000; + break; + case 3: // 270 degree CW + ram_mode = 0b10000000; + break; + case 4: + ram_mode = 0b00000000; + break; + case 5: // 90 degree CW + ram_mode = 0b01100000; + break; + case 6: // 180 degree CW + ram_mode = 0b11000000; + break; + default: // 270 degree CW + ram_mode = 0b10100000; + break; + } + s_offset_x = ((s_rotation & 0x03) == 3 ? 32 : 0); + s_offset_y = ((s_rotation & 0x03) == 2 ? 32 : 0); + ssd1306_intf.send( ram_mode | s_rgb_bit ); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x29); + ssd1306_intf.stop(); +} + +//////////////////////////////////////////////////////////////////////////////////////// +// ST7735 support +//////////////////////////////////////////////////////////////////////////////////////// + +static void st7735_setBlock(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + s_column = x; + s_page = y; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2B); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(0); + ssd1306_intf.send(x); + ssd1306_intf.send(0); + ssd1306_intf.send((rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1))); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2A); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(0); + ssd1306_intf.send((y<<3)); + ssd1306_intf.send(0); + ssd1306_intf.send((((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1))); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2C); + ssd1306_spiDataMode(1); +} + +static void st7735_setBlock2(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2A); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(0); + ssd1306_intf.send(x); + ssd1306_intf.send(0); + ssd1306_intf.send( rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1) ); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2B); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(0); + ssd1306_intf.send(y); + ssd1306_intf.send(0); + ssd1306_intf.send( ssd1306_lcd.height - 1 ); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2C); + ssd1306_spiDataMode(1); +} + +static void st7735_setMode(lcd_mode_t mode) +{ + if (mode == LCD_MODE_SSD1306_COMPAT ) + { + ssd1306_lcd.set_block = st7735_setBlock; + ssd1306_lcd.next_page = il9163_nextPage; + } + else if ( mode == LCD_MODE_NORMAL ) + { + ssd1306_lcd.set_block = st7735_setBlock2; + ssd1306_lcd.next_page = il9163_nextPage2; + } + s_rotation = mode ? (s_rotation & 0x03) : (s_rotation | 0x04); + il9163_setRotation( s_rotation & 0x03 ); +} + +void st7735_128x160_init() +{ + ssd1306_lcd.type = LCD_TYPE_SSD1331; + ssd1306_lcd.width = 128; + ssd1306_lcd.height = 160; + s_rgb_bit = 0b00000000; // set RGB mode mapping + ssd1306_lcd.set_block = st7735_setBlock; + ssd1306_lcd.next_page = il9163_nextPage; + ssd1306_lcd.send_pixels1 = il9163_sendPixels; + ssd1306_lcd.send_pixels_buffer1 = il9163_sendPixelsBuffer; + ssd1306_lcd.send_pixels8 = il9163_sendPixel8; + ssd1306_lcd.send_pixels16 = il9163_sendPixel16; + ssd1306_lcd.set_mode = st7735_setMode; + ssd1306_configureSpiDisplay2(s_oled128x160_initData, sizeof(s_oled128x160_initData)); +} + +void st7735_128x160_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 20 ); + /* Give 120ms display to initialize */ + delay(120); + } + /* ssd1351 cannot work faster than at 4MHz per datasheet */ + s_ssd1306_spi_clock = 8000000; + ssd1306_spiInit(cesPin, dcPin); + st7735_128x160_init(); +} diff --git a/lib/libssd1306/src/lcd/lcd_il9163.h b/lib/libssd1306/src/lcd/lcd_il9163.h new file mode 100644 index 0000000..9f4733b --- /dev/null +++ b/lib/libssd1306/src/lcd/lcd_il9163.h @@ -0,0 +1,144 @@ +/* + MIT License + + Copyright (c) 2018-2020, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file lcd_il9163.h support for RGB TFT 128x128 display + */ + + +#ifndef _TFT_IL9163_H_ +#define _TFT_IL9163_H_ + +#include "ssd1306_hal/io.h" +#include "lcd/lcd_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Sets GDRAM autoincrement mode + * + * Sets GDRAM autoincrement mode. By default, to make + * ssd1306_xxx functions compatible with RGB oled display, + * RGB oled is initialized in vertical auto-increment mode. + * But for pure rbg oled operations horizontal auto-increment mode is more suitable. + * So, if you're going to use NanoCanvas8 functions, please call + * il9163_setMode(0) prior to using pure RGB methods. + * + * @param mode 0 or 1 + * @deprecated Use ssd1306_setMode() instead. + */ +void il9163_setMode(lcd_mode_t mode); + +/** + * @brief Inits 128x128 RGB OLED display (based on il9163 controller). + * + * Inits 128x128 RGB OLED display (based on il9163 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void il9163_128x128_init(void); + +/** + * @brief Sets screen offset (refer to datasheet of your display) + * + * Set offset for the display + * @param x offset in pixels + * @param y offset in pixels + */ +void il9163_setOffset(lcdint_t x, lcdint_t y); + +/** + * @brief Inits 128x160 RGB OLED display (based on st7735 controller). + * + * Inits 128x160 RGB OLED display (based on st7735 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void st7735_128x160_init(void); + +/** + * @brief Inits 128x128 RGB TFT display over spi (based on il9163 controller). + * + * Inits 128x128 RGB TFT display over spi (based on il9163 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void il9163_128x128_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @brief Inits 128x160 RGB TFT display over spi (based on st7735 controller). + * + * Inits 128x160 RGB TFT display over spi (based on st7735 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void st7735_128x160_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @} + */ + +/** + * @defgroup IL9163_ST7734_API IL9163/ST7735: il9163/st7735 control functions + * @{ + */ + +/** + * @brief Sets screen orientation (rotation) + * + * Sets screen orientation (rotation): 0 - normal, 1 - 90 CW, 2 - 180 CW, 3 - 270 CW + * @param rotation - screen rotation 0 - normal, 1 - 90 CW, 2 - 180 CW, 3 - 270 CW + * @note works only with IL9163 display + */ +void il9163_setRotation(uint8_t rotation); + +/** + * @brief Sets screen orientation (rotation) + * + * Sets screen orientation (rotation): 0 - normal, 1 - 90 CW, 2 - 180 CW, 3 - 270 CW + * @param rotation - screen rotation 0 - normal, 1 - 90 CW, 2 - 180 CW, 3 - 270 CW + * @note works only with ST7735 display + */ +#define st7735_setRotation il9163_setRotation + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _TFT_IL9163_H_ diff --git a/lib/libssd1306/src/lcd/lcd_ili9341.c b/lib/libssd1306/src/lcd/lcd_ili9341.c new file mode 100644 index 0000000..e12682d --- /dev/null +++ b/lib/libssd1306/src/lcd/lcd_ili9341.c @@ -0,0 +1,283 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "lcd_ili9341.h" +#include "lcd_common.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#include "nano_gfx_types.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + +#define CMD_ARG 0xFF + +extern uint16_t ssd1306_color; +extern uint32_t s_ssd1306_spi_clock; + +static uint8_t s_rotation = 0x00; +static uint8_t s_rgb_bit = 0b00001000; +static uint8_t s_rotate_output = 0; + + +static const PROGMEM uint8_t s_oled240x320_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_ILI9341, + 0x00, +#endif + 0x01, // sw reset. not needed, we do hardware reset + 0x11, // exit sleep mode + 0x3A, CMD_ARG, 0x05, // set 16-bit pixel format + 0x26, CMD_ARG, 0x04, // set gamma curve: valid values 1, 2, 4, 8 + 0xF2, CMD_ARG, 0x01, // enable gamma adjustment, 0 - to disable + 0xE0, CMD_ARG, 0x3F, CMD_ARG, 0x25, CMD_ARG, 0x1C, + CMD_ARG, 0x1E, CMD_ARG, 0x20, CMD_ARG, 0x12, + CMD_ARG, 0x2A, CMD_ARG, 0x90, CMD_ARG, 0x24, + CMD_ARG, 0x11, CMD_ARG, 0x00, CMD_ARG, 0x00, + CMD_ARG, 0x00, CMD_ARG, 0x00, CMD_ARG, 0x00, // positive gamma correction + 0xE1, CMD_ARG, 0x20, CMD_ARG, 0x20, CMD_ARG, 0x20, + CMD_ARG, 0x20, CMD_ARG, 0x05, CMD_ARG, 0x00, + CMD_ARG, 0x15, CMD_ARG, 0xA7, CMD_ARG, 0x3D, + CMD_ARG, 0x18, CMD_ARG, 0x25, CMD_ARG, 0x2A, + CMD_ARG, 0x2B, CMD_ARG, 0x2B, CMD_ARG, 0x3A, // negative gamma correction +// 0xB1, CMD_ARG, 0x08, CMD_ARG, 0x08, // frame rate control 1, use by default +// 0xB4, CMD_ARG, 0x07, // display inversion, use by default + 0xC0, CMD_ARG, 0x0A, CMD_ARG, 0x02, // power control 1 + 0xC1, CMD_ARG, 0x02, // power control 2 + 0xC5, CMD_ARG, 0x50, CMD_ARG, 0x5B, // vcom control 1 + 0xC7, CMD_ARG, 0x40, // vcom offset + 0x36, CMD_ARG, 0b10100000, // enable fake "vertical addressing" mode (for ili9341_setBlock() ) + 0x29, // display on +}; + +static lcduint_t s_column; +static lcduint_t s_page; + +static void ili9341_setBlock(lcduint_t x, lcduint_t y, lcduint_t w) +{ + lcduint_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + s_column = x; + s_page = y; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2B); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(x >> 8); + ssd1306_intf.send(x & 0xFF); + ssd1306_intf.send((rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)) >> 8); + ssd1306_intf.send((rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)) & 0xFF); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2A); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send((y<<3) >> 8); + ssd1306_intf.send((y<<3) & 0xFF); + ssd1306_intf.send((((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1))>>8); + ssd1306_intf.send((((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1)) & 0xFF); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2C); + ssd1306_spiDataMode(1); +} + +static void ili9341_setBlock2(lcduint_t x, lcduint_t y, lcduint_t w) +{ + lcduint_t width = s_rotate_output ? ssd1306_lcd.height : ssd1306_lcd.width; + lcduint_t height = s_rotate_output ? ssd1306_lcd.width : ssd1306_lcd.height; + lcduint_t rx = w ? (x + w - 1) : (width - 1); + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2A); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(x >> 8); + ssd1306_intf.send(x & 0xFF); + ssd1306_intf.send((rx < width ? rx : (width - 1))>>8); + ssd1306_intf.send((rx < width ? rx : (width - 1)) & 0xFF); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2B); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(y >> 8); + ssd1306_intf.send(y & 0xFF); + ssd1306_intf.send((height - 1) >> 8); + ssd1306_intf.send((height - 1) & 0xFF); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x2C); + ssd1306_spiDataMode(1); +} + +static void ili9341_nextPage(void) +{ + ssd1306_intf.stop(); + ssd1306_lcd.set_block(s_column,s_page+1,0); +} + +static void ili9341_nextPage2(void) +{ +} + +void ili9341_setMode(lcd_mode_t mode) +{ + s_rotation &= 0x03; + s_rotation |= (mode == LCD_MODE_SSD1306_COMPAT ? 0x00 : 0x04); + ili9341_setRotation( s_rotation ); + if (mode == LCD_MODE_SSD1306_COMPAT) + { + ssd1306_lcd.set_block = ili9341_setBlock; + ssd1306_lcd.next_page = ili9341_nextPage; + } + else if (mode == LCD_MODE_NORMAL) + { + ssd1306_lcd.set_block = ili9341_setBlock2; + ssd1306_lcd.next_page = ili9341_nextPage2; + } +} + +static void ili9341_sendPixels(uint8_t data) +{ + for (uint8_t i=8; i>0; i--) + { + if ( data & 0x01 ) + { + ssd1306_intf.send( (uint8_t)(ssd1306_color>>8) ); + ssd1306_intf.send( (uint8_t)(ssd1306_color) ); + } + else + { + ssd1306_intf.send( 0B00000000 ); + ssd1306_intf.send( 0B00000000 ); + } + data >>= 1; + } +} + +static void ili9341_sendPixelsBuffer(const uint8_t *buffer, uint16_t len) +{ + while(len--) + { + ili9341_sendPixels(*buffer); + buffer++; + } +} + +static void ili9341_sendPixel8(uint8_t data) +{ + uint16_t color = RGB8_TO_RGB16(data); + ssd1306_intf.send( color >> 8 ); + ssd1306_intf.send( color & 0xFF ); +} + +static void ili9341_sendPixel16(uint16_t color) +{ + ssd1306_intf.send( color >> 8 ); + ssd1306_intf.send( color & 0xFF ); +} + +void ili9341_240x320_init() +{ + ssd1306_lcd.type = LCD_TYPE_SSD1331; + ssd1306_lcd.width = 240; + ssd1306_lcd.height = (lcduint_t)320; + s_rgb_bit = 0b00001000; // set BGR mode mapping + ssd1306_lcd.set_block = ili9341_setBlock; + ssd1306_lcd.next_page = ili9341_nextPage; + ssd1306_lcd.send_pixels1 = ili9341_sendPixels; + ssd1306_lcd.send_pixels_buffer1 = ili9341_sendPixelsBuffer; + ssd1306_lcd.send_pixels8 = ili9341_sendPixel8; + ssd1306_lcd.send_pixels16 = ili9341_sendPixel16; + ssd1306_lcd.set_mode = ili9341_setMode; + ssd1306_configureSpiDisplay(s_oled240x320_initData, sizeof(s_oled240x320_initData)); +} + +void ili9341_240x320_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + pinMode(rstPin, OUTPUT); + digitalWrite(rstPin, HIGH); + /* Wait at least 1ms after VCC is up for LCD */ + delay(1); + /* Perform reset operation of LCD display */ + digitalWrite(rstPin, LOW); + delay(100); + digitalWrite(rstPin, HIGH); + delay(100); + } + s_ssd1306_spi_clock = 10000000; + ssd1306_spiInit(cesPin, dcPin); + ili9341_240x320_init(); +} + +void ili9341_setRotation(uint8_t rotation) +{ + uint8_t ram_mode; + if ((rotation^s_rotation) & 0x01) + { + uint16_t t = ssd1306_lcd.width; + ssd1306_lcd.width = ssd1306_lcd.height; + ssd1306_lcd.height = t; + } + s_rotation = (rotation & 0x03) | (s_rotation & 0x04); + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x28); + ssd1306_intf.send(0x36); + ssd1306_spiDataMode(1); + switch (s_rotation) + { + case 0: + ram_mode = 0b10100000; + break; + case 1: // 90 degree CW + ram_mode = 0b11010000; + break; + case 2: // 180 degree CW + ram_mode = 0b01100000; + break; + case 3: // 270 degree CW + ram_mode = 0b00000000; + break; + case 4: + ram_mode = s_rotate_output ? 0b11100100: 0b10000100; + break; + case 5: // 90 degree CW + ram_mode = 0b11100000; + break; + case 6: // 180 degree CW + ram_mode = 0b01010100; + break; + default: // 270 degree CW + ram_mode = 0b00100000; + break; + } + ssd1306_intf.send( ram_mode | s_rgb_bit ); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x29); + ssd1306_intf.stop(); +} + +void ili9341_rotateOutput(uint8_t on) +{ + s_rotate_output = on; + ili9341_setRotation( s_rotation ); +} diff --git a/lib/libssd1306/src/lcd/lcd_ili9341.h b/lib/libssd1306/src/lcd/lcd_ili9341.h new file mode 100644 index 0000000..88850d0 --- /dev/null +++ b/lib/libssd1306/src/lcd/lcd_ili9341.h @@ -0,0 +1,117 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file lcd_ili9341.h support for RGB TFT 320x240 display + */ + + +#ifndef _TFT_ILI9341_H_ +#define _TFT_ILI9341_H_ + +#include "ssd1306_hal/io.h" +#include "lcd/lcd_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Sets GDRAM autoincrement mode + * + * Sets GDRAM autoincrement mode. By default, to make + * ssd1306_xxx functions compatible with RGB oled display, + * RGB oled is initialized in vertical auto-increment mode. + * But for pure rbg oled operations horizontal auto-increment mode is more suitable. + * So, if you're going to use NanoCanvas8 functions, please call + * ili9341_setMode(0) prior to using pure RGB methods. + * + * @param mode 0 or 1 + * @deprecated Use ssd1306_setMode() instead. + */ +void ili9341_setMode(lcd_mode_t mode); + +/** + * @brief Inits 240x320 RGB OLED display (based on ili9341 controller). + * + * Inits 240x320 RGB OLED display (based on ili9341 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void ili9341_240x320_init(void); + +/** + * @brief Inits 240x320 RGB TFT display over spi (based on ili9341 controller). + * + * Inits 240x320 RGB TFT display over spi (based on ili9341 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void ili9341_240x320_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @} + */ + +/** + * @defgroup ili9341_API ili9341: ili9341 control functions + * @{ + */ + +/** + * @brief Sets screen orientation (rotation) + * + * Sets screen orientation (rotation): 0 - normal, 1 - 90 CW, 2 - 180 CW, 3 - 270 CW + * @param rotation - screen rotation 0 - normal, 1 - 90 CW, 2 - 180 CW, 3 - 270 CW + * @note works only with ili9341 display + */ +void ili9341_setRotation(uint8_t rotation); + +/** + * @brief Sets rotation of all output functions + * + * Sets rotation of all output functions. 0 - no rotation, 1 - change by 90 degrees + * Actually doesn't change screen orientation, only rotates primitives being output + * + * @param on enable (1) of disable (0) + * @warning experimental feature, may work incorrectly + */ +void ili9341_rotateOutput(uint8_t on); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _TFT_ILI9141_H_ diff --git a/lib/libssd1306/src/lcd/lcd_pcd8544.c b/lib/libssd1306/src/lcd/lcd_pcd8544.c new file mode 100644 index 0000000..1da8468 --- /dev/null +++ b/lib/libssd1306/src/lcd/lcd_pcd8544.c @@ -0,0 +1,108 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "lcd_pcd8544.h" +#include "lcd_common.h" +#include "pcd8544_commands.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + + +static const uint8_t PROGMEM s_lcd84x48_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_PCD8544, + 0x00, +#endif + PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION, // switch to extented commands + PCD8544_SETVOP | 0x16, // Set vop contrast + PCD8544_SETTEMP, + PCD8544_SETBIAS | 0x04, // Set bias mode + PCD8544_FUNCTIONSET, // switch to basic commands + PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL +}; + +static uint8_t s_column; +static uint8_t s_page; +static uint8_t s_width; + +static void pcd8544_setBlock(lcduint_t x, lcduint_t y, lcduint_t w) +{ + s_width = w; + s_column = x; + s_page = y; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + if (w == 1) ssd1306_intf.send( 0x22 ); else ssd1306_intf.send( 0x20 ); + ssd1306_intf.send(0x80 | x); + ssd1306_intf.send(0x40 | y); + ssd1306_spiDataMode(1); +} + +static void pcd8544_nextPage(void) +{ + if ( s_width != 1) + { + ssd1306_intf.stop(); + pcd8544_setBlock(s_column, s_page+1, s_width); + } +} + +static void pcd8544_setMode(lcd_mode_t mode) +{ +} + +void pcd8544_84x48_init() +{ + ssd1306_lcd.type = LCD_TYPE_PCD8544; + ssd1306_lcd.width = 84; + ssd1306_lcd.height = 48; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_lcd.set_block = pcd8544_setBlock; + ssd1306_lcd.next_page = pcd8544_nextPage; + ssd1306_lcd.send_pixels1 = ssd1306_intf.send; + ssd1306_lcd.send_pixels_buffer1 = ssd1306_intf.send_buffer; + ssd1306_lcd.set_mode = pcd8544_setMode; + + for( uint8_t i=0; i<sizeof(s_lcd84x48_initData); i++) + { + ssd1306_intf.send(pgm_read_byte(&s_lcd84x48_initData[i])); + } + ssd1306_intf.stop(); +} + +void pcd8544_84x48_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 1 ); + } + ssd1306_spiInit(cesPin, dcPin); + pcd8544_84x48_init(); +} diff --git a/lib/libssd1306/src/lcd/lcd_pcd8544.h b/lib/libssd1306/src/lcd/lcd_pcd8544.h new file mode 100644 index 0000000..6facc03 --- /dev/null +++ b/lib/libssd1306/src/lcd/lcd_pcd8544.h @@ -0,0 +1,72 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file lcd_pcd8544.h support for LED 84x48 display (PCD8544) + */ + + +#ifndef _LCD_PCD8544_H_ +#define _LCD_PCD8544_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Inits 84x48 LED display (based on PCD8544 controller). + * + * Inits 84x48 LED display (based on PCD8544 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void pcd8544_84x48_init(void); + + +/** + * Inits 84x48 LED display over spi (based on PCD8544 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void pcd8544_84x48_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _LCD_PCD8544_H_ diff --git a/lib/libssd1306/src/lcd/oled_sh1106.c b/lib/libssd1306/src/lcd/oled_sh1106.c new file mode 100644 index 0000000..3302edb --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_sh1106.c @@ -0,0 +1,127 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "oled_sh1106.h" +#include "lcd_common.h" +#include "ssd1306_commands.h" +#include "intf/ssd1306_interface.h" +#include "intf/i2c/ssd1306_i2c.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + + +static const uint8_t PROGMEM s_oled128x64_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SH1106, + 0x00, +#endif + SSD1306_DISPLAYOFF, // display off + SSD1306_COMSCANDEC, // Scan from 127 to 0 (Reverse scan) + SSD1306_SETSTARTLINE | 0x00, // First line to start scanning from + SSD1306_SETCONTRAST, 0x7F, // contast value to 0x7F according to datasheet + SSD1306_SEGREMAP | 0x01, // Use reverse mapping. 0x00 - is normal mapping + SSD1306_NORMALDISPLAY, + SSD1306_SETMULTIPLEX, 63, // Reset to default MUX. See datasheet + SSD1306_SETDISPLAYOFFSET, 0x00, // no offset + SSD1306_SETDISPLAYCLOCKDIV, 0x80,// set to default ratio/osc frequency + SSD1306_SETPRECHARGE, 0x22, // switch precharge to 0x22 // 0xF1 + SSD1306_SETCOMPINS, 0x12, // set divide ratio + SSD1306_SETVCOMDETECT, 0x20, // vcom deselect to 0x20 // 0x40 + SSD1306_CHARGEPUMP, 0x14, // Enable charge pump + SSD1306_DISPLAYALLON_RESUME, + SSD1306_DISPLAYON +}; + +static uint8_t s_column; +static uint8_t s_page; + +static void sh1106_setBlock(lcduint_t x, lcduint_t y, lcduint_t w) +{ + s_column = x; + s_page = y; + ssd1306_intf.start(); + if (ssd1306_intf.spi) + ssd1306_spiDataMode(0); + else + ssd1306_intf.send(0x00); + ssd1306_intf.send(SSD1306_SETPAGE | y); + ssd1306_intf.send(((x+2)>>4) | SSD1306_SETHIGHCOLUMN); + ssd1306_intf.send(((x+2) & 0x0f) | SSD1306_SETLOWCOLUMN); + if (ssd1306_intf.spi) + { + ssd1306_spiDataMode(1); + } + else + { + ssd1306_intf.stop(); + ssd1306_intf.start(); + ssd1306_intf.send(0x40); + } +} + +static void sh1106_nextPage(void) +{ + ssd1306_intf.stop(); + sh1106_setBlock(s_column,s_page+1,0); +} + +static void sh1106_setMode(lcd_mode_t mode) +{ +} + +void sh1106_128x64_init() +{ + ssd1306_lcd.type = LCD_TYPE_SH1106; + ssd1306_lcd.height = 64; + ssd1306_lcd.width = 128; + ssd1306_lcd.set_block = sh1106_setBlock; + ssd1306_lcd.next_page = sh1106_nextPage; + ssd1306_lcd.send_pixels1 = ssd1306_intf.send; + ssd1306_lcd.send_pixels_buffer1 = ssd1306_intf.send_buffer; + ssd1306_lcd.set_mode = sh1106_setMode; + for( uint8_t i=0; i<sizeof(s_oled128x64_initData); i++) + { + ssd1306_sendCommand(pgm_read_byte(&s_oled128x64_initData[i])); + } +} + +void sh1106_128x64_i2c_init() +{ + ssd1306_i2cInit(); + sh1106_128x64_init(); +} + +void sh1106_128x64_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 10 ); + } + ssd1306_spiInit(cesPin, dcPin); + sh1106_128x64_init(); +} diff --git a/lib/libssd1306/src/lcd/oled_sh1106.h b/lib/libssd1306/src/lcd/oled_sh1106.h new file mode 100644 index 0000000..5d704e2 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_sh1106.h @@ -0,0 +1,81 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file oled_sh1106.h support for OLED 128x64 display + */ + + +#ifndef _OLED_SH1106_H_ +#define _OLED_SH1106_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Inits 128x64 OLED display (based on SH1106 controller). + * + * Inits 128x64 OLED display (based on SH1106 controller). + * User must init communication interface (i2c or spi) prior to calling this function. + */ +void sh1106_128x64_init(void); + +/** + * @brief Inits 128x64 OLED display over i2c (based on SH1106 controller). + * + * Inits 128x64 OLED display over i2c (based on SH1106 controller) + * This function uses hardcoded pins for i2c communication, depending on your hardware. + * If you use non-standard pins in your project, please perform call ssd1306_i2cInitEx() and + * sh1106_128x64_init(). + */ +void sh1106_128x64_i2c_init(void); + +/** + * @brief Inits 128x64 OLED display over spi (based on SH1106 controller). + * + * Inits 128x64 OLED display over spi (based on SH1106 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void sh1106_128x64_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _OLED_SH1106_H_ diff --git a/lib/libssd1306/src/lcd/oled_ssd1306.c b/lib/libssd1306/src/lcd/oled_ssd1306.c new file mode 100644 index 0000000..25b0001 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1306.c @@ -0,0 +1,259 @@ +/* + MIT License + + Copyright (c) 2017-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "oled_ssd1306.h" +#include "lcd_common.h" +#include "ssd1306_commands.h" +#include "intf/ssd1306_interface.h" +#include "intf/i2c/ssd1306_i2c.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + +uint8_t s_ssd1306_startLine = 0; + +static const uint8_t PROGMEM s_oled128x64_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SSD1306, + 0x00, +#endif + SSD1306_DISPLAYOFF, // display off + SSD1306_MEMORYMODE, HORIZONTAL_ADDRESSING_MODE, // Page Addressing mode + SSD1306_COMSCANDEC, // Scan from 127 to 0 (Reverse scan) + SSD1306_SETSTARTLINE | 0x00, // First line to start scanning from + SSD1306_SETCONTRAST, 0x7F, // contast value to 0x7F according to datasheet + SSD1306_SEGREMAP | 0x01, // Use reverse mapping. 0x00 - is normal mapping + SSD1306_NORMALDISPLAY, + SSD1306_SETMULTIPLEX, 63, // Reset to default MUX. See datasheet + SSD1306_SETDISPLAYOFFSET, 0x00, // no offset + SSD1306_SETDISPLAYCLOCKDIV, 0x80,// set to default ratio/osc frequency + SSD1306_SETPRECHARGE, 0x22, // switch precharge to 0x22 // 0xF1 + SSD1306_SETCOMPINS, 0x12, // set divide ratio + SSD1306_SETVCOMDETECT, 0x20, // vcom deselect to 0x20 // 0x40 + SSD1306_CHARGEPUMP, 0x14, // Enable charge pump + SSD1306_DISPLAYALLON_RESUME, + SSD1306_DISPLAYON, +}; + +static const uint8_t PROGMEM s_oled128x32_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SSD1306, + 0x00, +#endif + SSD1306_DISPLAYOFF, // display off + SSD1306_SETDISPLAYCLOCKDIV, 0x80, + SSD1306_SETMULTIPLEX, 31, + SSD1306_SETDISPLAYOFFSET, 0x00, // --no offset + SSD1306_SETSTARTLINE | 0x00, + SSD1306_CHARGEPUMP, 0x14, // 0x10 + SSD1306_SEGREMAP | 0x01, // Reverse mapping + SSD1306_COMSCANDEC, + SSD1306_SETCOMPINS, 0x02, + SSD1306_SETCONTRAST, 0x7F, // contast value + SSD1306_SETPRECHARGE, 0x22, // 0x1F + SSD1306_SETVCOMDETECT, 0x40, + SSD1306_MEMORYMODE, HORIZONTAL_ADDRESSING_MODE, + SSD1306_DISPLAYALLON_RESUME, + SSD1306_NORMALDISPLAY, + SSD1306_DISPLAYON, +}; + +static void ssd1306_setBlock(lcduint_t x, lcduint_t y, lcduint_t w) +{ + ssd1306_intf.start(); + if (ssd1306_intf.spi) + ssd1306_spiDataMode(0); + else + ssd1306_intf.send(0x00); + ssd1306_intf.send(SSD1306_COLUMNADDR); + ssd1306_intf.send(x); + ssd1306_intf.send(w ? (x + w - 1) : (ssd1306_lcd.width - 1)); + ssd1306_intf.send(SSD1306_PAGEADDR); + ssd1306_intf.send(y); + ssd1306_intf.send((ssd1306_lcd.height >> 3) - 1); + if (ssd1306_intf.spi) + { + ssd1306_spiDataMode(1); + } + else + { + ssd1306_intf.stop(); + ssd1306_intf.start(); + ssd1306_intf.send(0x40); + } +} + +static void ssd1306_nextPage(void) +{ +} + +static void ssd1306_setMode_int(lcd_mode_t mode) +{ +} + +void ssd1306_displayOff() +{ + ssd1306_sendCommand(SSD1306_DISPLAYOFF); +} + + +void ssd1306_displayOn() +{ + ssd1306_sendCommand(SSD1306_DISPLAYON); +} + +void ssd1306_setContrast(uint8_t contrast) +{ + ssd1306_commandStart(); + ssd1306_intf.send(SSD1306_SETCONTRAST); + ssd1306_intf.send(contrast); + ssd1306_intf.stop(); +} + +void ssd1306_invertMode() +{ + ssd1306_sendCommand(SSD1306_INVERTDISPLAY); +} + +void ssd1306_normalMode() +{ + ssd1306_sendCommand(SSD1306_NORMALDISPLAY); +} + +void ssd1306_flipHorizontal(uint8_t mode) +{ + ssd1306_sendCommand( SSD1306_SEGREMAP | (mode ? 0x00: 0x01 ) ); +} + +void ssd1306_flipVertical(uint8_t mode) +{ + ssd1306_sendCommand( mode ? SSD1306_COMSCANINC : SSD1306_COMSCANDEC ); +} + +void ssd1306_setStartLine(uint8_t line) +{ + s_ssd1306_startLine = line; + ssd1306_sendCommand( SSD1306_SETSTARTLINE | (line & 0x3F) ); +} + +uint8_t ssd1306_getStartLine(void) +{ + return s_ssd1306_startLine; +} + +/////////////////////////////////////////////////////////////////////////////// +// I2C SSD1306 128x64 +/////////////////////////////////////////////////////////////////////////////// + +void ssd1306_init() +{ + ssd1306_128x64_i2c_init(); +} + + +void ssd1306_128x64_init() +{ + ssd1306_lcd.type = LCD_TYPE_SSD1306; + ssd1306_lcd.height = 64; + ssd1306_lcd.width = 128; + ssd1306_lcd.set_block = ssd1306_setBlock; + ssd1306_lcd.next_page = ssd1306_nextPage; + ssd1306_lcd.send_pixels1 = ssd1306_intf.send; + ssd1306_lcd.send_pixels_buffer1 = ssd1306_intf.send_buffer; + ssd1306_lcd.set_mode = ssd1306_setMode_int; + for( uint8_t i=0; i<sizeof(s_oled128x64_initData); i++) + { + ssd1306_sendCommand(pgm_read_byte(&s_oled128x64_initData[i])); + } +} + +void ssd1306_128x64_i2c_init() +{ + ssd1306_i2cInit(); + ssd1306_128x64_init(); +} + +void ssd1306_128x64_i2c_initEx(int8_t scl, int8_t sda, int8_t sa) +{ + ssd1306_i2cInitEx(scl, sda, sa); + ssd1306_128x64_init(); +} + +/////////////////////////////////////////////////////////////////////////////// +// SPI SSD1306 128x64 +/////////////////////////////////////////////////////////////////////////////// + +void ssd1306_128x64_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 10 ); + } + ssd1306_spiInit(cesPin, dcPin); + ssd1306_128x64_init(); +} + +/////////////////////////////////////////////////////////////////////////////// +// I2C SSD1306 128x32 +/////////////////////////////////////////////////////////////////////////////// + +void ssd1306_128x32_init() +{ + ssd1306_lcd.type = LCD_TYPE_SSD1306; + ssd1306_lcd.height = 32; + ssd1306_lcd.width = 128; + ssd1306_lcd.set_block = ssd1306_setBlock; + ssd1306_lcd.next_page = ssd1306_nextPage; + ssd1306_lcd.send_pixels1 = ssd1306_intf.send; + ssd1306_lcd.set_mode = ssd1306_setMode_int; + for( uint8_t i=0; i < sizeof(s_oled128x32_initData); i++) + { + ssd1306_sendCommand(pgm_read_byte(&s_oled128x32_initData[i])); + } +} + + +void ssd1306_128x32_i2c_init() +{ + ssd1306_i2cInit(); + ssd1306_128x32_init(); +} + +/////////////////////////////////////////////////////////////////////////////// +// SPI SSD1306 128x32 +/////////////////////////////////////////////////////////////////////////////// + +void ssd1306_128x32_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 10 ); + } + ssd1306_spiInit(cesPin, dcPin); + ssd1306_128x32_init(); +} diff --git a/lib/libssd1306/src/lcd/oled_ssd1306.h b/lib/libssd1306/src/lcd/oled_ssd1306.h new file mode 100644 index 0000000..506470d --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1306.h @@ -0,0 +1,198 @@ +/* + MIT License + + Copyright (c) 2017-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file oled_ssd1306.h support for OLED ssd1306-based displays + */ + + +#ifndef _OLED_SSD1306_H_ +#define _OLED_SSD1306_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Inits 128x64 OLED display (based on SSD1306 controller). + * + * Inits 128x64 OLED display (based on SSD1306 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void ssd1306_128x64_init(void); + +/** + * @brief Inits 128x64 OLED display over i2c (based on SSD1306 controller). + * + * Inits 128x64 OLED display over i2c (based on SSD1306 controller) + * This function uses hardcoded pins for i2c communication, depending on your hardware. + * If you use non-standard pins in your project, please perform call ssd1306_i2cInitEx() and + * ssd1306_128x64_init(), or you can use ssd1306_128x64_i2c_initEx(). + */ +void ssd1306_128x64_i2c_init(void); + +/** + * @brief Inits 128x64 OLED display over i2c (based on SSD1306 controller). + * + * Inits 128x64 OLED display over i2c (based on SSD1306 controller) + * This function uses hardcoded pins for i2c communication, depending on your hardware. + * + * @param scl - i2c clock pin. Use -1 if you don't need to change default pin number + * @param sda - i2c data pin. Use -1 if you don't need to change default pin number + * @param sa - i2c address of lcd display. Use 0 to leave default + * + * @note scl and sda parameters depend on used hardware. For many hardware boards these + * parameters do not have any effect. ESP8266 allows to specify these parameters + * + * @note scl and sda for Linux systems should be the same, and should contain i2c bus id. + */ +void ssd1306_128x64_i2c_initEx(int8_t scl, int8_t sda, int8_t sa); + +/** + * @brief Inits 128x64 OLED display over spi (based on SSD1306 controller). + * + * Inits 128x64 OLED display over spi (based on SSD1306 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void ssd1306_128x64_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @brief Inits 128x32 OLED display over spi (based on SSD1306 controller). + * + * Inits 128x32 OLED display over spi (based on SSD1306 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void ssd1306_128x32_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @copydoc ssd1306_128x64_i2c_init + * @deprecated Use ssd1306_128x64_i2c_init() instead. + */ +void ssd1306_init(void) __attribute__((deprecated)); + +/** + * @brief Inits 128x32 OLED display over i2c (based on SSD1306 controller). + * + * Inits 128x32 OLED display over i2c (based on SSD1306 controller) + * This function uses hardcoded pins for i2c communication, depending on your hardware. + * If you use non-standard pins in your project, please perform call ssd1306_i2cInitEx() and + * ssd1306_128x32_init(). + */ +void ssd1306_128x32_i2c_init(void); + +/** + * @brief Inits 128x32 OLED display (based on ssd1306 controller). + * + * Inits 128x32 OLED display (based on ssd1306 controller) + * spi or i2c bus must be initialized prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void ssd1306_128x32_init(void); + +/** + * Turns off display + */ +void ssd1306_displayOff(void); + +/** + * Turns on display + */ +void ssd1306_displayOn(void); + +/** + * Set display contrast, ie light intensity + * @param contrast - contrast value to see, refer to ssd1306 datasheet + */ +void ssd1306_setContrast(uint8_t contrast); + +/** + * Switches display to inverse mode. + * LCD will display 0-pixels as white, and 1-pixels as black. + * @note Not supported for SSD1331 + */ +void ssd1306_invertMode(void); + +/** + * Switches display to normal mode. + * @note Not supported for SSD1331 + */ +void ssd1306_normalMode(void); + +/** + * @brief performs horizontal flip + * + * Performs horizontal flip. If you need to turn display by 180 degree, + * please use both ssd1306_flipHorizontal() and ssd1306_flipVertical(). + * + * @param mode - 0 to disable horizontal flip + * 1 to enable horizontal flip + */ +void ssd1306_flipHorizontal(uint8_t mode); + +/** + * @brief performs vertical flip + * + * Performs vertical flip. If you need to turn display by 180 degree, + * please use both ssd1306_flipHorizontal() and ssd1306_flipVertical(). + * + * @param mode - 0 to disable vertical flip + * 1 to enable vertical flip + */ +void ssd1306_flipVertical(uint8_t mode); + +/** + * Sets start line in gdram to start display content with + * + * @param line start line in range 0 - 63 + */ +void ssd1306_setStartLine(uint8_t line); + +/** + * returns start line in gdram. + */ +uint8_t ssd1306_getStartLine(void); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _OLED_SSD1306_H_ diff --git a/lib/libssd1306/src/lcd/oled_ssd1325.c b/lib/libssd1306/src/lcd/oled_ssd1325.c new file mode 100644 index 0000000..cd5289f --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1325.c @@ -0,0 +1,182 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "oled_ssd1325.h" +#include "lcd_common.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + +extern uint16_t ssd1306_color; + +static const PROGMEM uint8_t s_oled_128x64_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SSD1325, + SDL_LCD_SSD1325_GENERIC, +#endif + 0xAE, // OFF /* display off */ + 0xB3, 0x91, // CLK + 0xA8, 0x3F, // multiplex 64 + 0xA2, 0x00, // Display offset + 0xA1, 0x00, // Start line + 0xAD, 0x02, // VCOMH + 0xA0, 0x40 | 0x10 | 0x04 | 0x02 | 0x01, // REMAP: vertical increment mode + 0x86, // CURRENT + 0x81, 0x70, // CONTRAST + 0xB2, 0x51, // FREQ + 0xB1, 0x55, // PHASE + 0xBC, 0x10, // PRECHARGE + 0xBE, 0x1C, // VCOMH voltage + 0xA4, // NORMAL +}; + +///////////// ssd1325 functions below are for SPI display //////////// +///////////// in ssd1306 compatible mode //////////// + +//////////////////////// SSD1306 COMPATIBLE MODE /////////////////////////////// + +static uint8_t __s_column; +static uint8_t __s_w; +static uint8_t __s_w2; +static uint8_t __s_page; +static uint8_t __s_leftPixel; +static uint8_t __s_pos; + +static void set_block_compat(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + rx = rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1); + __s_column = x; + __s_page = y; + __s_w = w; + __s_w2 = rx - x + 1; + __s_leftPixel = 0; + __s_pos = __s_column; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x15); + ssd1306_intf.send(x / 2); + ssd1306_intf.send(rx / 2); + ssd1306_intf.send(0x75); + ssd1306_intf.send(y<<3); + ssd1306_intf.send(((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1)); + ssd1306_spiDataMode(1); +} + +static void next_page_compat(void) +{ + ssd1306_intf.stop(); + set_block_compat(__s_column,__s_page + 1, __s_w); +} + +static void ssd1325_sendPixels(uint8_t data) +{ + if (!(__s_pos & 0x01)) + { + __s_leftPixel = data; + data = 0x00; + } + if ((__s_pos & 0x01) || (__s_pos == __s_column + __s_w2 - 1)) + { + for (uint8_t i=8; i>0; i--) + { + uint8_t color = (__s_leftPixel & 0x01) ? (ssd1306_color & 0x0F) : 0; + color |= (((data & 0x01) ? (ssd1306_color & 0x0F): 0) << 4); + ssd1306_intf.send(color); + data >>= 1; + __s_leftPixel >>= 1; + } + } + __s_pos++; +} + +static void ssd1325_sendPixelsBuffer(const uint8_t *buffer, uint16_t len) +{ + while (len--) + { + ssd1325_sendPixels(*buffer); + buffer++; + } +} + +//////////////////////// SSD1331 NATIVE MODE /////////////////////////////////// + +CONTROLLER_NATIVE_SPI_BLOCK_8BIT_CMDS( 0x15, 0x75 ); + +///////////// ssd1325 functions below are for SPI display //////////// +///////////// in native/normal mode //////////// + +void ssd1325_setMode(lcd_mode_t mode) +{ + if (mode == LCD_MODE_NORMAL) + { + ssd1306_lcd.set_block = set_block_native; + ssd1306_lcd.next_page = next_page_native; + } + else if (mode == LCD_MODE_SSD1306_COMPAT ) + { + ssd1306_lcd.set_block = set_block_compat; + ssd1306_lcd.next_page = next_page_compat; + } + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send( 0xA0 ); + ssd1306_intf.send( 0x10 | (mode == LCD_MODE_NORMAL ? 0x00 : 0x04) ); + ssd1306_intf.stop(); + return; +} + +void ssd1325_128x64_init() +{ + ssd1306_lcd.type = LCD_TYPE_CUSTOM; + ssd1306_lcd.width = 128; // specify width + ssd1306_lcd.height = 64; // specify height + // Set functions for compatible mode + ssd1306_lcd.set_block = set_block_compat; + ssd1306_lcd.next_page = next_page_compat; + ssd1306_lcd.send_pixels1 = ssd1325_sendPixels; + ssd1306_lcd.send_pixels_buffer1 = ssd1325_sendPixelsBuffer; + // Set function for 8-bit mode + ssd1306_lcd.send_pixels8 = ssd1306_intf.send; + ssd1306_lcd.set_mode = ssd1325_setMode; + // Use one of 2 functions for initialization below + // Please, read help on this functions and read datasheet before you decide, which + // one needs to be used. For example, ssd1331 is OK with ssd1306_configureI2cDisplay(), + // while st7735 can be initialized only with ssd1306_configureSpiDisplay(). + ssd1306_configureI2cDisplay(s_oled_128x64_initData, sizeof(s_oled_128x64_initData)); +} + +void ssd1325_128x64_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 10 ); + } + ssd1306_spiInit(cesPin, dcPin); + ssd1325_128x64_init(); +} diff --git a/lib/libssd1306/src/lcd/oled_ssd1325.h b/lib/libssd1306/src/lcd/oled_ssd1325.h new file mode 100644 index 0000000..401ffa8 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1325.h @@ -0,0 +1,98 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file oled_ssd1325.h support for SSD1325 OLED 128x64 display + */ + + +#ifndef _OLED_SSD1325_H_ +#define _OLED_SSD1325_H_ + +#include "ssd1306_hal/io.h" +#include "lcd/lcd_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup SSD1325_OLED_API SSD1325: ssd1325 control functions + * @{ + */ + + +/** + * @} + */ + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Sets GDRAM autoincrement mode + * + * Sets GDRAM autoincrement mode. By default, to make + * ssd1306_xxx functions compatible with SSD1325 oled display, + * SSD1325 oled is initialized in vertical auto-increment mode. + * But for pure SSD1325 oled operations horizontal auto-increment mode is more suitable. + * So, if you're going to use NanoCanvas8 functions, please call + * ssd1325_setMode(0) prior to using pure SSD1325 oled methods. + * + * @param mode 0 or 1 + * @deprecated Use ssd1306_setMode() instead. + */ +void ssd1325_setMode(lcd_mode_t mode); + +/** + * @brief Inits 128x64 SSD1325 OLED display (based on SSD1325 controller). + * + * Inits 128x64 SSD1325 OLED display (based on SSD1325 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void ssd1325_128x64_init(void); + +/** + * @brief Inits 128x64 SSD1325 OLED display over spi (based on SSD1325 controller). + * + * Inits 128x64 SSD1325 OLED display over spi (based on SSD1325 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void ssd1325_128x64_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _OLED_SSD1325_H_ diff --git a/lib/libssd1306/src/lcd/oled_ssd1327.c b/lib/libssd1306/src/lcd/oled_ssd1327.c new file mode 100644 index 0000000..2a53f64 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1327.c @@ -0,0 +1,195 @@ +/* + MIT License + + Copyright (c) 2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "oled_ssd1327.h" +#include "lcd_common.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + +extern uint16_t ssd1306_color; + +static const PROGMEM uint8_t s_oled_128x128_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SSD1327, + SDL_LCD_SSD1327_GENERIC, +#endif + 0xFD, 0x12, // Unlock OLED + 0xAE, // OFF /* display off */ + 0xA8, 0x7F, // multiplex 128 + 0xA1, 0x00, // Start line + 0xA2, 0x00, // Display offset + 0xA0, 0x40 | 0x10 | 0x04 | (0x02 | 0x01), // REMAP: vertical increment mode + 0xAB, 0x01, // VDD internal + 0x81, 0x70, // CONTRAST + 0xB1, 0x55, // PHASE 0x51 + 0xB3, 0x01, // CLK +// 0xB9, //Reload grey scale + 0xBC, 0x08, // PRECHARGE + 0xBE, 0x07, // VCOMH voltage + 0xB6, 0x01, // Second pre-charge + 0xA4, // NORMAL + 0x2E, // Deactivate scroll + 0xAF, // Display ON +}; + +///////////// ssd1327 functions below are for SPI display //////////// +///////////// in ssd1306 compatible mode //////////// + +//////////////////////// SSD1306 COMPATIBLE MODE /////////////////////////////// + +static uint8_t __s_column; +static uint8_t __s_w; +static uint8_t __s_w2; +static uint8_t __s_page; +static uint8_t __s_leftPixel; +static uint8_t __s_pos; + +static void set_block_compat(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + rx = rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1); + __s_column = x; + __s_page = y; + __s_w = w; + __s_w2 = rx - x + 1; + __s_leftPixel = 0; + __s_pos = __s_column; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x15); + ssd1306_intf.send(x / 2); + ssd1306_intf.send(rx / 2); + ssd1306_intf.send(0x75); + ssd1306_intf.send(y<<3); + ssd1306_intf.send(((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1)); + ssd1306_spiDataMode(1); +} + +static void ssd1327_sendPixels(uint8_t data); + +static void next_page_compat(void) +{ + ssd1306_intf.stop(); + set_block_compat(__s_column,__s_page + 1, __s_w); +} + +//SSD1306_COMPAT_SPI_BLOCK_8BIT_CMDS( 0x15, 0x75 ); + +static void ssd1327_sendPixels(uint8_t data) +{ + if (!(__s_pos & 0x01)) + { + __s_leftPixel = data; + data = 0x00; + } + if ((__s_pos & 0x01) || (__s_pos == __s_column + __s_w2 - 1)) + { + for (uint8_t i=8; i>0; i--) + { + uint8_t color = (__s_leftPixel & 0x01) ? (ssd1306_color & 0x0F) : 0; + color |= (((data & 0x01) ? (ssd1306_color & 0x0F): 0) << 4); + ssd1306_intf.send(color); + data >>= 1; + __s_leftPixel >>= 1; + } + } + __s_pos++; +} + +static void ssd1327_sendPixels8(uint8_t data) +{ + ssd1306_intf.send( data ); +} + +static void ssd1327_sendPixelsBuffer(const uint8_t *buffer, uint16_t len) +{ + while (len--) + { + ssd1327_sendPixels(*buffer); + buffer++; + } +} + +//////////////////////// SSD1331 NATIVE MODE /////////////////////////////////// + +CONTROLLER_NATIVE_SPI_BLOCK_8BIT_CMDS( 0x15, 0x75 ); + +///////////// ssd1325 functions below are for SPI display //////////// +///////////// in native/normal mode //////////// + +static void ssd1327_setMode(lcd_mode_t mode) +{ + if (mode == LCD_MODE_NORMAL) + { + ssd1306_lcd.set_block = set_block_native; + ssd1306_lcd.next_page = next_page_native; + } + else if (mode == LCD_MODE_SSD1306_COMPAT ) + { + ssd1306_lcd.set_block = set_block_compat; + ssd1306_lcd.next_page = next_page_compat; + } + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send( 0xA0 ); + ssd1306_intf.send( 0x10 | (mode == LCD_MODE_NORMAL ? 0x00 : 0x04) ); + ssd1306_intf.stop(); + return; +} + +void ssd1327_128x128_init() +{ + ssd1306_lcd.type = LCD_TYPE_CUSTOM; + ssd1306_lcd.width = 128; // specify width + ssd1306_lcd.height = 128; // specify height + // Set functions for compatible mode + ssd1306_lcd.set_block = set_block_compat; + ssd1306_lcd.next_page = next_page_compat; + ssd1306_lcd.send_pixels1 = ssd1327_sendPixels; + ssd1306_lcd.send_pixels_buffer1 = ssd1327_sendPixelsBuffer; + // Set function for 8-bit mode + ssd1306_lcd.send_pixels8 = ssd1327_sendPixels8; + ssd1306_lcd.set_mode = ssd1327_setMode; + // Use one of 2 functions for initialization below + // Please, read help on this functions and read datasheet before you decide, which + // one needs to be used. For example, ssd1331 is OK with ssd1306_configureI2cDisplay(), + // while st7735 can be initialized only with ssd1306_configureSpiDisplay(). + ssd1306_configureI2cDisplay(s_oled_128x128_initData, sizeof(s_oled_128x128_initData)); + delay(100); +} + +void ssd1327_128x128_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 10 ); + } + ssd1306_spiInit(cesPin, dcPin); + ssd1327_128x128_init(); +} diff --git a/lib/libssd1306/src/lcd/oled_ssd1327.h b/lib/libssd1306/src/lcd/oled_ssd1327.h new file mode 100644 index 0000000..b955346 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1327.h @@ -0,0 +1,83 @@ +/* + MIT License + + Copyright (c) 2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file oled_ssd1325.h support for SSD1325 OLED 128x64 display + */ + + +#ifndef _OLED_SSD1327_H_ +#define _OLED_SSD1327_H_ + +#include "ssd1306_hal/io.h" +#include "lcd/lcd_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup SSD1327_OLED_API SSD1327: ssd1327 control functions + * @{ + */ + + +/** + * @} + */ + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Inits 128x128 SSD1327 OLED display (based on SSD1327 controller). + * + * Inits 128x128 SSD1327 OLED display (based on SSD1327 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void ssd1327_128x128_init(void); + +/** + * @brief Inits 128x128 SSD1327 OLED display over spi (based on SSD1327 controller). + * + * Inits 128x128 SSD1327 OLED display over spi (based on SSD1327 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void ssd1327_128x128_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _OLED_SSD1327_H_ diff --git a/lib/libssd1306/src/lcd/oled_ssd1331.c b/lib/libssd1306/src/lcd/oled_ssd1331.c new file mode 100644 index 0000000..35fdd2f --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1331.c @@ -0,0 +1,287 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "oled_ssd1331.h" +#include "lcd_common.h" +#include "ssd1331_commands.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif +#include "nano_gfx_types.h" + +extern uint16_t ssd1306_color; + +static const PROGMEM uint8_t s_oled96x64_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SSD1331_X8, + 0x00, +#endif + SSD1331_DISPLAYOFF, // display off + SSD1331_SEGREMAP, 0x00 | 0x20 | 0x10 | 0x02 | 0x01, /* 8-bit rgb color mode */ + SSD1331_SETSTARTLINE, 0x00, // First line to start scanning from + SSD1331_SETDISPLAYOFFSET, 0x00, // Set display offset + SSD1331_NORMALDISPLAY, + SSD1331_SETMULTIPLEX, 63, // Reset to default MUX. See datasheet + SSD1331_SETMASTER, 0x8E, // Set master mode + SSD1331_POWERMODE, 0x0B, // Disable power-safe mode + SSD1331_SETPRECHARGE, 0x31, // Phase 1 and Phase 2 periods + SSD1331_CLOCKDIV, 0xF0, // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16) + SSD1331_PRECHARGEA, 0x64, + SSD1331_PRECHARGEB, 0x78, + SSD1331_PRECHARGELEVEL, 0x3A, + SSD1331_VCOMH, 0x3E, + SSD1331_MASTERCURRENT, 0x09, + SSD1331_CONTRASTA, 0x91, // RED + SSD1331_CONTRASTB, 0x50, // GREEN + SSD1331_CONTRASTC, 0x7D, // BLUE + SSD1331_DISPLAYON, +}; + +static const PROGMEM uint8_t s_oled96x64_initData16[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SSD1331_X16, + 0x00, +#endif + SSD1331_DISPLAYOFF, // display off + SSD1331_SEGREMAP, 0x40 | 0x20 | 0x10 | 0x02 | 0x01, /* 16-bit rgb color mode */ + SSD1331_SETSTARTLINE, 0x00, // First line to start scanning from + SSD1331_SETDISPLAYOFFSET, 0x00, // Set display offset + SSD1331_NORMALDISPLAY, + SSD1331_SETMULTIPLEX, 63, // Reset to default MUX. See datasheet + SSD1331_SETMASTER, 0x8E, // Set master mode + SSD1331_POWERMODE, 0x0B, // Disable power-safe mode + SSD1331_SETPRECHARGE, 0x31, // Phase 1 and Phase 2 periods + SSD1331_CLOCKDIV, 0xF0, // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16) + SSD1331_PRECHARGEA, 0x64, + SSD1331_PRECHARGEB, 0x78, + SSD1331_PRECHARGELEVEL, 0x3A, + SSD1331_VCOMH, 0x3E, + SSD1331_MASTERCURRENT, 0x09, + SSD1331_CONTRASTA, 0x91, // RED + SSD1331_CONTRASTB, 0x50, // GREEN + SSD1331_CONTRASTC, 0x7D, // BLUE + SSD1331_DISPLAYON, +}; + +static uint8_t s_rotation = 0x04; + +//////////////////////// SSD1306 COMPATIBLE MODE /////////////////////////////// + +SSD1306_COMPAT_SPI_BLOCK_8BIT_CMDS( + (s_rotation & 1) ? SSD1331_ROWADDR: SSD1331_COLUMNADDR, + (s_rotation & 1) ? SSD1331_COLUMNADDR: SSD1331_ROWADDR ); + +SSD1306_COMPAT_SEND_PIXELS_RGB8_CMDS(); + +SSD1306_COMPAT_SEND_PIXELS_RGB16_CMDS(); + +//////////////////////// SSD1331 NATIVE MODE /////////////////////////////////// + +CONTROLLER_NATIVE_SPI_BLOCK_8BIT_CMDS( + (s_rotation & 1) ? SSD1331_ROWADDR: SSD1331_COLUMNADDR, + (s_rotation & 1) ? SSD1331_COLUMNADDR: SSD1331_ROWADDR ); + +//////////////////////////// GENERIC FUNCTIONS //////////////////////////// + +void ssd1331_setMode(lcd_mode_t mode) +{ + if (mode == LCD_MODE_NORMAL) + { + s_rotation &= ~0x04; + ssd1306_lcd.set_block = set_block_native; + ssd1306_lcd.next_page = next_page_native; + } + else if (mode == LCD_MODE_SSD1306_COMPAT ) + { + s_rotation |= 0x04; + ssd1306_lcd.set_block = set_block_compat; + ssd1306_lcd.next_page = next_page_compat; + } + ssd1331_setRotation( s_rotation ); + return; +} + +void ssd1331_setRotation(uint8_t rotation) +{ + uint8_t ram_mode; + if ((rotation^s_rotation) & 0x01) + { + uint16_t t = ssd1306_lcd.width; + ssd1306_lcd.width = ssd1306_lcd.height; + ssd1306_lcd.height = t; + } + s_rotation = (rotation & 0x03) | (s_rotation & 0x04); + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send( SSD1331_SEGREMAP ); + switch (s_rotation) + { + // NORMAL FULL COLOR MODE + case 0: + ram_mode = 0b00110010; + break; + case 1: // 90 degree CW + ram_mode = 0b00110001; + break; + case 2: // 180 degree CW + ram_mode = 0b00100000; + break; + case 3: // 270 degree CW + ram_mode = 0b00100011; + break; + // SSD1306_COMPATIBLE mode + case 4: + ram_mode = 0b00110011; + break; + case 5: // 90 degree CW + ram_mode = 0b00110000; + break; + case 6: // 180 degree CW + ram_mode = 0b00100001; + break; + case 7: // 270 degree CW + ram_mode = 0b00100010; + break; + default: // 270 degree CW + ram_mode = 0b00100000; + break; + } + ssd1306_intf.send( ram_mode ); + ssd1306_intf.stop(); +} + +// 16-bit color in 8-bit display mode +static void ssd1331_sendPixel16_8(uint16_t data) +{ + uint8_t color = RGB16_TO_RGB8(data); + ssd1306_intf.send( color ); +} + +// 8-bit color in 16-bit display mode +static void ssd1331_sendPixel8_16(uint8_t data) +{ + uint16_t color = RGB8_TO_RGB16(data); + ssd1306_intf.send( color >> 8 ); + ssd1306_intf.send( color & 0xFF ); +} + +// 16-bit color in 16-bit display mode +static void ssd1331_sendPixel16(uint16_t color) +{ + ssd1306_intf.send( color >> 8 ); + ssd1306_intf.send( color & 0xFF ); +} + +void ssd1331_96x64_init() +{ + ssd1306_lcd.type = LCD_TYPE_SSD1331; + ssd1306_lcd.height = 64; + ssd1306_lcd.width = 96; + ssd1306_lcd.set_block = set_block_compat; + ssd1306_lcd.next_page = next_page_compat; + ssd1306_lcd.send_pixels1 = send_pixels_compat; + ssd1306_lcd.send_pixels_buffer1 = send_pixels_buffer_compat; + + ssd1306_lcd.send_pixels8 = ssd1306_intf.send; + ssd1306_lcd.send_pixels16 = ssd1331_sendPixel16_8; + ssd1306_lcd.set_mode = ssd1331_setMode; + for( uint8_t i=0; i<sizeof(s_oled96x64_initData); i++) + { + ssd1306_sendCommand(pgm_read_byte(&s_oled96x64_initData[i])); + } +} + +void ssd1331_96x64_init16() +{ + ssd1306_lcd.type = LCD_TYPE_SSD1331; + ssd1306_lcd.height = 64; + ssd1306_lcd.width = 96; + ssd1306_lcd.set_block = set_block_compat; + ssd1306_lcd.next_page = next_page_compat; + ssd1306_lcd.send_pixels1 = send_pixels_compat16; + ssd1306_lcd.send_pixels_buffer1 = send_pixels_buffer_compat16; + + ssd1306_lcd.send_pixels8 = ssd1331_sendPixel8_16; + ssd1306_lcd.send_pixels16 = ssd1331_sendPixel16; + ssd1306_lcd.set_mode = ssd1331_setMode; + for( uint8_t i=0; i<sizeof(s_oled96x64_initData16); i++) + { + ssd1306_sendCommand(pgm_read_byte(&s_oled96x64_initData16[i])); + } +} + +void ssd1331_96x64_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 10 ); + } + ssd1306_spiInit(cesPin, dcPin); + ssd1331_96x64_init(); +} + +void ssd1331_96x64_spi_init16(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 10 ); + } + ssd1306_spiInit(cesPin, dcPin); + ssd1331_96x64_init16(); +} + +void ssd1331_drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint16_t color) +{ + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(SSD1331_DRAWLINE); + ssd1306_intf.send(x1); + ssd1306_intf.send(y1); + ssd1306_intf.send(x2); + ssd1306_intf.send(y2); + ssd1306_intf.send( (color & 0x03) << 4 ); + ssd1306_intf.send( (color & 0x1C) << 2 ); + ssd1306_intf.send( (color & 0xE0) >> 2 ); + ssd1306_intf.stop(); +} + +void ssd1331_copyBlock(uint8_t left, uint8_t top, uint8_t right, uint8_t bottom, uint8_t newLeft, uint8_t newTop) +{ + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x23); + ssd1306_intf.send(left); + ssd1306_intf.send(top); + ssd1306_intf.send(right); + ssd1306_intf.send(bottom); + ssd1306_intf.send(newLeft); + ssd1306_intf.send(newTop); + ssd1306_intf.stop(); +} + diff --git a/lib/libssd1306/src/lcd/oled_ssd1331.h b/lib/libssd1306/src/lcd/oled_ssd1331.h new file mode 100644 index 0000000..d270a25 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1331.h @@ -0,0 +1,146 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file oled_ssd1331.h support for RGB OLED 96x64 display + */ + + +#ifndef _OLED_SSD1331_H_ +#define _OLED_SSD1331_H_ + +#include "ssd1306_hal/io.h" +#include "lcd/lcd_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup SSD1331_API SSD1331: ssd1331 control functions + * @{ + */ + +/** + * @brief Sets screen orientation (rotation) + * + * Sets screen orientation (rotation): 0 - normal, 1 - 90 CW, 2 - 180 CW, 3 - 270 CW + * @param rotation - screen rotation 0 - normal, 1 - 90 CW, 2 - 180 CW, 3 - 270 CW + * @note works only with ssd1331 display + */ +void ssd1331_setRotation(uint8_t rotation); + +/** + * @} + */ + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Sets GDRAM autoincrement mode + * + * Sets GDRAM autoincrement mode. By default, to make + * ssd1306_xxx functions compatible with RGB oled display, + * RGB oled is initialized in vertical auto-increment mode. + * But for pure rbg oled operations horizontal auto-increment mode is more suitable. + * So, if you're going to use NanoCanvas8 functions, please call + * ssd1331_setMode(0) prior to using pure RGB methods. + * + * @param mode 0 or 1 + * @deprecated Use ssd1306_setMode() instead. + */ +void ssd1331_setMode(lcd_mode_t mode); + +/** + * @brief Inits 96x64 RGB OLED display (based on SSD1331 controller). + * + * Inits 96x64 RGB OLED display (based on SSD1331 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void ssd1331_96x64_init(void); + +/** + * @brief Inits 96x64 RGB OLED display over spi in 8-bit mode (based on SSD1331 controller). + * + * Inits 96x64 RGB OLED display over spi in 8-bit mode (based on SSD1331 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void ssd1331_96x64_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @brief Inits 96x64 RGB OLED display over spi in 16-bit mode (based on SSD1331 controller). + * + * Inits 96x64 RGB OLED display over spi in 16-bit mode (based on SSD1331 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void ssd1331_96x64_spi_init16(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * Draws line + * @param x1 - x position in pixels of start point + * @param y1 - y position in pixels of start point + * @param x2 - x position in pixels of end point + * @param y2 - y position in pixels of end point + * @param color - color of the line, refer to RGB_COLOR8 macros + * + * @note This API can be used only with ssd1331 RGB oled displays + */ +void ssd1331_drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint16_t color); + +/** + * Copies block in GDRAM to new position + * @param left column start of block to copy + * @param top row start of block to copy + * @param right column end of block to copy + * @param bottom row end of block to copy + * @param newLeft new column start + * @param newTop new row start + * + * @note This API can be used only with ssd1331 RGB oled displays + * @note after copy command is sent, it takes some time from oled + * controller to complete operation. So, it is HIGHLY recommended + * to wait for reasonable time before send other graphics operations + * (for example, use 250us delay). This time is required for + * oled display to become ready to accept new commands. + */ +void ssd1331_copyBlock(uint8_t left, uint8_t top, uint8_t right, uint8_t bottom, uint8_t newLeft, uint8_t newTop); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _OLED_SSD1331_H_ diff --git a/lib/libssd1306/src/lcd/oled_ssd1351.c b/lib/libssd1306/src/lcd/oled_ssd1351.c new file mode 100644 index 0000000..56f7c08 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1351.c @@ -0,0 +1,226 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "oled_ssd1351.h" +#include "lcd_common.h" +#include "ssd1351_commands.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#include "nano_gfx_types.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + +#define CMD_ARG 0xFF + +extern uint16_t ssd1306_color; +extern uint32_t s_ssd1306_spi_clock; + +static const PROGMEM uint8_t s_oled128x128_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_SSD1351, + 0x00, +#endif + SSD1351_UNLOCK, CMD_ARG, 0x12, + SSD1351_UNLOCK, CMD_ARG, 0xB1, + SSD1351_SLEEP_ON, + SSD1351_CLOCKDIV, CMD_ARG, 0xF1, // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16) + SSD1351_SETMULTIPLEX, CMD_ARG, 127, // Reset to default MUX. See datasheet + SSD1351_SEGREMAP, CMD_ARG, 0B00110101, // 16-bit rgb color mode + SSD1351_SETSTARTLINE, CMD_ARG, 0x00, // First line to start scanning from + SSD1351_SETDISPLAYOFFSET, CMD_ARG, 0x00, // Set display offset + SSD1351_SETGPIO, CMD_ARG, 0x00, // GPIO OFF + SSD1351_SETFUNCTION, CMD_ARG, 0x01, + SSD1351_SETPRECHARGE, CMD_ARG, 0x32, // Phase 1 and Phase 2 periods + SSD1351_VCOMH, CMD_ARG, 0x05, // + SSD1351_PRECHARGELEVEL, CMD_ARG, 0x17, + SSD1351_NORMALDISPLAY, + SSD1351_CONTRAST, CMD_ARG, 0xC8, // RED + CMD_ARG, 0x80, // GREEN + CMD_ARG, 0xC8, // BLUE + SSD1351_MASTERCURRENT, CMD_ARG, 0x0F, // + SSD1351_EXTVSL, CMD_ARG, 0xA0, CMD_ARG, 0xB5, CMD_ARG, 0x55, + SSD1351_PRECHARGESECOND, CMD_ARG, 0x01, // + SSD1351_SLEEP_OFF, // Disable power-safe mode + SSD1351_NORMALDISPLAY, +}; + +static uint8_t s_column; +static uint8_t s_page; + +static void ssd1351_setBlock(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + s_column = x; + s_page = y; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(SSD1351_COLUMNADDR); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(x); + ssd1306_intf.send(rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)); + ssd1306_spiDataMode(0); + ssd1306_intf.send(SSD1351_ROWADDR); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(y<<3); + ssd1306_intf.send(((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1)); + ssd1306_spiDataMode(0); + ssd1306_intf.send(SSD1331_WRITEDATA); + ssd1306_spiDataMode(1); +} + +static void ssd1351_setBlock2(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(SSD1351_COLUMNADDR); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(x); + ssd1306_intf.send(rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)); + ssd1306_spiDataMode(0); + ssd1306_intf.send(SSD1351_ROWADDR); + ssd1306_spiDataMode(1); // According to datasheet all args must be passed in data mode + ssd1306_intf.send(y); + ssd1306_intf.send(ssd1306_lcd.height - 1); + ssd1306_spiDataMode(0); + ssd1306_intf.send(SSD1331_WRITEDATA); + ssd1306_spiDataMode(1); +} + +static void ssd1351_nextPage(void) +{ + ssd1306_intf.stop(); + ssd1351_setBlock(s_column,s_page+1,0); +} + +static void ssd1351_nextPage2(void) +{ +} + +void ssd1351_setMode(lcd_mode_t mode) +{ + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send( SSD1351_SEGREMAP ); + ssd1306_spiDataMode(1); + ssd1306_intf.send( 0B00110100 | mode ); + ssd1306_intf.stop(); + if (mode == LCD_MODE_SSD1306_COMPAT) + { + ssd1306_lcd.set_block = ssd1351_setBlock; + ssd1306_lcd.next_page = ssd1351_nextPage; + } + else if (mode == LCD_MODE_NORMAL ) + { + ssd1306_lcd.set_block = ssd1351_setBlock2; + ssd1306_lcd.next_page = ssd1351_nextPage2; + } +} + +static void ssd1351_sendPixels(uint8_t data) +{ + for (uint8_t i=8; i>0; i--) + { + if ( data & 0x01 ) + { + ssd1306_intf.send( (uint8_t)(ssd1306_color>>8) ); + ssd1306_intf.send( (uint8_t)(ssd1306_color) ); + } + else + { + ssd1306_intf.send( 0B00000000 ); + ssd1306_intf.send( 0B00000000 ); + } + data >>= 1; + } +} + +static void ssd1351_sendPixelsBuffer(const uint8_t *buffer, uint16_t len) +{ + while(len--) + { + ssd1351_sendPixels(*buffer); + buffer++; + } +} + +static void ssd1351_sendPixel8(uint8_t data) +{ + uint16_t color = RGB8_TO_RGB16(data); + ssd1306_intf.send( color >> 8 ); + ssd1306_intf.send( color & 0xFF ); +} + +static void ssd1351_sendPixel16(uint16_t color) +{ + ssd1306_intf.send( color >> 8 ); + ssd1306_intf.send( color & 0xFF ); +} + +void ssd1351_128x128_init() +{ + ssd1306_lcd.type = LCD_TYPE_SSD1331; + ssd1306_lcd.height = 128; + ssd1306_lcd.width = 128; + ssd1306_lcd.set_block = ssd1351_setBlock; + ssd1306_lcd.next_page = ssd1351_nextPage; + ssd1306_lcd.send_pixels1 = ssd1351_sendPixels; + ssd1306_lcd.send_pixels_buffer1 = ssd1351_sendPixelsBuffer; + ssd1306_lcd.send_pixels8 = ssd1351_sendPixel8; + ssd1306_lcd.send_pixels16 = ssd1351_sendPixel16; + ssd1306_lcd.set_mode = ssd1351_setMode; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + for( uint8_t i=0; i<sizeof(s_oled128x128_initData); i++) + { + uint8_t data = pgm_read_byte(&s_oled128x128_initData[i]); + if (data == CMD_ARG) + { + data = pgm_read_byte(&s_oled128x128_initData[++i]); + ssd1306_spiDataMode(1); + ssd1306_intf.send(data); + ssd1306_spiDataMode(0); + } + else + { + ssd1306_intf.send(data); + } + } + ssd1306_intf.stop(); +} + +void ssd1351_128x128_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 20 ); + } + /* ssd1351 cannot work faster than at 4MHz per datasheet */ + s_ssd1306_spi_clock = 4400000; + ssd1306_spiInit(cesPin, dcPin); + ssd1351_128x128_init(); +} diff --git a/lib/libssd1306/src/lcd/oled_ssd1351.h b/lib/libssd1306/src/lcd/oled_ssd1351.h new file mode 100644 index 0000000..68bdb59 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_ssd1351.h @@ -0,0 +1,88 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file oled_ssd1351.h support for RGB OLED 128x128 display + */ + + +#ifndef _OLED_SSD1351_H_ +#define _OLED_SSD1351_H_ + +#include "ssd1306_hal/io.h" +#include "lcd/lcd_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Sets GDRAM autoincrement mode + * + * Sets GDRAM autoincrement mode. By default, to make + * ssd1306_xxx functions compatible with RGB oled display, + * RGB oled is initialized in vertical auto-increment mode. + * But for pure rbg oled operations horizontal auto-increment mode is more suitable. + * So, if you're going to use NanoCanvas8 functions, please call + * ssd1351_setMode(0) prior to using pure RGB methods. + * + * @param mode 0 or 1 + * @deprecated Use ssd1306_setMode() instead. + */ +void ssd1351_setMode(lcd_mode_t mode); + +/** + * @brief Inits 128x128 RGB OLED display (based on SSD1351 controller). + * + * Inits 128x128 RGB OLED display (based on SSD1351 controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void ssd1351_128x128_init(void); + +/** + * @brief Inits 128x128 RGB OLED display over spi (based on SSD1351 controller). + * + * Inits 128x128 RGB OLED display over spi (based on SSD1351 controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void ssd1351_128x128_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _OLED_SSD1351_H_ diff --git a/lib/libssd1306/src/lcd/oled_template.c b/lib/libssd1306/src/lcd/oled_template.c new file mode 100644 index 0000000..1f825f3 --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_template.c @@ -0,0 +1,173 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "oled_template.h" +#include "lcd_common.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif + +extern uint16_t ssd1306_color; + +static const PROGMEM uint8_t s_oled_WxH_initData[] = +{ +#ifdef SDL_EMULATION + SDL_LCD_TEMPLATE, + 0x00, +#endif + // Specify display initialization commands here + // The commands should be in format, required by + // ssd1306_configureI2cDisplay() or ssd1306_configureSpiDisplay() + // functions. Refer to their documenation. + 0x00, 0x00, +}; + +///////////// template functions below are for SPI display //////////// +///////////// in ssd1306 compatible mode //////////// + +static uint8_t s_column; +static uint8_t s_page; + +// The function must set block to draw data +static void template_setBlock_compat(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + s_column = x; + s_page = y; + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x00); // Send column addr command to controller + ssd1306_intf.send(x); + ssd1306_intf.send(rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)); + ssd1306_intf.send(0x00); // Replace with row addr command to controller + ssd1306_intf.send(y<<3); + ssd1306_intf.send(((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1)); + ssd1306_spiDataMode(1); +} + +static void template_nextPage_compat(void) +{ + ssd1306_intf.stop(); + template_setBlock_compat(s_column,s_page+1,0); +} + +static void template_sendPixels(uint8_t data) +{ + for (uint8_t i=8; i>0; i--) + { + if ( data & 0x01 ) + { + ssd1306_intf.send( (uint8_t)ssd1306_color ); + } + else + { + ssd1306_intf.send( 0B00000000 ); + } + data >>= 1; + } +} + +static void template_sendPixelsBuffer(const uint8_t *buffer, uint16_t len) +{ + while(len--) + { + template_sendPixels(*buffer); + buffer++; + } +} + +///////////// template functions below are for SPI display //////////// +///////////// in native/normal mode //////////// + +static void template_setBlock(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + ssd1306_intf.start(); + ssd1306_spiDataMode(0); + ssd1306_intf.send(0x00); // Send column address command here + ssd1306_intf.send(x); + ssd1306_intf.send(rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)); + ssd1306_intf.send(0x00); // Send row address command here + ssd1306_intf.send(y); + ssd1306_intf.send(ssd1306_lcd.height - 1); + ssd1306_spiDataMode(1); +} + +static void template_nextPage(void) +{ +} + +void template_setMode(lcd_mode_t mode) +{ + if (mode == LCD_MODE_NORMAL) + { + ssd1306_lcd.set_block = template_setBlock; + ssd1306_lcd.next_page = template_nextPage; + } + else if (mode == LCD_MODE_SSD1306_COMPAT) + { + ssd1306_lcd.set_block = template_setBlock_compat; + ssd1306_lcd.next_page = template_nextPage_compat; + } + // Send command to update controller +// ssd1306_intf.start(); +// ssd1306_spiDataMode(0); +// ssd1306_intf.send( SSD1331_SEGREMAP ); +// ssd1306_intf.stop(); + return; +} + +void template_WxH_init() +{ + ssd1306_lcd.type = LCD_TYPE_CUSTOM; + ssd1306_lcd.width = 96; // specify width + ssd1306_lcd.height = 64; // specify height + // Set functions for compatible mode + ssd1306_lcd.set_block = template_setBlock_compat; + ssd1306_lcd.next_page = template_nextPage_compat; + ssd1306_lcd.send_pixels1 = template_sendPixels; + ssd1306_lcd.send_pixels_buffer1 = template_sendPixelsBuffer; + // Set function for 8-bit mode + ssd1306_lcd.send_pixels8 = ssd1306_intf.send; + ssd1306_lcd.set_mode = template_setMode; + // Use one of 2 functions for initialization below + // Please, read help on this functions and read datasheet before you decide, which + // one needs to be used. For example, ssd1331 is OK with ssd1306_configureI2cDisplay(), + // while st7735 can be initialized only with ssd1306_configureSpiDisplay(). + ssd1306_configureI2cDisplay(s_oled_WxH_initData, sizeof(s_oled_WxH_initData)); +// ssd1306_configureSpiDisplay(s_oled_WxH_initData, sizeof(s_oled_WxH_initData)); +} + +void template_WxH_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin) +{ + if (rstPin >=0) + { + ssd1306_resetController( rstPin, 10 ); + } + ssd1306_spiInit(cesPin, dcPin); + template_WxH_init(); +} diff --git a/lib/libssd1306/src/lcd/oled_template.h b/lib/libssd1306/src/lcd/oled_template.h new file mode 100644 index 0000000..abb6c0d --- /dev/null +++ b/lib/libssd1306/src/lcd/oled_template.h @@ -0,0 +1,99 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file oled_template.h support for TEMPLATE OLED WxH display + */ + + +#ifndef _OLED_TEMPLATE_H_ +#define _OLED_TEMPLATE_H_ + +#include "ssd1306_hal/io.h" +#include "lcd/lcd_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup TEMPLATE_OLED_API TEMPLATE: template control functions + * @{ + */ + +// PLACE ANY OLED SPECIFIC FUNCTIONS HERE + +/** + * @} + */ + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Sets GDRAM autoincrement mode + * + * Sets GDRAM autoincrement mode. By default, to make + * ssd1306_xxx functions compatible with TEMPLATE oled display, + * TEMPLATE oled is initialized in vertical auto-increment mode. + * But for pure TEMPLATE oled operations horizontal auto-increment mode is more suitable. + * So, if you're going to use NanoCanvas8 functions, please call + * template_setMode(0) prior to using pure TEMPLATE oled methods. + * + * @param mode 0 or 1 + * @deprecated Use ssd1306_setMode() instead. + */ +void template_setMode(lcd_mode_t mode); + +/** + * @brief Inits WxH TEMPLATE OLED display (based on TEMPLATE controller). + * + * Inits WxH TEMPLATE OLED display (based on TEMPLATE controller). + * User must init communication interface (i2c, spi) prior to calling this function. + * @see ssd1306_i2cInit() + * @see ssd1306_spiInit() + */ +void template_WxH_init(void); + +/** + * @brief Inits WxH TEMPLATE OLED display over spi (based on TEMPLATE controller). + * + * Inits WxH TEMPLATE OLED display over spi (based on TEMPLATE controller) + * @param rstPin - pin controlling LCD reset (-1 if not used) + * @param cesPin - chip enable pin to LCD slave (-1 if not used) + * @param dcPin - data/command pin to control LCD dc (required) + */ +void template_WxH_spi_init(int8_t rstPin, int8_t cesPin, int8_t dcPin); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _OLED_TEMPLATE_H_ diff --git a/lib/libssd1306/src/lcd/pcd8544_commands.h b/lib/libssd1306/src/lcd/pcd8544_commands.h new file mode 100644 index 0000000..8eba1eb --- /dev/null +++ b/lib/libssd1306/src/lcd/pcd8544_commands.h @@ -0,0 +1,76 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file pcd8544_commands.h PCD8544 commands definitions + */ + +#ifndef _PCD8544_COMMANDS_H_ +#define _PCD8544_COMMANDS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** PCD8544 LCD driver commands */ +enum ESsd1306Commands +{ + PCD8544_NOP = 0x00, + +// Regular functions + PCD8544_FUNCTIONSET = 0x20, + PCD8544_DISPLAYCONTROL = 0x08, + PCD8544_SETYADDR = 0x40, + PCD8544_SETXADDR = 0x80, + +// Extended functions + PCD8544_SETTEMP = 0x04, + PCD8544_SETBIAS = 0x10, + PCD8544_SETVOP = 0x80, + +}; + +/** PCD8544 supported function modes. */ +enum EPcd8544FunctionMode +{ + PCD8544_POWERDOWN = 0x04, + PCD8544_VERTICAL_ADDR_MODE = 0x02, + PCD8544_EXTENDEDINSTRUCTION = 0x01, +}; + +/** PCD8544 supported display modes. */ +enum EPcd8544DisplayMode +{ + PCD8544_DISPLAYBLANK = 0x0, + PCD8544_DISPLAYALLON = 0x1, + PCD8544_DISPLAYNORMAL = 0x4, + PCD8544_DISPLAYINVERTED = 0x5, +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _PCD8544_COMMANDS_H_ diff --git a/lib/libssd1306/src/lcd/ssd1306_commands.h b/lib/libssd1306/src/lcd/ssd1306_commands.h new file mode 100644 index 0000000..9238561 --- /dev/null +++ b/lib/libssd1306/src/lcd/ssd1306_commands.h @@ -0,0 +1,82 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_commands.h SSD1306 commands definitions + */ + +#ifndef _SSD1306_COMMANDS_H_ +#define _SSD1306_COMMANDS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** SSD1306 LCD driver commands */ +enum ESsd1306Commands +{ + SSD1306_SETLOWCOLUMN = 0x00, + SSD1306_SETHIGHCOLUMN = 0x10, + SSD1306_MEMORYMODE = 0x20, + SSD1306_COLUMNADDR = 0x21, + SSD1306_PAGEADDR = 0x22, + SSD1306_SETSTARTLINE = 0x40, + SSD1306_DEFAULT_ADDRESS = 0x78, + SSD1306_SETCONTRAST = 0x81, + SSD1306_CHARGEPUMP = 0x8D, + SSD1306_SEGREMAP = 0xA0, + SSD1306_DISPLAYALLON_RESUME = 0xA4, + SSD1306_DISPLAYALLON = 0xA5, + SSD1306_NORMALDISPLAY = 0xA6, + SSD1306_INVERTDISPLAY = 0xA7, + SSD1306_SETMULTIPLEX = 0xA8, + SSD1306_DISPLAYOFF = 0xAE, + SSD1306_DISPLAYON = 0xAF, + SSD1306_SETPAGE = 0xB0, + SSD1306_COMSCANINC = 0xC0, + SSD1306_COMSCANDEC = 0xC8, + SSD1306_SETDISPLAYOFFSET = 0xD3, + SSD1306_SETDISPLAYCLOCKDIV = 0xD5, + SSD1306_SETPRECHARGE = 0xD9, + SSD1306_SETCOMPINS = 0xDA, + SSD1306_SETVCOMDETECT = 0xDB, + + SSD1306_SWITCHCAPVCC = 0x02, + SSD1306_NOP = 0xE3, +}; + +/** SSD1306 supported memory modes. */ +enum ESsd1306MemoryMode +{ + HORIZONTAL_ADDRESSING_MODE = 0x00, + VERTICAL_ADDRESSING_MODE = 0x01, + PAGE_ADDRESSING_MODE = 0x02, +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _SSD1306_COMMANDS_H_ diff --git a/lib/libssd1306/src/lcd/ssd1331_commands.h b/lib/libssd1306/src/lcd/ssd1331_commands.h new file mode 100644 index 0000000..5b262d6 --- /dev/null +++ b/lib/libssd1306/src/lcd/ssd1331_commands.h @@ -0,0 +1,69 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1331_commands.h SSD1331 commands definitions + */ + +#ifndef _SSD1331_COMMANDS_H_ +#define _SSD1331_COMMANDS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** SSD1331 LCD driver commands */ +enum ESsd1331Commands +{ + SSD1331_COLUMNADDR = 0x15, + SSD1331_DRAWLINE = 0x21, + SSD1331_ROWADDR = 0x75, + SSD1331_CONTRASTA = 0x81, + SSD1331_CONTRASTB = 0x82, + SSD1331_CONTRASTC = 0x83, + SSD1331_MASTERCURRENT = 0x87, + SSD1331_PRECHARGEA = 0x8A, + SSD1331_PRECHARGEB = 0x8B, + SSD1331_SEGREMAP = 0xA0, + SSD1331_SETSTARTLINE = 0xA1, + SSD1331_SETDISPLAYOFFSET = 0xA2, + SSD1331_NORMALDISPLAY = 0xA4, + SSD1331_SETMULTIPLEX = 0xA8, + SSD1331_SETMASTER = 0xAD, + SSD1331_DISPLAYOFF = 0xAE, + SSD1331_DISPLAYON = 0xAF, + SSD1331_POWERMODE = 0xB0, + SSD1331_SETPRECHARGE = 0xB1, + SSD1331_CLOCKDIV = 0xB3, + SSD1331_PRECHARGELEVEL = 0xBB, + SSD1331_VCOMH = 0xBE, + SSD1331_NOP = 0xE3, +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _SSD1331_COMMANDS_H_ diff --git a/lib/libssd1306/src/lcd/ssd1351_commands.h b/lib/libssd1306/src/lcd/ssd1351_commands.h new file mode 100644 index 0000000..4f76463 --- /dev/null +++ b/lib/libssd1306/src/lcd/ssd1351_commands.h @@ -0,0 +1,75 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1351_commands.h SSD1331 commands definitions + */ + +#ifndef _SSD1351_COMMANDS_H_ +#define _SSD1351_COMMANDS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** SSD1351 LCD driver commands */ +enum ESsd1351Commands +{ + SSD1351_COLUMNADDR = 0x15, + SSD1331_WRITEDATA = 0x5C, + SSD1351_ROWADDR = 0x75, + SSD1351_SEGREMAP = 0xA0, + SSD1351_SETSTARTLINE = 0xA1, + SSD1351_SETDISPLAYOFFSET = 0xA2, + SSD1351_SETFUNCTION = 0xAB, + SSD1351_NOP = 0xAD, + SSD1351_ALLOFF = 0xA4, + SSD1351_DISPLAYON = 0xA5, + SSD1351_NORMALDISPLAY = 0xA6, + SSD1351_DISPLAYINVERSE = 0xA7, + SSD1351_SLEEP_ON = 0xAE, + SSD1351_SLEEP_OFF = 0xAF, + SSD1351_NOP2 = 0xB0, + SSD1351_SETPRECHARGE = 0xB1, + SSD1351_CLOCKDIV = 0xB3, + SSD1351_EXTVSL = 0xB4, + SSD1351_SETGPIO = 0xB5, + SSD1351_PRECHARGESECOND = 0xB6, + SSD1351_PRECHARGELEVEL = 0xBB, + SSD1351_VCOMH = 0xBE, + SSD1351_CONTRAST = 0xC1, + SSD1351_MASTERCURRENT = 0xC7, + SSD1351_SETMULTIPLEX = 0xCA, + SSD1351_PRECHARGEA = 0x8A, + SSD1351_PRECHARGEB = 0x8B, + SSD1351_NOP3 = 0xE3, + SSD1351_UNLOCK = 0xFD, +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif // _SSD1351_COMMANDS_H_ diff --git a/lib/libssd1306/src/lcd/vga_commands.h b/lib/libssd1306/src/lcd/vga_commands.h new file mode 100644 index 0000000..63842a7 --- /dev/null +++ b/lib/libssd1306/src/lcd/vga_commands.h @@ -0,0 +1,71 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file vga_commands.h VGA library commands definitions + */ + +#ifndef _VGA_COMMANDS_H_ +#define _VGA_COMMANDS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** VGA driver commands */ +enum EVgaCommands +{ + /** + * VGA_SET_BLOCK command sets rectangle in VGA ram to send pixels to. + * The command needs 4 byte-arguments: + * left boundary in pixels, + * right boundary in pixels, + * top boundary in pixels, + * bottom boundary in pixels, (last arg in not implemented yet) + */ + VGA_SET_BLOCK = 0x01, + + /** + * VGA_SET_MODE command sets memory addressing mode: there are 2 modes + * available: 0 - normal addressing mode, 1 - ssd1306 compatible mode. + * After sending each pixel in normal addressing mode, x position shifts + * right by 1 pixel until end of block is reached, then y position shifts + * down by 1 pixel, and x position move to the start of block. + * After sending each pixel in ssd1306 compatible mode, y position shifts + * down by 1 pixel until 8 vertical pixels are printed, then y position changes + * to top of block, and x position shifts right by 1 pixel. + */ + VGA_SET_MODE = 0x02, + + VGA_SET_RESOLUTION = 0x03, + + VGA_DISPLAY_ON = 0x04, +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- +#endif diff --git a/lib/libssd1306/src/lcd/vga_monitor.c b/lib/libssd1306/src/lcd/vga_monitor.c new file mode 100644 index 0000000..d061a44 --- /dev/null +++ b/lib/libssd1306/src/lcd/vga_monitor.c @@ -0,0 +1,145 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "vga_monitor.h" +#include "vga_commands.h" +#include "lcd_common.h" +#include "intf/ssd1306_interface.h" +#include "ssd1306_hal/io.h" + +static uint8_t s_column = 0; +static uint8_t s_page = 0; + +extern uint16_t ssd1306_color; + +static void vga_set_block1(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + s_column = x; + s_page = y; + ssd1306_intf.start(); + ssd1306_intf.send(0x00); + ssd1306_intf.send(VGA_SET_BLOCK); + ssd1306_intf.send(s_column); + ssd1306_intf.send(rx); + ssd1306_intf.send(s_page * 8); + ssd1306_intf.stop(); + ssd1306_intf.start(); + ssd1306_intf.send(0x40); +} + +static void vga_next_page1(void) +{ + ssd1306_intf.stop(); + vga_set_block1(s_column,s_page+1,0); +} + +static void vga_set_block2(lcduint_t x, lcduint_t y, lcduint_t w) +{ + uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); + ssd1306_intf.start(); + ssd1306_intf.send(0x00); + ssd1306_intf.send(VGA_SET_BLOCK); // set block + ssd1306_intf.send(x); + ssd1306_intf.send(rx); + ssd1306_intf.send(y); + ssd1306_intf.stop(); + ssd1306_intf.start(); + ssd1306_intf.send(0x40); +} + +static void vga_next_page2(void) +{ +} + +static void vga_send_pixels(uint8_t data) +{ + for (uint8_t i=8; i>0; i--) + { + if ( data & 0x01 ) + { + ssd1306_intf.send( (uint8_t)ssd1306_color ); + } + else + { + ssd1306_intf.send( 0B00000000 ); + } + data >>= 1; + } +} + +static void vga_send_pixels_buffer(const uint8_t *buffer, uint16_t len) +{ + while(len--) + { + vga_send_pixels(*buffer); + buffer++; + } +} + +static void vga_set_mode(lcd_mode_t mode) +{ + if (mode == LCD_MODE_NORMAL) + { + ssd1306_lcd.set_block = vga_set_block2; + ssd1306_lcd.next_page = vga_next_page2; + } + else if (mode == LCD_MODE_SSD1306_COMPAT) + { + ssd1306_lcd.set_block = vga_set_block1; + ssd1306_lcd.next_page = vga_next_page1; + } + ssd1306_intf.start(); + ssd1306_intf.send( 0x00 ); + ssd1306_intf.send( VGA_SET_MODE ); + ssd1306_intf.send( (uint8_t)mode ); + ssd1306_intf.stop(); + // empty for a while +} + +void vga_96x40_8colors_init(void) +{ + ssd1306_lcd.type = LCD_TYPE_SSD1331; + ssd1306_lcd.width = 96; + ssd1306_lcd.height = 40; + ssd1306_lcd.set_block = vga_set_block1; + ssd1306_lcd.next_page = vga_next_page1; + ssd1306_lcd.send_pixels1 = vga_send_pixels; + ssd1306_lcd.send_pixels_buffer1 = vga_send_pixels_buffer; + ssd1306_lcd.send_pixels8 = ssd1306_intf.send; + ssd1306_lcd.set_mode = vga_set_mode; +} + +void vga_128x64_mono_init(void) +{ + ssd1306_lcd.type = LCD_TYPE_SSD1306; + ssd1306_lcd.width = 128; + ssd1306_lcd.height = 64; + ssd1306_lcd.set_block = vga_set_block2; + ssd1306_lcd.next_page = vga_next_page2; + ssd1306_lcd.send_pixels1 = ssd1306_intf.send; + ssd1306_lcd.send_pixels_buffer1 = ssd1306_intf.send_buffer; + ssd1306_lcd.set_mode = vga_set_mode; +} + diff --git a/lib/libssd1306/src/lcd/vga_monitor.h b/lib/libssd1306/src/lcd/vga_monitor.h new file mode 100644 index 0000000..afbf9b1 --- /dev/null +++ b/lib/libssd1306/src/lcd/vga_monitor.h @@ -0,0 +1,75 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file vga_monitor.h Interface to vga_monitor + */ + +#ifndef _SSD1306_VGA_MONITOR_H_ +#define _SSD1306_VGA_MONITOR_H_ + +#include "ssd1306_hal/io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * @{ + */ + +/** + * @brief Inits 96x40 color VGA display. + * + * Inits 96x40 color VGA display. This mode supports 8 colors: 3 bits per pixel. + * User must init communication interface (uart) for vga client mode or init vga + * interface for host mode prior to calling this function. + * + * @see ssd1306_uartInit_Builtin() + * @see ssd1306_vga_controller_init() + */ +void vga_96x40_8colors_init(void); + +/** + * @brief Inits 128x64 monochrome VGA display. + * + * Inits 128x64 monochrome VGA display. This mode supports 2 colors: black and white. + * User must init communication interface (uart) for vga client mode or init vga + * interface for host mode prior to calling this function. + * + * @see ssd1306_uartInit_Builtin() + * @see ssd1306_vga_controller_init() + */ +void vga_128x64_mono_init(void); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/lib/libssd1306/src/nano_engine.h b/lib/libssd1306/src/nano_engine.h new file mode 100644 index 0000000..cd1923a --- /dev/null +++ b/lib/libssd1306/src/nano_engine.h @@ -0,0 +1,134 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file nano_engine.h Small graphics engine, based on SSD1331 functions + */ + + +#ifndef _NANO_ENGINE_H_ +#define _NANO_ENGINE_H_ + +#include "nano_engine/sprite.h" +#include "nano_engine/canvas.h" +#include "nano_engine/adafruit.h" +#include "nano_engine/tiler.h" +#include "nano_engine/core.h" + +// DO NOT DECLARE NanoEngine8, NanoEngine16, NanoEngine1 as class NAME: public NanoEngine<T> +// This causes flash and RAM memory consumption in compiled ELF + +/** + * @defgroup NANO_ENGINE_API NANO_ENGINE: Nano Engine description + * @{ + * @brief Nano Engine description + * + * @details This group contains API functions for developing Graphics engines. + */ + +/** + * NanoEngine1 is simple graphics engine, that implements double buffering work + * for the systems with very low resources. That is, memory buffer for SSD1306 oled + * display needs at least 128x64/8 bytes (1024 bytes), and this is inacceptable for + * microcontrollers like attiny85 (it has only 512B of RAM). So, to workaround + * issue with low resources, NanoEngine1 uses small tile buffer (NE_TILE_SIZE x NE_TILE_SIZE) + * and updates only part of oled screen at once. It makes system slow, but it is + * possible to run NanoEngine1 on simple controllers. + * If tile size is 32x32, then 128x64 oled display is devided into 8 tiles: <br> + * [0,0] [1,0] [2,0], [3,0] <br> + * [0,1] [1,1] [2,1], [3,1] <br> + * In your application you can choose, if you want to refresh whole screen (refresh()), or you + * need to refresh only part of oled display. + * + * @warning Works only in SSD1306 compatible mode + */ +#define NanoEngine1 NanoEngine<TILE_16x16_MONO> + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +#define NanoEngineArduboy NanoEngine<TILE_8x8_MONO> +#endif + +/** + * NanoEngine8 is simple graphics engine, that implements double buffering work + * for the systems with very low resources. That is, memory buffer for SSD1331 oled + * display needs at least 96x64x1 bytes (6144 bytes), and this is inacceptable for + * microcontrollers like atmega328p (it has only 2KiB of RAM). So, to workaround + * issue with low resources, NanoEngine8 uses small tile buffer (NE_TILE_SIZE x NE_TILE_SIZE) + * and updates only part of oled screen at once. It makes system slow, but it is + * possible to run NanoEngine8 on simple controllers. + * If tile size is 32x32, then 96x64 oled display is devided into 6 tiles: <br> + * [0,0] [1,0] [2,0] <br> + * [0,1] [1,1] [2,1] <br> + * In your application you can choose, if you want to refresh whole screen (refresh()), or you + * need to refresh only part of oled display. + */ +#define NanoEngine8 NanoEngine<TILE_16x16_RGB8> + +/** + * NanoEngine1 is simple graphics engine, that implements double buffering work + * for the systems with very low resources. That is, memory buffer for SSD1306 oled + * display needs at least 128x64/8 bytes (1024 bytes), and this is inacceptable for + * microcontrollers like attiny85 (it has only 512B of RAM). So, to workaround + * issue with low resources, NanoEngine1 uses small tile buffer (NE_TILE_SIZE x NE_TILE_SIZE) + * and updates only part of oled screen at once. It makes system slow, but it is + * possible to run NanoEngine1 on simple controllers. + * If tile size is 32x32, then 128x64 oled display is devided into 8 tiles: <br> + * [0,0] [1,0] [2,0], [3,0] <br> + * [0,1] [1,1] [2,1], [3,1] <br> + * In your application you can choose, if you want to refresh whole screen (refresh()), or you + * need to refresh only part of oled display. + * + * @warning Works only in RGB 8-bit color mode + */ +class NanoEngine1_8: public NanoEngine<TILE_8x8_MONO_8> +{ +public: + /** + * Creates new Graphics Engine object. + */ + NanoEngine1_8(): NanoEngine() {}; +}; + +/** + * NanoEngine16 is simple graphics engine, that implements double buffering work + * for the systems with very low resources. That is, memory buffer for SSD1351 oled + * display needs at least 128x128x2 bytes (32768 bytes), and this is inacceptable for + * microcontrollers like atmega328p (it has only 2KiB of RAM). So, to workaround + * issue with low resources, NanoEngine16 uses small tile buffer (NE_TILE_SIZE x NE_TILE_SIZE) + * and updates only part of oled screen at once. It makes system slow, but it is + * possible to run NanoEngine16 on simple controllers. + * If tile size is 16x16, then 128x128 oled display is devided into 64 tiles: <br> + * [0,0] [1,0] [2,0] [3,0] [4,0] [5,0] [6,0] [7,0] <br> + * [0,1] [1,1] [2,1] [3,1] [4,1] [5,1] [6,1] [7,1] <br> + * etc. <br> + * In your application you can choose, if you want to refresh whole screen (refresh()), or you + * need to refresh only part of oled display. + */ +#define NanoEngine16 NanoEngine<TILE_8x8_RGB16> + +/** + * @} + */ + +#endif + diff --git a/lib/libssd1306/src/nano_engine/README.md b/lib/libssd1306/src/nano_engine/README.md new file mode 100644 index 0000000..2d0d0c1 --- /dev/null +++ b/lib/libssd1306/src/nano_engine/README.md @@ -0,0 +1,299 @@ +# Using NanoEngine for systems with low resources + +*** + +[tocstart]: # (toc start) + + * [Introduction](#introduction) + * [Main idea of NanoEngine](#main-idea-of-nanoengine) + * [Simple NanoEngine demo](#simple-nanoengine-demo) + * [Reading keys with NanoEngine](#reading-keys-with-nanoengine) + * [Draw monochrome bitmap](#draw-monochrome-bitmap) + * [Draw moving bitmap](#draw-moving-bitmap) + * [What if not to use draw callbacks](#what-if-not-to-use-draw-callbacks) + * [Using Adafruit GFX with NanoEngine](#using-adafruit-gfx-with-nanoengine) + * [To upper level](@ref index) + +[tocend]: # (toc end) + +<a name="introduction"></a> +## Introduction + +Many applications use double-buffered output to physical display to avoid flickering effect, when a user observed non-completed picture for a short time. When working with color OLED/LCD displays like ssd1331, some micro-controllers do not have enough RAM to fit display buffer in. For example, in 8-bit mode ssd1331 OLED display needs 6144 bytes (`96*64`). But simple micro-controller like Atmega328 has only 2KiB, and Attiny85 has only 512B of RAM. But with ssd1306 library you still can create applications for those ones with good graphics. +ssd1306 library represents NanoEngine8, intended to be used with color OLED displays. Digit 8 means that engine implements 8-bit color mode. Refer to arkanoid8 as example, which can be run even on small Attiny85 with color ssd1331 display. The system supports NanoEngine1 for monochrome OLED displays, NanoEngine8 for 8-bit RGB OLED displays, NanoEngine16 for 16-bit RGB OLED displays. + +<a name="main-idea-of-nanoengine"></a> +## Main idea of NanoEngine + +There are 2 issues with tiny controllers: + * they have a little RAM + * they support low frequencies + +The first problem is solved in NanoEngine by using double-buffer to redraw only part of display content at once. By default NanoEngine uses 8x8 small buffer (64 bytes) and 24 bytes to store information on areas, which need to be refreshed. +The second problem is solved almost the same way: refresh only those part of display content, which were changed since last frame update. For example, ssd1331 oled display work on SPI at 8MHz frequency, that means in ideal conditions the screen content can be refreshed 162 times per second (`8000000/(96*64*8)`). But with the data, you need to send also commands to the display and to do some other stuff. And real tests with Atmega328p show that `ssd1306_clearScreen()` can run only at 58 FPS, coping data from buffer to OLED memory runs slower. +There is no such issue for Arduboy, since it uses monochrome OLED ssd1306 with only 1KiB of RAM buffer, and theoretical fps can be up to 976. For color display and small controllers the main solution is to refresh only part of display content. Arkanoid8 can give easily 60 fps with NanoEngine8 + +<a name="simple-nanoengine-demo"></a> +## Simple NanoEngine demo + +```cpp +#include "ssd1306.h" +#include "nano_engine.h" + +NanoEngine8 engine; + +bool drawAll() +{ + engine.canvas.clear(); + engine.canvas.setColor(RGB_COLOR8(255,255,0)); + engine.canvas.drawRect(15,12,70,55); + return true; // if to return false, the engine will skip this part of screen update +} + +void setup() +{ + /* Init SPI 96x64 RBG oled. 3 - RESET, 4 - CS (can be omitted, oled CS must be pulled down), 5 - D/C */ + ssd1331_96x64_spi_init(3, 4, 5); + + engine.begin(); + engine.setFrameRate(30); + /* Set callback to draw parts, when NanoEngine8 asks */ + engine.drawCallback( drawAll ); +} + +void loop() +{ + if (!engine.nextFrame()) return; + engine.refresh(); // Makes engine to refresh whole display content + engine.display(); +} +``` + +<a name="reading-keys-with-nanoengine"></a> +## Reading keys with NanoEngine + +What, if we want to move yellow rectangle. There is easy way to do this with NanoEngine8. The engine supports up-to 6 keys: `BUTTON_DOWN`, `BUTTON_LEFT`, `BUTTON_RIGHT`, `BUTTON_UP`, `BUTTON_A`, `BUTTON_B`. All you need is to say the engine how it can get buttons state on your board. There are already 2 built-in implementations: `connectArduboyKeys()` allows using Arduboy platform hardware (remember that you need to replace ssd1306 oled with color ssd1331 oled), and `connectZKeypad()` allows using standard 5-keys Z-keypad (you can find it on E-bay). Or you can set custom key processing handler via `connectCustomKeys()` and implement your own hardware driver. + +Example of using Z-keypad to move rectangle. +```cpp +#include "ssd1306.h" +#include "nano_engine.h" + +NanoEngine8 engine; + +NanoRect rect = { {15,12}, {60,35} }; // Lets make rect smaller than in previous example + +bool drawAll() +{ + engine.canvas.clear(); + engine.canvas.setColor(RGB_COLOR8(255,255,0)); + engine.canvas.drawRect(rect); // draw rect in buffer + return true; +} + +void setup() +{ + /* Init SPI 96x64 RBG oled. 3 - RESET, 4 - CS (can be omitted, oled CS must be pulled down), 5 - D/C */ + ssd1331_96x64_spi_init(3, 4, 5); + + engine.begin(); + engine.setFrameRate(30); + engine.drawCallback( drawAll ); // Set callback to draw parts, when NanoEngine8 asks + engine.connectZKeypad(0); // Connect ADC-buttons Z-keypad to analog A0 pin + engine.refresh(); // Makes engine to refresh whole display content at start-up +} + +void loop() +{ + if (!engine.nextFrame()) return; + NanoPoint point = {0,0}; + if (engine.pressed( BUTTON_RIGHT )) point.x = +1; + if (engine.pressed( BUTTON_LEFT )) point.x = -1; + if (engine.pressed( BUTTON_UP )) point.y = -1; + if (engine.pressed( BUTTON_DOWN )) point.y = +1; + engine.refresh(rect); // Update screen content at old rect position + rect += point; // Move rect according to pressed keys + engine.refresh(rect); // Update screen content at new rect position + engine.display(); // refresh display content +} +``` + +<a name="draw-monochrome-bitmap"></a> +## Draw monochrome bitmap + +```cpp +#include "ssd1306.h" +#include "nano_engine.h" + +NanoEngine8 engine; + +const uint8_t heartSprite[8] PROGMEM = +{ + 0B00001110, + 0B00011111, + 0B00111111, + 0B01111110, + 0B01111110, + 0B00111101, + 0B00011001, + 0B00001110 +}; + +bool drawAll() +{ + engine.canvas.clear(); + engine.canvas.setMode(0); // We want to draw non-transparent bitmap + engine.canvas.setColor(RGB_COLOR8(255,0,0)); // draw with red color + engine.canvas.drawBitmap1(10, 20, 8, 8, heartSprite); + return true; +} + +void setup() +{ + /* Init SPI 96x64 RBG oled. 3 - RESET, 4 - CS (can be omitted, oled CS must be pulled down), 5 - D/C */ + ssd1331_96x64_spi_init(3, 4, 5); + engine.begin(); + engine.drawCallback( drawAll ); // Set callback to draw parts, when NanoEngine8 asks + engine.refresh(); // Makes engine to refresh whole display content at start-up +} + +void loop() +{ + if (!engine.nextFrame()) return; + engine.display(); // refresh display content +} +``` + +<a name="draw-moving-bitmap"></a> +## Draw moving bitmap + +In some applications like games, there is need to move bitmaps. It is easy to do this with ssd1306 library using NanoSprite objects. NanoSprite object is responsible for refreshing areas, touched by sprite. So, you need only to move sprite, where you want, the engine will take care of updating display content. + +```cpp +#include "ssd1306.h" +#include "nano_engine.h" + +const uint8_t heartSprite[8] PROGMEM = +{ + 0B00001110, + 0B00011111, + 0B00111111, + 0B01111110, + 0B01111110, + 0B00111101, + 0B00011001, + 0B00001110 +}; + +NanoEngine8 engine; +NanoSprite<NanoEngine8, engine> sprite( {0, 0}, {8, 8}, heartSprite ); + +bool drawAll() +{ + engine.canvas.clear(); + engine.canvas.setMode(0); // We want to draw non-transparent bitmap + engine.canvas.setColor(RGB_COLOR8(255,0,0)); // draw with red color + sprite.draw(); + return true; +} + +void setup() +{ + /* Init SPI 96x64 RBG oled. 3 - RESET, 4 - CS (can be omitted, oled CS must be pulled down), 5 - D/C */ + ssd1331_96x64_spi_init(3, 4, 5); + engine.begin(); + engine.drawCallback( drawAll ); // Set callback to draw parts, when NanoEngine8 asks + engine.refresh(); // Makes engine to refresh whole display content at start-up +} + +void loop() +{ + if (!engine.nextFrame()) return; + // You will see horizontal flying heart + sprite.moveBy( { 1, 0 } ); + engine.display(); // refresh display content +} +``` + +<a name="what-if-not-to-use-draw-callbacks"></a> +## What if not to use draw callbacks + +If you don't want to use draw callbacks in your application, but still need a power of NanoEngine, then there is one way for you: to use full-screen double-buffering with NanoEngine. The example, you will find below, shows how to use full-screen double buffering for monochrome 128x64 ssd1306 oled display. This example can be run on Atmega328p and more powerful micro controllers. It clears back-buffer every time engine says to redraw the frame. But you can preserve previously prepared image by removing call to `engine.canvas.clear()`. + +```cpp +#include "ssd1306.h" +#include "nano_engine.h" + +NanoEngine<BUFFER_128x64_MONO> engine; + +void setup() +{ + // Init SPI 128x64 monochrome oled. + // 3 - RESET, 4 - CS (can be omitted, oled CS must be pulled down), 5 - D/C + ssd1306_128x64_spi_init(3, 4, 5); + + engine.begin(); + engine.setFrameRate(30); +} + +void loop() +{ + if (!engine.nextFrame()) return; + engine.canvas.clear(); // This step can be removed, if you don't want to clear buffer + engine.canvas.drawRect(15,12,70,55); + engine.display(); +} +``` + +<a name="using-adafruit-gfx-with-nanoengine"></a> +## Using Adafruit GFX with NanoEngine + +Many developers are familiar with nice AdafruitGFX library. It provides rich set of graphics functions. Starting with 1.7.0 ssd1306 library it is possible to use AdafruiGFX api in combination with NanoEngine. And it is really easy. +You need to remember only, that AdafruitGFX uses different approach, when working with rectangles and monochrome images. NanoCanvas expects monochrome bitmaps in native ssd1306 format, while Adafruit uses more native format for human. If you compare an example below with examples above you will understand, what's the difference (heartImage). Refer to AdafruitGFX documentation. + +```cpp +// Define this before including library header, this will give Adafruit GFX support +// !!! Don't forget to install AdafruitGFX library to your Arduino IDE !!! +#define CONFIG_ADAFRUIT_GFX_ENABLE + +#include "ssd1306.h" +#include "nano_engine.h" + +// Now you can use AdafruitGFX by referencing engine.canvas +NanoEngine<ADATILE_8x8_RGB8> engine; + +const PROGMEM uint8_t heartImage[8] = +{ + 0B01100110, + 0B11111001, + 0B11111101, + 0B11111111, + 0B01111110, + 0B00111100, + 0B00011000, + 0B00000000 +}; + +bool drawAll() +{ + engine.canvas.fillScreen( 0 ); + engine.canvas.drawBitmap(10, 20, heartSprite, 8, 8, RGB_COLOR8(255,0,0)); // draw bitmap with red color + return true; +} + +void setup() +{ + /* Init SPI 96x64 RBG oled. 3 - RESET, 4 - CS (can be omitted, oled CS must be pulled down), 5 - D/C */ + ssd1331_96x64_spi_init(3, 4, 5); + engine.begin(); + engine.drawCallback( drawAll ); // Set callback to draw parts, when NanoEngine8 asks + engine.refresh(); // Makes engine to refresh whole display content at start-up +} + +void loop() +{ + if (!engine.nextFrame()) return; + engine.display(); // refresh display content +} +``` + diff --git a/lib/libssd1306/src/nano_engine/adafruit.h b/lib/libssd1306/src/nano_engine/adafruit.h new file mode 100644 index 0000000..bf799e1 --- /dev/null +++ b/lib/libssd1306/src/nano_engine/adafruit.h @@ -0,0 +1,335 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file adafruit.h Adafruit related canvas implementation + * + * @brief Canvas implementation, based on Adafruit GFX. + * + * @details If you like canvas implementation by Adafruit, you can easily use it with + * ssd1306 library, including NanoEngine support. You will be able to use + * all features of AdafruitGFX, and output result to any OLED display, supported + * by ssd1306 library. If you want to use this feature, define CONFIG_ADAFRUIT_GFX_ENABLE + * in the beginning of your sketch, and include "nano_engine.h" header. + */ +#ifndef _SSD1306_ADAFRUIT_H_ +#define _SSD1306_ADAFRUIT_H_ + +#include "ssd1306_hal/io.h" + +#if defined(CONFIG_ADAFRUIT_GFX_ENABLE) + +#include "ssd1306.h" +#include "ssd1306_hal/Print_internal.h" +#include "nano_gfx_types.h" + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +/* This is special case for non-Arduino platforms, since Adafruit requires * + * Arduino libraries support */ +#ifndef ARDUINO +#define ARDUINO 100 +#include "Adafruit_GFX.h" +#undef ARDUINO +#else +#include "Adafruit_GFX.h" +#endif + +#endif // DOXYGEN_SHOULD_SKIP_THIS + +/** + * @ingroup NANO_ENGINE_API + * @{ + */ + +/** + * This is basic template class for all canvas classes, + * based on Adafruit_GFX. This base class provides functionality + * compatible with native NanoCanvas implementation of ssd1306 + * library + */ +template <uint8_t BPP> +class AdafruitCanvasOps: public Adafruit_GFX +{ +public: + /** Fixed offset for all operation of NanoCanvasOps in pixels. */ + NanoPoint offset; + + /** number of bits per single pixel in buffer */ + static const uint8_t BITS_PER_PIXEL = BPP; + + /** + * Initializes canvas, based on Adafruit GFX. + * @param w width of canvas + * @param h height of canvas area + * @param buffer buffer to use for pixels + * + * @note the size of buffer must be enough to store (w*h*bpp/8) bytes. + */ + AdafruitCanvasOps(lcduint_t w, lcduint_t h, uint8_t *buffer) + : Adafruit_GFX(w, h) + , offset{0} + , m_buffer(buffer) + { + } + + /** + * draw single pixel in canvas area + * + * @param x x position + * @param y y position + * @param color color of pixel: for monochrome it can be 0 (black), + * 1 (white), 2 (invert) + */ + void drawPixel(int16_t x, int16_t y, uint16_t color) override; + + /** + * Sets offset + * @param ox - X offset in pixels + * @param oy - Y offset in pixels + */ + void setOffset(lcdint_t ox, lcdint_t oy) { offset.x = ox; offset.y = oy; }; + +#ifndef DOXYGEN_SHOULD_SKIP_THIS + // We need to override Adafruit GFX implementation of fillScreen, because + // NanoEngine uses offsets, when refreshing screen content. + void fillScreen(uint16_t color) override + { + fillRect(offset.x, offset.y, _width, _height, color); + } +#endif + +protected: + + /** pixels buffer */ + uint8_t *m_buffer; + +private: + inline void rotatePosition(int16_t &x, int16_t &y) + { + switch (getRotation()) { + case 1: + ssd1306_swap_data(x, y, int16_t); + x = WIDTH - x - 1; + break; + case 2: + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + break; + case 3: + ssd1306_swap_data(x, y, int16_t); + y = HEIGHT - y - 1; + break; + } + + } +}; + +/** + * Base class for all AdafruitCanvas childs + */ +template <uint8_t BPP> +class AdafruitCanvasBase: public AdafruitCanvasOps<BPP> +{ +public: + using AdafruitCanvasOps<BPP>::AdafruitCanvasOps; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + */ + virtual void blt(lcdint_t x, lcdint_t y) = 0; + + /** + * Draws canvas on the LCD display using offset values. + */ + virtual void blt() = 0; +}; + +///////////////////////////////////////////////////////////////////////////////// +// +// 1-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/** + * AdafruitCanvas1 represents objects for drawing in memory buffer + * AdafruitCanvas1 represents each pixel as single bit: 0/1 + * For details refer to SSD1306 datasheet + */ +class AdafruitCanvas1 : public AdafruitCanvasBase<1> +{ +public: + using AdafruitCanvasBase::AdafruitCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override + { + ssd1306_drawBufferFast(x, y, WIDTH, HEIGHT, m_buffer); + } + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override + { + ssd1306_drawBufferFast(offset.x, offset.y, WIDTH, HEIGHT, m_buffer); + } +}; + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +template <> +void AdafruitCanvasOps<1>::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + x -= offset.x; + y -= offset.y; + if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) + { + return; + } + rotatePosition(x, y); + + switch (color) + { + case 1: m_buffer[x+ (y/8)*WIDTH] |= (1 << (y&7)); break; + case 0: m_buffer[x+ (y/8)*WIDTH] &= ~(1 << (y&7)); break; + case 2: m_buffer[x+ (y/8)*WIDTH] ^= (1 << (y&7)); break; + } +} +#endif // DOXYGEN_SHOULD_SKIP_THIS + +///////////////////////////////////////////////////////////////////////////////// +// +// 8-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/** + * AdafruitCanvas8 represents objects for drawing in memory buffer + * AdafruitCanvas8 represents each pixel as single byte with RGB bits: RRRGGGBB + * For details refer to SSD1331 datasheet. + */ +class AdafruitCanvas8 : public AdafruitCanvasBase<8> +{ +public: + using AdafruitCanvasBase::AdafruitCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override + { + ssd1306_drawBufferFast8(x, y, WIDTH, HEIGHT, m_buffer); + } + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override + { + ssd1306_drawBufferFast8(offset.x, offset.y, WIDTH, HEIGHT, m_buffer); + } +}; + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +template <> +void AdafruitCanvasOps<8>::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + x -= offset.x; + y -= offset.y; + if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) + { + return; + } + rotatePosition(x, y); + + m_buffer[x+y*WIDTH] = color; +} +#endif // DOXYGEN_SHOULD_SKIP_THIS + +///////////////////////////////////////////////////////////////////////////////// +// +// 16-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/** + * AdafruitCanvas16 represents objects for drawing in memory buffer + * AdafruitCanvas16 represents each pixel as two bytes with RGB bits: + * RRRRRGGG GGGBBBBB. + * For details refer to SSD1351 datasheet. + */ +class AdafruitCanvas16 : public AdafruitCanvasBase<16> +{ +public: + using AdafruitCanvasBase::AdafruitCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override + { + ssd1306_drawBufferFast16(x, y, WIDTH, HEIGHT, m_buffer); + } + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override + { + ssd1306_drawBufferFast16(offset.x, offset.y, WIDTH, HEIGHT, m_buffer); + } +}; + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +template <> +void AdafruitCanvasOps<16>::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + x -= offset.x; + y -= offset.y; + if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) + { + return; + } + rotatePosition(x, y); + + m_buffer[(x+y*WIDTH) * 2 + 0] = color; + m_buffer[(x+y*WIDTH) * 2 + 1] = color >> 8; +} +#endif // DOXYGEN_SHOULD_SKIP_THIS + +/** + * @} + */ + +#endif // CONFIG_ADAFRUIT_GFX_ENABLE + +#endif diff --git a/lib/libssd1306/src/nano_engine/canvas.cpp b/lib/libssd1306/src/nano_engine/canvas.cpp new file mode 100644 index 0000000..c4707d0 --- /dev/null +++ b/lib/libssd1306/src/nano_engine/canvas.cpp @@ -0,0 +1,1477 @@ +/* + MIT License + + Copyright (c) 2018-2020, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "canvas.h" +#include "lcd/lcd_common.h" +#include "ssd1306.h" + +extern const uint8_t *s_font6x8; +extern "C" SFixedFontInfo s_fixedFont; +#ifdef CONFIG_SSD1306_UNICODE_ENABLE +extern "C" uint8_t g_ssd1306_unicode; +#endif + +///////////////////////////////////////////////////////////////////////////////// +// +// COMMON GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +template <uint8_t BPP> +void NanoCanvasOps<BPP>::putPixel(const NanoPoint &p) +{ + putPixel(p.x, p.y); +} + +template <uint8_t BPP> +void NanoCanvasOps<BPP>::drawRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + drawHLine(x1, y1, x2); + drawHLine(x1, y2, x2); + drawVLine(x1, y1, y2); + drawVLine(x2, y1, y2); +} + +template <uint8_t BPP> +void NanoCanvasOps<BPP>::drawRect(const NanoRect &rect) +{ + drawRect(rect.p1.x, rect.p1.y, rect.p2.x, rect.p2.y); +} + +template <uint8_t BPP> +void NanoCanvasOps<BPP>::drawLine(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + lcduint_t dx = x1 > x2 ? (x1 - x2): (x2 - x1); + lcduint_t dy = y1 > y2 ? (y1 - y2): (y2 - y1); + lcduint_t err = 0; + if (dy > dx) + { + if (y1 > y2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + ssd1306_swap_data(y1, y2, lcdint_t); + } + for(; y1<=y2; y1++) + { + err += dx; + if (err >= dy) + { + err -= dy; + x1 < x2 ? x1++: x1--; + } + putPixel( x1, y1 ); + } + } + else + { + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + ssd1306_swap_data(y1, y2, lcdint_t); + } + for(; x1<=x2; x1++) + { + err += dy; + if (err >= dx) + { + err -= dx; + if (y1 < y2) y1++; else y1--; + } + putPixel( x1, y1 ); + } + } +} + +template <uint8_t BPP> +void NanoCanvasOps<BPP>::drawLine(const NanoRect &rect) +{ + drawLine(rect.p1.x, rect.p1.y, rect.p2.x, rect.p2.y); +} + +template <uint8_t BPP> +void NanoCanvasOps<BPP>::fillRect(const NanoRect &rect) +{ + fillRect(rect.p1.x, rect.p1.y, rect.p2.x, rect.p2.y); +} + +template <uint8_t BPP> +uint8_t NanoCanvasOps<BPP>::printChar(uint8_t c) +{ + uint16_t unicode = ssd1306_unicode16FromUtf8(c); + if (unicode == SSD1306_MORE_CHARS_REQUIRED) return 0; + SCharInfo char_info; + ssd1306_getCharBitmap(unicode, &char_info); + uint8_t mode = m_textMode; + for (uint8_t i = 0; i<(m_fontStyle == STYLE_BOLD ? 2: 1); i++) + { + drawBitmap1(m_cursorX + i, + m_cursorY, + char_info.width, + char_info.height, + char_info.glyph ); + m_textMode |= CANVAS_MODE_TRANSPARENT; + } + m_textMode = mode; + m_cursorX += (lcdint_t)(char_info.width + char_info.spacing); + if ( ( (m_textMode & CANVAS_TEXT_WRAP_LOCAL) && (m_cursorX > ((lcdint_t)m_w - (lcdint_t)s_fixedFont.h.width) ) ) + || ( (m_textMode & CANVAS_TEXT_WRAP) && (m_cursorX > ((lcdint_t)ssd1306_lcd.width - (lcdint_t)s_fixedFont.h.width)) ) ) + { + m_cursorY += (lcdint_t)s_fixedFont.h.height; + m_cursorX = 0; + if ( (m_textMode & CANVAS_TEXT_WRAP_LOCAL) && (m_cursorY > ((lcdint_t)m_h - (lcdint_t)s_fixedFont.h.height)) ) + { + m_cursorY = 0; + } + } + return 1; +} + +template <uint8_t BPP> +size_t NanoCanvasOps<BPP>::write(uint8_t c) +{ + if (c == '\n') + { + m_cursorY += (lcdint_t)s_fixedFont.h.height; + m_cursorX = 0; + } + else if (c == '\r') + { + // skip non-printed char + } + else + { + return printChar( c ); + } + return 1; +} + +template <uint8_t BPP> +void NanoCanvasOps<BPP>::printFixed(lcdint_t xpos, lcdint_t y, const char *ch, EFontStyle style) +{ + m_fontStyle = style; + m_cursorX = xpos; + m_cursorY = y; + while (*ch) + { + write(*ch); + ch++; + } +} + +template <uint8_t BPP> +void NanoCanvasOps<BPP>::printFixedPgm(lcdint_t xpos, lcdint_t y, const char *ch, EFontStyle style) +{ + m_fontStyle = style; + m_cursorX = xpos; + m_cursorY = y; + for (;;) + { + char c = pgm_read_byte(ch); + if (!c) break; + write(c); + ch++; + } +} + +///////////////////////////////////////////////////////////////////////////////// +// +// 1-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +#ifdef CONFIG_MULTIPLICATION_NOT_SUPPORTED +#define YADDR1(y) (static_cast<uint16_t>((y) >> 3) << m_p) +#define BANK_ADDR1(b) ((b) << m_p) +#else +#define YADDR1(y) (static_cast<uint16_t>((y) >> 3) * m_w) +#define BANK_ADDR1(b) ((b) * m_w) +#endif + +template <> +void NanoCanvasOps<1>::putPixel(lcdint_t x, lcdint_t y) +{ + x -= offset.x; + y -= offset.y; + if ((x<0) || (y<0)) return; + if (( x >= (lcdint_t)m_w ) || ( y >= (lcdint_t)m_h)) return; + if (m_color) + { + m_buf[YADDR1(y) + x] |= (1 << (y & 0x7)); + } + else + { + m_buf[YADDR1(y) + x] &= ~(1 << (y & 0x7)); + } +} + +template <> +void NanoCanvasOps<1>::drawHLine(lcdint_t x1, lcdint_t y1, lcdint_t x2) +{ + if (x2 < x1) ssd1306_swap_data(x2, x1, lcdint_t); + x1 -= offset.x; + x2 -= offset.x; + y1 -= offset.y; + if ((y1 >= (lcdint_t)m_h) || (y1 < 0)) return; + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + x1 = max(0, x1); + x2 = min(x2, (lcdint_t)(m_w -1)); + uint16_t addr = YADDR1(y1) + x1; + uint8_t mask = (1 << (y1 & 0x7)); + if (m_color) + { + do { m_buf[addr++] |= mask; } while (x2>x1++); + } + else + { + do { m_buf[addr++] &= ~mask; } while (x2>x1++); + } +} + +template <> +void NanoCanvasOps<1>::drawVLine(lcdint_t x1, lcdint_t y1, lcdint_t y2) +{ + if (y2 < y1) ssd1306_swap_data(y2, y1, lcdint_t); + x1 -= offset.x; + y1 -= offset.y; + y2 -= offset.y; + if ((x1 >= (lcdint_t)m_w) || (x1 < 0)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + y1 = max(0, y1); + y2 = min(y2, (lcdint_t)(m_h -1)); + + uint16_t addr = YADDR1(y1) + x1; + if ((y1 & 0xFFF8) == (y2 & 0xFFF8)) + { + uint8_t mask = ((0xFF >> (0x07 + y1 - y2)) << (y1 & 0x07)); + if (m_color) + m_buf[addr] |= mask; + else + m_buf[addr] &= ~mask; + return; + } + if (m_color) + { + m_buf[addr] |= (0xFF << (y1 & 0x07)); + addr += m_w; + while (addr<YADDR1(y2) + x1) + { + m_buf[addr] |= 0xFF; + addr += m_w; + } + m_buf[addr] |= (0xFF >> (0x07 - (y2 & 0x07))); + } + else + { + m_buf[addr] &= ~(0xFF << (y1 & 0x07)); + addr += m_w; + while (addr<YADDR1(y2) + x1) + { + m_buf[addr] &= 0; + addr += m_w; + } + m_buf[addr] &= ~(0xFF >> (0x07 - (y2 & 0x07))); + } +} + +template <> +void NanoCanvasOps<1>::fillRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + if (x2 < x1) ssd1306_swap_data(x2, x1, lcdint_t); + if (y2 < y1) ssd1306_swap_data(y2, y1, lcdint_t); + x1 -= offset.x; + x2 -= offset.x; + y1 -= offset.y; + y2 -= offset.y; + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + x1 = max(0, x1); + x2 = min(x2, (lcdint_t)(m_w - 1)); + y1 = max(0, y1); + y2 = min(y2, (lcdint_t)(m_h - 1)); + uint8_t bank1 = (y1 >> 3); + uint8_t bank2 = (y2 >> 3); + for (uint8_t bank = bank1; bank<=bank2; bank++) + { + uint8_t mask = 0xFF; + if (bank1 == bank2) + { + mask = (mask >> ((y1 & 7) + 7 - (y2 & 7))) << (y1 & 7); + } + else if (bank1 == bank) + { + mask = (mask << (y1 & 7)); + } + else if (bank2 == bank) + { + mask = (mask >> (7 - (y2 & 7))); + } + for (uint8_t x=x1; x<=x2; x++) + { + if (m_color) + { + m_buf[BANK_ADDR1(bank) + x] |= mask; + } + else + { + m_buf[BANK_ADDR1(bank) + x] &= ~mask; + } + } + } +}; + +template <> +void NanoCanvasOps<1>::clear() +{ + memset(m_buf, 0, YADDR1(m_h)); +} + +// TODO: Not so fast implementation. needs to be optimized +template <> +void NanoCanvasOps<1>::drawBitmap1(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + x -= offset.x; + y -= offset.y; + lcduint_t origin_width = w; + uint8_t offs = y & 0x07; + uint8_t complexFlag = 0; + uint8_t mainFlag = 1; + if (y + (lcdint_t)h <= 0) return; + if (y >= (lcdint_t)m_h) return; + if ((int16_t)x + (int16_t)w <= 0) return; + if ((int16_t)x >= (int16_t)m_w) return; + if (y < 0) + { + bitmap += ((lcduint_t)((-y) + 7) >> 3) * w; + h += y; + y = 0; + complexFlag = 1; + } + if (x < 0) + { + bitmap += -x; + w += x; + x = 0; + } + uint8_t max_pages = (lcduint_t)(h + 15 - offs) >> 3; + if ((lcduint_t)(y + (lcdint_t)h) > (lcduint_t)m_h) + { + h = (lcduint_t)(m_h - (lcduint_t)y); + } + if ((lcduint_t)(x + (lcdint_t)w) > (lcduint_t)m_w) + { + w = (lcduint_t)(m_w - (lcduint_t)x); + } + uint8_t pages = ((y + h - 1) >> 3) - (y >> 3) + 1; + uint8_t j; + lcduint_t i; + + for(j=0; j < pages; j++) + { + uint16_t addr = YADDR1(y + ((uint16_t)j<<3)) + x; + if ( j == max_pages - 1 ) mainFlag = !offs; + for( i=w; i > 0; i--) + { + uint8_t data = 0; + uint8_t mask = 0; + if ( mainFlag ) { data |= (pgm_read_byte(bitmap) << offs); mask |= (0xFF << offs); } + if ( complexFlag ) { data |= (pgm_read_byte(bitmap - origin_width) >> (8 - offs)); mask |= (0xFF >> (8 - offs)); } + if (CANVAS_MODE_TRANSPARENT != (m_textMode & CANVAS_MODE_TRANSPARENT)) + { + m_buf[addr] &= ~mask; + m_buf[addr] |= m_color == BLACK ? ~data: data; + } + else + { + if (m_color == BLACK) + m_buf[addr] &= ~data; + else + m_buf[addr] |= data; + } + bitmap++; + addr++; + } + bitmap += origin_width - w; + complexFlag = offs; + } +} + +template <> +void NanoCanvasOps<1>::drawXBitmap1(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + x -= offset.x; + y -= offset.y; + lcduint_t origin_width = w; + if (y + (lcdint_t)h <= 0) return; + if (y >= (lcdint_t)m_h) return; + if (x + (lcdint_t)w <= 0) return; + if (x >= (lcdint_t)m_w) return; + + delay(100); + + uint8_t start_bit = 0; + lcduint_t pitch_delta = 0; + if (y < 0) + { + bitmap += /*pitch*/((origin_width + 7) >> 3) * (lcduint_t)(-y); + h += y; + y = 0; + } + if (x < 0) + { + bitmap += ((lcduint_t)(-x)) / 8; + start_bit = ((lcduint_t)(-x)) & 0x07; + w += x; + x = 0; + } + if ((lcduint_t)(y + (lcdint_t)h) > (lcduint_t)m_h) + { + h = (lcduint_t)(m_h - (lcduint_t)y); + } + if ((lcduint_t)(x + (lcdint_t)w) > (lcduint_t)m_w) + { + w = (lcduint_t)(m_w - (lcduint_t)x); + } + pitch_delta = ((origin_width + 7 - start_bit) >> 3) - ((w + 7) >> 3); + + for(lcduint_t j = 0; j < h; j++) + { + uint8_t bit = start_bit; + for(lcduint_t i = 0; i < w; i++) + { + uint8_t data = 0; + data = (pgm_read_byte(bitmap) >> bit) & 0x01; + if (data) + { + if (m_color == BLACK) + m_buf[YADDR1(y + j) + (x + i)] &= ~(1 << ((y + j) & 0x7)); + else + m_buf[YADDR1(y + j) + (x + i)] |= (1 << ((y + j) & 0x7)); + } + else if (CANVAS_MODE_TRANSPARENT != (m_textMode & CANVAS_MODE_TRANSPARENT)) + { + if (m_color == BLACK) + m_buf[YADDR1(y + j) + (x + i)] |= (1 << ((y + j) & 0x7)); + else + m_buf[YADDR1(y + j) + (x + i)] &= ~(1 << ((y + j) & 0x7)); + } + bit++; + if (bit >= 8) + { + bitmap++; + bit=0; + } + } + if (bit) + { + bitmap++; + } + bitmap += pitch_delta; + } +} + +template <> +void NanoCanvasOps<1>::begin(lcdint_t w, lcdint_t h, uint8_t *bytes) +{ + m_w = w; + m_h = h; + offset.x = 0; + offset.y = 0; + m_cursorX = 0; + m_cursorY = 0; + m_color = WHITE; + m_textMode = 0; + m_p = 3; + while (w >> (m_p+1)) { m_p++; }; + m_buf = bytes; + clear(); +} + +// NANO CANVAS 1 + +void NanoCanvas1::blt(lcdint_t x, lcdint_t y) +{ + ssd1306_drawBufferFast(x, y, m_w, m_h, m_buf); +} + +void NanoCanvas1::blt() +{ + ssd1306_drawBufferFast(offset.x, offset.y, m_w, m_h, m_buf); +} + +void NanoCanvas1::blt(const NanoRect &rect) +{ + // TODO: NOT IMPLEMENTED +} + +// NANO CANVAS 1_8 + +void NanoCanvas1_8::blt(lcdint_t x, lcdint_t y) +{ + ssd1306_drawMonoBuffer8(x, y, m_w, m_h, m_buf); +} + +void NanoCanvas1_8::blt() +{ + ssd1306_drawMonoBuffer8(offset.x, offset.y, m_w, m_h, m_buf); +} + +void NanoCanvas1_8::blt(const NanoRect &rect) +{ + // TODO: NOT IMPLEMENTED +} + +// NANO CANVAS 1_16 + +void NanoCanvas1_16::blt(lcdint_t x, lcdint_t y) +{ + ssd1306_drawMonoBuffer16(x, y, m_w, m_h, m_buf); +} + +void NanoCanvas1_16::blt() +{ + ssd1306_drawMonoBuffer16(offset.x, offset.y, m_w, m_h, m_buf); +} + +void NanoCanvas1_16::blt(const NanoRect &rect) +{ + // TODO: NOT IMPLEMENTED +} + +///////////////////////////////////////////////////////////////////////////////// +// +// 4-BIT GRAY GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/* We need to use multiply operation, because there are displays on the market * + * with resolution different from 2^N (160x128, 96x64, etc.) */ +#define YADDR4(y) (static_cast<uint32_t>(y) * m_w / 2) +#define BITS_SHIFT4(x) ((x & 1) ? 4 : 0) + +template <> +void NanoCanvasOps<4>::putPixel(lcdint_t x, lcdint_t y) +{ + x -= offset.x; + y -= offset.y; + if ((x >= 0) && (y >= 0) && (x < (lcdint_t)m_w) && (y < (lcdint_t)m_h)) + { + m_buf[YADDR4(y) + x / 2] &= ~(0x0F << BITS_SHIFT4(x)); + m_buf[YADDR4(y) + x / 2] |= (m_color & 0x0F) << BITS_SHIFT4(x); + } +} + +template <> +void NanoCanvasOps<4>::drawVLine(lcdint_t x1, lcdint_t y1, lcdint_t y2) +{ + x1 -= offset.x; + y1 -= offset.y; + y2 -= offset.y; + if (y1 > y2) + { + ssd1306_swap_data(y1, y2, lcdint_t); + } + if ((x1 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + y1 = max(y1,0); + y2 = min(y2,(lcdint_t)m_h-1) - y1; + uint8_t *buf = m_buf + YADDR4(y1) + x1 / 2; + do + { + *buf &= ~(0x0F << BITS_SHIFT4(x1)); + *buf |= ((m_color & 0x0F) << BITS_SHIFT4(x1)); + buf += m_w / 2; + } + while (y2--); +} + +template <> +void NanoCanvasOps<4>::drawHLine(lcdint_t x1, lcdint_t y1, lcdint_t x2) +{ + x1 -= offset.x; + y1 -= offset.y; + x2 -= offset.x; + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + } + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y1 < 0) || (y1 >= (lcdint_t)m_h)) return; + x1 = max(x1,0); + x2 = min(x2,(lcdint_t)m_w-1); + uint8_t *buf = m_buf + YADDR4(y1) + x1 / 2; + for (lcdint_t x = x1; x <= x2; x++) + { + *buf &= ~(0x0F << BITS_SHIFT4(x)); + *buf |= ((m_color & 0x0F) << BITS_SHIFT4(x)); + if ( x & 1 ) + { + buf++; + } + } +} + +template <> +void NanoCanvasOps<4>::fillRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + if (y1 > y2) + { + ssd1306_swap_data(y1, y2, lcdint_t); + } + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + } + x1 -= offset.x; + y1 -= offset.y; + x2 -= offset.x; + y2 -= offset.y; + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + x1 = max(x1,0); + x2 = min(x2,(lcdint_t)m_w-1); + y1 = max(y1,0); + y2 = min(y2,(lcdint_t)m_h-1); + uint8_t *buf = m_buf + YADDR4(y1) + x1 / 2; + for (lcdint_t y = y1; y <= y2; y++) + { + for (lcdint_t x = x1; x <= x2; x++) + { + *buf &= ~(0x0F << BITS_SHIFT4(x)); + *buf |= ((m_color & 0xF) << BITS_SHIFT4(x)); + if ( x & 1 ) + { + buf++; + } + } + buf += ((lcdint_t)(m_w) - (x2 - x1 + ((x2 - x1) & 0x1))) / 2; + } +} + +template <> +void NanoCanvasOps<4>::drawBitmap1(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + lcdint_t xb1 = 0; + lcdint_t yb1 = 0; + lcdint_t xb2 = (lcdint_t)w - 1; + lcdint_t yb2 = (lcdint_t)h - 1; + /* calculate char rectangle */ + lcdint_t x1 = xpos - offset.x; + lcdint_t y1 = ypos - offset.y; + lcdint_t x2 = x1 + xb2; + lcdint_t y2 = y1 + yb2; + /* clip bitmap */ + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + + if (x1 < 0) + { + xb1 -= x1; + x1 = 0; + } + if (y1 < 0) + { + yb1 -= y1; + y1 = 0; + } + if (y2 >= (lcdint_t)m_h) + { + // yb2 -= (y2 - (lcdint_t)m_h + 1); + y2 = (lcdint_t)m_h - 1; + } + if (x2 >= (lcdint_t)m_w) + { + // xb2 -= (x2 - (lcdint_t)m_w + 1); + x2 = (lcdint_t)m_w - 1; + } + for ( lcdint_t y = y1; y <= y2; y++ ) + { + for ( lcdint_t x = x1; x <= x2; x++ ) + { + uint16_t src_addr1 = xb1 + x - x1 + ((yb1 + y - y1) / 8) * w; + uint8_t src_bit1 = (yb1 + y - y1) & 0x07; + uint8_t data = pgm_read_byte( &bitmap[ src_addr1 ] ); + uint16_t addr = YADDR4(y) + x / 2; + if (data & (1 << src_bit1)) + { + data = m_color & 0x0F; + m_buf[ addr ] &= ~(0x0F << BITS_SHIFT4(x)); + m_buf[ addr ] |= data << BITS_SHIFT4(x); + } + else if (!(m_textMode & CANVAS_MODE_TRANSPARENT)) + { + data = 0x00; + m_buf[ addr ] &= ~(0x0F << BITS_SHIFT4(x)); + } + } + } +} + +template <> +void NanoCanvasOps<4>::drawBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + lcdint_t xb1 = 0; + lcdint_t yb1 = 0; + lcdint_t xb2 = (lcdint_t)w - 1; + lcdint_t yb2 = (lcdint_t)h - 1; + /* calculate char rectangle */ + lcdint_t x1 = xpos - offset.x; + lcdint_t y1 = ypos - offset.y; + lcdint_t x2 = x1 + xb2; + lcdint_t y2 = y1 + yb2; + /* clip bitmap */ + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + + if (x1 < 0) + { + xb1 -= x1; + x1 = 0; + } + if (y1 < 0) + { + yb1 -= y1; + y1 = 0; + } + if (y2 >= (lcdint_t)m_h) + { + //yb2 -= (y2 - (lcdint_t)m_h + 1); + y2 = (lcdint_t)m_h - 1; + } + if (x2 >= (lcdint_t)m_w) + { + //xb2 -= (x2 - (lcdint_t)m_w + 1); + x2 = (lcdint_t)m_w - 1; + } + for ( lcdint_t y = y1; y <= y2; y++ ) + { + for ( lcdint_t x = x1; x <= x2; x++ ) + { + uint16_t src_addr8 = xb1 + x - x1 + ((yb1 + y - y1)) * w; + uint8_t data = pgm_read_byte( &bitmap[ src_addr8 ] ); + uint16_t addr = YADDR4(y) + x / 2; + if ( (data) || (!(m_textMode & CANVAS_MODE_TRANSPARENT)) ) + { + data = RGB8_TO_GRAY4(data); + m_buf[ addr ] &= ~(0x0F << BITS_SHIFT4(x)); + m_buf[ addr ] |= (data & 0x0F) << BITS_SHIFT4(x); + } + } + } +} + +template <> +void NanoCanvasOps<4>::clear() +{ + memset(m_buf, 0, YADDR4(m_h)); +} + +/* This method must be implemented always after clear() */ +template <> +void NanoCanvasOps<4>::begin(lcdint_t w, lcdint_t h, uint8_t *bytes) +{ + m_w = w; + m_h = h; + offset.x = 0; + offset.y = 0; + m_cursorX = 0; + m_cursorY = 0; + m_color = 0xFF; // white color by default + m_textMode = 0; + m_buf = bytes; + clear(); +} + +// NANO CANVAS 1_8 + +void NanoCanvas1_4::blt(lcdint_t x, lcdint_t y) +{ + ssd1306_drawBuffer1_4(x, y, m_w, m_h, m_buf); +} + +void NanoCanvas1_4::blt() +{ + ssd1306_drawBuffer1_4(offset.x, offset.y, m_w, m_h, m_buf); +} + +void NanoCanvas1_4::blt(const NanoRect &rect) +{ + // TODO: NOT IMPLEMENTED +} + +///////////////////////////////////////////////////////////////////////////////// +// +// 8-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/* We need to use multiply operation, because there are displays on the market * + * with resolution different from 2^N (160x128, 96x64, etc.) */ +#define YADDR8(y) (static_cast<uint32_t>(y) * m_w) + +template <> +void NanoCanvasOps<8>::putPixel(lcdint_t x, lcdint_t y) +{ + x -= offset.x; + y -= offset.y; + if ((x >= 0) && (y >= 0) && (x < (lcdint_t)m_w) && (y < (lcdint_t)m_h)) + { + m_buf[YADDR8(y) + x] = m_color; + } +} + +template <> +void NanoCanvasOps<8>::drawVLine(lcdint_t x1, lcdint_t y1, lcdint_t y2) +{ + x1 -= offset.x; + y1 -= offset.y; + y2 -= offset.y; + if (y1 > y2) + { + ssd1306_swap_data(y1, y2, lcdint_t); + } + if ((x1 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + y1 = max(y1,0); + uint8_t *buf = m_buf + YADDR8(y1) + x1; + y2 = min(y2,(lcdint_t)m_h-1) - y1; + do + { + *buf = m_color; + buf += m_w; + } + while (y2--); +} + +template <> +void NanoCanvasOps<8>::drawHLine(lcdint_t x1, lcdint_t y1, lcdint_t x2) +{ + x1 -= offset.x; + y1 -= offset.y; + x2 -= offset.x; + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + } + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y1 < 0) || (y1 >= (lcdint_t)m_h)) return; + x1 = max(x1,0); + x2 = min(x2,(lcdint_t)m_w-1); + uint8_t *buf = m_buf + YADDR8(y1) + x1; + for (lcdint_t x = 0; x <= x2 - x1; x++) + { + *buf = m_color; + buf++; + } +} + +template <> +void NanoCanvasOps<8>::fillRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + if (y1 > y2) + { + ssd1306_swap_data(y1, y2, lcdint_t); + } + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + } + x1 -= offset.x; + y1 -= offset.y; + x2 -= offset.x; + y2 -= offset.y; + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + x1 = max(x1,0); + x2 = min(x2,(lcdint_t)m_w-1); + y1 = max(y1,0); + y2 = min(y2,(lcdint_t)m_h-1); + uint8_t *buf = m_buf + YADDR8(y1) + x1; + for (lcdint_t y = y1; y <= y2; y++) + { + for (lcdint_t x = x1; x <= x2; x++) + { + *buf = m_color; + buf++; + } + buf += ((lcdint_t)(m_w) - (x2 - x1 + 1)); + } +} + +template <> +void NanoCanvasOps<8>::drawBitmap1(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + uint8_t offs = 0; + /* calculate char rectangle */ + lcdint_t x1 = xpos - offset.x; + lcdint_t y1 = ypos - offset.y; + lcdint_t x2 = x1 + (lcdint_t)w - 1; + lcdint_t y2 = y1 + (lcdint_t)h - 1; + /* clip bitmap */ + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + + if (x1 < 0) + { + bitmap -= x1; + x1 = 0; + } + if (y1 < 0) + { + bitmap += ((lcduint_t)(-y1) >> 3) * w; + offs = ((-y1) & 0x07); + y1 = 0; + } + if (y2 >= (lcdint_t)m_h) + { + y2 = (lcdint_t)m_h - 1; + } + if (x2 >= (lcdint_t)m_w) + { + x2 = (lcdint_t)m_w - 1; + } + uint8_t offs2 = 8 - offs; + lcdint_t y = y1; + while ( y <= y2) + { + for ( lcdint_t x = x1; x <= x2; x++ ) + { + uint8_t data = pgm_read_byte( bitmap ); + uint16_t addr = YADDR8(y) + x; + for (uint8_t n = 0; n < min(y2 - y + 1, 8); n++) + { + if ( data & (1<<(n + offs)) ) + m_buf[addr] = m_color; + else if (!(m_textMode & CANVAS_MODE_TRANSPARENT)) + m_buf[addr] = 0x00; + addr += (lcduint_t)m_w; + } + bitmap++; + } + bitmap += (w - (x2 - x1 + 1)); + y = y + offs2; + offs = 0; + offs2 = 8; + } +} + +template <> +void NanoCanvasOps<8>::drawXBitmap1(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + x -= offset.x; + y -= offset.y; + lcduint_t origin_width = w; + if (y + (lcdint_t)h <= 0) return; + if (y >= (lcdint_t)m_h) return; + if (x + (lcdint_t)w <= 0) return; + if (x >= (lcdint_t)m_w) return; + + uint8_t start_bit = 0; + lcduint_t pitch_delta = 0; + if (y < 0) + { + bitmap += /*pitch*/((origin_width + 7) >> 3) * (lcduint_t)(-y); + h += y; + y = 0; + } + if (x < 0) + { + bitmap += ((lcduint_t)(-x)) / 8; + start_bit = ((lcduint_t)(-x)) & 0x07; + w += x; + x = 0; + } + if ((lcduint_t)(y + (lcdint_t)h) > (lcduint_t)m_h) + { + h = (lcduint_t)(m_h - (lcduint_t)y); + } + if ((lcduint_t)(x + (lcdint_t)w) > (lcduint_t)m_w) + { + w = (lcduint_t)(m_w - (lcduint_t)x); + } + pitch_delta = ((origin_width + 7 - start_bit) >> 3) - ((w + 7) >> 3); + + for(lcduint_t j = 0; j < h; j++) + { + uint8_t bit = start_bit; + for(lcduint_t i = 0; i < w; i++) + { + uint8_t data = 0; + data = (pgm_read_byte(bitmap) >> bit) & 0x01; + if (data) + { + m_buf[YADDR8(y + j) + (x + i)] = m_color; + } + else if (CANVAS_MODE_TRANSPARENT != (m_textMode & CANVAS_MODE_TRANSPARENT)) + { + m_buf[YADDR8(y + j) + (x + i)] = 0x00; + } + bit++; + if (bit >= 8) + { + bitmap++; + bit=0; + } + } + if (bit) + { + bitmap++; + } + bitmap += pitch_delta; + } +} + +template <> +void NanoCanvasOps<8>::drawBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + /* calculate char rectangle */ + lcdint_t x1 = xpos - offset.x; + lcdint_t y1 = ypos - offset.y; + lcdint_t x2 = x1 + (lcdint_t)w - 1; + lcdint_t y2 = y1 + (lcdint_t)h - 1; + /* clip bitmap */ + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + + if (x1 < 0) + { + bitmap -= x1; + x1 = 0; + } + if (y1 < 0) + { + bitmap += (lcduint_t)(-y1) * w; + y1 = 0; + } + if (y2 >= (lcdint_t)m_h) + { + y2 = (lcdint_t)m_h - 1; + } + if (x2 >= (lcdint_t)m_w) + { + x2 = (lcdint_t)m_w - 1; + } + lcdint_t y = y1; + while ( y <= y2 ) + { + for ( lcdint_t x = x1; x <= x2; x++ ) + { + uint8_t data = pgm_read_byte( bitmap ); + if ( (data) || (!(m_textMode & CANVAS_MODE_TRANSPARENT)) ) + { + m_buf[YADDR8(y) + x] = data; + } + bitmap++; + } + bitmap += (w - (x2 - x1 + 1)); + y++; + } +} + +template <> +void NanoCanvasOps<8u>::clear() +{ + memset(m_buf, 0, YADDR8(m_h)); +} + +/* This method must be implemented always after clear() */ +template <> +void NanoCanvasOps<8>::begin(lcdint_t w, lcdint_t h, uint8_t *bytes) +{ + m_w = w; + m_h = h; + offset.x = 0; + offset.y = 0; + m_cursorX = 0; + m_cursorY = 0; + m_color = 0xFF; // white color by default + m_textMode = 0; + m_p = 3; + while (w >> (m_p+1)) { m_p++; }; + m_buf = bytes; + clear(); +} + +// NANO CANVAS 8 + +void NanoCanvas8::blt(lcdint_t x, lcdint_t y) +{ + ssd1306_drawBufferFast8(x, y, m_w, m_h, m_buf); +} + +void NanoCanvas8::blt() +{ + ssd1306_drawBufferFast8(offset.x, offset.y, m_w, m_h, m_buf); +} + +void NanoCanvas8::blt(const NanoRect &rect) +{ + ssd1306_drawBufferEx8(offset.x + rect.p1.x, + offset.y + rect.p1.y, + rect.width(), + rect.height(), + m_w, + m_buf + rect.p1.x + rect.p1.y * m_w ); +} + +///////////////////////////////////////////////////////////////////////////////// +// +// 16-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/* We need to use multiply operation, because there are displays on the market * + * with resolution different from 2^N (160x128, 96x64, etc.) */ +#define YADDR16(y) (static_cast<uint32_t>(y) * (m_w << 1)) + +template <> +void NanoCanvasOps<16>::putPixel(lcdint_t x, lcdint_t y) +{ + x -= offset.x; + y -= offset.y; + if ((x >= 0) && (y >= 0) && (x < (lcdint_t)m_w) && (y < (lcdint_t)m_h)) + { + m_buf[YADDR16(y) + (x<<1)] = m_color >> 8; + m_buf[YADDR16(y) + (x<<1) + 1] = m_color & 0xFF; + } +} + +template <> +void NanoCanvasOps<16>::drawVLine(lcdint_t x1, lcdint_t y1, lcdint_t y2) +{ + x1 -= offset.x; + y1 -= offset.y; + y2 -= offset.y; + if (y1 > y2) + { + ssd1306_swap_data(y1, y2, lcdint_t); + } + if ((x1 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + y1 = max(y1,0); + uint8_t *buf = m_buf + YADDR16(y1) + (x1 << 1); + y2 = min(y2,(lcdint_t)m_h-1) - y1; + do + { + buf[0] = m_color >> 8; + buf[1] = m_color & 0xFF; + buf += (m_w<<1); + } + while (y2--); +} + +template <> +void NanoCanvasOps<16>::drawHLine(lcdint_t x1, lcdint_t y1, lcdint_t x2) +{ + x1 -= offset.x; + y1 -= offset.y; + x2 -= offset.x; + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + } + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y1 < 0) || (y1 >= (lcdint_t)m_h)) return; + x1 = max(x1,0); + x2 = min(x2,(lcdint_t)m_w-1); + uint8_t *buf = m_buf + YADDR16(y1) + (x1<<1); + for (lcdint_t x = 0; x <= x2 - x1; x++) + { + buf[0] = m_color >> 8; + buf[1] = m_color & 0xFF; + buf+=2; + } +} + +template <> +void NanoCanvasOps<16>::fillRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + if (y1 > y2) + { + ssd1306_swap_data(y1, y2, lcdint_t); + } + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + } + x1 -= offset.x; + y1 -= offset.y; + x2 -= offset.x; + y2 -= offset.y; + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + x1 = max(x1,0); + x2 = min(x2,(lcdint_t)m_w-1); + y1 = max(y1,0); + y2 = min(y2,(lcdint_t)m_h-1); + uint8_t *buf = m_buf + YADDR16(y1) + (x1<<1); + for (lcdint_t y = y1; y <= y2; y++) + { + for (lcdint_t x = x1; x <= x2; x++) + { + buf[0] = m_color >> 8; + buf[1] = m_color & 0xFF; + buf+=2; + } + buf += ( ((lcdint_t)(m_w) - (x2 - x1 + 1)) <<1 ); + } +} + +template <> +void NanoCanvasOps<16>::drawBitmap1(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + uint8_t offs = 0; + /* calculate char rectangle */ + lcdint_t x1 = xpos - offset.x; + lcdint_t y1 = ypos - offset.y; + lcdint_t x2 = x1 + (lcdint_t)w - 1; + lcdint_t y2 = y1 + (lcdint_t)h - 1; + /* clip bitmap */ + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + + if (x1 < 0) + { + bitmap -= x1; + x1 = 0; + } + if (y1 < 0) + { + bitmap += ((lcduint_t)(-y1) >> 3) * w; + offs = ((-y1) & 0x07); + y1 = 0; + } + if (y2 >= (lcdint_t)m_h) + { + y2 = (lcdint_t)m_h - 1; + } + if (x2 >= (lcdint_t)m_w) + { + x2 = (lcdint_t)m_w - 1; + } + uint8_t offs2 = 8 - offs; + lcdint_t y = y1; + while ( y <= y2) + { + for ( lcdint_t x = x1; x <= x2; x++ ) + { + uint8_t data = pgm_read_byte( bitmap ); + uint16_t addr = YADDR16(y) + (x<<1); + for (uint8_t n = 0; n < min(y2 - y + 1, 8); n++) + { + if ( data & (1<<(n + offs)) ) + { + m_buf[addr] = m_color >> 8; + m_buf[addr+1] = m_color & 0xFF; + } + else if (!(m_textMode & CANVAS_MODE_TRANSPARENT)) + { + m_buf[addr] = 0x00; + m_buf[addr+1] = 0x00; + } + addr += ((lcduint_t)m_w << 1); + } + bitmap++; + } + bitmap += (w - (x2 - x1 + 1)); + y = y + offs2; + offs = 0; + offs2 = 8; + } +} + +template <> +void NanoCanvasOps<16>::drawXBitmap1(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + x -= offset.x; + y -= offset.y; + lcduint_t origin_width = w; + if (y + (lcdint_t)h <= 0) return; + if (y >= (lcdint_t)m_h) return; + if (x + (lcdint_t)w <= 0) return; + if (x >= (lcdint_t)m_w) return; + + uint8_t start_bit = 0; + lcduint_t pitch_delta = 0; + if (y < 0) + { + bitmap += /*pitch*/((origin_width + 7) >> 3) * (lcduint_t)(-y); + h += y; + y = 0; + } + if (x < 0) + { + bitmap += ((lcduint_t)(-x)) / 8; + start_bit = ((lcduint_t)(-x)) & 0x07; + w += x; + x = 0; + } + if ((lcduint_t)(y + (lcdint_t)h) > (lcduint_t)m_h) + { + h = (lcduint_t)(m_h - (lcduint_t)y); + } + if ((lcduint_t)(x + (lcdint_t)w) > (lcduint_t)m_w) + { + w = (lcduint_t)(m_w - (lcduint_t)x); + } + pitch_delta = ((origin_width + 7 - start_bit) >> 3) - ((w + 7) >> 3); + + for(lcduint_t j = 0; j < h; j++) + { + uint8_t bit = start_bit; + for(lcduint_t i = 0; i < w; i++) + { + uint8_t data = 0; + data = (pgm_read_byte(bitmap) >> bit) & 0x01; + if (data) + { + m_buf[YADDR16(y + j) + ((x + i)<<1)] = m_color >> 8; + m_buf[YADDR16(y + j) + ((x + i)<<1) + 1] = m_color & 0xFF; + } + else if (CANVAS_MODE_TRANSPARENT != (m_textMode & CANVAS_MODE_TRANSPARENT)) + { + m_buf[YADDR16(y + j) + ((x + i)<<1)] = 0x00; + m_buf[YADDR16(y + j) + ((x + i)<<1) + 1] = 0x00; + } + bit++; + if (bit >= 8) + { + bitmap++; + bit=0; + } + } + if (bit) + { + bitmap++; + } + bitmap += pitch_delta; + } +} + +template <> +void NanoCanvasOps<16>::drawBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + /* calculate char rectangle */ + lcdint_t x1 = xpos - offset.x; + lcdint_t y1 = ypos - offset.y; + lcdint_t x2 = x1 + (lcdint_t)w - 1; + lcdint_t y2 = y1 + (lcdint_t)h - 1; + /* clip bitmap */ + if ((x2 < 0) || (x1 >= (lcdint_t)m_w)) return; + if ((y2 < 0) || (y1 >= (lcdint_t)m_h)) return; + + if (x1 < 0) + { + bitmap -= x1; + x1 = 0; + } + if (y1 < 0) + { + bitmap += (lcduint_t)(-y1) * w; + y1 = 0; + } + if (y2 >= (lcdint_t)m_h) + { + y2 = (lcdint_t)m_h - 1; + } + if (x2 >= (lcdint_t)m_w) + { + x2 = (lcdint_t)m_w - 1; + } + lcdint_t y = y1; + while ( y <= y2 ) + { + for ( lcdint_t x = x1; x <= x2; x++ ) + { + uint8_t data = pgm_read_byte( bitmap ); + if ( (data) || (!(m_textMode & CANVAS_MODE_TRANSPARENT)) ) + { + uint16_t color = (((uint16_t)data & 0b11100000) << 8) | + (((uint16_t)data & 0b00011100) << 6) | + (((uint16_t)data & 0b00000011) << 3); + m_buf[YADDR16(y) + (x<<1)] = color; + } + bitmap++; + } + bitmap += (w - (x2 - x1 + 1)); + y++; + } +} + +template <> +void NanoCanvasOps<16>::clear() +{ + memset(m_buf, 0, YADDR16(m_h)); +} + +template <> +void NanoCanvasOps<16>::begin(lcdint_t w, lcdint_t h, uint8_t *bytes) +{ + m_w = w; + m_h = h; + offset.x = 0; + offset.y = 0; + m_cursorX = 0; + m_cursorY = 0; + m_color = 0xFFFF; // white color by default + m_textMode = 0; + m_p = 3; + while (w >> (m_p+1)) { m_p++; }; + m_p++; + m_buf = bytes; + clear(); +} + +///////////////////////////////////////////////////////////////////////////////// +// +// NanoCanvasOps class initiation +// +///////////////////////////////////////////////////////////////////////////////// + +template class NanoCanvasOps<1>; +template class NanoCanvasOps<4>; +template class NanoCanvasOps<8>; +template class NanoCanvasOps<16>; + + +// NANO CANVAS 16 + +void NanoCanvas16::blt(lcdint_t x, lcdint_t y) +{ + ssd1306_drawBufferFast16(x, y, m_w, m_h, m_buf); +} + +void NanoCanvas16::blt() +{ + ssd1306_drawBufferFast16(offset.x, offset.y, m_w, m_h, m_buf); +} + +void NanoCanvas16::blt(const NanoRect &rect) +{ + ssd1306_drawBufferEx16(offset.x + rect.p1.x, + offset.y + rect.p1.y, + rect.width(), + rect.height(), + m_w<<1, + m_buf + (rect.p1.x<<1) + rect.p1.y * (m_w<<1) ); +} diff --git a/lib/libssd1306/src/nano_engine/canvas.h b/lib/libssd1306/src/nano_engine/canvas.h new file mode 100644 index 0000000..05b5a87 --- /dev/null +++ b/lib/libssd1306/src/nano_engine/canvas.h @@ -0,0 +1,613 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file canvas.h Drawing in memory buffer + */ + + +#ifndef _NANO_CANVAS_H_ +#define _NANO_CANVAS_H_ + +#include "point.h" +#include "rect.h" +#include "ssd1306_hal/io.h" +#include "ssd1306_hal/Print_internal.h" +#include "nano_gfx_types.h" + +/** + * @ingroup NANO_ENGINE_API + * @{ + */ + +enum +{ + CANVAS_MODE_BASIC = 0x00, + /** If the flag is specified, text cursor is moved to new line when end of screen is reached */ + CANVAS_TEXT_WRAP = 0x01, + /** This flag make bitmaps transparent (Black color) */ + CANVAS_MODE_TRANSPARENT = 0x02, + /** If the flag is specified, text cursor is moved to new line when end of canvas is reached */ + CANVAS_TEXT_WRAP_LOCAL = 0x04, +}; + +/** + * NanoCanvasOps provides operations for drawing in memory buffer. + * Depending on BPP argument, this class can work with 1,8,16-bit canvas areas. + */ +template <uint8_t BPP> +class NanoCanvasOps: public Print +{ +public: + /** number of bits per single pixel in buffer */ + static const uint8_t BITS_PER_PIXEL = BPP; + + /** Fixed offset for all operation of NanoCanvasOps in pixels */ + NanoPoint offset = { 0, 0 }; + + /** + * Creates new empty canvas object. + * If you this constructor is used, you must call begin() method before + * working with canvas. + */ + NanoCanvasOps() + { + } + + /** + * Creates new canvas object. + * Width can be of any value. + * Height should be divided by 8. + * Memory buffer must be not less than w * h. + * + * @param w - width + * @param h - height + * @param bytes - pointer to memory buffer to use + */ + NanoCanvasOps(lcdint_t w, lcdint_t h, uint8_t *bytes) + { + begin(w, h, bytes); + } + + /** + * Initializes canvas object. + * Width can be of any value. + * Height should be divided by 8. + * Memory buffer must be not less than w * h. + * + * @param w - width + * @param h - height + * @param bytes - pointer to memory buffer to use + */ + void begin(lcdint_t w, lcdint_t h, uint8_t *bytes); + + /** + * Sets offset + * @param ox - X offset in pixels + * @param oy - Y offset in pixels + */ + void setOffset(lcdint_t ox, lcdint_t oy) { offset.x = ox; offset.y = oy; }; + + /** + * Returns right-bottom point of the canvas in offset terms. + * If offset is (0,0), then offsetEnd() will return (width-1,height-1). + */ + const NanoPoint offsetEnd() const + { + return offset + (NanoPoint){ (lcdint_t)(m_w-1), (lcdint_t)(m_h-1) }; + } + + /** + * Returns rectangle area, covered by canvas in offset terms. + * If offset is (0,0), then rect() will return ((0,0),(width-1,height-1)) + */ + const NanoRect rect() const + { + return { offset, offsetEnd() }; + } + + /** + * Draws pixel on specified position + * @param x - position X + * @param y - position Y + * @note color can be set via setColor() + */ + void putPixel(lcdint_t x, lcdint_t y); + + /** + * Draws pixel on specified position + * @param p - NanoPoint + * @note color can be set via setColor() + */ + void putPixel(const NanoPoint &p); + + /** + * Draws horizontal or vertical line + * @param x1 - position X + * @param y1 - position Y + * @param y2 - position Y + * @note color can be set via setColor() + */ + void drawVLine(lcdint_t x1, lcdint_t y1, lcdint_t y2); + + /** + * Draws horizontal or vertical line + * @param x1 - position X + * @param y1 - position Y + * @param x2 - position X + * @note color can be set via setColor() + */ + void drawHLine(lcdint_t x1, lcdint_t y1, lcdint_t x2); + + /** + * Draws line + * @param x1 - position X + * @param y1 - position Y + * @param x2 - position X + * @param y2 - position Y + * @note color can be set via setColor() + */ + void drawLine(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + + /** + * Draws line + * @param rect - structure, describing rectangle area + * @note color can be set via setColor() + */ + void drawLine(const NanoRect &rect); + + /** + * Draws rectangle + * @param x1 - position X + * @param y1 - position Y + * @param x2 - position X + * @param y2 - position Y + * @note color can be set via setColor() + */ + void drawRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + + /** + * Draws rectangle + * @param rect - structure, describing rectangle area + * @note color can be set via setColor() + */ + void drawRect(const NanoRect &rect); + + /** + * Fills rectangle area + * @param x1 - position X + * @param y1 - position Y + * @param x2 - position X + * @param y2 - position Y + * @note color can be set via setColor() + */ + void fillRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + + /** + * Fills rectangle area + * @param rect - structure, describing rectangle area + * @note color can be set via setColor() + */ + void fillRect(const NanoRect &rect); + + /** + * @brief Draws monochrome bitmap in color buffer using color, specified via setColor() method + * Draws monochrome bitmap in color buffer using color, specified via setColor() method + * The bitmap is expected in Native ssd1306 controller format. + * + * @param x - position X in pixels + * @param y - position Y in pixels + * @param w - width in pixels + * @param h - height in pixels + * @param bitmap - monochrome bitmap data, located in flash + * + * @note There are 2 modes: transparent and non-transparent mode, - and 2 colors available: black and white. + * In non-transparent mode, when black color is selected, the monochrome image just inverted. + * In transparent mode, those pixels of source monochrome image, which are black, do not overwrite pixels + * in the screen buffer. + */ + void drawBitmap1(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + + /** + * @brief Draws monochrome bitmap in color buffer using color, specified via setColor() method + * Draws monochrome bitmap in color buffer using color, specified via setColor() method + * The bitmap is expected in XBMP format. + * + * @param x - position X in pixels + * @param y - position Y in pixels + * @param w - width in pixels + * @param h - height in pixels + * @param bitmap - monochrome bitmap data, located in flash + * + * @note There are 2 modes: transparent and non-transparent mode, - and 2 colors available: black and white. + * In non-transparent mode, when black color is selected, the monochrome image just inverted. + * In transparent mode, those pixels of source monochrome image, which are black, do not overwrite pixels + * in the screen buffer. + */ + void drawXBitmap1(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + + /** + * @brief Draws 8-bit color bitmap in color buffer. + * Draws 8-bit color bitmap in color buffer. + * @param x - position X in pixels + * @param y - position Y in pixels + * @param w - width in pixels + * @param h - height in pixels + * @param bitmap - 8-bit color bitmap data, located in flash + */ + void drawBitmap8(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + + /** + * Clears canvas + */ + void clear(); + + /** + * Writes single character to canvas + * @param c - character code to print + */ + size_t write(uint8_t c) override; + + /** + * Draws single character to canvas + * @param c - character code to print + * @returns 0 if char is not printed + */ + uint8_t printChar(uint8_t c); + + /** + * Print text at specified position to canvas + * + * @param xpos position in pixels + * @param y position in pixels + * @param ch pointer to NULL-terminated string. + * @param style specific font style to use + * + * @note Supports only STYLE_NORMAL and STYLE_BOLD + */ + void printFixed(lcdint_t xpos, lcdint_t y, const char *ch, EFontStyle style = STYLE_NORMAL); + + /** + * Print text at specified position to canvas + * + * @param xpos position in pixels + * @param y position in pixels + * @param ch pointer to NULL-terminated string, located in flash + * @param style specific font style to use + * + * @note Supports only STYLE_NORMAL and STYLE_BOLD + */ + void printFixedPgm(lcdint_t xpos, lcdint_t y, const char *ch, EFontStyle style = STYLE_NORMAL); + + /** + * @brief Sets canvas drawing mode + * Sets canvas drawing mode. The set flags define transparency of output images + * @param modeFlags - combination of flags: CANVAS_TEXT_WRAP, CANVAS_MODE_TRANSPARENT + */ + void setMode(uint8_t modeFlags) { m_textMode = modeFlags; }; + + /** + * Sets color for monochrome operations + * @param color - color to set (refer to RGB_COLOR8 definition) + */ + void setColor(uint16_t color) { m_color = color; }; + +protected: + lcduint_t m_w; ///< width of NanoCanvas area in pixels + lcduint_t m_h; ///< height of NanoCanvas area in pixels + lcduint_t m_p; ///< number of bits, used by width value: 3 equals to 8 pixels width + lcdint_t m_cursorX; ///< current X cursor position for text output + lcdint_t m_cursorY; ///< current Y cursor position for text output + uint8_t m_textMode; ///< Flags for current NanoCanvas mode + EFontStyle m_fontStyle; ///< currently active font style + uint8_t * m_buf; ///< Canvas data + uint16_t m_color; ///< current color for monochrome operations +}; + +/** + * Base class for all NanoCanvas childs + */ +template <uint8_t BPP> +class NanoCanvasBase: public NanoCanvasOps<BPP> +{ +public: + using NanoCanvasOps<BPP>::NanoCanvasOps; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + */ + virtual void blt(lcdint_t x, lcdint_t y) = 0; + + /** + * Draws canvas on the LCD display using offset values. + */ + virtual void blt() = 0; + + /** + * Draws only part of canvas on the LCD display. + * This method uses Canvas offset field as top-left point of whole canvas + * content. First point of specified rectangle defines the actual top-left + * point on the screen to be refreshed. + * For example, `blt({{8,0},{15,7}});` will copy canvas area {8,0}-{15,7} + * to screen starting at {8,0} if canvas offset is {0,0}. + * If canvas offset is {12,3}, then canvas area {8,0}-{15,7} will be copied + * to screen at position {20,3}. + * @param rect rectagle describing part of canvas to move to display. + */ + virtual void blt(const NanoRect &rect) = 0; +}; + +///////////////////////////////////////////////////////////////////////////////// +// +// 1-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +enum +{ + BLACK = 0x00, ///< Black color + WHITE = 0xFF, ///< White color +}; + +/** + * NanoCanvas1 represents objects for drawing in memory buffer + * NanoCanvas1 represents each pixel as single bit: 0/1 + * For details refer to SSD1306 datasheet + */ +class NanoCanvas1: public NanoCanvasBase<1> +{ +public: + using NanoCanvasBase::NanoCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override; + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override; + + /** + * Draws only part of canvas on the LCD display. + * This method uses Canvas offset field as top-left point of whole canvas + * content. First point of specified rectangle defines the actual top-left + * point on the screen to be refreshed. + * For example, `blt({{8,0},{15,7}});` will copy canvas area {8,0}-{15,7} + * to screen starting at {8,0} if canvas offset is {0,0}. + * If canvas offset is {12,3}, then canvas area {8,0}-{15,7} will be copied + * to screen at position {20,3}. + * @param rect rectagle describing part of canvas to move to display. + */ + void blt(const NanoRect &rect) override; +}; + +/** + * NanoCanvas1_8 represents objects for drawing in memory buffer + * NanoCanvas1_8 represents each pixel as single bit: 0/1 + * Unlike NanoCanvas1, it works with RBG color displays in normal mode. + */ +class NanoCanvas1_8: public NanoCanvasBase<1> +{ +public: + using NanoCanvasBase::NanoCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override; + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override; + + /** + * Draws only part of canvas on the LCD display. + * This method uses Canvas offset field as top-left point of whole canvas + * content. First point of specified rectangle defines the actual top-left + * point on the screen to be refreshed. + * For example, `blt({{8,0},{15,7}});` will copy canvas area {8,0}-{15,7} + * to screen starting at {8,0} if canvas offset is {0,0}. + * If canvas offset is {12,3}, then canvas area {8,0}-{15,7} will be copied + * to screen at position {20,3}. + * @param rect rectagle describing part of canvas to move to display. + */ + void blt(const NanoRect &rect) override; +}; + +/** + * NanoCanvas1_16 represents objects for drawing in memory buffer + * NanoCanvas1_16 represents each pixel as single bit: 0/1 + * Unlike NanoCanvas1, it works with RBG color displays in normal mode. + */ +class NanoCanvas1_16: public NanoCanvasBase<1> +{ +public: + using NanoCanvasBase::NanoCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override; + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override; + + /** + * Draws only part of canvas on the LCD display. + * This method uses Canvas offset field as top-left point of whole canvas + * content. First point of specified rectangle defines the actual top-left + * point on the screen to be refreshed. + * For example, `blt({{8,0},{15,7}});` will copy canvas area {8,0}-{15,7} + * to screen starting at {8,0} if canvas offset is {0,0}. + * If canvas offset is {12,3}, then canvas area {8,0}-{15,7} will be copied + * to screen at position {20,3}. + * @param rect rectagle describing part of canvas to move to display. + */ + void blt(const NanoRect &rect) override; +}; + +///////////////////////////////////////////////////////////////////////////////// +// +// 4-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/** + * NanoCanvas1_4 represents objects for drawing in memory buffer + * NanoCanvas1_4 represents each pixel as 4-bits in GRAYscale: 11112222 + * For details refer to ssd1327/ssd1325 datasheet + */ +class NanoCanvas1_4: public NanoCanvasBase<4> +{ +public: + using NanoCanvasBase::NanoCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override; + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override; + + /** + * Draws only part of canvas on the LCD display. + * This method uses Canvas offset field as top-left point of whole canvas + * content. First point of specified rectangle defines the actual top-left + * point on the screen to be refreshed. + * For example, `blt({{8,0},{15,7}});` will copy canvas area {8,0}-{15,7} + * to screen starting at {8,0} if canvas offset is {0,0}. + * If canvas offset is {12,3}, then canvas area {8,0}-{15,7} will be copied + * to screen at position {20,3}. + * @param rect rectagle describing part of canvas to move to display. + */ + void blt(const NanoRect &rect) override; +}; + +///////////////////////////////////////////////////////////////////////////////// +// +// 8-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/** + * NanoCanvas8 represents objects for drawing in memory buffer + * NanoCanvas8 represents each pixel as single byte with RGB bits: RRRGGGBB + * For details refer to SSD1331 datasheet + */ +class NanoCanvas8: public NanoCanvasBase<8> +{ +public: + using NanoCanvasBase::NanoCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override; + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override; + + /** + * Draws only part of canvas on the LCD display. + * This method uses Canvas offset field as top-left point of whole canvas + * content. First point of specified rectangle defines the actual top-left + * point on the screen to be refreshed. + * For example, `blt({{8,0},{15,7}});` will copy canvas area {8,0}-{15,7} + * to screen starting at {8,0} if canvas offset is {0,0}. + * If canvas offset is {12,3}, then canvas area {8,0}-{15,7} will be copied + * to screen at position {20,3}. + * @param rect rectagle describing part of canvas to move to display. + */ + void blt(const NanoRect &rect) override; +}; + +///////////////////////////////////////////////////////////////////////////////// +// +// 16-BIT GRAPHICS +// +///////////////////////////////////////////////////////////////////////////////// + +/** + * NanoCanvas16 represents objects for drawing in memory buffer + * NanoCanvas16 represents each pixel as 2-bytes with RGB bits: RRRRRGGG-GGGBBBBB + * For details refer to SSD1351 datasheet + */ +class NanoCanvas16: public NanoCanvasBase<16> +{ +public: + using NanoCanvasBase::NanoCanvasBase; + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ + void blt(lcdint_t x, lcdint_t y) override; + + /** + * Draws canvas on the LCD display using offset values. + */ + void blt() override; + + /** + * Draws only part of canvas on the LCD display. + * This method uses Canvas offset field as top-left point of whole canvas + * content. First point of specified rectangle defines the actual top-left + * point on the screen to be refreshed. + * For example, `blt({{8,0},{15,7}});` will copy canvas area {8,0}-{15,7} + * to screen starting at {8,0} if canvas offset is {0,0}. + * If canvas offset is {12,3}, then canvas area {8,0}-{15,7} will be copied + * to screen at position {20,3}. + * @param rect rectagle describing part of canvas to move to display. + */ + void blt(const NanoRect &rect) override; +}; + +/** + * @} + */ + +#endif + diff --git a/lib/libssd1306/src/nano_engine/core.cpp b/lib/libssd1306/src/nano_engine/core.cpp new file mode 100644 index 0000000..d2aa0fe --- /dev/null +++ b/lib/libssd1306/src/nano_engine/core.cpp @@ -0,0 +1,193 @@ +/* + MIT License + + Copyright (c) 2018-2021, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "core.h" + +#ifdef SDL_EMULATION +#include "sdl_core.h" +#endif +/////////////////////////////////////////////////////////////////////////////// +////// NANO ENGINE INPUTS CLASS /////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +/** Callback to call if buttons state needs to be updated */ +TNanoEngineGetButtons NanoEngineInputs::m_onButtons = nullptr; + +uint8_t NanoEngineInputs::s_ky40_clk; +uint8_t NanoEngineInputs::s_ky40_dt; +uint8_t NanoEngineInputs::s_ky40_sw; + + +bool NanoEngineInputs::pressed(uint8_t buttons) +{ + return (m_onButtons() & buttons) == buttons; +} + +bool NanoEngineInputs::notPressed(uint8_t buttons) +{ + return (m_onButtons() & buttons) == 0; +} + +void NanoEngineInputs::connectCustomKeys(TNanoEngineGetButtons handler) +{ + m_onButtons = handler; +} + +void NanoEngineInputs::connectArduboyKeys() +{ + m_onButtons = arduboyButtons; +} + +uint8_t NanoEngineInputs::s_zkeypadPin; + +uint8_t NanoEngineInputs::zkeypadButtons() +{ + int buttonValue = analogRead(s_zkeypadPin); + if (buttonValue < 100) return BUTTON_RIGHT; + if (buttonValue < 200) return BUTTON_UP; + if (buttonValue < 400) return BUTTON_DOWN; + if (buttonValue < 600) return BUTTON_LEFT; + if (buttonValue < 800) return BUTTON_A; + /** Z-keypad has only 5 analog buttons: no button B */ + return BUTTON_NONE; +} + +void NanoEngineInputs::connectZKeypad(uint8_t analogPin) +{ + NanoEngineInputs::s_zkeypadPin = analogPin; + m_onButtons = zkeypadButtons; +} + +uint8_t NanoEngineInputs::arduboyButtons() +{ + uint8_t buttons; + /* Arduboy buttons available only for Atmega32U4 platform */ + #if defined(__AVR_ATmega32U4__) + // down, up, left right + buttons = (((~PINF) & 0B11110000)>>4); + // A (left) + buttons |= (((~PINE) & 0B01000000) >> 2); + // B (right) + buttons |= (((~PINB) & 0B00010000) << 1); + #else + buttons = 0; + #endif + return buttons; +} + +const uint8_t * NanoEngineInputs::s_gpioKeypadPins; + +void NanoEngineInputs::connectGpioKeypad(const uint8_t * gpioKeys) +{ + NanoEngineInputs::s_gpioKeypadPins = gpioKeys; +#ifdef SDL_EMULATION + sdl_set_gpio_keys(gpioKeys); +#endif + m_onButtons = gpioButtons; +} + +uint8_t NanoEngineInputs::gpioButtons() +{ + uint8_t buttons = BUTTON_NONE; + if ((s_gpioKeypadPins[0]) && (digitalRead(s_gpioKeypadPins[0]) == HIGH)) buttons |= BUTTON_DOWN; + if ((s_gpioKeypadPins[1]) && (digitalRead(s_gpioKeypadPins[1]) == HIGH)) buttons |= BUTTON_LEFT; + if ((s_gpioKeypadPins[2]) && (digitalRead(s_gpioKeypadPins[2]) == HIGH)) buttons |= BUTTON_RIGHT; + if ((s_gpioKeypadPins[3]) && (digitalRead(s_gpioKeypadPins[3]) == HIGH)) buttons |= BUTTON_UP; + if ((s_gpioKeypadPins[4]) && (digitalRead(s_gpioKeypadPins[4]) == HIGH)) buttons |= BUTTON_A; + if ((s_gpioKeypadPins[5]) && (digitalRead(s_gpioKeypadPins[5]) == HIGH)) buttons |= BUTTON_B; + return buttons; +} + +void NanoEngineInputs::connectKY40encoder(uint8_t pina_clk, uint8_t pinb_dt, int8_t pinc_sw) +{ + s_ky40_clk = pina_clk; + s_ky40_dt = pinb_dt; + s_ky40_sw = pinc_sw; + m_onButtons = ky40Buttons; +} + +uint8_t NanoEngineInputs::ky40Buttons() +{ + static uint8_t last_clk = digitalRead( s_ky40_clk ); + uint8_t buttons = BUTTON_NONE; + uint8_t clk = digitalRead( s_ky40_clk ); + if ( clk != last_clk ) + { + if ( clk == HIGH ) + { + buttons = digitalRead( s_ky40_dt ) == LOW ? BUTTON_DOWN : BUTTON_UP; + } + else + { + buttons = digitalRead( s_ky40_dt ) == HIGH ? BUTTON_DOWN : BUTTON_UP; + } + } + last_clk = clk; + if ( digitalRead( s_ky40_sw ) == LOW ) + { + buttons |= BUTTON_A; + } + return buttons; +} + +/////////////////////////////////////////////////////////////////////////////// +////// NANO ENGINE CORE CLASS ///////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +/** Defaut frame rate for all engines */ +static const uint8_t ENGINE_DEFAULT_FPS = 30; + +/** Duration between frames in milliseconds */ +uint8_t NanoEngineCore::m_frameDurationMs = 1000/ENGINE_DEFAULT_FPS; +/** Current fps */ +uint8_t NanoEngineCore::m_fps = ENGINE_DEFAULT_FPS; +/** Current cpu load in percents */ +uint8_t NanoEngineCore::m_cpuLoad = 0; +/** Last timestamp in milliseconds the frame was updated on oled display */ +uint32_t NanoEngineCore::m_lastFrameTs; +/** Callback to call before starting oled update */ +TLoopCallback NanoEngineCore::m_loop = nullptr; + + +void NanoEngineCore::begin() +{ + m_lastFrameTs = millis(); +} + +void NanoEngineCore::setFrameRate(uint8_t fps) +{ + if ( fps > 0 ) + { + m_fps = fps; + m_frameDurationMs = 1000/fps; + } +} + +bool NanoEngineCore::nextFrame() +{ + bool needUpdate = (uint32_t)(millis() - m_lastFrameTs) >= m_frameDurationMs; + if (needUpdate && m_loop) m_loop(); + return needUpdate; +} + diff --git a/lib/libssd1306/src/nano_engine/core.h b/lib/libssd1306/src/nano_engine/core.h new file mode 100644 index 0000000..1ecc909 --- /dev/null +++ b/lib/libssd1306/src/nano_engine/core.h @@ -0,0 +1,301 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file core.h Small graphics engine, based on SSD1331 functions + */ + + +#ifndef _NANO_ENGINE_CORE_H_ +#define _NANO_ENGINE_CORE_H_ + +#include "tiler.h" +#include "canvas.h" + +/** + * @ingroup NANO_ENGINE_API + * @{ + */ + +/** Type of user-specified keyboard callback */ +typedef uint8_t (*TNanoEngineGetButtons)(void); + +/** Type of user-specified loop callback */ +typedef void (*TLoopCallback)(void); + +/////////////////////////////////////////////////////////////////////////////// +////// NANO ENGINE INPUTS CLASS /////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +enum +{ + BUTTON_NONE = 0B00000000, + BUTTON_DOWN = 0B00000001, + BUTTON_LEFT = 0B00000010, + BUTTON_RIGHT = 0B00000100, + BUTTON_UP = 0B00001000, + BUTTON_A = 0B00010000, + BUTTON_B = 0B00100000, +}; + +/** + * Class for keys processing functionality + */ +class NanoEngineInputs +{ +protected: + /** + * Initializes Nano Engine Inputs object. + */ + NanoEngineInputs() {}; +public: + /** + * @brief Returns true if button or specific combination of buttons is not pressed. + * Returns true if button or specific combination of buttons is pressed. + * @param buttons - buttons to check + * @return true or false + */ + static bool pressed(uint8_t buttons); + + /** + * @brief Returns true if button or specific combination of buttons is not pressed. + * Returns true if button or specific combination of buttons is not pressed. + * @param buttons - buttons to check + * @return true of false + */ + static bool notPressed(uint8_t buttons); + + /** + * @brief Returns bits of all pressed buttons + * + * Returns bits of all pressed buttons. For example, to check if Down button is pressed + * you need to write `if (result & BUTTON_DOWN) {}`. Available constants are: + * BUTTON_DOWN, BUTTON_LEFT, BUTTON_RIGHT, BUTTON_UP, BUTTON_A, BUTTON_B. + * + */ + static uint8_t buttonsState() + { + return m_onButtons(); + } + + /** + * Configures NanoEngine8 to use custom key handler. + * You can implement in your handler any keyboard layout, you use in your schematics. + */ + static void connectCustomKeys(TNanoEngineGetButtons handler); + + /** + * @brief Enables engine to use Z-Keypad. + * Enables engine to use Z-Keypad. Please refer to arkanoid example for schematics. + * @param analogPin - pin, which Z-Keypad is connected to. + */ + static void connectZKeypad(uint8_t analogPin); + + /** + * @brief Configures NanoEngine8 to use Arduboy keys layout. + * Configures NanoEngine8 to use Arduboy keys layout. + */ + static void connectArduboyKeys(); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS + /** + * @brief Configures NanoEngine to use KY40 Rotary Encoder. + * Configures NanoEngine to use KY40 Rotary Encoder. + * @param pina_clk pin number to use as clk (see KY40 docs). + * @param pinb_dt pin number to use as direction pin (see KY40 docs). + * @param pinc_sw optional pin number ot use as push button. + * @warning do not use, not tested + */ + static void connectKY40encoder(uint8_t pina_clk, uint8_t pinb_dt, int8_t pinc_sw = -1); +#endif + + /** + * @brief Enables engine to use GPIO keys + * + * Enables engine to use gpio-keys. You need to pass globally defined array, + * containing GPIO pin numbers for the 6 buttons in the following order: + * Down, Left, Right, Up, A, B. If you don't want to use some specific button, + * then just set not used button to 0. + * Once you call this function, you can read buttons state via buttonsState(). + * + * @param gpioKeys pointer to 6-button pins array. + * + * @see buttonsState() + */ + static void connectGpioKeypad(const uint8_t *gpioKeys); + +protected: + /** Callback to call if buttons state needs to be updated */ + static TNanoEngineGetButtons m_onButtons; + +private: + static uint8_t s_zkeypadPin; + static const uint8_t * s_gpioKeypadPins; + static uint8_t s_ky40_clk; + static uint8_t s_ky40_dt; + static uint8_t s_ky40_sw; + static uint8_t zkeypadButtons(); + static uint8_t arduboyButtons(); + static uint8_t gpioButtons(); + static uint8_t ky40Buttons(); +}; + + +/////////////////////////////////////////////////////////////////////////////// +////// NANO ENGINE CORE CLASS ///////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +/** + * Nano Engine Core class, contains generic frame-rate control functions + */ +class NanoEngineCore: public NanoEngineInputs +{ +protected: + NanoEngineCore(): NanoEngineInputs() {}; + +public: + /** + * Initializes internal timestamps. + */ + static void begin(); + + /** + * Sets working frame-rate for the engine + * @param fps - frame rate to set between [1-255] + */ + static void setFrameRate(uint8_t fps); + + /** + * Returns current frame rate + */ + static uint8_t getFrameRate() { return m_fps; }; + + /** + * Returns cpu load in percents [0-255]. + * 100 means maximum normal CPU load. + * 0 means, CPU has nothing to do. + * >100 means that CPU is not enough to perform all operations + */ + static uint8_t getCpuLoad() { return m_cpuLoad; }; + + /** + * Returns true if it is time to render next frame + */ + static bool nextFrame(); + + /** + * Sets user-defined loop callback. This callback will be called once every time + * new frame needs to be refreshed on oled display. + */ + static void loopCallback(TLoopCallback callback) { m_loop = callback; }; + +protected: + + /** Duration between frames in milliseconds */ + static uint8_t m_frameDurationMs; + /** Current fps */ + static uint8_t m_fps; + /** Current cpu load in percents */ + static uint8_t m_cpuLoad; + /** Last timestamp in milliseconds the frame was updated on oled display */ + static uint32_t m_lastFrameTs; + /** Callback to call before starting oled update */ + static TLoopCallback m_loop; +}; + +/** + * Base class for NanoEngine. + */ +template<class C, uint8_t W, uint8_t H, uint8_t B> +class NanoEngine: public NanoEngineCore, + public NanoEngineTiler<C,W,H,B> +{ +public: + /** + * Initializes Nano Engine Base object. + */ + NanoEngine(); + + /** + * @brief refreshes content on oled display. + * Refreshes content on oled display. Call it, if you want to update the screen. + * Engine will update only those areas, which are marked by refresh() + * methods. + */ + static void display(); + + /** + * Initializes internal timestamps, engine state, and + * switches oled display to required mode (see ssd1306_setMode()). + */ + static void begin(); + + /** + * @brief shows notification to a user for 1 seconds + * Shows notification to a user for 1 seconds + * @param str - pointer to null-terminated string to show + */ + static void notify(const char *str); + +protected: +}; + +template<class C, uint8_t W, uint8_t H, uint8_t B> +NanoEngine<C,W,H,B>::NanoEngine() + : NanoEngineCore(), NanoEngineTiler<C,W,H,B>() +{ +} + +template<class C, uint8_t W, uint8_t H, uint8_t B> +void NanoEngine<C,W,H,B>::display() +{ + m_lastFrameTs = millis(); + NanoEngineTiler<C,W,H,B>::displayBuffer(); + m_cpuLoad = ((millis() - m_lastFrameTs)*100)/m_frameDurationMs; +} + +template<class C, uint8_t W, uint8_t H, uint8_t B> +void NanoEngine<C,W,H,B>::begin() +{ + NanoEngineCore::begin(); + if (C::BITS_PER_PIXEL > 1) + { + ssd1306_setMode(LCD_MODE_NORMAL); + } +} + +template<class C, uint8_t W, uint8_t H, uint8_t B> +void NanoEngine<C,W,H,B>::notify(const char *str) +{ + NanoEngineTiler<C,W,H,B>::displayPopup(str); + delay(1000); + m_lastFrameTs = millis(); + NanoEngineTiler<C,W,H,B>::refresh(); +} + +/** + * @} + */ + +#endif + diff --git a/lib/libssd1306/src/nano_engine/point.h b/lib/libssd1306/src/nano_engine/point.h new file mode 100644 index 0000000..bea582b --- /dev/null +++ b/lib/libssd1306/src/nano_engine/point.h @@ -0,0 +1,183 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file point.h Point class + */ + + +#ifndef _NANO_POINT_H_ +#define _NANO_POINT_H_ + +#include "ssd1306_hal/io.h" + +/** + * @ingroup NANO_ENGINE_API + * @{ + */ + +/** Describes point */ +typedef struct _NanoPoint +{ + /** x position in pixels */ + lcdint_t x; + /** y position in pixels */ + lcdint_t y; + +// _NanoPoint(lcdint_t px, lcdint_t py) +// { +// x = px; +// y = py; +// } + + /** + * Initializes NanoPoint with specified values + * @param px - x position + * @param py - y position + */ + void setPoint(lcdint_t px, lcdint_t py) { x=px; y=py; }; + + /** + * Shifts right x,y value of the point by bits value. + * @param bits - number of bits to shift + */ + _NanoPoint& operator>>=(const uint8_t bits) + { + x >>= bits; + y >>= bits; + return *this; + } + + /** + * Shifts left x,y value of the point by bits value. + * @param bits - number of bits to shift + */ + _NanoPoint& operator<<=(const uint8_t bits) + { + x <<= bits; + y <<= bits; + return *this; + } + + /** + * Adds point. + * @param p - point values to add to the point. + */ + _NanoPoint& operator+=(const _NanoPoint &p) + { + x += p.x; + y += p.y; + return *this; + }; + + /** + * Subtracts point. + * @param p - point values to subtract from the point. + */ + _NanoPoint& operator-=(const _NanoPoint &p) + { + x -= p.x; + y -= p.y; + return *this; + }; + + /** + * Subtracts point. + * @param p - point values to subtract from the point. + */ + _NanoPoint operator-(const _NanoPoint &p) + { + return { static_cast<lcdint_t>(x - p.x), + static_cast<lcdint_t>(y - p.y) }; + }; + + /** + * Adds point. + * @param p - point values to add to the point. + */ + _NanoPoint operator+(const _NanoPoint &p) + { + return { static_cast<lcdint_t>(x + p.x), + static_cast<lcdint_t>(y + p.y) }; + }; + + /** + * Shifts right x,y value of the point by bits value. + * @param bits - number of bits to shift + */ + _NanoPoint operator>>(const uint8_t bits) const + { + return { static_cast<lcdint_t>(x >> bits), + static_cast<lcdint_t>(y >> bits) }; + }; + + /** + * Shifts left x,y value of the point by bits value. + * @param bits - number of bits to shift + */ + _NanoPoint operator<<(const uint8_t bits) const + { + return { static_cast<lcdint_t>(x << bits), + static_cast<lcdint_t>(y << bits) }; + }; + + /** + * Divides x,y value of the point by d value. + * @param d divider + */ + _NanoPoint operator/(const int16_t d) const + { + return { static_cast<lcdint_t>(x / d), + static_cast<lcdint_t>(y / d) }; + }; + +} NanoPoint; + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +inline NanoPoint operator+(const NanoPoint& p1, const NanoPoint& p2) +{ + return { (lcdint_t)(p1.x + p2.x), (lcdint_t)(p1.y + p2.y) }; +} + +inline NanoPoint operator-(const NanoPoint& p1, const NanoPoint& p2) +{ + return { (lcdint_t)(p1.x - p2.x), (lcdint_t)(p1.y - p2.y) }; +} + +inline bool operator==(const NanoPoint& p1, const NanoPoint& p2) +{ + return (p1.x == p2.x) && (p1.y == p2.y); +} + +inline bool operator!=(const NanoPoint& p1, const NanoPoint& p2) +{ + return !(p1 == p2); +} +#endif // DOXYGEN_SHOULD_SKIP_THIS + +/** + * @} + */ + +#endif + diff --git a/lib/libssd1306/src/nano_engine/rect.h b/lib/libssd1306/src/nano_engine/rect.h new file mode 100644 index 0000000..da7ad80 --- /dev/null +++ b/lib/libssd1306/src/nano_engine/rect.h @@ -0,0 +1,257 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file rect.h Rectangle class + */ + +#ifndef _NANO_RECT_H_ +#define _NANO_RECT_H_ + +#include "point.h" +#include "ssd1306_hal/io.h" + +/** + * @ingroup NANO_ENGINE_API + * @{ + */ + +/** + * NanoRect structure describes rectangle area. + */ +typedef struct _NanoRect +{ + /** top-left point of the rectangle area */ + NanoPoint p1; + + /** right-bottom point of the rectangle area */ + NanoPoint p2; + + /** returns width of NanoRect */ + lcdint_t width() const + { + return p2.x - p1.x + 1; + } + + /** returns size of NanoRect */ + const NanoPoint size() const + { + return {width(), height()}; + } + + /** returns height of NanoRect */ + lcdint_t height() const + { + return p2.y - p1.y + 1; + } + + /** + * Shifts rectangle area by dx;dy pixels. + * @param dx - delta on x-axis + * @param dy - delta on y-axis + */ + void move(lcdint_t dx, lcdint_t dy) + { + p1.x += dx; p2.x += dx; + p1.y += dy; p2.y += dy; + } + + /** + * Shifts rectangle area by dx pixels. + * @param dx - delta on x-axis + */ + void addH(lcdint_t dx) + { + p1.x += dx; p2.x += dx; + } + + /** + * Shifts rectangle area by dy pixels. + * @param dy - delta on y-axis + */ + void addV(lcdint_t dy) + { + p1.y += dy; + p2.y += dy; + } + + /** + * Initializes NanoRect with specified values + * @param l - left position + * @param t - top position + * @param r - right position + * @param b - bottom position + */ + void setRect(lcdint_t l, lcdint_t t, lcdint_t r, lcdint_t b) + { + p1.x = l; p1.y = t; + p2.x = r; p2.y = b; + } + + /** + * Crops rectangle to fit specified area + * + * @param rect rectangle to crop to + */ + void crop(const _NanoRect& rect) + { + if (p1.x < rect.p1.x) p1.x = rect.p1.x; + if (p1.y < rect.p1.y) p1.y = rect.p1.y; + if (p2.x > rect.p2.x) p2.x = rect.p2.x; + if (p2.y > rect.p2.y) p2.y = rect.p2.y; + } + + /** + * Returns true if specified x position is between left and right borders. + * @param x - position to check + */ + bool collisionX(lcdint_t x) const + { + return (x >= p1.x) && (x <= p2.x); + } + + /** + * Returns true if specified y position is between left and right borders. + * @param y - position to check + */ + bool collisionY(lcdint_t y) const { return (y >= p1.y) && (y <= p2.y); }; + + /** + * Returns true if specified point is inside rectangle area. + * @param p - point to check. + */ + bool collision(const NanoPoint &p) const + { + return collisionX(p.x) && collisionY(p.y); + } + + /** + * Returns true of point belongs to rectangle area + * + * @param p point to check for + */ + bool contains(const NanoPoint &p) const + { + return collision(p); + } + + /** + * Returns true if whole rectangle belongs to rectangle area + * + * @param r rectangle to check + */ + bool contains(const _NanoRect &r) const + { + return contains(r.p1) && contains(r.p2); + } + + /** + * Returns true if rectangle topleft or rightbottom points belong to rectangle area + * + * @param r rectangle to check + */ + bool containsPartOf(const _NanoRect &r) const + { + return contains(r.p1) || contains(r.p2); + } + + /** + * Returns true if specified point is above rectangle area. + * @param p - point to check. + */ + bool above(const NanoPoint &p) const { return (p.y < p1.y); }; + + /** + * Returns true if specified point is below rectangle area. + * @param p - point to check. + */ + bool below(const NanoPoint &p) const { return (p.y > p2.y); }; + + /** + * Returns true if specified point is above rectangle area. + * @param p - point to check. + */ + _NanoRect operator-(const _NanoPoint &p) + { + return { {static_cast<lcdint_t>(p1.x - p.x), static_cast<lcdint_t>(p1.y - p.y) }, + {static_cast<lcdint_t>(p2.x - p.x), static_cast<lcdint_t>(p2.y - p.y) } }; + } + + /** + * Add point to all points of rectangle. + * @param p - point to add. + */ + _NanoRect operator+(const _NanoPoint &p) + { + return { {static_cast<lcdint_t>(p1.x + p.x), static_cast<lcdint_t>(p1.y + p.y) }, + {static_cast<lcdint_t>(p2.x + p.x), static_cast<lcdint_t>(p2.y + p.y) } }; + } + + /** + * Subtracts point to all points of rectangle. + * @param p - point to subtract. + */ + _NanoRect& operator+=(const _NanoPoint &p) + { + p1.x += p.x; + p1.y += p.y; + p2.x += p.x; + p2.y += p.y; + return *this; + } + + /** + * Shifts right x,y value of the point by bits value. + * @param bits - number of bits to shift + */ + _NanoRect operator>>(const uint8_t bits) const + { + return { p1 >> bits, p2 >> bits }; + }; + + /** + * Shifts left x,y value of the point by bits value. + * @param bits - number of bits to shift + */ + _NanoRect operator<<(const uint8_t bits) const + { + return { p1 << bits, p2 << bits }; + }; + + +} NanoRect; + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +inline NanoRect operator+(const NanoRect& rect, const NanoPoint& p) +{ + return { { (lcdint_t)(rect.p1.x + p.x), (lcdint_t)(rect.p1.y + p.y) }, + { (lcdint_t)(rect.p2.x + p.x), (lcdint_t)(rect.p2.y + p.y) } }; +} +#endif + +/** + * @} + */ + +#endif + diff --git a/lib/libssd1306/src/nano_engine/sprite.h b/lib/libssd1306/src/nano_engine/sprite.h new file mode 100644 index 0000000..29ea37f --- /dev/null +++ b/lib/libssd1306/src/nano_engine/sprite.h @@ -0,0 +1,303 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file sprite.h Sprite class + */ + +#ifndef _NANO_SPRITE_H_ +#define _NANO_SPRITE_H_ + +#include "point.h" +#include "rect.h" +#include "ssd1306_hal/io.h" + +/** + * @ingroup NANO_ENGINE_API + * @{ + */ + +/** + * This is template class for user sprites implementations. + * NanoSprite can work only as part of NanoEngine, it requires + * NanoEngine type and NanoEngine instance as arguments. + */ +template<typename T, T &E> +class NanoSprite +{ +public: + /** + * Creates sprite object of variable size. Such sprites can + * change their size and bitmap content. + * @param pos position of the sprite in global coordinates + * @param size size of sprite + * @param bitmap sprite content (in flash memory) + */ + NanoSprite(const NanoPoint &pos, const NanoPoint &size, const uint8_t *bitmap) + : m_rect{pos, pos + size} + , m_bitmap( bitmap ) + { + } + + /** + * Draws monochrome sprite on Engine canvas + */ + void draw() + { + E.canvas.drawBitmap1(m_rect.p1.x, m_rect.p1.y, m_rect.width(), m_rect.height(), m_bitmap); + } + + /** + * Marks sprite locate for refreshing on the new frame + */ + void refresh() + { + E.refreshWorld( m_rect ); + } + + /** + * Moves sprite to new position + */ + void moveTo(const NanoPoint &p) + { + refresh(); + m_rect = { p, p + m_rect.size() }; + refresh(); + } + + /** + * Moves sprite to new position by specified offset + */ + void moveBy(const NanoPoint &p) + { + refresh(); + m_rect += p; + refresh(); + } + + /** + * Returns bottom-center point of the sprite + */ + const NanoPoint bottom() const + { + return { (m_rect.p1.x + m_rect.p2.x) >> 1, m_rect.p2.y }; + } + + /** + * Returns top-center point of the sprite + */ + const NanoPoint top() const + { + return { (m_rect.p1.x + m_rect.p2.x) >> 1, m_rect.p1.y }; + } + + /** + * Returns left-center point of the sprite + */ + const NanoPoint left() const + { + return { m_rect.p1.x, (m_rect.p1.y + m_rect.p2.y) >> 1 }; + } + + /** + * Returns right-center point of the sprite + */ + const NanoPoint right() const + { + return { m_rect.p2.x, (m_rect.p1.y + m_rect.p2.y) >> 1 }; + } + + /** + * Returns center point of the sprite + */ + const NanoPoint center() const + { + return { (m_rect.p1.x + m_rect.p2.x) >> 1, (m_rect.p1.y + m_rect.p2.y) >> 1 }; + } + + /** + * Changes sprite bitmap to new one. + */ + void setBitmap( const uint8_t * bitmap ) + { + m_bitmap = bitmap; + } + + /** + * Returns sprite x position + */ + lcdint_t x( ) const { return m_rect.p1.x; } + + /** + * Returns sprite y position + */ + lcdint_t y( ) const { return m_rect.p1.y; } + +private: + NanoRect m_rect; + const uint8_t *m_bitmap; +}; + +/** + * This is template class for user sprites implementation. + * It requires NanoEngine type and NanoEngine instance as arguments. + */ +template<typename T, T &E> +class NanoFixedSprite +{ +public: + /** + * Creates sprite object of fixed size. Such sprites can + * change their bitmap content only and position. + * @param pos position of the sprite in global coordinates + * @param size size of sprite + * @param bitmap sprite content (in flash memory) + */ + NanoFixedSprite(const NanoPoint &pos, const NanoPoint &size, const uint8_t *bitmap) + : m_pos(pos) + , m_size(size) + , m_bitmap( bitmap ) + { + } + + /** + * Draws monochrome sprite on Engine canvas + */ + void draw() + { + E.canvas.drawBitmap1(m_pos.x, m_pos.y, m_size.x, m_size.y, m_bitmap); + } + + /** + * Marks sprite locate for refreshing on the new frame + */ + void refresh() + { + E.refreshWorld( m_pos.x, m_pos.y, + m_pos.x + m_size.x - 1, m_pos.y + m_size.y - 1 ); + } + + /** + * Moves sprite to new position + */ + void moveTo(const NanoPoint &p) + { + refresh(); + m_pos = p; + refresh(); + } + + /** + * Moves sprite to new position by specified offset + */ + void moveBy(const NanoPoint &p) + { + refresh(); + m_pos += p; + refresh(); + } + + /** + * Returns bottom-center point of the sprite + */ + const NanoPoint bottom() const + { + return { m_pos.x + (m_size.x >> 1), m_pos.y + m_size.y - 1 }; + } + + /** + * Returns top-center point of the sprite + */ + const NanoPoint top() const + { + return { m_pos.x + (m_size.x >> 1), m_pos.y }; + } + + /** + * Returns left-center point of the sprite + */ + const NanoPoint left() const + { + return { m_pos.x, m_pos.y + (m_size.y>>1) }; + } + + /** + * Returns right-center point of the sprite + */ + const NanoPoint right() const + { + return { m_pos.x + m_size.x - 1, m_pos.y + (m_size.y>>1) }; + } + + /** + * Returns center point of the sprite + */ + const NanoPoint center() const + { + return { m_pos.x + (m_size.x >> 1), m_pos.y + (m_size.y>>1) }; + } + + /** + * Changes sprite bitmap to new one. + */ + void setBitmap( const uint8_t * bitmap ) + { + m_bitmap = bitmap; + } + + /** + * Returns current sprite position (top-left corner) + */ + const NanoPoint & getPosition() const { return m_pos; } + + /** + * Returns sprite x position + */ + lcdint_t x( ) const { return m_pos.x; } + + /** + * Returns sprite y position + */ + lcdint_t y( ) const { return m_pos.y; } + + /** + * Returns current sprite position (top-left corner) + */ + const NanoPoint & pos() const { return m_pos; } + +protected: + /** fixed size of sprite */ + const NanoPoint m_size; + /** Sprite position in global (world) coordinates */ + NanoPoint m_pos; + +private: + const uint8_t *m_bitmap; +}; + +/** + * @} + */ + +#endif + diff --git a/lib/libssd1306/src/nano_engine/tiler.h b/lib/libssd1306/src/nano_engine/tiler.h new file mode 100644 index 0000000..eb764ce --- /dev/null +++ b/lib/libssd1306/src/nano_engine/tiler.h @@ -0,0 +1,364 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file tiler.h Tiler helper for graphics processing + */ + + +#ifndef _NANO_ENGINE_TILER_H_ +#define _NANO_ENGINE_TILER_H_ + +#include "canvas.h" +#include "lcd/lcd_common.h" + +/** + * @ingroup NANO_ENGINE_API + * @{ + */ + +/** + * Structure, holding currently set font. + * @warning Only for internal use. + */ +extern "C" SFixedFontInfo s_fixedFont; + +/* The table below defines arguments for NanoEngineTiler. * + * canvas width height bits */ +// Tiles for monochrome displays +#define TILE_128x64_MONO NanoCanvas1, 128, 64, 7 ///< Full-screen 1-bit tile for SSD1306 +#define TILE_8x8_MONO NanoCanvas1, 8, 8, 3 ///< Standard 1-bit tile 8x8 for monochrome mode +#define TILE_16x16_MONO NanoCanvas1, 16, 16, 4 ///< Standard 1-bit tile 16x16 for monochrome mode +#define TILE_32x32_MONO NanoCanvas1, 32, 32, 4 ///< Standard 1-bit tile 32x32 for monochrome mode +// Tiles for 8-bit displays +#define TILE_8x8_RGB8 NanoCanvas8, 8, 8, 3 ///< Standard 8-bit RGB tile 8x8 +#define TILE_16x16_RGB8 NanoCanvas8, 16, 16, 4 ///< Standard 8-bit RGB tile 16x16 +#define TILE_32x32_RGB8 NanoCanvas8, 32, 32, 5 ///< Standard 8-bit RGB tile 32x32 +#define TILE_8x8_MONO_8 NanoCanvas1_8,8, 8, 3 ///< Standard 1-bit tile 8x8 for RGB mode +// Tiles for 16-bit displays +#define TILE_8x8_RGB16 NanoCanvas16, 8, 8, 3 ///< Standard 16-bit RGB tile 8x8 +// Adafruit tiles +#define ADATILE_8x8_MONO AdafruitCanvas1, 8, 8, 3 ///< Use Adafruit GFX implementation as NanoEngine canvas +#define ADATILE_8x8_RGB8 AdafruitCanvas8, 8, 8, 3 ///< Use Adafruit GFX implementation as NanoEngine canvas +#define ADATILE_8x8_RGB16 AdafruitCanvas16, 8, 8, 3 ///< Use Adafruit GFX implementation as NanoEngine canvas + +/** + * Type of user-specified draw callback. + */ +typedef bool (*TNanoEngineOnDraw)(void); + +/** + * This class template is responsible for holding and updating data about areas to be refreshed + * on LCD display. It accepts canvas class, tile width in pixels, tile height in pixels and + * number of bits in tile width as arguments for the template. + * For example, for 8x8 8-bit RGB tiles the reference should be NanoEngineTiler<NanoCanvas8,8,8,3>, + * and 3 bits means 3^2 = 8. + * If you need to have single big buffer, holding the whole content for monochrome display, + * you can specify something like this NanoEngineTiler<NanoCanvas1,128,64,7>. + */ +template<class C, lcduint_t W, lcduint_t H, uint8_t B> +class NanoEngineTiler +{ +protected: + /** Only child classes can initialize the engine */ + NanoEngineTiler() + { + refresh(); + }; + +public: + /** Number of bits in tile size. 5 corresponds to 1<<5 = 32 tile size */ + static const uint8_t NE_TILE_SIZE_BITS = B; + /** Width of tile in pixels */ + static const lcduint_t NE_TILE_WIDTH = W; + /** Height of tile in pixels */ + static const lcduint_t NE_TILE_HEIGHT = H; + /** Max tiles supported in X */ + static const uint8_t NE_MAX_TILES_NUM = 64 >> (B - 3); + + /** object, representing canvas. Use it in your draw handler */ + static C canvas; + + /** + * Marks all tiles for update. Actual update will take place in display() method. + */ + static void refresh() + { + memset(m_refreshFlags,0xFF,sizeof(uint16_t) * NanoEngineTiler<C,W,H,B>::NE_MAX_TILES_NUM); + } + + /** + * Mark specified area in pixels for redrawing by NanoEngine. + * Actual update will take place in display() method. + * @note assumes that rect is in local screen coordinates + */ + static void refresh(const NanoRect &rect) + { + refresh(rect.p1.x, rect.p1.y, rect.p2.x, rect.p2.y); + } + + /** + * Mark specified area in pixels for redrawing by NanoEngine. + * Actual update will take place in display() method. + */ + static void refresh(const NanoPoint &point) + { + if ((point.y<0) || ((point.y>>B)>=NE_MAX_TILES_NUM)) return; + m_refreshFlags[(point.y>>B)] |= (1<<(point.x>>B)); + } + + /** + * Mark specified area in pixels for redrawing by NanoEngine. + * Actual update will take place in display() method. + */ + static void refresh(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) + { + if (y2 < 0) return; + if (y1 < 0) y1 = 0; + if (x1 < 0) x1 = 0; + y1 = y1>>B; + y2 = min((y2>>B), NE_MAX_TILES_NUM - 1); + for (uint8_t y=y1; y<=y2; y++) + { + for(uint8_t x=x1>>B; x<=(x2>>B); x++) + { + m_refreshFlags[y] |= (1<<x); + } + } + } + + /** + * Marks for refresh lcd area, which corresponds to specified rectangle in + * global (World) coordinates. If engine offset is (0,0), then this function + * refreshes the same area as refresh(). + */ + static void refreshWorld(const NanoRect &rect) + { + refreshWorld(rect.p1.x, rect.p1.y, rect.p2.x, rect.p2.y); + } + + /** + * Marks for refresh lcd area, which corresponds to specified rectangle in + * global (World) coordinates. If engine offset is (0,0), then this function + * refreshes the same area as refresh(). + */ + static void refreshWorld(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) + { + refresh(x1 - offset.x, y1 - offset.y, x2 - offset.x, y2 - offset.y); + } + + /** + * Marks specified pixel area for redrawing by NanoEngine. + * @param point point in global (World) coordinates + */ + static void refreshWorld(const NanoPoint &point) + { + refresh( point - offset ); + } + + /** + * Switches engine canvas to local coordinates system. This method can be useful + * to ease up drawing of some static elements on lcd display. + * @warning do not call twice subsequentally. + */ + static void localCoordinates() + { + canvas.offset -= offset; + } + + /** + * Switches engine canvas to global (World) coordinates system. This method can be useful + * to create screen moving animation. + * @warning do not call twice subsequentally. + */ + static void worldCoordinates() + { + canvas.offset += offset; + } + + /** + * Moves engine coordinate to new position (this sets World coordinates offset). + */ + static void moveTo(const NanoPoint & position) + { + offset = position; + } + + /** + * Moves engine coordinate to new position and mark whole display for refresh + * (this sets World coordinates offset). + */ + static void moveToAndRefresh(const NanoPoint & position) + { + moveTo(position); + refresh(); + } + + /** + * Returns current World offset + */ + const NanoPoint & getPosition() const + { + return offset; + } + + /** + * Sets user-defined draw callback. This callback will be called everytime, engine needs + * to update display content. If callback returns false, engine will not update those area. + * You always have a way to find out, which area is being updated by engine via + * NanoEngine<>::canvas::getOffset() and NanoEngine<>::NE_TILE_SIZE. + * @warning By default canvas in the engine is initialized with local screen coordinates. So + * graphics object with [0,0] coordinates will be placed at topleft position on the + * display. But engine supports also global coordinates, in this case actual object + * position depends on current engine offset. Refer to worldCoordinates() and + * localCoordinates(). + * @param callback - user-defined draw callback. + * @note you can change draw callback anytime you need. + * @see worldCoordinates() + * @see localCoordinates() + */ + static void drawCallback(TNanoEngineOnDraw callback) + { + m_onDraw = callback; + } + + /** + * @brief Returns true if point is inside the rectangle area. + * Returns true if point is inside the rectangle area. + * @param p - point to check + * @param rect - rectangle, describing the region to check with the point + * @returns true if point is inside the rectangle area. + */ + static bool collision(NanoPoint &p, NanoRect &rect) { return rect.collision( p ); } + +protected: + /** + * Contains information on tiles to be updated. + * Elements of array are rows and bits are columns. + */ + static uint16_t m_refreshFlags[NE_MAX_TILES_NUM]; + + /** Callback to call if specific tile needs to be updated */ + static TNanoEngineOnDraw m_onDraw; + + /** + * @brief refreshes content on oled display. + * Refreshes content on oled display. Call it, if you want to update the screen. + * Engine will update only those areas, which are marked by refresh() + * methods. + */ + static void displayBuffer(); + + /** + * @brief prints popup message over display content + * prints popup message over display content + * @param msg - message to display + */ + static void displayPopup(const char *msg); +private: + /** Buffer, used by NanoCanvas */ + static uint8_t m_buffer[W * H * C::BITS_PER_PIXEL / 8]; + + static NanoPoint offset; +}; + +template<class C, lcduint_t W, lcduint_t H, uint8_t B> +uint16_t NanoEngineTiler<C,W,H,B>::m_refreshFlags[NE_MAX_TILES_NUM]; + +template<class C, lcduint_t W, lcduint_t H, uint8_t B> +uint8_t NanoEngineTiler<C,W,H,B>::m_buffer[W * H * C::BITS_PER_PIXEL / 8]; + +template<class C, lcduint_t W, lcduint_t H, uint8_t B> +C NanoEngineTiler<C,W,H,B>::canvas(W, H, m_buffer); + +template<class C, lcduint_t W, lcduint_t H, uint8_t B> +NanoPoint NanoEngineTiler<C,W,H,B>::offset = {0, 0}; + +template<class C, lcduint_t W, lcduint_t H, uint8_t B> +TNanoEngineOnDraw NanoEngineTiler<C,W,H,B>::m_onDraw = nullptr; + +template<class C, lcduint_t W, lcduint_t H, uint8_t B> +void NanoEngineTiler<C,W,H,B>::displayBuffer() +{ + if (!m_onDraw) // If onDraw handler is not set, just output current canvas + { + canvas.blt(); + return; + } + for (lcduint_t y = 0; y < ssd1306_lcd.height; y = y + NE_TILE_HEIGHT) + { + uint16_t flag = m_refreshFlags[y >> NE_TILE_SIZE_BITS]; + m_refreshFlags[y >> NE_TILE_SIZE_BITS] = 0; + for (lcduint_t x = 0; x < ssd1306_lcd.width; x = x + NE_TILE_WIDTH) + { + if (flag & 0x01) + { + canvas.setOffset(x, y); + if (m_onDraw()) + { + canvas.setOffset(x, y); + canvas.blt(); + } + } + flag >>=1; + } + } +} + +template<class C, lcduint_t W, lcduint_t H, uint8_t B> +void NanoEngineTiler<C,W,H,B>::displayPopup(const char *msg) +{ + NanoRect rect = { {8, (ssd1306_lcd.height>>1) - 8}, {ssd1306_lcd.width - 8, (ssd1306_lcd.height>>1) + 8} }; + // TODO: It would be nice to calculate message height + NanoPoint textPos = { (ssd1306_lcd.width - (lcdint_t)strlen(msg)*s_fixedFont.h.width) >> 1, (ssd1306_lcd.height>>1) - 4 }; + refresh(rect); + for (lcduint_t y = 0; y < ssd1306_lcd.height; y = y + NE_TILE_HEIGHT) + { + uint16_t flag = m_refreshFlags[y >> NE_TILE_SIZE_BITS]; + m_refreshFlags[y >> NE_TILE_SIZE_BITS] = 0; + for (lcduint_t x = 0; x < ssd1306_lcd.width; x = x + NE_TILE_WIDTH) + { + if (flag & 0x01) + { + canvas.setOffset(x, y); + if (m_onDraw) m_onDraw(); + canvas.setOffset(x, y); + canvas.setColor(RGB_COLOR8(0,0,0)); + canvas.fillRect(rect); + canvas.setColor(RGB_COLOR8(192,192,192)); + canvas.drawRect(rect); + canvas.printFixed( textPos.x, textPos.y, msg); + + canvas.blt(); + } + flag >>=1; + } + } +} + +/** + * @} + */ + +#endif + diff --git a/lib/libssd1306/src/nano_gfx.cpp b/lib/libssd1306/src/nano_gfx.cpp new file mode 100644 index 0000000..691c515 --- /dev/null +++ b/lib/libssd1306/src/nano_gfx.cpp @@ -0,0 +1,522 @@ +/* + MIT License + + Copyright (c) 2016-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "nano_gfx.h" +#include "ssd1306.h" + +extern const uint8_t *s_font6x8; +extern "C" SFixedFontInfo s_fixedFont; + +#ifdef CONFIG_MULTIPLICATION_NOT_SUPPORTED +#define YADDR(y) (static_cast<uint16_t>((y) >> 3) << m_p) +#define BADDR(b) ((b) << m_p) +#else +#define YADDR(y) (static_cast<uint16_t>((y) >> 3) * m_w) +#define BADDR(b) ((b) * m_w) +#endif + +void NanoCanvas::putPixel(uint8_t x, uint8_t y) +{ + if ((x>=m_w) || (y>=m_h)) return; + if (m_invertByte) + { + m_bytes[YADDR(y) + x] &= ((1 << (y & 0x7))^m_invertByte); + } + else + { + m_bytes[YADDR(y) + x] |= (1 << (y & 0x7)); + } +}; + +void NanoCanvas::drawHLine(uint8_t x1, uint8_t y1, uint8_t x2) +{ + if (y1 >= m_h) return; + if (x2 < x1) x1 = 0; + if (x1 >= m_w) return; + if (x2 >= m_w) x2 = m_w - 1; + for(uint8_t x = x1; x<=x2; x++) + m_bytes[YADDR(y1) + x] |= (1 << (y1 & 0x7)); +}; + +void NanoCanvas::drawVLine(uint8_t x1, uint8_t y1, uint8_t y2) +{ + if (x1 >= m_w) return; + if (y2 < y1) y1 = 0; + if (y1 >= m_h) return; + if (y2 >= m_h) y2 = m_h - 1; + for(uint8_t y = y1; y<=y2; y++) + m_bytes[YADDR(y) + x1] |= (1 << (y & 0x7)); +}; + +void NanoCanvas::drawRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) +{ + drawHLine(x1, y1, x2); + drawHLine(x1, y2, x2); + drawVLine(x1, y1, y2); + drawVLine(x2, y1, y2); +}; + + +void NanoCanvas::fillRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t templ) +{ + templ ^= m_invertByte; + if ((x1 < x2) && (x1 >= m_w)) return; + if ((y1 < y2) && (y1 >= m_h)) return; + if (x1 > x2) x1 = 0; + if (y1 > y2) y1 = 0; + if (x2 >= m_w) x2 = m_w -1; + if (y2 >= m_h) y2 = m_h -1; + uint8_t bank1 = (y1 >> 3); + uint8_t bank2 = (y2 >> 3); + for (uint8_t bank = bank1; bank<=bank2; bank++) + { + uint8_t mask = 0xFF; + if (bank1 == bank2) + { + mask = (mask >> ((y1 & 7) + 7 - (y2 & 7))) << (y1 & 7); + } + else if (bank1 == bank) + { + mask = (mask << (y1 & 7)); + } + else if (bank2 == bank) + { + mask = (mask >> (7 - (y2 & 7))); + } + for (uint8_t x=x1; x<=x2; x++) + { + m_bytes[BADDR(bank) + x] &= ~mask; + m_bytes[BADDR(bank) + x] |= (templ & mask); + } + } +}; + + +void NanoCanvas::clear() +{ + memset(m_bytes, m_invertByte, static_cast<uint16_t>(m_w) * (m_h >> 3)); +} + + +void NanoCanvas::charF6x8(uint8_t x, uint8_t y, const char ch[], EFontStyle style) +{ + uint8_t i, j, topMask, bottomMask; + if (y>=m_h) return; + j = 0; + topMask = (0xFF >> (8 - (y & 0x7))); + bottomMask = (0xFF << (y & 0x7)); + while(ch[j] != '\0') + { + uint8_t c = ch[j] - 32; + uint8_t ldata = 0; + for(i=0;i<6;i++) + { + if (x>=m_w) return; + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&s_font6x8[c*6+i]); + } + else if ( style == STYLE_BOLD ) + { + data = pgm_read_byte(&s_font6x8[c*6+i]); + uint8_t temp = data | ldata; + ldata = data; + data = temp; + } + else + { + data = pgm_read_byte(&s_font6x8[c*6+i + 1]); + uint8_t temp = (data & 0xF0) | ldata; + ldata = (data & 0x0F); + data = temp; + } + m_bytes[YADDR(y) + x] &= topMask; + m_bytes[YADDR(y) + x] |= (data << (y & 0x7)); + if (y+8 < m_h) + { + m_bytes[YADDR(y) + m_w + x] &= bottomMask; + m_bytes[YADDR(y) + m_w + x] |= (data >> (8 - (y & 0x7))); + } + x++; + } + j++; + } +} + +void NanoCanvas::charF12x16(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style) +{ + uint8_t i, j = 0; + uint8_t text_index = 0; + uint8_t odd = 0; + uint8_t x = xpos; + uint8_t topMask, bottomMask; + if ( y >= m_h ) return; + topMask = (0xFF >> (8 - (y & 0x7))); + bottomMask = (0xFF << (y & 0x7)); + for(;;) + { + if( ( x > m_w - 12 ) || ( ch[j] == '\0' ) ) + { + x = xpos; + y += 8; + if (y > (m_h - 8)) + { + break; + } + if (odd) + { + text_index = j; + if (ch[j] == '\0') + { + break; + } + } + else + { + j = text_index; + } + odd = !odd; + } + uint8_t c = ch[j] - 32; + uint8_t ldata = 0; + for( i=0; i<6; i++) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&s_font6x8[c*6+i]); + } + else if ( style == STYLE_BOLD ) + { + data = pgm_read_byte(&s_font6x8[c*6+i]); + uint8_t temp = data | ldata; + ldata = data; + data = temp; + } + else + { + data = pgm_read_byte(&s_font6x8[c*6+i + 1]); + uint8_t temp = (data & 0xF0) | ldata; + ldata = (data & 0x0F); + data = temp; + } + if (odd) data >>= 4; + data = ((data & 0x01) ? 0x03: 0x00) | + ((data & 0x02) ? 0x0C: 0x00) | + ((data & 0x04) ? 0x30: 0x00) | + ((data & 0x08) ? 0xC0: 0x00); + + for (uint8_t n=2; n>0; n--) + { + m_bytes[YADDR(y) + x] &= topMask; + m_bytes[YADDR(y) + x] |= (data << (y & 0x7)); + if (y+8 < m_h) + { + m_bytes[YADDR(y) + m_w + x] &= bottomMask; + m_bytes[YADDR(y) + m_w + x] |= (data >> (8 - (y & 0x7))); + } + x++; + } + } + j++; + } +} + +void NanoCanvas::printFixed(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style) +{ + uint8_t i, j = 0; + uint8_t text_index = 0; + uint8_t page_offset = 0; + uint8_t x = xpos; + uint8_t topMask, bottomMask; + if ( y >= m_h ) return; + topMask = (0xFF >> (8 - (y & 0x7))); + bottomMask = (0xFF << (y & 0x7)); + for(;;) + { + if( ( x > m_w - s_fixedFont.h.width ) || ( ch[j] == '\0' ) ) + { + x = xpos; + y += 8; + if (y > (m_h - 8)) + { + break; + } + page_offset++; + if (page_offset == s_fixedFont.pages) + { + text_index = j; + page_offset = 0; + if (ch[j] == '\0') + { + break; + } + } + else + { + j = text_index; + } + } + uint8_t c = ch[j] - 32; + if ( c > 224 ) + { + c = 0; + } + uint8_t ldata = 0; + uint16_t offset = (c * s_fixedFont.pages + page_offset) * s_fixedFont.h.width; + for( i=0; i<s_fixedFont.h.width; i++) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&s_fixedFont.primary_table[offset]); + } + else if ( style == STYLE_BOLD ) + { + data = pgm_read_byte(&s_fixedFont.primary_table[offset]); + uint8_t temp = data | ldata; + ldata = data; + data = temp; + } + else + { + data = pgm_read_byte(&s_fixedFont.primary_table[offset + 1]); + uint8_t temp = (data & 0xF0) | ldata; + ldata = (data & 0x0F); + data = temp; + } + m_bytes[YADDR(y) + x] &= topMask; + m_bytes[YADDR(y) + x] |= (data << (y & 0x7)); + if (y + 8 < m_h) + { + m_bytes[YADDR(y) + m_w + x] &= bottomMask; + m_bytes[YADDR(y) + m_w + x] |= (data >> (8 - (y & 0x7))); + } + offset++; + x++; + } + j++; + } +} + +void NanoCanvas::printFixed2x(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style) +{ + uint8_t i, j = 0; + uint8_t text_index = 0; + uint8_t page_offset = 0; + uint8_t x = xpos; + uint8_t topMask, bottomMask; + if ( y >= m_h ) return; + topMask = (0xFF >> (8 - (y & 0x7))); + bottomMask = (0xFF << (y & 0x7)); + for(;;) + { + if( ( x > m_w - (s_fixedFont.h.width<<1) ) || ( ch[j] == '\0' ) ) + { + x = xpos; + y += 8; + if (y > (m_h - 8)) + { + break; + } + page_offset++; + if (page_offset == (s_fixedFont.pages<<1)) + { + text_index = j; + page_offset = 0; + if (ch[j] == '\0') + { + break; + } + } + else + { + j = text_index; + } + } + uint8_t c = ch[j] - 32; + if ( c > 224 ) + { + c = 0; + } + uint8_t ldata = 0; + uint16_t offset = (c * s_fixedFont.pages + (page_offset >> 1)) * s_fixedFont.h.width; + for( i=0; i<s_fixedFont.h.width; i++) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&s_fixedFont.primary_table[offset]); + } + else if ( style == STYLE_BOLD ) + { + data = pgm_read_byte(&s_fixedFont.primary_table[offset]); + uint8_t temp = data | ldata; + ldata = data; + data = temp; + } + else + { + data = pgm_read_byte(&s_fixedFont.primary_table[offset + 1]); + uint8_t temp = (data & 0xF0) | ldata; + ldata = (data & 0x0F); + data = temp; + } + if (page_offset & 1) data >>= 4; + data = ((data & 0x01) ? 0x03: 0x00) | + ((data & 0x02) ? 0x0C: 0x00) | + ((data & 0x04) ? 0x30: 0x00) | + ((data & 0x08) ? 0xC0: 0x00); + + for (uint8_t n=2; n>0; n--) + { + m_bytes[YADDR(y) + x] &= topMask; + m_bytes[YADDR(y) + x] |= (data << (y & 0x7)); + if (y+8 < m_h) + { + m_bytes[YADDR(y) + m_w + x] &= bottomMask; + m_bytes[YADDR(y) + m_w + x] |= (data >> (8 - (y & 0x7))); + } + x++; + } + offset++; + } + j++; + } +} + +void NanoCanvas::drawSpritePgm(uint8_t x, uint8_t y, const uint8_t sprite[]) +{ + uint8_t i; + for(i=0;i<8;i++) + { + if (x >= m_w) { x++; continue; } + uint8_t d = pgm_read_byte(&sprite[i]); + if (y < m_h) + m_bytes[YADDR(y) + x] |= (d << (y & 0x7)); + if ((uint8_t)(y + 8) < m_h) + m_bytes[YADDR((uint8_t)(y + 8)) + x] |= (d >> (8 - (y & 0x7))); + x++; + } +}; + + +void NanoCanvas::drawBitmap(uint8_t startX, uint8_t startY, uint8_t w, uint8_t h, const uint8_t *buf) +{ + uint8_t x,y; + for(y=0;y<h;y+=8) + { + for(x=0;x<w;x++) + { + uint8_t scrX = startX + x; + if (scrX >= m_w) continue; + uint8_t d = pgm_read_byte(&buf[x + static_cast<uint16_t>(y>>3) * w]); + uint8_t scrY = y + startY; + scrX = x + startX; + if (scrY < m_h) + m_bytes[YADDR(scrY) + scrX] |= (d << (scrY & 0x7)); + scrY+=8; + if (scrY < m_h) + m_bytes[YADDR(scrY) + scrX] |= (d >> (8 - (scrY & 0x7))); + } + } +} + + +void NanoCanvas::drawSprite(uint8_t x, uint8_t y, const uint8_t sprite[]) +{ + uint8_t i; + for(i=0;i<8;i++) + { + if (x>=m_w) { x++; continue; } + uint8_t d = sprite[i]; + if (uint8_t(y) < m_h) + m_bytes[YADDR(y) + x] |= (d << (y & 0x7)); + if ((uint8_t)(y+8) < m_h) + m_bytes[YADDR((uint8_t)(y + 8)) + x] |= (d >> (8 - (y & 0x7))); + x++; + } +}; + +void NanoCanvas::drawSprite(SPRITE *sprite) +{ + uint8_t i; + for(i = 0; i < sprite->w; i++) + { + if ((sprite->x + i) >= m_w) { continue; } + uint8_t d = pgm_read_byte(&sprite->data[i]); + if (sprite->y < m_h) + m_bytes[YADDR(sprite->y) + sprite->x + i] |= (d << (sprite->y & 0x7)); + if (uint8_t(sprite->y + 8) < m_h) + m_bytes[YADDR(uint8_t(sprite->y + 8)) + sprite->x + i] |= (d >> (8 - (sprite->y & 0x7))); + } +} + +void NanoCanvas::blt(uint8_t x, uint8_t y) +{ + ssd1306_drawBuffer(x, y, m_w, m_h, m_bytes); +} + +void NanoCanvas::invert() +{ + for(uint16_t i=0; i< static_cast<uint16_t>(m_w) * (m_h >> 3); i++) + m_bytes[i] = ~m_bytes[i]; +} + +void NanoCanvas::flipH() +{ + for (uint8_t y=0; y<(m_h>>3); y++) + for (uint8_t x=0; x<m_w>>1; x++) + { + uint8_t temp = m_bytes[YADDR(y) + x]; + m_bytes[YADDR(y) + x] = m_bytes[YADDR(y) + m_w - x -1]; + m_bytes[YADDR(y) + m_w - x -1] = temp; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// SPRITE OBJECT +//////////////////////////////////////////////////////////////////////////////// + +void SPRITE::setPos(uint8_t x, uint8_t y) +{ + this->x = x; + this->y = y; +} + +void SPRITE::draw() +{ + ssd1306_drawSprite(this); +} + +void SPRITE::eraseTrace() +{ + ssd1306_eraseTrace(this); +} + +void SPRITE::erase() +{ + ssd1306_eraseSprite(this); +} diff --git a/lib/libssd1306/src/nano_gfx.h b/lib/libssd1306/src/nano_gfx.h new file mode 100644 index 0000000..750ec6e --- /dev/null +++ b/lib/libssd1306/src/nano_gfx.h @@ -0,0 +1,239 @@ +/* + MIT License + + Copyright (c) 2016-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file nano_gfx.h Drawing in memory buffer + */ + + +#ifndef _NANO_GFX_H_ +#define _NANO_GFX_H_ + +#include "nano_gfx_types.h" +#include "font6x8.h" + +/** + * NanoCanvas represents objects for drawing in memory buffer + * @deprecated Use NanoCanvas1, NanoCanvas8, NanoCanvas16 instead + */ +class NanoCanvas +{ +public: + /** + * Creates new canvas object. + * Width can be of any value. + * Height should be divided by 8. + * Memory buffer must be not less than w * h / 8. + * + * @param w - width + * @param h - height + * @param bytes - pointer to memory buffer to use + */ + NanoCanvas(uint8_t w, uint8_t h, uint8_t *bytes) + { + m_w = w; + m_h = h; + m_p = 3; + m_invertByte = 0; + while (w >> (m_p+1)) { m_p++; }; + m_bytes = bytes; + clear(); + }; + + /** + * Draws pixel on specified position + * @param x - position X + * @param y - position Y + * @deprecated Use putPixel() instead. + */ + inline void drawPixel(uint8_t x, uint8_t y) __attribute__ ((deprecated)) { putPixel(x,y); }; + + /** + * Draws pixel on specified position + * @param x - position X + * @param y - position Y + */ + void putPixel(uint8_t x, uint8_t y); + + /** + * Draws rectangle + * @param x1 - left boundary + * @param y1 - top boundary + * @param x2 - right boundary + * @param y2 - bottom boundary + */ + void drawRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); + + /** + * Draws horizontal line + * @param x1 - left boundary + * @param y1 - position Y + * @param x2 - right boundary + */ + void drawHLine(uint8_t x1, uint8_t y1, uint8_t x2); + + /** + * Draws vertical line + * @param x1 - position X + * @param y1 - top boundary + * @param y2 - bottom boundary + */ + void drawVLine(uint8_t x1, uint8_t y1, uint8_t y2); + + /** + * Draws filled rectangle + * @param x1 - left boundary + * @param y1 - top boundary + * @param x2 - right boundary + * @param y2 - bottom boundary + * @param templ - template to use for filling rectangle + */ + void fillRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t templ); + + /** + * Clears canvas + */ + void clear(); + + /** + * Prints text to canvas buffer + * @param x - start position X + * @param y - start position Y + * @param ch - text to print (null-terminated) + * @param style - font style (EFontStyle), normal by default + * @deprecated use printFixed() instead. + */ + inline void char_f6x8(uint8_t x, uint8_t y, const char ch[], EFontStyle style = STYLE_NORMAL) + __attribute__ ((deprecated)) + { charF6x8(x,y,ch,style); }; + + /** + * Prints text to canvas buffer + * @param x - start position X + * @param y - start position Y + * @param ch - text to print (null-terminated) + * @param style - font style (EFontStyle), normal by default + * @deprecated use printFixed() instead. + */ + void charF6x8(uint8_t x, uint8_t y, const char ch[], EFontStyle style = STYLE_NORMAL); + + /** + * Prints text to canvas buffer using double size font 12x16 + * @param x - start position X + * @param y - start position Y + * @param ch - text to print (null-terminated) + * @param style - font style (EFontStyle), normal by default + */ + void charF12x16(uint8_t x, uint8_t y, const char ch[], EFontStyle style = STYLE_NORMAL); + + /** + * Prints text to canvas buffer using fixed font. + * @param xpos - start position X + * @param y - start position Y + * @param ch - text to print (null-terminated) + * @param style - font style (EFontStyle), normal by default + * @see ssd1306_setFixedFont(). + */ + void printFixed(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style = STYLE_NORMAL); + + /** + * Prints text to canvas buffer using fixed font double size. + * @param xpos - start position X + * @param y - start position Y + * @param ch - text to print (null-terminated) + * @param style - font style (EFontStyle), normal by default + * @see ssd1306_setFixedFont(). + */ + void printFixed2x(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style = STYLE_NORMAL); + + /** + * Sprite is small image 8x8, sprite doesn't change background + * Reads sprite from Flash memory + */ + void drawSpritePgm(uint8_t x, uint8_t y, const uint8_t sprite[]); + + /** + * Draw bitmap to the buffer from SRAM. + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels (must be divided by 8) + * @param buf - pointer to data, located in Flash: each byte represents 8 vertical pixels. + */ + void drawBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf); + + /** + * Sprite is small image 8x8, sprite doesn't change background + * Reads sprite from SRAM memory + */ + void drawSprite(uint8_t x, uint8_t y, const uint8_t sprite[]); + + /** + * Draws sprite in the buffer + * @param sprite - pointer to SPRITE structure containing sprite information + */ + void drawSprite(SPRITE *sprite); + + /** + * Returns canvas width + */ + inline uint8_t width() const { return m_w; }; + + /** + * Returns canvas height + */ + inline uint8_t height() const { return m_h; }; + + /** + * Returns canvas buffer + */ + inline uint8_t *buffer() const { return m_bytes; }; + + /** + * Inverts content in the buffer. + * white becomes black and wise versa. + */ + void invert(); + + /** + * Flips image horizontally. + */ + void flipH(); + + /** + * Draws canvas on the LCD display + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + */ + void blt(uint8_t x, uint8_t y); + +private: + uint8_t m_w; + uint8_t m_p; + uint8_t m_h; + uint8_t m_invertByte; + uint8_t *m_bytes; +}; + +#endif + diff --git a/lib/libssd1306/src/nano_gfx_types.h b/lib/libssd1306/src/nano_gfx_types.h new file mode 100644 index 0000000..2348401 --- /dev/null +++ b/lib/libssd1306/src/nano_gfx_types.h @@ -0,0 +1,261 @@ +/* + MIT License + + Copyright (c) 2017-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file nano_gfx_types.h Basic structures of nano gfx library + */ + +#ifndef _NANO_GFX_TYPES_H_ +#define _NANO_GFX_TYPES_H_ + +#include "ssd1306_hal/io.h" + +#ifndef min +/** Macros returning minimum of 2 numbers */ +#define min(a,b) ((a)<(b)?(a):(b)) +#endif + +#ifndef max +/** Macros returning maximum of 2 numbers */ +#define max(a,b) ((a)>(b)?(a):(b)) +#endif + +/** Macro to generate 8-bit color for SSD1331 OLED display */ +#define RGB_COLOR8(r,g,b) ( (r & 0xE0) | ((g >> 3)&0x1C) | (b>>6) ) + +/** Macro to generate 16-bit color for SSD1351 OLED display */ +#define RGB_COLOR16(r,g,b) ( ((r<<8) & 0xF800) | ((g << 3)&0x07E0) | (b>>3) ) + +/** Macro to convert 3-3-2 color to 5-6-5 color */ +#define RGB8_TO_RGB16(c) ( (((uint16_t)c & 0b11100000) << 8) | \ + (((uint16_t)c & 0b00011100) << 6) | \ + (((uint16_t)c & 0b00000011) << 3) ) + +/** Macro to convert 8-bit RGB to 4-bit monochrome format */ +#define RGB8_TO_GRAY4(rgb) ( (rgb >> 6) + ((rgb >> 2) & 0x07) + (rgb & 0x03) ) + +/** Macro to generate 4-bit monochrome color from gray component */ +#define GRAY_COLOR4(gray) ( ((gray >> 4) & 0x0F) | (gray & 0xF0) ) + +/** Macro to convert 5-6-5 color to 3-3-2 color */ +#define RGB16_TO_RGB8(c) ( ((uint16_t)(c >> 8) & 0b11100000) | \ + ((uint16_t)(c >> 6) & 0b00011100) | \ + ((uint16_t)(c >> 3) & 0b00000011) ) + +/** Pointer type to LCD display initialization function */ +typedef void (*InitFunction)(void); + +/** Supported font styles */ +typedef enum +{ + STYLE_NORMAL, + STYLE_BOLD, + STYLE_ITALIC, +} EFontStyle; + +/** Supported scale font values */ +typedef enum +{ + FONT_SIZE_NORMAL = 0, + FONT_SIZE_2X = 1, + FONT_SIZE_4X = 2, + FONT_SIZE_8X = 3, +} EFontSize; + +#pragma pack(push, 1) +/** Structure describes font format in memory */ +typedef struct +{ + uint8_t type; ///< font type: 0 - Fixed Font + uint8_t width; ///< width in pixels + uint8_t height; ///< height in pixels + uint8_t ascii_offset; ///< ascii offset +} SFontHeaderRecord; + +/** Structure describes unicode block in font data */ +typedef struct +{ + uint16_t start_code; ///< unicode start code + uint8_t count; ///< count of unicode chars in block +} SUnicodeBlockRecord; + +#pragma pack(pop) + +/** Structure is used for internal font presentation */ +typedef struct +{ + SFontHeaderRecord h; ///< record, containing information on font + uint8_t count; ///< count of characters + uint8_t pages; ///< height in pages (each page height is 8-pixels) + uint8_t glyph_size; ///< glyph size in bytes + const uint8_t *primary_table; ///< font chars bits +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + const uint8_t *secondary_table; ///< font chars bits +#endif +} SFixedFontInfo; + +/** Structure describes single char information */ +typedef struct +{ + uint8_t width; ///< char width in pixels + uint8_t height; ///< char height in pixels + uint8_t spacing; ///< additional spaces after char in pixels + const uint8_t *glyph; ///< char data, located in progmem. +} SCharInfo; + +/** + * Rectangle region. not used now + */ +typedef struct +{ + /// left + uint8_t left; + /// top + uint8_t top; + /// right + uint8_t right; + /// bottom + uint8_t bottom; +} SSD1306_RECT; + + +/** + * SPRITE structure represents logical graphics object + * @deprecated Use NanoSprite or NanoFixedSprite instead. + */ +typedef struct SPRITE +{ + /// draw position X on the screen + uint8_t x; + /// draw position Y on the screen + uint8_t y; + /// sprite width + uint8_t w; + /// last draw position X on the screen + uint8_t lx; + /// last draw position Y on the screen + uint8_t ly; + /// Pointer to PROGMEM data, representing sprite image + const uint8_t * data; + /// Pointer to PROGMEM data, representing sprite transparencyMask (can be nullptr) + const uint8_t * transparentMask; + +#ifdef __cplusplus + /** + * Updates active position of the sprite (doesn't redraw it) + * @param x - horizontal position + * @param y - vertical position + */ + void setPos(uint8_t x, uint8_t y); + + /** + * Draws sprite on the display. Position can be changed by + * updating x and y fields of SPRITE structure. + */ + void draw(); + + /** + * Clears some sprite parts in old position on the display. + */ + void eraseTrace(); + + /** + * Clears sprite from the display leaving black rectangle. + */ + void erase(); + + /** + * Returns true if sprite is moved not far from previous position, + * and old and new rects have intersection. + */ + inline bool isNearMove() const + { + /* We emulate abs function for unsigned vars here */ + return (((uint8_t)(x-lx)<w) || ((uint8_t)(lx-x)<w)) && + (((uint8_t)(y-ly)<8) || ((uint8_t)(ly-y)<8)); + }; + + /** + * Returns area in 8-pixel blocks, which is used by the sprite. + * + * For example, if sprite pixels coordinates are 10,18 and size is 8x8, + * the rect will be (left:1,top:2,right:2,bottom:3). + * if sprite pixels coordinates are 32,16 and size is 8x8, + * the rect will be (left:4,top:2,right:4,bottom:2). + */ + inline SSD1306_RECT getRect() const + { + uint8_t right = ((x + w - 1)>>3); + uint8_t bottom = ((y + 7)>>3); + uint8_t left = x>>3; left = left < right ? left: 0; + uint8_t top = y>>3; top = top < bottom ? top: 0; + return (SSD1306_RECT){ left, top, right, bottom }; + }; + + /** + * Returns area in 8-pixel blocks, which was used by the sprite last time + * For example, if sprite pixels coordinates are 10,18 and size is 8x8, + * the rect will be (left:1,top:2,right:2,bottom:3). + * if sprite pixels coordinates are 32,16 and size is 8x8, + * the rect will be (left:4,top:2,right:4,bottom:2). + */ + inline SSD1306_RECT getLRect() const + { + uint8_t left = lx; + uint8_t top = ly; + uint8_t right = (uint8_t)(lx + w - 1); + uint8_t bottom = (uint8_t)(ly + 7); + left = left < right ? left: 0; + top = top < bottom ? top: 0; + return (SSD1306_RECT){ left, top, right, bottom }; + }; + + /** + * Returns area in 8-pixel blocks, which includes old and new position + * For example, if sprite pixels coordinates are 12,18 and size is 8x8, + * and sprite is moved to the right by 6 pixels, the rect will be + * (left:1,top:2,right:3,bottom:3). + */ + inline SSD1306_RECT getUpdateRect() const + { + uint8_t left = min(x,lx); + uint8_t top = min(y,ly); + uint8_t right = max((uint8_t)(x + w - 1), (uint8_t)(lx + w - 1)); + if (((uint8_t)(lx + w - 1) < w) && (right > 2*w)) + { + right = (uint8_t)(lx + w - 1); + } + uint8_t bottom = max((uint8_t)(y + 7), (uint8_t)(ly + 7)); + if (((uint8_t)(ly + 7) < 8) && (bottom > 16)) + { + bottom = (uint8_t)(ly + 7); + } + if ( left > right ) left = 0; + if ( top > bottom ) top = 0; + return (SSD1306_RECT){ left, top, right, bottom }; + }; +#endif +} SPRITE; + +// ---------------------------------------------------------------------------- +#endif // _NANO_GFX_TYPES_H_ diff --git a/lib/libssd1306/src/sprite_pool.cpp b/lib/libssd1306/src/sprite_pool.cpp new file mode 100644 index 0000000..1a3ff91 --- /dev/null +++ b/lib/libssd1306/src/sprite_pool.cpp @@ -0,0 +1,132 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "sprite_pool.h" +#include "ssd1306.h" + + +SpritePool::SpritePool( ) + : m_canvas( 8, 8, m_canvasBuf) + , m_canvasBuf{0} + , m_sprites{0} + , m_count( 0 ) +{ + m_rect.left = 0; + m_rect.top = 0; + m_rect.right = (ssd1306_displayWidth() >> 3) - 1; + m_rect.bottom = (ssd1306_displayHeight() >> 3) - 1; +}; + +void SpritePool::drawBlock(uint8_t blockColumn, uint8_t blockRow) +{ + m_canvas.clear(); +}; + +void SpritePool::drawSprites() +{ + for (uint8_t i = 0; i < m_count; i++) + { + SPRITE * sprite = m_sprites[i]; + if ( sprite->isNearMove( ) ) + { + updateRegion(sprite->getUpdateRect()); + } + else + { + updateRegion(sprite->getRect()); + updateRegion(sprite->getLRect()); + } + sprite->lx = sprite->x; + sprite->ly = sprite->y; + } +} + +void SpritePool::refreshScreen() +{ + updateRegion( (SSD1306_RECT){ (uint8_t)(m_rect.left<<3), + (uint8_t)(m_rect.top<<3), + (uint8_t)(m_rect.right<<3), + (uint8_t)(m_rect.bottom<<3) } ); +} + +uint8_t SpritePool::add( SPRITE &sprite ) +{ + uint8_t index = m_count; + if (index >= MAX_SPRITES) + { + return SpritePool::SP_ERR_NO_SPACE; + } + m_sprites[index] = &sprite; + m_count++; + return index; +}; + +void SpritePool::clear() +{ + m_count = 0; +}; + +void SpritePool::remove( SPRITE &sprite ) +{ + updateRegion( sprite.getLRect() ); + for (uint8_t i=0; i<m_count; i++) + { + if (m_sprites[i] == &sprite) + { + m_count--; + for (uint8_t j=i; j<m_count; j++) + { + m_sprites[j] = m_sprites[j+1]; + } + break; + } + } +} + + +void SpritePool::updateRegion(SSD1306_RECT ur) +{ + ur.left >>= 3; + ur.top >>= 3; + ur.right >>= 3; + ur.bottom >>= 3; + ur.left = max(ur.left, m_rect.left); + ur.top = max(ur.top, m_rect.top); + ur.right = min(ur.right, m_rect.right); + ur.bottom = min(ur.bottom, m_rect.bottom); + for(uint8_t x = ur.left; x <= ur.right; x++) + { + for(uint8_t y = ur.top; y <= ur.bottom; y++) + { + drawBlock(x,y); + for (uint8_t i = 0; i < m_count; i++) + { + m_canvas.drawSpritePgm(m_sprites[i]->x - (x << 3), + m_sprites[i]->y - (y << 3), + m_sprites[i]->data ); + } + m_canvas.blt( x << 3, y ); + } + } +} diff --git a/lib/libssd1306/src/sprite_pool.h b/lib/libssd1306/src/sprite_pool.h new file mode 100644 index 0000000..126ea78 --- /dev/null +++ b/lib/libssd1306/src/sprite_pool.h @@ -0,0 +1,131 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file sprite_pool.h Controlling sprites on the display + */ + + +#ifndef _SPRITE_POOL_H_ +#define _SPRITE_POOL_H_ + +#include "nano_gfx.h" + +/** + * Sprites pool class automates processing of several sprites. + * It remembers pointers to SPRITE objects, and carefully + * updates only the areas, touched by the sprites. So, it + * reduces number of i2c calls to SSD1306 display. + * @warning this class is deprecated and not supported anymore. + * @deprecated use NanoEngine, NanoSprite objects. + */ +class SpritePool +{ +public: + /// No free space for new sprite error + static const uint8_t SP_ERR_NO_SPACE = 0xFF; + +#if defined(ESP32) || defined(ESP8266) + /// Defines max sprites number supported by SpritePool + static const uint8_t MAX_SPRITES = 32; +#else + /// Defines max sprites number supported by SpritePool + static const uint8_t MAX_SPRITES = 10; +#endif + + /** + * Creates empty SpritePool object. + * It is able to hold up to 10 sprites on AVR + * platforms and up to 32 sprites on ESP platforms. + */ + SpritePool( ); + + /** + * Draw all areas, touched by the sprites. + * To remove flickering, the method uses NanoCanvas + * capabilities. + */ + void drawSprites(); + + /** + * Redraws whole area, used by the sprites. + */ + void refreshScreen(); + + /** + * Adds SPRITE object to the internal list of SpritePool + * @param sprite - reference to SPRITE object + * @return index of added object or SP_ERR_NO_SPACE in case of error. + */ + uint8_t add( SPRITE &sprite ); + + /** + * Removes all SPRITE objects from internal list of SpritePool. + */ + void clear(); + + /** + * Removes specific SPRITE object from the SpritePool. + */ + void remove( SPRITE &sprite ); + + /** + * Sets active paint area region in blocks (pixels / 8) + * @param rect - region in blocks (pixels / 8) + */ + void setRect(SSD1306_RECT rect) { m_rect = rect; }; + +protected: + /// Canvas used to draw sprites to avoid flickering. + NanoCanvas m_canvas; + + /// Rectangle, which specifies part of the display, used by the sprites + SSD1306_RECT m_rect; + + /** + * This method is call every time 8x8 pixels block is needed to be drawn. + * Use m_canvas field variable, which represents block to update. + * For example, you can draw any 8x8 image, starting at 0,0 position in m_canvas. + * + * @param blockColumn - column of the block to redraw + * @param blockRow - row of the block to redraw + * @note 128x64 display has 16 columns and 8 rows. + */ + virtual void drawBlock(uint8_t blockColumn, uint8_t blockRow); + +private: + + /// Internal buffer for Canvas + uint8_t m_canvasBuf[8*8/8]; + + /// Sprites container + SPRITE *m_sprites[MAX_SPRITES]; + + /// Count of registered sprites + uint8_t m_count; + + void updateRegion(SSD1306_RECT ur); +}; + +#endif + diff --git a/lib/libssd1306/src/ssd1306.h b/lib/libssd1306/src/ssd1306.h new file mode 100644 index 0000000..3199f5a --- /dev/null +++ b/lib/libssd1306/src/ssd1306.h @@ -0,0 +1,72 @@ +/* + MIT License + + Copyright (c) 2016-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306.h SSD1306 basic draw functions + */ + +#ifndef _SSD1306_H_ +#define _SSD1306_H_ + +#include "nano_gfx_types.h" +#include "ssd1306_generic.h" +#include "ssd1306_1bit.h" +#include "ssd1306_8bit.h" +#include "ssd1306_16bit.h" +#include "ssd1306_fonts.h" + +#include "lcd/lcd_common.h" +#include "lcd/oled_ssd1306.h" +#include "lcd/oled_ssd1325.h" +#include "lcd/oled_ssd1327.h" +#include "lcd/oled_ssd1331.h" +#include "lcd/oled_ssd1351.h" +#include "lcd/oled_sh1106.h" +#include "lcd/lcd_pcd8544.h" +#include "lcd/lcd_il9163.h" +#include "lcd/lcd_ili9341.h" +#include "lcd/composite_video.h" + +#include "lcd/oled_template.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup LCD_INTERFACE_API + * Returns display height in pixels + */ +lcduint_t ssd1306_displayHeight(void); + +/** + * @ingroup LCD_INTERFACE_API + * Returns display width in pixels + */ +lcduint_t ssd1306_displayWidth(void); + +#ifdef __cplusplus +} +#endif + +#endif // _SSD1306_H_ diff --git a/lib/libssd1306/src/ssd1306_16bit.c b/lib/libssd1306/src/ssd1306_16bit.c new file mode 100644 index 0000000..a1f4738 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_16bit.c @@ -0,0 +1,366 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_16bit.h" +#include "ssd1306_generic.h" +#include "intf/ssd1306_interface.h" +#include "lcd/lcd_common.h" +#include "ssd1306_hal/io.h" + +extern uint16_t ssd1306_color; +extern uint8_t s_ssd1306_invertByte; +extern lcduint_t ssd1306_cursorX; +extern lcduint_t ssd1306_cursorY; +extern SFixedFontInfo s_fixedFont; +#ifdef CONFIG_SSD1306_UNICODE_ENABLE +extern uint8_t g_ssd1306_unicode; +#endif + +void ssd1306_setRgbColor16(uint8_t r, uint8_t g, uint8_t b) +{ + ssd1306_color = RGB_COLOR16(r,g,b); +} + +static void ssd1306_drawBufferPitch16(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, lcduint_t pitch, const uint8_t *data) +{ + ssd1306_lcd.set_block(x, y, w); + while (h--) + { + lcduint_t line = w << 1; + while (line--) + { + ssd1306_intf.send( *data ); + data++; + } + data += pitch - (w << 1); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawBufferFast16(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *data) +{ + ssd1306_drawBufferPitch16(x, y, w, h, w<<1, data); +} + +void ssd1306_drawBufferEx16(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, lcduint_t pitch, const uint8_t *data) +{ + ssd1306_drawBufferPitch16( x, y, w, h, pitch, data ); +} + +// IMPORTANT: ALL 16-BIT OLED DISPLAYS ALSO SUPPORT 8-BIT DIRECT DRAW FUNCTIONS +// REFER TO ssd1306_8bit.c + +void ssd1306_drawMonoBuffer16(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + uint8_t bit = 1; + uint16_t blackColor = s_ssd1306_invertByte ? ssd1306_color : 0x00; + uint16_t color = s_ssd1306_invertByte ? 0x00 : ssd1306_color; + ssd1306_lcd.set_block(xpos, ypos, w); + while (h--) + { + lcduint_t wx = w; + while (wx--) + { + uint8_t data = *bitmap; + if ( data & bit ) + ssd1306_lcd.send_pixels16( color ); + else + ssd1306_lcd.send_pixels16( blackColor ); + bitmap++; + } + bit <<= 1; + if (bit == 0) + { + bit = 1; + } + else + { + bitmap -= w; + } + } + ssd1306_intf.stop(); +} + +void ssd1306_fillScreen16(uint16_t fill_Data) +{ + ssd1306_lcd.set_block(0, 0, 0); + uint32_t count = (uint32_t)ssd1306_lcd.width * (uint32_t)ssd1306_lcd.height; + while (count--) + { + ssd1306_lcd.send_pixels16( fill_Data ); + } + ssd1306_intf.stop(); +} + +void ssd1306_clearScreen16(void) +{ + ssd1306_fillScreen16( 0x0000 ); +} + +void ssd1306_putPixel16(lcdint_t x, lcdint_t y) +{ + ssd1306_lcd.set_block(x, y, 0); + ssd1306_lcd.send_pixels16( ssd1306_color ); + ssd1306_intf.stop(); +} + +void ssd1306_putColorPixel16(lcdint_t x, lcdint_t y, uint16_t color) +{ + ssd1306_lcd.set_block(x, y, 0); + ssd1306_lcd.send_pixels16( color ); + ssd1306_intf.stop(); +} + +void ssd1306_drawVLine16(lcdint_t x1, lcdint_t y1, lcdint_t y2) +{ + ssd1306_lcd.set_block(x1, y1, 1); + while (y1<=y2) + { + ssd1306_lcd.send_pixels16( ssd1306_color ); + y1++; + } + ssd1306_intf.stop(); +} + +void ssd1306_drawHLine16(lcdint_t x1, lcdint_t y1, lcdint_t x2) +{ + ssd1306_lcd.set_block(x1, y1, 0); + while (x1 < x2) + { + ssd1306_lcd.send_pixels16( ssd1306_color ); + x1++; + } + ssd1306_intf.stop(); +} + +void ssd1306_drawLine16(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + lcduint_t dx = x1 > x2 ? (x1 - x2): (x2 - x1); + lcduint_t dy = y1 > y2 ? (y1 - y2): (y2 - y1); + lcduint_t err = 0; + if (dy > dx) + { + if (y1 > y2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + ssd1306_swap_data(y1, y2, lcdint_t); + } + for(; y1<=y2; y1++) + { + err += dx; + if (err >= dy) + { + err -= dy; + x1 < x2 ? x1++: x1--; + } + ssd1306_putPixel16( x1, y1 ); + } + } + else + { + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + ssd1306_swap_data(y1, y2, lcdint_t); + } + for(; x1<=x2; x1++) + { + err += dy; + if (err >= dx) + { + err -= dx; + if (y1 < y2) y1++; else y1--; + } + ssd1306_putPixel16( x1, y1 ); + } + } +} + +void ssd1306_drawRect16(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + ssd1306_drawHLine16(x1,y1,x2); + ssd1306_drawHLine16(x1,y2,x2); + ssd1306_drawVLine16(x1,y1,y2); + ssd1306_drawVLine16(x2,y1,y2); +} + +void ssd1306_fillRect16(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + if (y1 > y2) + { + ssd1306_swap_data(y1, y2, lcdint_t); + } + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + } + ssd1306_lcd.set_block(x1, y1, x2 - x1 + 1); + uint16_t count = (x2 - x1 + 1) * (y2 - y1 + 1); + while (count--) + { + ssd1306_lcd.send_pixels16( ssd1306_color ); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawMonoBitmap16(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + uint8_t bit = 1; + uint16_t blackColor = s_ssd1306_invertByte ? ssd1306_color : 0x00; + uint16_t color = s_ssd1306_invertByte ? 0x00 : ssd1306_color; + ssd1306_lcd.set_block(xpos, ypos, w); + while (h--) + { + lcduint_t wx = w; + while ( wx-- ) + { + uint8_t data = pgm_read_byte( bitmap ); + if ( data & bit ) + ssd1306_lcd.send_pixels16( color ); + else + ssd1306_lcd.send_pixels16( blackColor ); + bitmap++; + } + bit <<= 1; + if ( bit == 0 ) + { + bit = 1; + } + else + { + bitmap -= w; + } + } + ssd1306_intf.stop(); +} + +void ssd1306_drawBitmap16(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + ssd1306_lcd.set_block(xpos, ypos, w); + uint32_t count = (w) * (h); + while (count--) + { + ssd1306_lcd.send_pixels16( (pgm_read_byte( &bitmap[0] ) << 8) | pgm_read_byte( &bitmap[1] ) ); + bitmap += 2; + } + ssd1306_intf.stop(); +} + +void ssd1306_clearBlock16(uint8_t x, uint8_t y, uint8_t w, uint8_t h) +{ + ssd1306_lcd.set_block(x, y, w); + uint32_t count = w * h; + while (count--) + { + ssd1306_lcd.send_pixels16( 0x0000 ); + } + ssd1306_intf.stop(); +} + +void ssd1306_setCursor16(lcduint_t x, lcduint_t y) +{ + ssd1306_cursorX = x; + ssd1306_cursorY = y; +} + +void ssd1306_printChar16(uint8_t c) +{ + uint16_t unicode = ssd1306_unicode16FromUtf8(c); + if (unicode == SSD1306_MORE_CHARS_REQUIRED) return; + SCharInfo char_info; + ssd1306_getCharBitmap(unicode, &char_info); + ssd1306_drawMonoBitmap16(ssd1306_cursorX, + ssd1306_cursorY, + char_info.width, + char_info.height, + char_info.glyph ); +} + +size_t ssd1306_write16(uint8_t ch) +{ + if (ch == '\r') + { + ssd1306_cursorX = 0; + return 0; + } + SCharInfo char_info; + uint8_t gotoNewLine = 1; + if (ch != '\n') + { + uint16_t unicode = ssd1306_unicode16FromUtf8(ch); + if (unicode == SSD1306_MORE_CHARS_REQUIRED) return 0; + ssd1306_getCharBitmap(unicode, &char_info); + gotoNewLine = (ssd1306_cursorX > (ssd1306_lcd.width - char_info.width)); + } + if ( gotoNewLine ) + { + ssd1306_cursorX = 0; + ssd1306_cursorY += s_fixedFont.h.height; + if ( ssd1306_cursorY > ssd1306_lcd.height - s_fixedFont.h.height ) + { + ssd1306_cursorY = 0; + } + ssd1306_clearBlock16(0, ssd1306_cursorY, ssd1306_lcd.width, s_fixedFont.h.height); + if (ch == '\n') + { + return 0; + } + } + if ( 1 ) + { + uint16_t color = ssd1306_color; + ssd1306_color = s_ssd1306_invertByte ? color : 0x0000; + ssd1306_fillRect16( ssd1306_cursorX, ssd1306_cursorY, + ssd1306_cursorX + char_info.width + char_info.spacing - 1, + ssd1306_cursorY + s_fixedFont.h.height - 1 ); + ssd1306_color = color; + } + ssd1306_drawMonoBitmap16( ssd1306_cursorX, + ssd1306_cursorY, + char_info.width, + char_info.height, + char_info.glyph); + ssd1306_cursorX += char_info.width + char_info.spacing; + return 1; +} + +size_t ssd1306_print16(const char ch[]) +{ + size_t n = 0; + while (*ch) + { + n += ssd1306_write16(*ch); + ch++; + } + return n; +} + +uint8_t ssd1306_printFixed16(lcdint_t x, lcdint_t y, const char *ch, EFontStyle style) +{ + ssd1306_cursorX = x; + ssd1306_cursorY = y; + return ssd1306_print16(ch); +} + + diff --git a/lib/libssd1306/src/ssd1306_16bit.h b/lib/libssd1306/src/ssd1306_16bit.h new file mode 100644 index 0000000..f3811f6 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_16bit.h @@ -0,0 +1,303 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_16bit.h 16-bit specific draw functions + */ + +#ifndef _SSD1306_16BIT_H_ +#define _SSD1306_16BIT_H_ + +#include "nano_gfx_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////// +// DIRECT GRAPH FUNCTIONS +/////////////////////////////////////////////////////////////////////// + +/** + * @defgroup LCD_16BIT_GRAPHICS DIRECT DRAW: 16-bit API functions only for color displays + * @{ + * + * @brief LCD direct draw functions only for color display. + * + * @details LCD direct draw functions are applicable for color display types. These functions will NOT work + * in ssd1306 compatible mode. Use ssd1306_setMode() function to change display mode to NORMAL. + * You can combine combine NanoEngine capabilities with these functions. + * Direct draw functions draw directly in GDRAM and do not use any double-buffering. + */ + +/** + * @brief Sets default color. + * + * Sets default color for monochrome operations. + * This function supports only 16-bit RGB mode. + * To work with RGB colors in 8-bit mode, please refer to ssd1306_setRgbColor8() function + * and RGB_COLOR8 macros. + * @param r - red in 0-255 range. + * @param g - green in 0-255 range. + * @param b - blue in 0-255 range. + */ +void ssd1306_setRgbColor16(uint8_t r, uint8_t g, uint8_t b); + +/** + * Draws 16-bit bitmap, located in SRAM, on the display + * Each byte represents separate pixel: refer to RGB_COLOR16 to understand RGB scheme, being used. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels + * @param data - pointer to data, located in SRAM. + */ +void ssd1306_drawBufferFast16(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *data); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +static inline void ssd1331_drawBufferFast16(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *data) +{ + ssd1306_drawBufferFast16(x, y, w, h, data); +} +#endif + +/** + * Draws 16-bit bitmap, located in SRAM, on the display, taking into account pitch parameter. + * Each byte represents separate pixel: refer to RGB_COLOR16 to understand RGB scheme, being used. + * pitch parameter specifies, length of single line in bytes. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels + * @param pitch length of bitmap buffer line in bytes + * @param data - pointer to data, located in SRAM. + */ +void ssd1306_drawBufferEx16(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, lcduint_t pitch, const uint8_t *data); + +/** + * Draws 1-bit bitmap, located in SRAM, on the display + * Each bit represents separate pixel: refer to ssd1306 datasheet for more information. + * + * @param xpos horizontal position in pixels + * @param ypos vertical position in pixels + * @param w width of bitmap in pixels + * @param h height of bitmap in pixels + * @param bitmap pointer to data, located in SRAM. + */ +void ssd1306_drawMonoBuffer16(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + +/** + * Fills screen with pattern byte + * + * @param fill_Data pattern color to fill screen with + */ +void ssd1306_fillScreen16(uint16_t fill_Data); + +/** + * Fills screen with zero-byte + */ +void ssd1306_clearScreen16(void); + +/** + * Puts single color point directly in OLED display GDRAM. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_putPixel16(lcdint_t x, lcdint_t y); + +/** + * Puts single color point directly in OLED display GDRAM. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param color color in 16-bit format: 5-6-5 + */ +void ssd1306_putColorPixel16(lcdint_t x, lcdint_t y, uint16_t color); + +/** + * Draw vertical line directly in OLED display GDRAM. + * + * @param x1 - horizontal position in pixels + * @param y1 - top vertical position in pixels + * @param y2 - bottom vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawVLine16(lcdint_t x1, lcdint_t y1, lcdint_t y2); + +/** + * Draw horizontal line directly in OLED display GDRAM. + * + * @param x1 - left position in pixels + * @param y1 - vertical vertical position in pixels + * @param x2 - right position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawHLine16(lcdint_t x1, lcdint_t y1, lcdint_t x2); + +/** + * Draw line directly in OLED display GDRAM. + * This is software implementation. Some OLED controllers have hardware implementation. + * Refer to datasheet. + * + * @param x1 - start horizontal position in pixels + * @param y1 - start vertical position in pixels + * @param x2 - end horizontal position in pixels + * @param y2 - end vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawLine16(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + +/** + * Draw rectangle directly in OLED display GDRAM. + * This is software implementation. Some OLED controllers have hardware implementation. + * Refer to datasheet. + * + * @param x1 - start horizontal position in pixels + * @param y1 - start vertical position in pixels + * @param x2 - end horizontal position in pixels + * @param y2 - end vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawRect16(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + +/** + * Fill rectangle directly in OLED display GDRAM. + * This is software implementation. Some OLED controllers have hardware implementation. + * Refer to datasheet. + * + * @param x1 - start horizontal position in pixels + * @param y1 - start vertical position in pixels + * @param x2 - end horizontal position in pixels + * @param y2 - end vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_fillRect16(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + +/** + * Draw monochrome bitmap, located in Flash, directly to OLED display GDRAM. + * The bitmap should be in ssd1306 format (each byte represents 8 vertical pixels) + * + * @param xpos start horizontal position in pixels + * @param ypos start vertical position in pixels + * @param w bitmap width in pixels + * @param h bitmap height in pixels + * @param bitmap pointer to Flash data, containing monochrome bitmap. + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawMonoBitmap16(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + +/** + * Draw 16-bit color bitmap, located in Flash, directly to OLED display GDRAM. + * Each pixel of the bitmap is expected in 5-6-5 format. + * + * @param xpos start horizontal position in pixels + * @param ypos start vertical position in pixels + * @param w bitmap width in pixels + * @param h bitmap height in pixels + * @param bitmap pointer to Flash data, containing 16-bit color bitmap. + */ +void ssd1306_drawBitmap16(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + +/** + * Clears block, filling it with black pixels, directly in OLED display GDRAM. + * + * @param x start horizontal position in pixels + * @param y start vertical position in pixels + * @param w block width in pixels + * @param h block height in pixels + */ +void ssd1306_clearBlock16(uint8_t x, uint8_t y, uint8_t w, uint8_t h); + +/** + * Set cursor position for text functions + * + * @param x horizontal position in pixels. + * @param y vertical position in pixels. + */ +void ssd1306_setCursor16(lcduint_t x, lcduint_t y); + +/** + * Draws single character to canvas. Cursor position is defined + * by ssd1306_setCursor16(). Do not changes cursor position + * + * @param c - character code to print + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_printChar16(uint8_t c); + +/** + * @brief Prints single character to display at current cursor position + * + * Prints single character to display at current cursor position. + * Cursor position can be set by ssd1306_setCursor16(). + * + * @param ch - character to print to the display. 'LF' and 'CR' are skipped + * @return returns number of printed characters. + */ +size_t ssd1306_write16(uint8_t ch); + +/** + * @brief Prints null-terminated string to display at current cursor position + * + * Prints null-terminated string to display at current cursor position + * Cursor position can be set by ssd1306_setCursor16(). + * + * @param ch - string to print to the display. 'LF' and 'CR' are skipped + * @return returns number of printed characters. + */ +size_t ssd1306_print16(const char ch[]); + +/** + * Prints text to screen using fixed font. + * @param x horizontal position in pixels + * @param y vertical position in pixels + * @param ch NULL-terminated string to print + * @param style font style (EFontStyle), normal by default (not implemented). + * @returns number of chars in string + * + * @see ssd1306_setFixedFont + * @note set color with ssd1306_setColor() function. + */ +uint8_t ssd1306_printFixed16(lcdint_t x, lcdint_t y, const char *ch, EFontStyle style); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif // _SSD1306_16BIT_H_ diff --git a/lib/libssd1306/src/ssd1306_1bit.c b/lib/libssd1306/src/ssd1306_1bit.c new file mode 100644 index 0000000..9c8d4c5 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_1bit.c @@ -0,0 +1,1098 @@ +/* + MIT License + + Copyright (c) 2016-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/////////////////////////////////////////////////////////////////////////////// +////// GENERIC FUNCTIONS APPLICABLE FOR ALL DISPLAY TYPES ///////////////////// +/////////////////////////////////////////////////////////////////////////////// + +#include "ssd1306.h" +#include "ssd1306_fonts.h" +#include "lcd/lcd_common.h" +#include "intf/i2c/ssd1306_i2c.h" +#include "intf/spi/ssd1306_spi.h" +#include "intf/ssd1306_interface.h" +#include "ssd1306_hal/io.h" + +// TODO: remove +#include "lcd/ssd1306_commands.h" + +uint8_t s_ssd1306_invertByte = 0x00000000; +extern uint16_t ssd1306_color; +const uint8_t *s_font6x8 = &ssd1306xled_font6x8[4]; +extern lcduint_t ssd1306_cursorX; +extern lcduint_t ssd1306_cursorY; +extern SFixedFontInfo s_fixedFont; +#ifdef CONFIG_SSD1306_UNICODE_ENABLE +extern uint8_t g_ssd1306_unicode; +#endif + +void ssd1306_fillScreen(uint8_t fill_Data) +{ + fill_Data ^= s_ssd1306_invertByte; + ssd1306_lcd.set_block(0, 0, 0); + for(lcduint_t m=(ssd1306_lcd.height >> 3); m>0; m--) + { + for(lcduint_t n=ssd1306_lcd.width; n>0; n--) + { + ssd1306_lcd.send_pixels1(fill_Data); + } + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +void ssd1306_clearScreen() +{ + ssd1306_lcd.set_block(0, 0, 0); + for(lcduint_t m=(ssd1306_lcd.height >> 3); m>0; m--) + { + for(lcduint_t n=ssd1306_lcd.width; n>0; n--) + { + ssd1306_lcd.send_pixels1( s_ssd1306_invertByte ); + } + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +uint8_t ssd1306_printFixed(uint8_t xpos, uint8_t y, const char *ch, EFontStyle style) +{ + uint8_t i, j=0; + uint8_t text_index = 0; + uint8_t page_offset = 0; + uint8_t x = xpos; + y >>= 3; + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + for(;;) + { + uint8_t ldata; + if ((x > ssd1306_lcd.width - s_fixedFont.h.width) || (ch[j] == '\0')) + { + x = xpos; + y++; + if (y >= (ssd1306_lcd.height >> 3)) + { + break; + } + page_offset++; + if (page_offset == s_fixedFont.pages) + { + text_index = j; + page_offset = 0; + if (ch[j] == '\0') + { + break; + } + } + else + { + j = text_index; + } + ssd1306_intf.stop(); + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + } + uint16_t unicode; + do + { + unicode = ssd1306_unicode16FromUtf8(ch[j]); + j++; + } while ( unicode == SSD1306_MORE_CHARS_REQUIRED ); + SCharInfo char_info; + ssd1306_getCharBitmap(unicode, &char_info); + ldata = 0; + x += char_info.width + char_info.spacing; + if (char_info.height > page_offset * 8) + { + char_info.glyph += page_offset * char_info.width; + for( i = char_info.width; i>0; i--) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&char_info.glyph[0]); + } + else if ( style == STYLE_BOLD ) + { + uint8_t temp = pgm_read_byte(&char_info.glyph[0]); + data = temp | ldata; + ldata = temp; + } + else + { + uint8_t temp = pgm_read_byte(&char_info.glyph[1]); + data = (temp & 0xF0) | ldata; + ldata = (temp & 0x0F); + } + ssd1306_lcd.send_pixels1(data^s_ssd1306_invertByte); + char_info.glyph++; + } + } + else + { + char_info.spacing += char_info.width; + } + for (i = 0; i < char_info.spacing; i++) + ssd1306_lcd.send_pixels1(s_ssd1306_invertByte); + } + ssd1306_intf.stop(); + return j; +} + +uint8_t ssd1306_printFixed_oldStyle(uint8_t xpos, uint8_t y, const char *ch, EFontStyle style) +{ + uint8_t i, j=0; + uint8_t text_index = 0; + uint8_t page_offset = 0; + uint8_t x = xpos; + y >>= 3; + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + for(;;) + { + uint8_t c; + uint8_t ldata; + uint16_t offset; + if( (x > ssd1306_lcd.width - s_fixedFont.h.width) || (ch[j] == '\0') ) + { + x = xpos; + y++; + if (y >= (ssd1306_lcd.height >> 3)) + { + break; + } + page_offset++; + if (page_offset == s_fixedFont.pages) + { + text_index = j; + page_offset = 0; + if (ch[j] == '\0') + { + break; + } + } + else + { + j = text_index; + } + ssd1306_intf.stop(); + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + } + c = ch[j]; + if ( c >= s_fixedFont.h.ascii_offset ) + { + c -= s_fixedFont.h.ascii_offset; + } + ldata = 0; + offset = (c * s_fixedFont.pages + page_offset) * s_fixedFont.h.width; + for( i=s_fixedFont.h.width; i>0; i--) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&s_fixedFont.primary_table[offset]); + } + else if ( style == STYLE_BOLD ) + { + uint8_t temp = pgm_read_byte(&s_fixedFont.primary_table[offset]); + data = temp | ldata; + ldata = temp; + } + else + { + uint8_t temp = pgm_read_byte(&s_fixedFont.primary_table[offset + 1]); + data = (temp & 0xF0) | ldata; + ldata = (temp & 0x0F); + } + ssd1306_lcd.send_pixels1(data^s_ssd1306_invertByte); + offset++; + } + x += s_fixedFont.h.width; + j++; + } + ssd1306_intf.stop(); + return j; +} + +uint8_t ssd1306_printFixed2x(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style) +{ + uint8_t i, j=0; + uint8_t text_index = 0; + uint8_t page_offset = 0; + uint8_t x = xpos; + y >>= 3; + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + for(;;) + { + uint8_t c; + uint8_t ldata; + uint16_t offset; + if( (x > ssd1306_lcd.width - (s_fixedFont.h.width << 1)) || (ch[j] == '\0') ) + { + x = xpos; + y++; + if (y >= (ssd1306_lcd.height >> 3)) + { + break; + } + page_offset++; + if (page_offset == (s_fixedFont.pages << 1)) + { + text_index = j; + page_offset = 0; + if (ch[j] == '\0') + { + break; + } + } + else + { + j = text_index; + } + ssd1306_intf.stop(); + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + } + c = ch[j]; + if ( c >= 32 ) + { + c -= 32; + } + ldata = 0; + offset = (c * s_fixedFont.pages + (page_offset >> 1)) * s_fixedFont.h.width; + for( i=s_fixedFont.h.width; i>0; i--) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&s_fixedFont.primary_table[offset]); + } + else if ( style == STYLE_BOLD ) + { + uint8_t temp = pgm_read_byte(&s_fixedFont.primary_table[offset]); + data = temp | ldata; + ldata = temp; + } + else + { + uint8_t temp = pgm_read_byte(&s_fixedFont.primary_table[offset + 1]); + data = (temp & 0xF0) | ldata; + ldata = (temp & 0x0F); + } + if (page_offset & 1) data >>= 4; + data = ((data & 0x01) ? 0x03: 0x00) | + ((data & 0x02) ? 0x0C: 0x00) | + ((data & 0x04) ? 0x30: 0x00) | + ((data & 0x08) ? 0xC0: 0x00); + ssd1306_lcd.send_pixels1(data^s_ssd1306_invertByte); + ssd1306_lcd.send_pixels1(data^s_ssd1306_invertByte); + offset++; + } + x += (s_fixedFont.h.width << 1); + j++; + } + ssd1306_intf.stop(); + return j; +} + + +uint8_t ssd1306_printFixedN(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style, uint8_t factor) +{ + uint8_t i, j=0; + uint8_t text_index = 0; + uint8_t page_offset = 0; + uint8_t x = xpos; + y >>= 3; + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + for(;;) + { + uint8_t ldata; + if( (x > ssd1306_lcd.width - (s_fixedFont.h.width << factor)) || (ch[j] == '\0') ) + { + x = xpos; + y++; + if (y >= (ssd1306_lcd.height >> 3)) + { + break; + } + page_offset++; + if (page_offset == (s_fixedFont.pages << factor)) + { + text_index = j; + page_offset = 0; + if (ch[j] == '\0') + { + break; + } + } + else + { + j = text_index; + } + ssd1306_intf.stop(); + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + } + uint16_t unicode; + do + { + unicode = ssd1306_unicode16FromUtf8(ch[j]); + j++; + } while ( unicode == SSD1306_MORE_CHARS_REQUIRED ); + SCharInfo char_info; + ssd1306_getCharBitmap(unicode, &char_info); + ldata = 0; + x += ((char_info.width + char_info.spacing) << factor); + if (char_info.height > (page_offset >> factor) * 8) + { + char_info.glyph += (page_offset >> factor) * char_info.width; + for( i=char_info.width; i>0; i--) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(char_info.glyph); + } + else if ( style == STYLE_BOLD ) + { + uint8_t temp = pgm_read_byte(char_info.glyph); + data = temp | ldata; + ldata = temp; + } + else + { + uint8_t temp = pgm_read_byte(char_info.glyph+1); + data = (temp & 0xF0) | ldata; + ldata = (temp & 0x0F); + } + if ( factor > 0 ) + { + uint8_t accum = 0; + uint8_t mask = ~((0xFF) << (1<<factor)); + // N=0 -> right shift is always 0 + // N=1 -> right shift goes through 0, 4 + // N=2 -> right shift goes through 0, 2, 4, 6 + // N=3 -> right shift goes through 0, 1, 2, 3, 4, 5, 6, 7 + data >>= ((page_offset & ((1<<factor) - 1))<<(3-factor)); + for (uint8_t idx = 0; idx < 1<<(3-factor); idx++) + { + accum |= (((data>>idx) & 0x01) ? (mask<<(idx<<factor)) : 0); + } + data = accum; + } + for (uint8_t z=(1<<factor); z>0; z--) + { + ssd1306_lcd.send_pixels1(data^s_ssd1306_invertByte); + } + char_info.glyph++; + } + } + else + { + char_info.spacing += char_info.width; + } + for (i = 0; i < (char_info.spacing << factor); i++) + ssd1306_lcd.send_pixels1(s_ssd1306_invertByte); + } + ssd1306_intf.stop(); + return j; +} + +size_t ssd1306_write(uint8_t ch) +{ + if (ch == '\r') + { + ssd1306_cursorX = 0; + return 0; + } + SCharInfo char_info = {}; + uint8_t gotoNewLine = 1; + if (ch != '\n') + { + uint16_t unicode; + unicode = ssd1306_unicode16FromUtf8(ch); + if (unicode == SSD1306_MORE_CHARS_REQUIRED) return 0; + ssd1306_getCharBitmap(unicode, &char_info); + gotoNewLine = (ssd1306_cursorX > (ssd1306_lcd.width - char_info.width)); + } + if ( gotoNewLine ) + { + ssd1306_cursorX = 0; + ssd1306_cursorY += s_fixedFont.h.height; + if ( ssd1306_cursorY > ssd1306_lcd.height - s_fixedFont.h.height ) + { + ssd1306_cursorY = 0; + } + ssd1306_clearBlock(0, ssd1306_cursorY >> 3, ssd1306_lcd.width, s_fixedFont.h.height); + if (ch == '\n') + { + return 0; + } + } + ssd1306_drawBitmap( ssd1306_cursorX, + ssd1306_cursorY >> 3, + char_info.width, + char_info.height, + char_info.glyph ); + ssd1306_cursorX += char_info.width + char_info.spacing; + return 1; +} + +size_t ssd1306_print(const char ch[]) +{ + size_t n = 0; + while (*ch) + { + n += ssd1306_write(*ch); + ch++; + } + return n; +} + +uint8_t ssd1306_charF6x8(uint8_t x, uint8_t y, const char ch[], EFontStyle style) +{ + uint8_t i, j=0; + ssd1306_lcd.set_block(x, y, ssd1306_lcd.width - x); + while(ch[j] != '\0') + { + uint8_t ldata; + uint8_t c = ch[j] - 32; + if ( c > 224 ) + { + c = 0; + } + if(x > ssd1306_lcd.width - 6) + { + x=0; + y++; + } + ldata = 0; + for(i=0;i<6;i++) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&s_font6x8[c*6+i]); + } + else if ( style == STYLE_BOLD ) + { + uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i]); + data = temp | ldata; + ldata = temp; + } + else + { + uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i + 1]); + data = (temp & 0xF0) | ldata; + ldata = (temp & 0x0F); + } + ssd1306_lcd.send_pixels1(data^s_ssd1306_invertByte); + } + x += 6; + j++; + } + ssd1306_intf.stop(); + return j; +} + +uint8_t ssd1306_charF12x16(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style) +{ + uint8_t i, j=0; + uint8_t text_index = 0; + uint8_t odd = 0; + uint8_t x = xpos; + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + for(;;) + { + uint8_t c; + uint8_t ldata; + if( (x > ssd1306_lcd.width-12) || (ch[j] == '\0') ) + { + x = xpos; + y++; + if (y >= (ssd1306_lcd.height >> 3)) + { + break; + } + if (odd) + { + text_index = j; + if (ch[j] == '\0') + { + break; + } + } + else + { + j = text_index; + } + odd = !odd; + ssd1306_intf.stop(); + ssd1306_lcd.set_block(xpos, y, ssd1306_lcd.width - xpos); + } + c = ch[j] - 32; + if ( c > 224 ) + { + c = 0; + } + ldata = 0; + for(i=0;i<6;i++) + { + uint8_t data; + if ( style == STYLE_NORMAL ) + { + data = pgm_read_byte(&s_font6x8[c*6+i]); + } + else if ( style == STYLE_BOLD ) + { + uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i]); + data = temp | ldata; + ldata = temp; + } + else + { + uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i + 1]); + data = (temp & 0xF0) | ldata; + ldata = (temp & 0x0F); + } + if (odd) data >>= 4; + data = ((data & 0x01) ? 0x03: 0x00) | + ((data & 0x02) ? 0x0C: 0x00) | + ((data & 0x04) ? 0x30: 0x00) | + ((data & 0x08) ? 0xC0: 0x00); + ssd1306_lcd.send_pixels1(data^s_ssd1306_invertByte); + ssd1306_lcd.send_pixels1(data^s_ssd1306_invertByte); + } + x += 12; + j++; + } + ssd1306_intf.stop(); + return j; +} + +uint8_t ssd1306_charF6x8_eol(uint8_t left, + uint8_t y, + const char ch[], + EFontStyle style, + uint8_t right) +{ + uint8_t len = ssd1306_printFixed(left, y<<3, ch, style); + uint8_t text_end_pos = len * 6 + left; + if (text_end_pos <= right) + { + ssd1306_clearBlock(text_end_pos, y, right - text_end_pos + 1, 8); + } + return len; +} + +void ssd1306_putPixel(uint8_t x, uint8_t y) +{ + ssd1306_lcd.set_block(x, y >> 3, 1); + ssd1306_lcd.send_pixels1((1 << (y & 0x07))^s_ssd1306_invertByte); + ssd1306_intf.stop(); +} + +void ssd1306_putPixels(uint8_t x, uint8_t y, uint8_t pixels) +{ + ssd1306_lcd.set_block(x, y >> 3, 1); + ssd1306_lcd.send_pixels1(pixels^s_ssd1306_invertByte); + ssd1306_intf.stop(); +} + +void ssd1306_putPixel_delayed(uint8_t x, uint8_t y, uint8_t complete) +{ + static uint8_t lx = 0, ly = 0xFF; + static uint8_t pixels = 0; + if ((lx != x) || ((ly & 0xF8) != (y & 0xF8)) || (complete)) + { + if (ly != 0xFF) + { + ssd1306_putPixels( lx, ly, pixels ); + } + pixels = 0; + ly = 0xFF; + } + if ( !complete ) + { + pixels |= (1 << (y & 0x07)); + lx = x; ly = y; + } +} + +void ssd1306_drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) +{ + lcduint_t dx = x1 > x2 ? (x1 - x2): (x2 - x1); + lcduint_t dy = y1 > y2 ? (y1 - y2): (y2 - y1); + lcduint_t err = 0; + if (dy > dx) + { + if (y1 > y2) + { + ssd1306_swap_data(x1, x2, uint8_t); + ssd1306_swap_data(y1, y2, uint8_t); + } + for(; y1<=y2; y1++) + { + err += dx; + if (err >= dy) + { + err -= dy; + x1 < x2 ? x1++: x1--; + } + ssd1306_putPixel_delayed( x1, y1, 0 ); + } + ssd1306_putPixel_delayed( 0, 0, 1 ); + } + else + { + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, uint8_t); + ssd1306_swap_data(y1, y2, uint8_t); + } + for(; x1<=x2; x1++) + { + err += dy; + if (err >= dx) + { + err -= dx; + if (y1 < y2) y1++; else y1--; + } + ssd1306_putPixel( x1, y1 ); + } + } +} + +void ssd1306_drawHLine(uint8_t x1, uint8_t y1, uint8_t x2) +{ + ssd1306_lcd.set_block(x1, y1 >> 3, x2 - x1 + 1); + for (uint8_t x = x1; x <= x2; x++) + { + ssd1306_lcd.send_pixels1((1 << (y1 & 0x07))^s_ssd1306_invertByte); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawVLine(uint8_t x1, uint8_t y1, uint8_t y2) +{ + uint8_t topPage = y1 >> 3; + uint8_t bottomPage = y2 >> 3; + uint8_t height = y2-y1; + uint8_t y; + ssd1306_lcd.set_block(x1, topPage, 1); + if (topPage == bottomPage) + { + ssd1306_lcd.send_pixels1( ((0xFF >> (0x07 - height)) << (y1 & 0x07))^s_ssd1306_invertByte ); + ssd1306_intf.stop(); + return; + } + ssd1306_lcd.send_pixels1( (0xFF << (y1 & 0x07))^s_ssd1306_invertByte ); + for ( y = (topPage + 1); y <= (bottomPage - 1); y++) + { + ssd1306_lcd.next_page(); + ssd1306_lcd.send_pixels1( 0xFF^s_ssd1306_invertByte ); + } + ssd1306_lcd.next_page(); + ssd1306_lcd.send_pixels1( (0xFF >> (0x07 - (y2 & 0x07)))^s_ssd1306_invertByte ); + ssd1306_intf.stop(); +} + +void ssd1306_drawRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) +{ + ssd1306_drawHLine(x1+1, y1, x2-1); + ssd1306_drawHLine(x1+1, y2, x2-1); + ssd1306_drawVLine(x1, y1, y2); + ssd1306_drawVLine(x2, y1, y2); +} + +void ssd1306_drawBufferFast(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *buf) +{ + uint8_t j; + ssd1306_lcd.set_block(x, y >> 3, w); + for(j=(h >> 3); j>0; j--) + { + ssd1306_lcd.send_pixels_buffer1(buf,w); + buf+=w; + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawBuffer(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf) +{ + uint8_t i, j; + ssd1306_lcd.set_block(x, y, w); + for(j=(h >> 3); j>0; j--) + { + for(i=w;i>0;i--) + { + ssd1306_lcd.send_pixels1(s_ssd1306_invertByte^*buf++); + } + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawBuffer1_4(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf) +{ + uint8_t i, j, k; + ssd1306_lcd.set_block(x, y>>3, w); + uint8_t y_offset = (y & 0x07); + uint8_t x_offset = (x & 0x01); + for( j = 0; j < ((h + 7 + y_offset) >> 3); j++) + { + for( i = 0; i < w / 2 + x_offset; i++) + { + for( k = 0; k < 8; k++) + { + if ((j*8 + k - y_offset < h) && (k >= y_offset || j != 0)) + { + uint8_t data = (i < w / 2) ? buf[ i + (j * 8 + k - y_offset) * w / 2 ]: 0x00; + if ( x_offset ) + { + data <<= 4; + if ( i > 0) data |= buf[ i + (j * 8 + k - y_offset) * w / 2 - 1] >> 4; + } + ssd1306_lcd.send_pixels8( data ); + } + else + { + ssd1306_lcd.send_pixels8( 0x00 ); + } + } + } + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf) +{ + uint8_t i, j; + uint8_t remainder = (ssd1306_lcd.width - x) < w ? (w + x - ssd1306_lcd.width): 0; + w -= remainder; + ssd1306_lcd.set_block(x, y, w); + for(j=(h >> 3); j>0; j--) + { + for(i=w;i>0;i--) + { + ssd1306_lcd.send_pixels1(s_ssd1306_invertByte^pgm_read_byte(buf++)); + } + buf += remainder; + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawBitmap1_4(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf) +{ + uint8_t i, j, k; + ssd1306_lcd.set_block(x, y>>3, w); + uint8_t y_offset = (y & 0x07); + uint8_t x_offset = (x & 0x01); + for( j = 0; j < ((h + 7 + y_offset) >> 3); j++) + { + for( i = 0; i < w / 2 + x_offset; i++) + { + for( k = 0; k < 8; k++) + { + if ((j*8 + k - y_offset < h) && (k >= y_offset || j != 0)) + { + uint8_t data = (i < w / 2) ? pgm_read_byte( &buf[ i + (j * 8 + k - y_offset) * w / 2 ] ) : 0x00; + if ( x_offset ) + { + data <<= 4; + if ( i > 0) data |= pgm_read_byte( &buf[ i + (j * 8 + k - y_offset) * w / 2 - 1] ) >> 4; + } + ssd1306_lcd.send_pixels8( data ); + } + else + { + ssd1306_lcd.send_pixels8( 0x00 ); + } + } + } + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawXBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf) +{ + uint8_t i, j; + lcduint_t pitch = (w + 7) >> 3; + ssd1306_lcd.set_block(x, y, w); + for(j=(h >> 3); j>0; j--) + { + uint8_t bit = 0; + for(i=w;i>0;i--) + { + uint8_t data = 0; + for (uint8_t k = 0; k<8; k++) + { + data |= ( ((pgm_read_byte(&buf[k*pitch]) >> bit) & 0x01) << k ); + } + ssd1306_lcd.send_pixels1(s_ssd1306_invertByte^data); + bit++; + if (bit >= 8) + { + buf++; + bit=0; + } + } + if (bit) + { + buf++; + } + buf += pitch * 7; + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +void gfx_drawMonoBitmap(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *buf) +{ + lcduint_t origin_width = w; + uint8_t offset = y & 0x07; + uint8_t complexFlag = 0; + uint8_t mainFlag = 1; + uint8_t max_pages; + uint8_t pages; + lcduint_t i, j; + if (y + (lcdint_t)h <= 0) return; + if (y >= ssd1306_lcd.height) return; + if (x + (lcdint_t)w <= 0) return; + if (x >= ssd1306_lcd.width) return; + if (y < 0) + { + buf += ((lcduint_t)((-y) + 7) >> 3) * w; + h += y; + y = 0; + complexFlag = 1; + } + if (x < 0) + { + buf += -x; + w += x; + x = 0; + } + max_pages = (lcduint_t)(h + 15 - offset) >> 3; + if ((lcduint_t)((lcduint_t)y + h) > (lcduint_t)ssd1306_lcd.height) + { + h = (lcduint_t)(ssd1306_lcd.height - (lcduint_t)y); + } + if ((lcduint_t)((lcduint_t)x + w) > (lcduint_t)ssd1306_lcd.width) + { + w = (lcduint_t)(ssd1306_lcd.width - (lcduint_t)x); + } + pages = ((y + h - 1) >> 3) - (y >> 3) + 1; + + ssd1306_lcd.set_block(x, y >> 3, w); + for(j=0; j < pages; j++) + { + if ( j == max_pages - 1 ) mainFlag = !offset; + for( i=w; i > 0; i--) + { + uint8_t data = 0; + if ( mainFlag ) data |= (pgm_read_byte(buf) << offset); + if ( complexFlag ) data |= (pgm_read_byte(buf - origin_width) >> (8 - offset)); + buf++; + ssd1306_lcd.send_pixels1(s_ssd1306_invertByte^data); + } + buf += origin_width - w; + complexFlag = offset; + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + + +void ssd1306_clearBlock(uint8_t x, uint8_t y, uint8_t w, uint8_t h) +{ + uint8_t i, j; + ssd1306_lcd.set_block(x, y, w); + for(j=(h >> 3); j>0; j--) + { + for(i=w;i>0;i--) + { + ssd1306_lcd.send_pixels1(s_ssd1306_invertByte); + } + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + +void ssd1306_fillRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + uint8_t templ = ssd1306_color^s_ssd1306_invertByte; + if (x1 > x2) return; + if (y1 > y2) return; + if ((lcduint_t)x2 >= ssd1306_displayWidth()) x2 = (lcdint_t)ssd1306_displayWidth() - 1; + if ((lcduint_t)y2 >= ssd1306_displayHeight()) y2 = (lcdint_t)ssd1306_displayHeight() - 1; + uint8_t bank1 = (y1 >> 3); + uint8_t bank2 = (y2 >> 3); + ssd1306_lcd.set_block(x1, bank1, x2 - x1 + 1); + for (uint8_t bank = bank1; bank<=bank2; bank++) + { + uint8_t mask = 0xFF; + if (bank1 == bank2) + { + mask = (mask >> ((y1 & 7) + 7 - (y2 & 7))) << (y1 & 7); + } + else if (bank1 == bank) + { + mask = (mask << (y1 & 7)); + } + else if (bank2 == bank) + { + mask = (mask >> (7 - (y2 & 7))); + } + for (uint8_t x=x1; x<=x2; x++) + { + ssd1306_lcd.send_pixels1(templ & mask); + } + ssd1306_lcd.next_page(); + } + ssd1306_intf.stop(); +} + + +void ssd1306_drawSpriteEx(uint8_t x, uint8_t y, uint8_t w, const uint8_t *sprite) +{ + uint8_t i; + ssd1306_lcd.set_block(x,y,w); + for(i=0;i<w;i++) + { + ssd1306_lcd.send_pixels1(s_ssd1306_invertByte^pgm_read_byte(&sprite[i])); + } + ssd1306_intf.stop(); +} + + +void ssd1306_drawSprite(SPRITE *sprite) +{ + uint8_t offsety = sprite->y & 0x7; + if (sprite->y < ssd1306_lcd.height) + { + ssd1306_lcd.set_block(sprite->x, sprite->y >> 3, sprite->w); + for (uint8_t i=0; i < sprite->w; i++) + { + ssd1306_lcd.send_pixels1( s_ssd1306_invertByte^(pgm_read_byte( &sprite->data[i] ) << offsety) ); + } + ssd1306_intf.stop(); + } + if (offsety && (sprite->y + 8 < ssd1306_lcd.height)) + { + ssd1306_lcd.set_block(sprite->x, (sprite->y >> 3) + 1, sprite->w); + for (uint8_t i=0; i < sprite->w; i++) + { + ssd1306_lcd.send_pixels1( s_ssd1306_invertByte^(pgm_read_byte( &sprite->data[i] ) >> (8 - offsety)) ); + } + ssd1306_intf.stop(); + } + sprite->lx = sprite->x; + sprite->ly = sprite->y; +} + + +void ssd1306_eraseSprite(SPRITE *sprite) +{ + uint8_t posy = sprite->y >> 3; + uint8_t offsety = sprite->y & 0x7; + ssd1306_lcd.set_block(sprite->x, posy, sprite->w); + for (uint8_t i=sprite->w; i > 0; i--) + { + ssd1306_lcd.send_pixels1( s_ssd1306_invertByte ); + } + ssd1306_intf.stop(); + if (offsety) + { + ssd1306_lcd.set_block(sprite->x, posy + 1, sprite->w); + for (uint8_t i=sprite->w; i > 0; i--) + { + ssd1306_lcd.send_pixels1( s_ssd1306_invertByte ); + } + } + ssd1306_intf.stop(); +} + + +void ssd1306_eraseTrace(SPRITE *sprite) +{ + uint8_t y1 = sprite->ly >> 3; + uint8_t y2 = (sprite->ly + 7) >> 3; + if (sprite->ly < sprite->y) + y2 = min(y2, (uint8_t)((sprite->y >> 3) - 1)); + else if (sprite->y + 8 > sprite->ly) + y1 = max(y1, (sprite->ly + 7) >> 3); + for(uint8_t y = y1; y <= y2; y++) + { + ssd1306_lcd.set_block(sprite->lx, y, sprite->w); + for(uint8_t x = sprite->w; x > 0; x--) + { + ssd1306_lcd.send_pixels1( s_ssd1306_invertByte ); + } + ssd1306_intf.stop(); + } + if (sprite->lx != sprite->x) + { + uint8_t x1 = sprite->lx; + uint8_t x2 = sprite->lx + sprite->w - 1; + if (sprite->x < sprite->lx) + x1 = max(x1, sprite->x + sprite->w); + else + x2 = min((uint8_t)(sprite->x - 1), x2); + for(uint8_t y = sprite->ly >> 3; y <= (sprite->ly + 7) >> 3; y++) + { + ssd1306_lcd.set_block(x1, y, x2 - x1 + 1 ); + for(uint8_t x = x2 - x1 + 1; x > 0; x--) + { + ssd1306_lcd.send_pixels1( s_ssd1306_invertByte ); + } + ssd1306_intf.stop(); + } + } +} + +SPRITE ssd1306_createSprite(uint8_t x, uint8_t y, uint8_t w, const uint8_t *data) +{ + return (SPRITE){x,y,w,x,y,data,NULL}; +} + +void ssd1306_replaceSprite(SPRITE *sprite, const uint8_t *data) +{ + sprite->data = data; +} + +void ssd1306_negativeMode() +{ + s_ssd1306_invertByte = 0xFF; +} + +void ssd1306_positiveMode() +{ + s_ssd1306_invertByte = 0x00; +} + +void ssd1306_setFont6x8(const uint8_t * progmemFont) +{ + s_font6x8 = progmemFont + 4; +} + diff --git a/lib/libssd1306/src/ssd1306_1bit.h b/lib/libssd1306/src/ssd1306_1bit.h new file mode 100644 index 0000000..88be31b --- /dev/null +++ b/lib/libssd1306/src/ssd1306_1bit.h @@ -0,0 +1,458 @@ +/* + MIT License + + Copyright (c) 2016-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_1bit.h SSD1306 basic draw functions + */ + + +#ifndef _SSD1306_1BIT_H_ +#define _SSD1306_1BIT_H_ + +#include "nano_gfx_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////// +// DIRECT GRAPH FUNCTIONS +/////////////////////////////////////////////////////////////////////// + +/** + * @defgroup LCD_1BIT_GRAPHICS DIRECT DRAW: 1-bit graphic functions for ssd1306 compatible mode. + * @{ + * @brief LCD direct draw functions for all display types: color and monochrome. + * + * @details LCD direct draw functions are applicable for all display types. These functions will work + * both for monochrome and 8-bit/16-bit color OLED displays. You need remember, that for RGB + * oled displays these functions work only in special ssd1306 compatible mode. If you're going to + * combine NanoEngine capabilities with these functions, don't forget to switch addressing + * mode via ssd1306_setMode(). + * Direct draw functions draw directly in GDRAM and do not use any double-buffering. + */ + +/** + * Fills screen with pattern byte + */ +void ssd1306_fillScreen(uint8_t fill_Data); + +/** + * Fills screen with zero-byte + */ +void ssd1306_clearScreen(void); + +/** + * All drawing functions start to work in negative mode. + * Old picture on the display remains unchanged. + */ +void ssd1306_negativeMode(void); + +/** + * All drawing functions start to work in positive (default) mode. + * Old picture on the display remains unchanged. + */ +void ssd1306_positiveMode(void); + +/** + * Prints text to screen using fixed font. + * @param xpos - horizontal position in pixels + * @param y - vertical position in pixels + * @param ch - NULL-terminated string to print + * @param style - font style (EFontStyle), normal by default. + * @returns number of chars in string + * @see ssd1306_setFixedFont + * @warning ssd1306_printFixed() can output chars at fixed y positions: 0, 8, 16, 24, 32, etc. + * If you specify [10,18], ssd1306_printFixed() will output text starting at [10,16] position. + * @warning Be careful with you flash space! Do not mix too many different functions in single sketch. + * ssd1306_printFixedN() uses much flash: ~396 bytes, ssd1306_printFixed() needs 388 bytes. + * Placing both of these functions to your sketch will consume almost 1KiB. + */ +uint8_t ssd1306_printFixed(uint8_t xpos, uint8_t y, const char *ch, EFontStyle style); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +uint8_t ssd1306_printFixed_oldStyle(uint8_t xpos, uint8_t y, const char *ch, EFontStyle style); +#endif + +/** + * Prints text to screen using double size fixed font. + * @param xpos - horizontal position in pixels + * @param y - vertical position in pixels + * @param ch - NULL-terminated string to print + * @param style - font style (EFontStyle), normal by default. + * @returns number of chars in string + * @see ssd1306_setFixedFont + * @warning ssd1306_printFixed2x() can output chars at fixed y positions: 0, 8, 16, 24, 32, etc. + * If you specify [10,18], ssd1306_printFixed2x() will output text starting at [10,16] position. + * @warning Be careful with you flash space! Do not mix too many different functions in single sketch. + * ssd1306_printFixedN() uses much flash: ~474 bytes, ssd1306_printFixed() needs 388 bytes. + * Placing both of these functions to your sketch will consume almost 1KiB. + * @deprecated Use ssd1306_printFixedN() instead. + */ +uint8_t ssd1306_printFixed2x(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style) __attribute__ ((deprecated)); + +/** + * Prints text to screen using size fixed font, scaled by factor value. <br> + * Factor value 0 gives regular font size (6x8 for example) <br> + * Factor value 1 gives double font size (12x16 if 6x8 font is used) <br> + * Factor value 2 gives fourth font size (24x32 if 6x8 font is used) <br> + * Factor value 3 gives eighth font size (48x64 if 6x8 font is used) <br> + * @param xpos - horizontal position in pixels + * @param y - vertical position in pixels + * @param ch - NULL-terminated string to print + * @param style - font style (EFontStyle), normal by default. + * @param factor - 0, 1, 2, 3. + * @returns number of chars in string + * @see ssd1306_setFixedFont + * @warning ssd1306_printFixed2x() can output chars at fixed y positions: 0, 8, 16, 24, 32, etc. + * If you specify [10,18], ssd1306_printFixed2x() will output text starting at [10,16] position. + * @warning Be careful with you flash space! Do not mix too many different functions in single sketch. + * ssd1306_printFixedN() uses much flash: ~474 bytes, ssd1306_printFixed() needs 388 bytes. + * Placing both of these functions to your sketch will consume almost 1KiB. + */ +uint8_t ssd1306_printFixedN(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style, uint8_t factor); + +/** + * @brief Prints single character to display at current cursor position + * + * Prints single character to display at current cursor position + * @param ch - character to print to the display. 'LF' and 'CR' are skipped + * @return returns number of printed characters. + */ +size_t ssd1306_write(uint8_t ch); + +/** + * @brief Prints null-terminated string to display at current cursor position + * + * Prints null-terminated string to display at current cursor position + * @param ch - string to print to the display. 'LF' and 'CR' are skipped + * @return returns number of printed characters. + */ +size_t ssd1306_print(const char ch[]); + +/** + * Prints text to screen using font 6x8. + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + * @param ch - NULL-terminated string to print + * @param style - font style (EFontStyle), normal by default. + * @returns number of chars in string + * @deprecated Use ssd1306_printFixed() instead. + */ +uint8_t ssd1306_charF6x8(uint8_t x, uint8_t y, + const char ch[], + EFontStyle style +#ifdef __cplusplus + = STYLE_NORMAL +#endif + ) __attribute__ ((deprecated)); + +/** + * Prints text to screen using double size font 12x16. + * @param xpos - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + * @param ch - NULL-terminated string to print + * @param style - font style (EFontStyle). + * @returns number of chars in string + * @deprecated Use ssd1306_drawFixedN() instead. + */ +uint8_t ssd1306_charF12x16(uint8_t xpos, + uint8_t y, + const char ch[], + EFontStyle style) __attribute__ ((deprecated)); + + +/** + * Prints text to screen using set font. + * If real text ends before right boundary, + * the remaining part on the display will be erased till right + * boundary. + * @param left - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + * @param ch - NULL-terminated string to print + * @param style - font style (EFontStyle), normal by default. + * @param right - right boundary of the text to output + * @returns number of chars in string + * @deprecated This function is removed as superflouse. + */ +uint8_t ssd1306_charF6x8_eol(uint8_t left, + uint8_t y, + const char ch[], + EFontStyle style, + uint8_t right) __attribute__ ((deprecated)); + +/** + * Put single pixel on the LCD. + * + * @warning Please, take into account that there is no way + * to read data from ssd1306, thus since each byte contains + * 8 pixels, all other pixels in the same byte will be cleared + * on the display. Use ssd1306_putPixels() instead. + * If you need to have buffered output, please, refer to NanoCanvas. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + */ +void ssd1306_putPixel(uint8_t x, uint8_t y); + +/** + * Puts eight vertical pixels on the LCD at once. + * + * ~~~~~~~~~~~~~~~{.c} + * // Draw 8 vertical pixels, starting at [10,16] position + * ssd1306_putPixels(10,2,0xFF); + * // Draw 4 vertical pixels, starting at [32,28] position + * ssd1306_putPixels(32,3,0x0F); + * ~~~~~~~~~~~~~~~ + * + * @param x - horizontal position in pixels + * @param y - vertical position pixels. Should be multiply of 8. + * @param pixels - bit-pixels to draw on display + */ +void ssd1306_putPixels(uint8_t x, uint8_t y, uint8_t pixels); + +/** + * Draws rectangle + * @param x1 - left boundary in pixel units + * @param y1 - top boundary in pixel units + * @param x2 - right boundary in pixel units + * @param y2 - bottom boundary int pixel units + */ +void ssd1306_drawRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); + +/** + * Fill rectangle directly in OLED display GDRAM. + * This is software implementation. Some OLED controllers have hardware implementation. + * Refer to datasheet. + * + * @param x1 - start horizontal position in pixels + * @param y1 - start vertical position in pixels + * @param x2 - end horizontal position in pixels + * @param y2 - end vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_fillRect(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + +/** + * Draws line + * @param x1 - x position in pixels of start point + * @param y1 - y position in pixels of start point + * @param x2 - x position in pixels of end point + * @param y2 - y position in pixels of end point + * + * @warning Remember that this function draws line directly in GDRAM of oled controller. + * Since there is no way to detect pixels already being displayed, some pixels + * can be overwritten by black color. If you use RGB oled, based on ssd1331 controller, + * use ssd1331_drawLine() function. + */ +void ssd1306_drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); + +/** + * Draws horizontal line + * @param x1 - left boundary in pixels + * @param y1 - position Y in pixels + * @param x2 - right boundary in pixels + */ +void ssd1306_drawHLine(uint8_t x1, uint8_t y1, uint8_t x2); + +/** + * Draws vertical line + * @param x1 - position X in pixels + * @param y1 - top boundary in pixels + * @param y2 - bottom boundary in pixels + */ +void ssd1306_drawVLine(uint8_t x1, uint8_t y1, uint8_t y2); + +/** + * Draws bitmap, located in SRAM, on the display + * Each byte represents 8 vertical pixels. + * + * ~~~~~~~~~~~~~~~{.c} + * // Draw small rectangle 3x8 at position 10,8 + * uint8_t buffer[3] = { 0xFF, 0x81, 0xFF }; + * ssd1306_drawBuffer(10, 1, 3, 8, buffer); + * ~~~~~~~~~~~~~~~ + * + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels (must be divided by 8) + * @param buf - pointer to data, located in SRAM: each byte represents 8 vertical pixels. + */ +void ssd1306_drawBuffer(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf); + +/** + * Draws bitmap, located in SRAM, on the display + * Each byte represents 2 horizontal grayscale pixels. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels (must be divided by 8) + * @param buf - pointer to data, located in SRAM: each byte represents 2 horizontal pixels. + */ +void ssd1306_drawBuffer1_4(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf); + + +/** + * Draws bitmap, located in SRAM, on the display + * Each byte represents 8 vertical pixels. + * + * ~~~~~~~~~~~~~~~{.c} + * // Draw small rectangle 3x8 at position 10,8 + * uint8_t buffer[3] = { 0xFF, 0x81, 0xFF }; + * ssd1306_drawBuffer(10, 1, 3, 8, buffer); + * ~~~~~~~~~~~~~~~ + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels (must be devided by 8) + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels (must be divided by 8) + * @param buf - pointer to data, located in SRAM: each byte represents 8 vertical pixels. + * + * @note ssd1306_drawBufferFast() doesn't support negative draw mode. Use ssd1306_drawBuffer() instead. + */ +void ssd1306_drawBufferFast(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *buf); + +/** + * @copydoc ssd1306_drawBuffer + */ +#define ssd1306_drawCanvas(x, y, w, h, buf) ssd1306_drawBuffer(x, y, w, h, buf) + +/** + * Draws bitmap, located in Flash, on the display + * The bitmap should be in native ssd1306 format + * + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels (must be divided by 8) + * @param buf - pointer to data, located in Flash: each byte represents 8 vertical pixels. + */ +void ssd1306_drawBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf); + +/** + * Draws bitmap, located in Flash, on the display + * The bitmap should be in XBMP format + * + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels (must be divided by 8) + * @param buf - pointer to data, located in Flash: each byte represents 8 vertical pixels. + */ +void ssd1306_drawXBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf); + +/** + * Draw bitmap, located in Flash, on the display + * The bitmap should be in in grayscale 4-bit format: + * ROW 1: 222211114444333366665555... + * ROW 2: 222211114444333366665555... + * ... + * ROW N: 222211114444333366665555... + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels (must be divided by 8) + * @param buf - pointer to data, located in Flash. + */ +void ssd1306_drawBitmap1_4(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf); + +/** + * Draws bitmap, located in Flash, on the display + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels (must be divided by 8) + * @param buf - pointer to data, located in Flash: each byte represents 8 vertical pixels. + */ +void gfx_drawMonoBitmap(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *buf); + +/** + * Fills block with black pixels + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + * @param w - width of block in pixels + * @param h - height of block in pixels (must be divided by 8) + * @note usually this method is used to erase bitmap on the screen. + */ +void ssd1306_clearBlock(uint8_t x, uint8_t y, uint8_t w, uint8_t h); + +/** + * Draws bitmap, located in Flash, on the display. This sprite must have wx8 size + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + * @param w - width in pixels + * @param sprite - pointer to data, located in Flash: each byte represents 8 vertical pixels. + */ +void ssd1306_drawSpriteEx(uint8_t x, uint8_t y, uint8_t w, const uint8_t *sprite); + +/** + * Draws sprite on the display. Position can be changed by + * updating x and y fields of SPRITE structure. + * @param sprite - pointer to SPRITE structure + */ +void ssd1306_drawSprite(SPRITE *sprite); + +/** + * Clears sprite from the display leaving black rectangle. + * @param sprite - pointer to SPRITE structure + */ +void ssd1306_eraseSprite(SPRITE *sprite); + +/** + * Clears some sprite parts in old position on the display. + * @param sprite - pointer to SPRITE structure + */ +void ssd1306_eraseTrace(SPRITE *sprite); + +/** + * Creates sprite object. Sprite height is fixed to 8 pixels + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of sprite in pixels + * @param data - pointer to data, located in Flash: each byte represents 8 vertical pixels. + * @return SPRITE structure + */ +SPRITE ssd1306_createSprite(uint8_t x, uint8_t y, uint8_t w, const uint8_t *data); + +/** + * Replaces image of the sprite with different data. The width must be the same as + * the width of original sprite image + * @param sprite - pointer to SPRITE structure + * @param data - pointer to data, located in Flash: each byte represents 8 vertical pixels. + */ +void ssd1306_replaceSprite(SPRITE *sprite, const uint8_t *data); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif // _SSD1306_1BIT_H_ diff --git a/lib/libssd1306/src/ssd1306_8bit.c b/lib/libssd1306/src/ssd1306_8bit.c new file mode 100644 index 0000000..84fa900 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_8bit.c @@ -0,0 +1,378 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_8bit.h" +#include "ssd1306_generic.h" +//#include "ssd1306_fonts.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "ssd1306_hal/io.h" + +#include "lcd/ssd1331_commands.h" +#include "lcd/lcd_common.h" + +extern uint16_t ssd1306_color; +extern uint8_t s_ssd1306_invertByte; +extern lcduint_t ssd1306_cursorX; +extern lcduint_t ssd1306_cursorY; +extern SFixedFontInfo s_fixedFont; +#ifdef CONFIG_SSD1306_UNICODE_ENABLE +extern uint8_t g_ssd1306_unicode; +#endif + +void ssd1306_setColor(uint16_t color) +{ + ssd1306_color = color; +} + +void ssd1306_setRgbColor(uint8_t r, uint8_t g, uint8_t b) +{ + ssd1306_color = RGB_COLOR8(r,g,b); +} + +void ssd1306_setRgbColor8(uint8_t r, uint8_t g, uint8_t b) +{ + ssd1306_color = RGB_COLOR8(r,g,b); +} + +void ssd1306_drawMonoBuffer8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + uint8_t bit = 1; + uint8_t blackColor = s_ssd1306_invertByte ? ssd1306_color : 0x00; + uint8_t color = s_ssd1306_invertByte ? 0x00 : ssd1306_color; + ssd1306_lcd.set_block(xpos, ypos, w); + while (h--) + { + lcduint_t wx = w; + while (wx--) + { + uint8_t data = *bitmap; + if ( data & bit ) + ssd1306_lcd.send_pixels8( color ); + else + ssd1306_lcd.send_pixels8( blackColor ); + bitmap++; + } + bit <<= 1; + if (bit == 0) + { + bit = 1; + } + else + { + bitmap -= w; + } + } + ssd1306_intf.stop(); +} + +static void ssd1306_drawBufferPitch8(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, lcduint_t pitch, const uint8_t *data) +{ + ssd1306_lcd.set_block(x, y, w); + while (h--) + { + lcduint_t line = w; + while (line--) + { + ssd1306_lcd.send_pixels8( *data ); + data++; + } + data += pitch - w; + } + ssd1306_intf.stop(); +} + +void ssd1306_drawBufferFast8(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *data) +{ + ssd1306_drawBufferPitch8( x, y, w, h, w, data ); +} + +void ssd1306_drawBufferEx8(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, lcduint_t pitch, const uint8_t *data) +{ + ssd1306_drawBufferPitch8( x, y, w, h, pitch, data ); +} + +void ssd1306_fillScreen8(uint8_t fill_Data) +{ + ssd1306_lcd.set_block(0, 0, 0); + uint32_t count = (uint32_t)ssd1306_lcd.width * (uint32_t)ssd1306_lcd.height; + while (count--) + { + ssd1306_lcd.send_pixels8( fill_Data ); + } + ssd1306_intf.stop(); +} + +void ssd1306_clearScreen8(void) +{ + ssd1306_fillScreen8( 0x00 ); +} + +void ssd1306_putPixel8(lcdint_t x, lcdint_t y) +{ + ssd1306_lcd.set_block(x, y, 0); + ssd1306_lcd.send_pixels8( ssd1306_color ); + ssd1306_intf.stop(); +} + +void ssd1306_putColorPixel8(lcdint_t x, lcdint_t y, uint8_t color) +{ + ssd1306_lcd.set_block(x, y, 0); + ssd1306_lcd.send_pixels8( color ); + ssd1306_intf.stop(); +} + +void ssd1306_drawVLine8(lcdint_t x1, lcdint_t y1, lcdint_t y2) +{ + ssd1306_lcd.set_block(x1, y1, 1); + while (y1<=y2) + { + ssd1306_lcd.send_pixels8( ssd1306_color ); + y1++; + } + ssd1306_intf.stop(); +} + +void ssd1306_drawHLine8(lcdint_t x1, lcdint_t y1, lcdint_t x2) +{ + ssd1306_lcd.set_block(x1, y1, 0); + while (x1 < x2) + { + ssd1306_lcd.send_pixels8( ssd1306_color ); + x1++; + } + ssd1306_intf.stop(); +} + +void ssd1306_drawLine8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + lcduint_t dx = x1 > x2 ? (x1 - x2): (x2 - x1); + lcduint_t dy = y1 > y2 ? (y1 - y2): (y2 - y1); + lcduint_t err = 0; + if (dy > dx) + { + if (y1 > y2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + ssd1306_swap_data(y1, y2, lcdint_t); + } + for(; y1<=y2; y1++) + { + err += dx; + if (err >= dy) + { + err -= dy; + x1 < x2 ? x1++: x1--; + } + ssd1306_putPixel8( x1, y1 ); + } + } + else + { + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + ssd1306_swap_data(y1, y2, lcdint_t); + } + for(; x1<=x2; x1++) + { + err += dy; + if (err >= dx) + { + err -= dx; + if (y1 < y2) y1++; else y1--; + } + ssd1306_putPixel8( x1, y1 ); + } + } +} + +void ssd1306_drawRect8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + ssd1306_drawHLine8(x1,y1,x2); + ssd1306_drawHLine8(x1,y2,x2); + ssd1306_drawVLine8(x1,y1,y2); + ssd1306_drawVLine8(x2,y1,y2); +} + +void ssd1306_fillRect8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + if (y1 > y2) + { + ssd1306_swap_data(y1, y2, lcdint_t); + } + if (x1 > x2) + { + ssd1306_swap_data(x1, x2, lcdint_t); + } + ssd1306_lcd.set_block(x1, y1, x2 - x1 + 1); + uint16_t count = (x2 - x1 + 1) * (y2 - y1 + 1); + while (count--) + { + ssd1306_lcd.send_pixels8( ssd1306_color ); + } + ssd1306_intf.stop(); +} + +void ssd1306_drawMonoBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + uint8_t bit = 1; + uint8_t blackColor = s_ssd1306_invertByte ? ssd1306_color : 0x00; + uint8_t color = s_ssd1306_invertByte ? 0x00 : ssd1306_color; + ssd1306_lcd.set_block(xpos, ypos, w); + while (h--) + { + lcduint_t wx = w; + while ( wx-- ) + { + uint8_t data = pgm_read_byte( bitmap ); + if ( data & bit ) + ssd1306_lcd.send_pixels8( color ); + else + ssd1306_lcd.send_pixels8( blackColor ); + bitmap++; + } + bit <<= 1; + if ( bit == 0 ) + { + bit = 1; + } + else + { + bitmap -= w; + } + } + ssd1306_intf.stop(); +} + +void ssd1306_drawBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + ssd1306_lcd.set_block(xpos, ypos, w); + uint32_t count = (w) * (h); + while (count--) + { + ssd1306_lcd.send_pixels8( pgm_read_byte( bitmap ) ); + bitmap++; + } + ssd1306_intf.stop(); +} + +void ssd1306_clearBlock8(uint8_t x, uint8_t y, uint8_t w, uint8_t h) +{ + ssd1306_lcd.set_block(x, y, w); + uint32_t count = w * h; + while (count--) + { + ssd1306_lcd.send_pixels8( 0x00 ); + } + ssd1306_intf.stop(); +} + +void ssd1306_setCursor8(lcduint_t x, lcduint_t y) +{ + ssd1306_cursorX = x; + ssd1306_cursorY = y; +} + +void ssd1306_printChar8(uint8_t c) +{ + uint16_t unicode = ssd1306_unicode16FromUtf8(c); + if (unicode == SSD1306_MORE_CHARS_REQUIRED) return; + SCharInfo char_info; + ssd1306_getCharBitmap(unicode, &char_info); + ssd1306_drawMonoBitmap8(ssd1306_cursorX, + ssd1306_cursorY, + char_info.width, + char_info.height, + char_info.glyph ); +} + +size_t ssd1306_write8(uint8_t ch) +{ + if (ch == '\r') + { + ssd1306_cursorX = 0; + return 0; + } + SCharInfo char_info; + uint8_t gotoNewLine = 1; + if (ch != '\n') + { + uint16_t unicode; + unicode = ssd1306_unicode16FromUtf8(ch); + if (unicode == SSD1306_MORE_CHARS_REQUIRED) return 0; + ssd1306_getCharBitmap(unicode, &char_info); + gotoNewLine = (ssd1306_cursorX > (ssd1306_lcd.width - char_info.width)); + } + if ( gotoNewLine ) + { + ssd1306_cursorX = 0; + ssd1306_cursorY += s_fixedFont.h.height; + if ( ssd1306_cursorY > ssd1306_lcd.height - s_fixedFont.h.height ) + { + ssd1306_cursorY = 0; + } + ssd1306_clearBlock8(0, ssd1306_cursorY, ssd1306_lcd.width, s_fixedFont.h.height); + if (ch == '\n') + { + return 0; + } + } + if ( 1 ) + { + uint8_t color = ssd1306_color; + ssd1306_color = s_ssd1306_invertByte ? color : 0x00; + ssd1306_fillRect8( ssd1306_cursorX, ssd1306_cursorY, + ssd1306_cursorX + char_info.width + char_info.spacing - 1, + ssd1306_cursorY + s_fixedFont.h.height - 1 ); + ssd1306_color = color; + } + ssd1306_drawMonoBitmap8( ssd1306_cursorX, + ssd1306_cursorY, + char_info.width, + char_info.height, + char_info.glyph); + ssd1306_cursorX += char_info.width + char_info.spacing; + return 1; +} + +size_t ssd1306_print8(const char ch[]) +{ + size_t n = 0; + while (*ch) + { + n += ssd1306_write8(*ch); + ch++; + } + return n; +} + +uint8_t ssd1306_printFixed8(lcdint_t x, lcdint_t y, const char *ch, EFontStyle style) +{ + ssd1306_cursorX = x; + ssd1306_cursorY = y; + return ssd1306_print8(ch); +} + + diff --git a/lib/libssd1306/src/ssd1306_8bit.h b/lib/libssd1306/src/ssd1306_8bit.h new file mode 100644 index 0000000..20651a5 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_8bit.h @@ -0,0 +1,426 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_8bit.h 8-bit specific draw functions + */ + +#ifndef _SSD1306_8BIT_H_ +#define _SSD1306_8BIT_H_ + +#include "nano_gfx_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////// +// DIRECT GRAPH FUNCTIONS +/////////////////////////////////////////////////////////////////////// + +/** + * @defgroup LCD_8BIT_GRAPHICS DIRECT DRAW: 8-bit API functions only for color displays + * @{ + * + * @brief LCD direct draw functions only for color display. + * + * @details LCD direct draw functions are applicable for color display types. These functions will NOT work + * in ssd1306 compatible mode. Use ssd1306_setMode() function to change display mode to NORMAL. + * You can combine combine NanoEngine capabilities with these functions. + * Direct draw functions draw directly in GDRAM and do not use any double-buffering. + */ + +/** + * @brief Sets default color, generated by RGB_COLOR8 or RGB_COLOR16 macros + * + * Sets color generated by RGB_COLOR8 or RGB_COLOR16 macros. + * + * @param color - new color to use for monochrome-specific operations on color display. + */ +void ssd1306_setColor(uint16_t color); + +/** + * @brief Sets default color. + * + * Sets default color for monochrome operations. + * For now this function supports only 8-bit RGB mode. + * To work with RGB colors in 16-bit mode, please refer to ssd1306_setColor() function + * and RGB_COLOR16 macros. + * @param r - red in 0-255 range. + * @param g - green in 0-255 range. + * @param b - blue in 0-255 range. + */ +void ssd1306_setRgbColor(uint8_t r, uint8_t g, uint8_t b); + +/** + * @brief Sets default color. + * + * Sets default color for monochrome operations. + * For now this function supports only 8-bit RGB mode. + * To work with RGB colors in 16-bit mode, please refer to ssd1306_setColor() function + * and RGB_COLOR16 macros. + * @param r - red in 0-255 range. + * @param g - green in 0-255 range. + * @param b - blue in 0-255 range. + */ +void ssd1306_setRgbColor8(uint8_t r, uint8_t g, uint8_t b); + +/** + * Draws 1-bit bitmap, located in SRAM, on the display + * Each bit represents separate pixel: refer to ssd1306 datasheet for more information. + * + * @param xpos horizontal position in pixels + * @param ypos vertical position in pixels + * @param w width of bitmap in pixels + * @param h height of bitmap in pixels + * @param bitmap pointer to data, located in SRAM. + */ +void ssd1306_drawMonoBuffer8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + +/** + * Draws 8-bit bitmap, located in SRAM, on the display + * Each byte represents separate pixel: refer to RGB_COLOR8 to understand RGB scheme, being used. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels + * @param data - pointer to data, located in SRAM. + */ +void ssd1306_drawBufferFast8(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *data); + +/** + * Draws 8-bit bitmap, located in SRAM, on the display, taking into account pitch parameter. + * Each byte represents separate pixel: refer to RGB_COLOR8 to understand RGB scheme, being used. + * pitch parameter specifies, length of single line in bytes. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param w - width of bitmap in pixels + * @param h - height of bitmap in pixels + * @param pitch length of bitmap buffer line in bytes + * @param data - pointer to data, located in SRAM. + */ +void ssd1306_drawBufferEx8(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, lcduint_t pitch, const uint8_t *data); + +/** + * Fills screen with pattern byte + * + * @param fill_Data pattern color to fill screen with + */ +void ssd1306_fillScreen8(uint8_t fill_Data); + +/** + * Fills screen with zero-byte + */ +void ssd1306_clearScreen8(void); + +/** + * Puts single color point directly in OLED display GDRAM. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_putPixel8(lcdint_t x, lcdint_t y); + +/** + * Puts single color point directly in OLED display GDRAM. + * + * @param x - horizontal position in pixels + * @param y - vertical position in pixels + * @param color color in RGB8 format (2-3-2) + */ +void ssd1306_putColorPixel8(lcdint_t x, lcdint_t y, uint8_t color); + +/** + * Draw vertical line directly in OLED display GDRAM. + * + * @param x1 - horizontal position in pixels + * @param y1 - top vertical position in pixels + * @param y2 - bottom vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawVLine8(lcdint_t x1, lcdint_t y1, lcdint_t y2); + +/** + * Draw horizontal line directly in OLED display GDRAM. + * + * @param x1 - left position in pixels + * @param y1 - vertical vertical position in pixels + * @param x2 - right position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawHLine8(lcdint_t x1, lcdint_t y1, lcdint_t x2); + +/** + * Draw line directly in OLED display GDRAM. + * This is software implementation. Some OLED controllers have hardware implementation. + * Refer to datasheet. + * + * @param x1 - start horizontal position in pixels + * @param y1 - start vertical position in pixels + * @param x2 - end horizontal position in pixels + * @param y2 - end vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawLine8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + +/** + * Draw rectangle directly in OLED display GDRAM. + * This is software implementation. Some OLED controllers have hardware implementation. + * Refer to datasheet. + * + * @param x1 - start horizontal position in pixels + * @param y1 - start vertical position in pixels + * @param x2 - end horizontal position in pixels + * @param y2 - end vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawRect8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + +/** + * Fill rectangle directly in OLED display GDRAM. + * This is software implementation. Some OLED controllers have hardware implementation. + * Refer to datasheet. + * + * @param x1 - start horizontal position in pixels + * @param y1 - start vertical position in pixels + * @param x2 - end horizontal position in pixels + * @param y2 - end vertical position in pixels + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_fillRect8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2); + +/** + * Draw monochrome bitmap, located in Flash, directly to OLED display GDRAM. + * The bitmap should be in ssd1306 format (each byte represents 8 vertical pixels) + * + * @param xpos start horizontal position in pixels + * @param ypos start vertical position in pixels + * @param w bitmap width in pixels + * @param h bitmap height in pixels + * @param bitmap pointer to Flash data, containing monochrome bitmap. + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_drawMonoBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + +/** + * Draw 8-bit color bitmap, located in Flash, directly to OLED display GDRAM. + * Each pixel of the bitmap is expected in 3-3-2 format. + * + * @param xpos start horizontal position in pixels + * @param ypos start vertical position in pixels + * @param w bitmap width in pixels + * @param h bitmap height in pixels + * @param bitmap pointer to Flash data, containing 8-bit color bitmap. + */ +void ssd1306_drawBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap); + +/** + * Clears block, filling it with black pixels, directly in OLED display GDRAM. + * + * @param x start horizontal position in pixels + * @param y start vertical position in pixels + * @param w block width in pixels + * @param h block height in pixels + */ +void ssd1306_clearBlock8(uint8_t x, uint8_t y, uint8_t w, uint8_t h); + +/** + * Set cursor position for text functions + * + * @param x horizontal position in pixels. + * @param y vertical position in pixels. + */ +void ssd1306_setCursor8(lcduint_t x, lcduint_t y); + +/** + * Draws single character to canvas. Cursor position is defined + * by ssd1306_setCursor8(). Do not changes cursor position + * + * @param c - character code to print + * + * @note set color with ssd1306_setColor() function. + */ +void ssd1306_printChar8(uint8_t c); + +/** + * @brief Prints single character to display at current cursor position + * + * Prints single character to display at current cursor position. + * Cursor position can be set by ssd1306_setCursor8(). + * + * @param ch - character to print to the display. 'LF' and 'CR' are skipped + * @return returns number of printed characters. + */ +size_t ssd1306_write8(uint8_t ch); + +/** + * @brief Prints null-terminated string to display at current cursor position + * + * Prints null-terminated string to display at current cursor position + * Cursor position can be set by ssd1306_setCursor8(). + * + * @param ch - string to print to the display. 'LF' and 'CR' are skipped + * @return returns number of printed characters. + */ +size_t ssd1306_print8(const char ch[]); + +/** + * Prints text to screen using fixed font. + * @param x horizontal position in pixels + * @param y vertical position in pixels + * @param ch NULL-terminated string to print + * @param style font style (EFontStyle), normal by default (not implemented). + * @returns number of chars in string + * + * @see ssd1306_setFixedFont + * @note set color with ssd1306_setColor() function. + */ +uint8_t ssd1306_printFixed8(lcdint_t x, lcdint_t y, const char *ch, EFontStyle style); + + +#ifndef DOXYGEN_SHOULD_SKIP_THIS + +///////////////////////////////////////////////////////////////////////////////// +// FUNCTIONS BELOW ARE ONLY FOR COMPATIBILITY WITH PREVIOUSE VERSIONS OF LIBRARY + +static inline void ssd1331_setColor(uint16_t color) +{ + ssd1306_setColor(color); +} + +static inline void ssd1331_setRgbColor(uint8_t r, uint8_t g, uint8_t b) +{ + ssd1306_setRgbColor(r, g, b); +} + +static inline void ssd1331_drawMonoBuffer8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + ssd1306_drawMonoBuffer8(xpos, ypos, w, h, bitmap); +} + +static inline void ssd1331_drawBufferFast8(lcdint_t x, lcdint_t y, lcduint_t w, lcduint_t h, const uint8_t *data) +{ + ssd1306_drawBufferFast8(x, y, w, h, data); +} + +static inline void ssd1331_fillScreen8(uint8_t fill_Data) +{ + ssd1306_fillScreen8(fill_Data); +} + +static inline void ssd1331_clearScreen8(void) +{ + ssd1306_clearScreen8(); +} + +static inline void ssd1331_putPixel8(lcdint_t x, lcdint_t y) +{ + ssd1306_putPixel8(x, y); +} + +static inline void ssd1331_drawVLine8(lcdint_t x1, lcdint_t y1, lcdint_t y2) +{ + ssd1306_drawVLine8(x1, y1, y2); +} + +static inline void ssd1331_drawHLine8(lcdint_t x1, lcdint_t y1, lcdint_t x2) +{ + ssd1306_drawHLine8(x1, y1, x2); +} + +static inline void ssd1331_drawLine8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + ssd1306_drawLine8(x1, y1, x2, y2); +} + +static inline void ssd1331_drawRect8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + ssd1306_drawRect8(x1, y1, x2, y2); +} + +static inline void ssd1331_fillRect8(lcdint_t x1, lcdint_t y1, lcdint_t x2, lcdint_t y2) +{ + ssd1306_fillRect8(x1, y1, x2, y2); +} + +static inline void ssd1331_drawMonoBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + ssd1306_drawMonoBitmap8(xpos, ypos, w, h, bitmap); +} + +static inline void ssd1331_drawBitmap8(lcdint_t xpos, lcdint_t ypos, lcduint_t w, lcduint_t h, const uint8_t *bitmap) +{ + ssd1306_drawBitmap8(xpos, ypos, w, h, bitmap); +} + +static inline void ssd1331_clearBlock8(uint8_t x, uint8_t y, uint8_t w, uint8_t h) +{ + ssd1306_clearBlock8(x, y, w, h); +} + +static inline void ssd1331_setCursor8(lcduint_t x, lcduint_t y) +{ + ssd1306_setCursor8(x, y); +} + +static inline void ssd1331_printChar8(uint8_t c) +{ + ssd1306_printChar8(c); +} + +static inline size_t ssd1331_write8(uint8_t ch) +{ + return ssd1306_write8(ch); +} + +static inline size_t ssd1331_print8(const char ch[]) +{ + return ssd1306_print8(ch); +} + +static inline uint8_t ssd1331_printFixed8(lcdint_t x, lcdint_t y, const char *ch, EFontStyle style) +{ + return ssd1306_printFixed8(x, y, ch, style); +} + +#endif + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif // _SSD1306_8BIT_H_ diff --git a/lib/libssd1306/src/ssd1306_console.cpp b/lib/libssd1306/src/ssd1306_console.cpp new file mode 100644 index 0000000..0502640 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_console.cpp @@ -0,0 +1,91 @@ +/* + MIT License + + Copyright (c) 2017-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_console.h" + +extern lcduint_t ssd1306_cursorX; +extern lcduint_t ssd1306_cursorY; +extern SFixedFontInfo s_fixedFont; + +#define SSD1306_MAX_SCAN_LINES 64 + +size_t ssd1306_consoleWriter(uint8_t ch) +{ + if (ch == '\r') + { + ssd1306_cursorX = 0; + return 0; + } + else if ( (ssd1306_cursorX > ssd1306_lcd.width - s_fixedFont.h.width) || (ch == '\n') ) + { + ssd1306_cursorX = 0; + ssd1306_cursorY += s_fixedFont.h.height; + uint8_t bottomScanLine = ssd1306_getStartLine() + ssd1306_lcd.height; + if ( bottomScanLine > SSD1306_MAX_SCAN_LINES ) + { + bottomScanLine -= SSD1306_MAX_SCAN_LINES; + } + if ( ssd1306_cursorY >= bottomScanLine ) + { + uint8_t lcd_offset = ssd1306_getStartLine() + s_fixedFont.h.height; + if ( lcd_offset >= SSD1306_MAX_SCAN_LINES ) + { + lcd_offset -= SSD1306_MAX_SCAN_LINES; + } + ssd1306_setStartLine( lcd_offset ); + } + if ( ssd1306_cursorY >= SSD1306_MAX_SCAN_LINES ) + { + ssd1306_cursorY -= SSD1306_MAX_SCAN_LINES; + } + ssd1306_clearBlock(0, ssd1306_cursorY >> 3, ssd1306_lcd.width, s_fixedFont.h.height); + if (ch == '\n') + { + return 0; + } + } + uint16_t unicode = ssd1306_unicode16FromUtf8(ch); + if (unicode == SSD1306_MORE_CHARS_REQUIRED) return 0; + SCharInfo char_info; + ssd1306_getCharBitmap(unicode, &char_info); + ssd1306_drawBitmap( ssd1306_cursorX, + ssd1306_cursorY >> 3, + char_info.width, + char_info.height, + char_info.glyph ); + ssd1306_cursorX += char_info.width + char_info.spacing; + return 1; +} + +void Ssd1306Console::clear() +{ + ssd1306_clearScreen(); + setCursor(0,0); +} + +void Ssd1306Console::setCursor(lcduint_t x, lcduint_t y) +{ + ssd1306_setCursor8(x,y); +} + diff --git a/lib/libssd1306/src/ssd1306_console.h b/lib/libssd1306/src/ssd1306_console.h new file mode 100644 index 0000000..2809afd --- /dev/null +++ b/lib/libssd1306/src/ssd1306_console.h @@ -0,0 +1,116 @@ +/* + MIT License + + Copyright (c) 2017-2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_console.h This is for console + */ + +#ifndef _SSD1306_CONSOLE_H_ +#define _SSD1306_CONSOLE_H_ + +#include "ssd1306.h" +#include "ssd1306_hal/io.h" +#include "ssd1306_hal/Print_internal.h" + +/** + * Callback function to print text to the LCD display + */ +typedef size_t (*LcdWriter)(uint8_t ch); + +/** + * Base template class for specific LCD console implementation + */ +template <LcdWriter W> +class LcdConsole: public Print +{ +public: + /** + * Creates console object to print text information on LCD display. + */ + explicit LcdConsole( ) { }; + + /** + * Initializes console. + */ + void begin() + { + } + + /** + * Writes single character to the display + * @param ch - character to write + */ + size_t write(uint8_t ch) override + { + return W(ch); + } + +private: + +}; + +/** + * ssd1306 console support function. + * @param ch character to print + * @warning only for SSD1306 based displays + */ +size_t ssd1306_consoleWriter(uint8_t ch); + +/** + * Ssd1306Console represents object to work with LCD display. + * Easy to use: + * ~~~~~~~~~~~~~~~{.cpp} + * Ssd1306Console console; + * void setup() + * { + * ssd1306_128x64_spi_init(3, 4, 5); + * ssd1306_clearScreen(); + * console.print( "Hello" ); + * } + * ~~~~~~~~~~~~~~~ + */ +class Ssd1306Console: public LcdConsole<ssd1306_consoleWriter> +{ +public: + using LcdConsole::LcdConsole; + + /** + * Fills screen with zero-byte and sets + * cursor position to top-left corner of the screen. + */ + void clear(); + + /** + * Set cursor position for text functions + * + * @param x horizontal position in pixels. + * @param y vertical position in pixels. + */ + void setCursor(lcduint_t x, lcduint_t y); + +private: + +}; + +#endif + diff --git a/lib/libssd1306/src/ssd1306_fonts.c b/lib/libssd1306/src/ssd1306_fonts.c new file mode 100644 index 0000000..d442ad1 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_fonts.c @@ -0,0 +1,1355 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/* + * ssd1306xled_font6x8 is by Neven Boyanov + * ssd1306xled_font8x16 is by Neven Boyanov + * + * @created: 2014-08-12 + * @author: Neven Boyanov + * + * Copyright (c) 2015 Neven Boyanov, Tinusaur Team. All Rights Reserved. + * Distributed as open source software under MIT License, see LICENSE.txt file. + * Please, as a favour, retain the link http://tinusaur.org to The Tinusaur Project. + * + * Source code available at: https://bitbucket.org/tinusaur/ssd1306xled + * + */ + +#include "ssd1306_fonts.h" + +/* Standard ASCII 6x8 font */ +const PROGMEM uint8_t ssd1306xled_font6x8 []= +{ + 0x00, 0x06, 0x08, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sp + 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, // ! + 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // " + 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14, // # + 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12, // $ + 0x00, 0x23, 0x13, 0x08, 0x64, 0x62, // % + 0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // & + 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // ' + 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00, // ( + 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00, // ) + 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // * + 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // + + 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // , + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // - + 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // . + 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // / + 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 + 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 1 + 0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 2 + 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 3 + 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 4 + 0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 5 + 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6 + 0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 7 + 0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 8 + 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 9 + 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // : + 0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // ; + 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // < + 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // = + 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // > + 0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // ? + 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // @ + 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // A + 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // B + 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // C + 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // D + 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // E + 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // F + 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // G + 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // H + 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // I + 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // J + 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // K + 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // L + 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M + 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // N + 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // O + 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // P + 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q + 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // R + 0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // S + 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // T + 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // U + 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // V + 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // W + 0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // X + 0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // Y + 0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // Z + 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // [ + 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55, // 55 + 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // ] + 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // ^ + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // _ + 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, // ' + 0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // a + 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, // b + 0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // c + 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // d + 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // e + 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // f + 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // g + 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // h + 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // i + 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // j + 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // k + 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // l + 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // m + 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // n + 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // o + 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // p + 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // q + 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // r + 0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // s + 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // t + 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // u + 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // v + 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // w + 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // x + 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // y + 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // z + 0x00, 0x00, 0x08, 0x77, 0x00, 0x00, // { + 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, // | + 0x00, 0x00, 0x77, 0x08, 0x00, 0x00, // } + 0x00, 0x10, 0x08, 0x10, 0x08, 0x00, // ~ + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // horiz lines // DEL + 0x00 /* This byte is required for italic type of font */ +}; + +const PROGMEM uint8_t ssd1306xled_font8x16[] = { + 0x00, // 0x00 means fixed font type - the only supported by the library + 0x08, // 0x08 = 8 - font width in pixels + 0x10, // 0x10 = 16 - font height in pixels + 0x20, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0 + 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 0x00, // ! 1 + 0x00, 0x10, 0x0C, 0x06, 0x10, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // " 2 + 0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x40, 0x00, 0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x04, 0x00, // # 3 + 0x00, 0x70, 0x88, 0xFC, 0x08, 0x30, 0x00, 0x00, 0x00, 0x18, 0x20, 0xFF, 0x21, 0x1E, 0x00, 0x00, // $ 4 + 0xF0, 0x08, 0xF0, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x21, 0x1C, 0x03, 0x1E, 0x21, 0x1E, 0x00, // % 5 + 0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, 0x1E, 0x21, 0x23, 0x24, 0x19, 0x27, 0x21, 0x10, // & 6 + 0x10, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ' 7 + 0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00, // ( 8 + 0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, // ) 9 + 0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00, 0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00, // * 10 + 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x00, // + 11 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, // , 12 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // - 13 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // . 14 + 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x04, 0x00, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, // / 15 + 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, // 0 16 + 0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // 1 17 + 0x00, 0x70, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, // 2 18 + 0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00, 0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, // 3 19 + 0x00, 0x00, 0xC0, 0x20, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x04, 0x24, 0x24, 0x3F, 0x24, 0x00, // 4 20 + 0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00, // 5 21 + 0x00, 0xE0, 0x10, 0x88, 0x88, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, // 6 22 + 0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, // 7 23 + 0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, // 8 24 + 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00, // 9 25 + 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, // : 26 + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, // ; 27 + 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, // < 28 + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, // = 29 + 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, // > 30 + 0x00, 0x70, 0x48, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x36, 0x01, 0x00, 0x00, // ? 31 + 0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00, 0x07, 0x18, 0x27, 0x24, 0x23, 0x14, 0x0B, 0x00, // @ 32 + 0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, // A 33 + 0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, // B 34 + 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, // C 35 + 0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, // D 36 + 0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, // E 37 + 0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, // F 38 + 0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, // G 39 + 0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, // H 40 + 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // I 41 + 0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, // J 42 + 0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00, 0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, // K 43 + 0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, // L 44 + 0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x20, 0x00, // M 45 + 0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, // N 46 + 0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, // O 47 + 0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, // P 48 + 0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x18, 0x24, 0x24, 0x38, 0x50, 0x4F, 0x00, // Q 49 + 0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, // R 50 + 0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, // S 51 + 0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, // T 52 + 0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, // U 53 + 0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, // V 54 + 0xF8, 0x08, 0x00, 0xF8, 0x00, 0x08, 0xF8, 0x00, 0x03, 0x3C, 0x07, 0x00, 0x07, 0x3C, 0x03, 0x00, // W 55 + 0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08, 0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, // X 56 + 0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, // Y 57 + 0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, // Z 58 + 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, // [ 59 + 0x00, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, // \ 60 + 0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, // ] 61 + 0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ^ 62 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // _ 63 + 0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ` 64 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x19, 0x24, 0x22, 0x22, 0x22, 0x3F, 0x20, // a 65 + 0x08, 0xF8, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, // b 66 + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, // c 67 + 0x00, 0x00, 0x00, 0x80, 0x80, 0x88, 0xF8, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x10, 0x3F, 0x20, // d 68 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x22, 0x22, 0x22, 0x13, 0x00, // e 69 + 0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x18, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // f 70 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, // g 71 + 0x08, 0xF8, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, // h 72 + 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // i 73 + 0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, // j 74 + 0x08, 0xF8, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x24, 0x02, 0x2D, 0x30, 0x20, 0x00, // k 75 + 0x00, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // l 76 + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, // m 77 + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, // n 78 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, // o 79 + 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xA1, 0x20, 0x20, 0x11, 0x0E, 0x00, // p 80 + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0xA0, 0xFF, 0x80, // q 81 + 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, // r 82 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, // s 83 + 0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x00, 0x00, // t 84 + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, // u 85 + 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x01, 0x0E, 0x30, 0x08, 0x06, 0x01, 0x00, // v 86 + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x0F, 0x30, 0x0C, 0x03, 0x0C, 0x30, 0x0F, 0x00, // w 87 + 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x31, 0x2E, 0x0E, 0x31, 0x20, 0x00, // x 88 + 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x8E, 0x70, 0x18, 0x06, 0x01, 0x00, // y 89 + 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, // z 90 + 0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, // { 91 + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, // | 92 + 0x00, 0x02, 0x02, 0x7C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, // } 93 + 0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ~ 94 +}; + +const PROGMEM uint8_t ssd1306xled_font6x8_German []= +{ + 0x01, 0x06, 0x08, 0x20, + 0x00, 0xE4, 0x01, // Ulmaute unicode + 0x38, 0x45, 0x44, 0x39, 0x44, 0x00, // ä + 0x00, 0xF6, 0x01, + 0x38, 0x45, 0x44, 0x45, 0x38, 0x00, // ö + 0x00, 0xFC, 0x01, + 0x3C, 0x41, 0x40, 0x41, 0x3C, 0x00, // ü + 0x00, 0xC4, 0x01, + 0x00, 0xF0, 0x29, 0x24, 0x29, 0xF0, // Ä + 0x00, 0xD6, 0x01, + 0x00, 0x78, 0x85, 0x84, 0x85, 0x78, // Ö + 0x00, 0xDC, 0x01, + 0x00, 0x7C, 0x81, 0x80, 0x81, 0x7C, // Ü + 0x00, 0x00, 0x00, // End of unicode tables +}; + +/* Standard ASCII 6x8_AB font */ +const PROGMEM uint8_t ssd1306xled_font6x8_AB []= +{ + 0x00, 0x06, 0x08, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sp + 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, // ! + 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // " + 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14, // # + 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12, // $ + 0x00, 0x23, 0x13, 0x08, 0x64, 0x62, // % + 0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // & + 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // ' + 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00, // ( + 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00, // ) + 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // * + 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // + + 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // , + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // - + 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // . + 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // / + 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 + 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 1 + 0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 2 + 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 3 + 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 4 + 0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 5 + 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6 + 0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 7 + 0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 8 + 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 9 + 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // : + 0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // ; + 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // < + 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // = + 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // > + 0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // ? + 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // @ + 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // A + 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // B + 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // C + 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // D + 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // E + 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // F + 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // G + 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // H + 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // I + 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // J + 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // K + 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // L + 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M + 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // N + 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // O + 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // P + 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q + 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // R + 0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // S + 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // T + 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // U + 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // V + 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // W + 0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // X + 0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // Y + 0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // Z + 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // [ + 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55, // 55 + 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // ] + 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // ^ + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // _ + 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, // ' + 0x00 /* This byte is required for italic type of font */ +}; + +const uint8_t digital_font5x7_123[] PROGMEM = +{ + 0x00, 0x05, 0x07, 0x30, + 0x36, 0x41, 0x41, 0x36, 0x00, // char '0' (0x30/48) + 0x00, 0x00, 0x00, 0x36, 0x00, // char '1' (0x31/49) + 0x30, 0x49, 0x49, 0x06, 0x00, // char '2' (0x32/50) + 0x00, 0x49, 0x49, 0x36, 0x00, // char '3' (0x33/51) + 0x06, 0x08, 0x08, 0x36, 0x00, // char '4' (0x34/52) + 0x06, 0x49, 0x49, 0x30, 0x00, // char '5' (0x35/53) + 0x36, 0x49, 0x49, 0x30, 0x00, // char '6' (0x36/54) + 0x00, 0x01, 0x01, 0x36, 0x00, // char '7' (0x37/55) + 0x36, 0x49, 0x49, 0x36, 0x00, // char '8' (0x38/56) + 0x06, 0x49, 0x49, 0x36, 0x00, // char '9' (0x39/57) +}; + +const uint8_t digital_font5x7[] PROGMEM = +{ + 0x00, 0x05, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, // char ' ' (0x20/32) + 0x00, 0x00, 0x2E, 0x00, 0x00, // char '!' (0x21/33) + 0x06, 0x00, 0x06, 0x00, 0x00, // char '"' (0x22/34) + 0x14, 0x7F, 0x14, 0x7F, 0x14, // char '#' (0x23/35) + 0x06, 0x49, 0x7F, 0x49, 0x30, // char '$' (0x24/36) + 0x24, 0x10, 0x08, 0x24, 0x00, // char '%' (0x25/37) + 0x36, 0x49, 0x36, 0x50, 0x00, // char '&' (0x26/38) + 0x00, 0x00, 0x00, 0x06, 0x00, // char ''' (0x27/39) + 0x00, 0x41, 0x36, 0x00, 0x00, // char '(' (0x28/40) + 0x00, 0x36, 0x41, 0x00, 0x00, // char ')' (0x29/41) + 0x00, 0x08, 0x00, 0x00, 0x00, // char '*' (0x2A/42) + 0x00, 0x08, 0x1C, 0x08, 0x00, // char '+' (0x2B/43) + 0x40, 0x20, 0x00, 0x00, 0x00, // char ',' (0x2C/44) + 0x00, 0x08, 0x08, 0x00, 0x00, // char '-' (0x2D/45) + 0x20, 0x00, 0x00, 0x00, 0x00, // char '.' (0x2E/46) + 0x00, 0x30, 0x06, 0x00, 0x00, // char '/' (0x2F/47) + 0x36, 0x41, 0x41, 0x36, 0x00, // char '0' (0x30/48) + 0x00, 0x00, 0x00, 0x36, 0x00, // char '1' (0x31/49) + 0x30, 0x49, 0x49, 0x06, 0x00, // char '2' (0x32/50) + 0x00, 0x49, 0x49, 0x36, 0x00, // char '3' (0x33/51) + 0x06, 0x08, 0x08, 0x36, 0x00, // char '4' (0x34/52) + 0x06, 0x49, 0x49, 0x30, 0x00, // char '5' (0x35/53) + 0x36, 0x49, 0x49, 0x30, 0x00, // char '6' (0x36/54) + 0x00, 0x01, 0x01, 0x36, 0x00, // char '7' (0x37/55) + 0x36, 0x49, 0x49, 0x36, 0x00, // char '8' (0x38/56) + 0x06, 0x49, 0x49, 0x36, 0x00, // char '9' (0x39/57) + 0x00, 0x14, 0x00, 0x00, 0x00, // char ':' (0x3A/58) + 0x20, 0x14, 0x00, 0x00, 0x00, // char ';' (0x3B/59) + 0x00, 0x08, 0x14, 0x22, 0x00, // char '<' (0x3C/60) + 0x00, 0x14, 0x14, 0x14, 0x00, // char '=' (0x3D/61) + 0x00, 0x22, 0x14, 0x08, 0x00, // char '>' (0x3E/62) + 0x00, 0x01, 0x31, 0x06, 0x00, // char '?' (0x3F/63) + 0x36, 0x49, 0x55, 0x59, 0x2E, // char '@' (0x40/64) + 0x36, 0x09, 0x09, 0x36, 0x00, // char 'A' (0x41/65) + 0x77, 0x49, 0x49, 0x36, 0x00, // char 'B' (0x42/66) + 0x36, 0x41, 0x41, 0x00, 0x00, // char 'C' (0x43/67) + 0x77, 0x41, 0x41, 0x36, 0x00, // char 'D' (0x44/68) + 0x36, 0x49, 0x49, 0x00, 0x00, // char 'E' (0x45/69) + 0x36, 0x09, 0x09, 0x00, 0x00, // char 'F' (0x46/70) + 0x36, 0x41, 0x51, 0x30, 0x00, // char 'G' (0x47/71) + 0x36, 0x08, 0x08, 0x36, 0x00, // char 'H' (0x48/72) + 0x00, 0x00, 0x36, 0x00, 0x00, // char 'I' (0x49/73) + 0x00, 0x40, 0x40, 0x36, 0x00, // char 'J' (0x4A/74) + 0x36, 0x08, 0x14, 0x22, 0x00, // char 'K' (0x4B/75) + 0x36, 0x40, 0x40, 0x00, 0x00, // char 'L' (0x4C/76) + 0x36, 0x01, 0x06, 0x01, 0x36, // char 'M' (0x4D/77) + 0x36, 0x04, 0x10, 0x36, 0x00, // char 'N' (0x4E/78) + 0x36, 0x41, 0x41, 0x36, 0x00, // char 'O' (0x4F/79) + 0x36, 0x09, 0x09, 0x06, 0x00, // char 'P' (0x50/80) + 0x36, 0x41, 0x21, 0x56, 0x00, // char 'Q' (0x51/81) + 0x36, 0x09, 0x19, 0x26, 0x00, // char 'R' (0x52/82) + 0x06, 0x49, 0x49, 0x30, 0x00, // char 'S' (0x53/83) + 0x00, 0x01, 0x37, 0x01, 0x00, // char 'T' (0x54/84) + 0x36, 0x40, 0x40, 0x36, 0x00, // char 'U' (0x55/85) + 0x36, 0x40, 0x36, 0x00, 0x00, // char 'V' (0x56/86) + 0x36, 0x40, 0x30, 0x40, 0x36, // char 'W' (0x57/87) + 0x36, 0x08, 0x08, 0x36, 0x00, // char 'X' (0x58/88) + 0x06, 0x48, 0x48, 0x36, 0x00, // char 'Y' (0x59/89) + 0x20, 0x51, 0x49, 0x45, 0x02, // char 'Z' (0x5A/90) + 0x77, 0x41, 0x41, 0x00, 0x00, // char '[' (0x5B/91) + 0x00, 0x06, 0x30, 0x00, 0x00, // char '\' (0x5C/92) + 0x00, 0x41, 0x41, 0x77, 0x00, // char ']' (0x5D/93) + 0x00, 0x02, 0x01, 0x02, 0x00, // char '^' (0x5E/94) + 0x00, 0x40, 0x40, 0x00, 0x00, // char '_' (0x5F/95) + 0x00, 0x01, 0x02, 0x00, 0x00, // char '`' (0x60/96) + 0x20, 0x54, 0x54, 0x38, 0x40, // char 'a' (0x61/97) + 0x00, 0x36, 0x48, 0x30, 0x00, // char 'b' (0x62/98) + 0x30, 0x48, 0x48, 0x00, 0x00, // char 'c' (0x63/99) + 0x30, 0x48, 0x48, 0x76, 0x00, // char 'd' (0x64/100) + 0x38, 0x54, 0x54, 0x08, 0x00, // char 'e' (0x65/101) + 0x08, 0x6C, 0x0A, 0x00, 0x00, // char 'f' (0x66/102) + 0x08, 0x54, 0x54, 0x38, 0x00, // char 'g' (0x67/103) + 0x36, 0x08, 0x08, 0x30, 0x00, // char 'h' (0x68/104) + 0x00, 0x34, 0x00, 0x00, 0x00, // char 'i' (0x69/105) + 0x00, 0x40, 0x34, 0x00, 0x00, // char 'j' (0x6A/106) + 0x36, 0x10, 0x28, 0x00, 0x00, // char 'k' (0x6B/107) + 0x36, 0x00, 0x00, 0x00, 0x00, // char 'l' (0x6C/108) + 0x30, 0x08, 0x10, 0x08, 0x30, // char 'm' (0x6D/109) + 0x30, 0x08, 0x08, 0x30, 0x00, // char 'n' (0x6E/110) + 0x30, 0x48, 0x48, 0x30, 0x00, // char 'o' (0x6F/111) + 0x78, 0x14, 0x14, 0x08, 0x00, // char 'p' (0x70/112) + 0x08, 0x14, 0x14, 0x68, 0x00, // char 'q' (0x71/113) + 0x30, 0x08, 0x08, 0x00, 0x00, // char 'r' (0x72/114) + 0x08, 0x54, 0x54, 0x20, 0x00, // char 's' (0x73/115) + 0x08, 0x2C, 0x48, 0x00, 0x00, // char 't' (0x74/116) + 0x30, 0x40, 0x40, 0x30, 0x00, // char 'u' (0x75/117) + 0x30, 0x40, 0x30, 0x00, 0x00, // char 'v' (0x76/118) + 0x30, 0x40, 0x20, 0x40, 0x30, // char 'w' (0x77/119) + 0x28, 0x10, 0x10, 0x28, 0x00, // char 'x' (0x78/120) + 0x08, 0x50, 0x50, 0x38, 0x00, // char 'y' (0x79/121) + 0x24, 0x34, 0x2C, 0x24, 0x00, // char 'z' (0x7A/122) + 0x08, 0x36, 0x41, 0x00, 0x00, // char '{' (0x7B/123) + 0x00, 0x36, 0x00, 0x00, 0x00, // char '|' (0x7C/124) + 0x00, 0x41, 0x36, 0x08, 0x00, // char '}' (0x7D/125) + 0x08, 0x08, 0x10, 0x10, 0x00, // char '~' (0x7E/126) + 0x36, 0x41, 0x36, 0x00, 0x00, // char '' (0x7F/127) +}; + +const uint8_t digital_font5x7_AB[] PROGMEM = +{ + 0x00, 0x05, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, // char ' ' (0x20/32) + 0x00, 0x00, 0x2E, 0x00, 0x00, // char '!' (0x21/33) + 0x06, 0x00, 0x06, 0x00, 0x00, // char '"' (0x22/34) + 0x14, 0x7F, 0x14, 0x7F, 0x14, // char '#' (0x23/35) + 0x06, 0x49, 0x7F, 0x49, 0x30, // char '$' (0x24/36) + 0x24, 0x10, 0x08, 0x24, 0x00, // char '%' (0x25/37) + 0x36, 0x49, 0x36, 0x50, 0x00, // char '&' (0x26/38) + 0x00, 0x00, 0x00, 0x06, 0x00, // char ''' (0x27/39) + 0x00, 0x41, 0x36, 0x00, 0x00, // char '(' (0x28/40) + 0x00, 0x36, 0x41, 0x00, 0x00, // char ')' (0x29/41) + 0x00, 0x08, 0x00, 0x00, 0x00, // char '*' (0x2A/42) + 0x00, 0x08, 0x1C, 0x08, 0x00, // char '+' (0x2B/43) + 0x40, 0x20, 0x00, 0x00, 0x00, // char ',' (0x2C/44) + 0x00, 0x08, 0x08, 0x00, 0x00, // char '-' (0x2D/45) + 0x20, 0x00, 0x00, 0x00, 0x00, // char '.' (0x2E/46) + 0x00, 0x30, 0x06, 0x00, 0x00, // char '/' (0x2F/47) + 0x36, 0x41, 0x41, 0x36, 0x00, // char '0' (0x30/48) + 0x00, 0x00, 0x00, 0x36, 0x00, // char '1' (0x31/49) + 0x30, 0x49, 0x49, 0x06, 0x00, // char '2' (0x32/50) + 0x00, 0x49, 0x49, 0x36, 0x00, // char '3' (0x33/51) + 0x06, 0x08, 0x08, 0x36, 0x00, // char '4' (0x34/52) + 0x06, 0x49, 0x49, 0x30, 0x00, // char '5' (0x35/53) + 0x36, 0x49, 0x49, 0x30, 0x00, // char '6' (0x36/54) + 0x00, 0x01, 0x01, 0x36, 0x00, // char '7' (0x37/55) + 0x36, 0x49, 0x49, 0x36, 0x00, // char '8' (0x38/56) + 0x06, 0x49, 0x49, 0x36, 0x00, // char '9' (0x39/57) + 0x00, 0x14, 0x00, 0x00, 0x00, // char ':' (0x3A/58) + 0x20, 0x14, 0x00, 0x00, 0x00, // char ';' (0x3B/59) + 0x00, 0x08, 0x14, 0x22, 0x00, // char '<' (0x3C/60) + 0x00, 0x14, 0x14, 0x14, 0x00, // char '=' (0x3D/61) + 0x00, 0x22, 0x14, 0x08, 0x00, // char '>' (0x3E/62) + 0x00, 0x01, 0x31, 0x06, 0x00, // char '?' (0x3F/63) + 0x36, 0x49, 0x55, 0x59, 0x2E, // char '@' (0x40/64) + 0x36, 0x09, 0x09, 0x36, 0x00, // char 'A' (0x41/65) + 0x77, 0x49, 0x49, 0x36, 0x00, // char 'B' (0x42/66) + 0x36, 0x41, 0x41, 0x00, 0x00, // char 'C' (0x43/67) + 0x77, 0x41, 0x41, 0x36, 0x00, // char 'D' (0x44/68) + 0x36, 0x49, 0x49, 0x00, 0x00, // char 'E' (0x45/69) + 0x36, 0x09, 0x09, 0x00, 0x00, // char 'F' (0x46/70) + 0x36, 0x41, 0x51, 0x30, 0x00, // char 'G' (0x47/71) + 0x36, 0x08, 0x08, 0x36, 0x00, // char 'H' (0x48/72) + 0x00, 0x00, 0x36, 0x00, 0x00, // char 'I' (0x49/73) + 0x00, 0x40, 0x40, 0x36, 0x00, // char 'J' (0x4A/74) + 0x36, 0x08, 0x14, 0x22, 0x00, // char 'K' (0x4B/75) + 0x36, 0x40, 0x40, 0x00, 0x00, // char 'L' (0x4C/76) + 0x36, 0x01, 0x06, 0x01, 0x36, // char 'M' (0x4D/77) + 0x36, 0x04, 0x10, 0x36, 0x00, // char 'N' (0x4E/78) + 0x36, 0x41, 0x41, 0x36, 0x00, // char 'O' (0x4F/79) + 0x36, 0x09, 0x09, 0x06, 0x00, // char 'P' (0x50/80) + 0x36, 0x41, 0x21, 0x56, 0x00, // char 'Q' (0x51/81) + 0x36, 0x09, 0x19, 0x26, 0x00, // char 'R' (0x52/82) + 0x06, 0x49, 0x49, 0x30, 0x00, // char 'S' (0x53/83) + 0x00, 0x01, 0x37, 0x01, 0x00, // char 'T' (0x54/84) + 0x36, 0x40, 0x40, 0x36, 0x00, // char 'U' (0x55/85) + 0x36, 0x40, 0x36, 0x00, 0x00, // char 'V' (0x56/86) + 0x36, 0x40, 0x30, 0x40, 0x36, // char 'W' (0x57/87) + 0x36, 0x08, 0x08, 0x36, 0x00, // char 'X' (0x58/88) + 0x06, 0x48, 0x48, 0x36, 0x00, // char 'Y' (0x59/89) + 0x20, 0x51, 0x49, 0x45, 0x02, // char 'Z' (0x5A/90) + 0x77, 0x41, 0x41, 0x00, 0x00, // char '[' (0x5B/91) + 0x00, 0x06, 0x30, 0x00, 0x00, // char '\' (0x5C/92) + 0x00, 0x41, 0x41, 0x77, 0x00, // char ']' (0x5D/93) + 0x00, 0x02, 0x01, 0x02, 0x00, // char '^' (0x5E/94) + 0x00, 0x40, 0x40, 0x00, 0x00, // char '_' (0x5F/95) + 0x00, 0x01, 0x02, 0x00, 0x00, // char '`' (0x60/96) +}; + +const PROGMEM uint8_t ssd1306xled_font5x7 []= +{ + 0x00, 0x05, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, // sp + 0x00, 0x00, 0x5F, 0x00, 0x00, // ! + 0x00, 0x03, 0x00, 0x03, 0x00, // " + 0x14, 0x3E, 0x14, 0x3E, 0x14, // # + 0x24, 0x2A, 0x7F, 0x2A, 0x12, // $ + 0x43, 0x33, 0x08, 0x66, 0x61, // % + 0x36, 0x49, 0x55, 0x22, 0x50, // & + 0x00, 0x05, 0x03, 0x00, 0x00, // ' + 0x00, 0x1C, 0x22, 0x41, 0x00, // ( + 0x00, 0x41, 0x22, 0x1C, 0x00, // ) + 0x14, 0x08, 0x3E, 0x08, 0x14, // * + 0x08, 0x08, 0x3E, 0x08, 0x08, // + + 0x00, 0x50, 0x30, 0x00, 0x00, // , + 0x08, 0x08, 0x08, 0x08, 0x08, // - + 0x00, 0x60, 0x60, 0x00, 0x00, // . + 0x20, 0x10, 0x08, 0x04, 0x02, // / + 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 + 0x00, 0x04, 0x02, 0x7F, 0x00, // 1 + 0x42, 0x61, 0x51, 0x49, 0x46, // 2 + 0x22, 0x41, 0x49, 0x49, 0x36, // 3 + 0x18, 0x14, 0x12, 0x7F, 0x10, // 4 + 0x27, 0x45, 0x45, 0x45, 0x39, // 5 + 0x3E, 0x49, 0x49, 0x49, 0x32, // 6 + 0x01, 0x01, 0x71, 0x09, 0x07, // 7 + 0x36, 0x49, 0x49, 0x49, 0x36, // 8 + 0x26, 0x49, 0x49, 0x49, 0x3E, // 9 + 0x00, 0x36, 0x36, 0x00, 0x00, // : + 0x00, 0x56, 0x36, 0x00, 0x00, // ; + 0x08, 0x14, 0x22, 0x41, 0x00, // < + 0x14, 0x14, 0x14, 0x14, 0x14, // = + 0x00, 0x41, 0x22, 0x14, 0x08, // > + 0x02, 0x01, 0x51, 0x09, 0x06, // ? + 0x3E, 0x41, 0x59, 0x55, 0x5E, // @ + 0x7E, 0x09, 0x09, 0x09, 0x7E, // A + 0x7F, 0x49, 0x49, 0x49, 0x36, // B + 0x3E, 0x41, 0x41, 0x41, 0x22, // C + 0x7F, 0x41, 0x41, 0x41, 0x3E, // D + 0x7F, 0x49, 0x49, 0x49, 0x41, // E + 0x7F, 0x09, 0x09, 0x09, 0x01, // F + 0x3E, 0x41, 0x41, 0x49, 0x3A, // G + 0x7F, 0x08, 0x08, 0x08, 0x7F, // H + 0x00, 0x41, 0x7F, 0x41, 0x00, // I + 0x30, 0x40, 0x40, 0x40, 0x3F, // J + 0x7F, 0x08, 0x14, 0x22, 0x41, // K + 0x7F, 0x40, 0x40, 0x40, 0x40, // L + 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M + 0x7F, 0x02, 0x04, 0x08, 0x7F, // N + 0x3E, 0x41, 0x41, 0x41, 0x3E, // O + 0x7F, 0x09, 0x09, 0x09, 0x06, // P + 0x1E, 0x21, 0x21, 0x21, 0x5E, // Q + 0x7F, 0x09, 0x09, 0x09, 0x76, // R + 0x26, 0x49, 0x49, 0x49, 0x32, // S + 0x01, 0x01, 0x7F, 0x01, 0x01, // T + 0x3F, 0x40, 0x40, 0x40, 0x3F, // U + 0x1F, 0x20, 0x40, 0x20, 0x1F, // V + 0x7F, 0x20, 0x10, 0x20, 0x7F, // W + 0x41, 0x22, 0x1C, 0x22, 0x41, // X + 0x07, 0x08, 0x70, 0x08, 0x07, // Y + 0x61, 0x51, 0x49, 0x45, 0x43, // Z + 0x00, 0x7F, 0x41, 0x00, 0x00, // [ + 0x02, 0x04, 0x08, 0x10, 0x20, // 55 + 0x00, 0x00, 0x41, 0x7F, 0x00, // ] + 0x04, 0x02, 0x01, 0x02, 0x04, // ^ + 0x40, 0x40, 0x40, 0x40, 0x40, // _ + 0x00, 0x01, 0x02, 0x04, 0x00, // ` + 0x20, 0x54, 0x54, 0x54, 0x78, // a + 0x7F, 0x44, 0x44, 0x44, 0x38, // b + 0x38, 0x44, 0x44, 0x44, 0x44, // c + 0x38, 0x44, 0x44, 0x44, 0x7F, // d + 0x38, 0x54, 0x54, 0x54, 0x18, // e + 0x04, 0x04, 0x7E, 0x05, 0x05, // f + 0x08, 0x54, 0x54, 0x54, 0x3C, // g + 0x7F, 0x08, 0x04, 0x04, 0x78, // h + 0x00, 0x44, 0x7D, 0x40, 0x00, // i + 0x20, 0x40, 0x44, 0x3D, 0x00, // j + 0x7F, 0x10, 0x28, 0x44, 0x00, // k + 0x00, 0x41, 0x7F, 0x40, 0x00, // l + 0x7C, 0x04, 0x78, 0x04, 0x78, // m + 0x7C, 0x08, 0x04, 0x04, 0x78, // n + 0x38, 0x44, 0x44, 0x44, 0x38, // o + 0x7C, 0x14, 0x14, 0x14, 0x08, // p + 0x08, 0x14, 0x14, 0x14, 0x7C, // q + 0x00, 0x7C, 0x08, 0x04, 0x04, // r + 0x48, 0x54, 0x54, 0x54, 0x20, // s + 0x04, 0x04, 0x3F, 0x44, 0x44, // t + 0x3C, 0x40, 0x40, 0x20, 0x7C, // u + 0x1C, 0x20, 0x40, 0x20, 0x1C, // v + 0x3C, 0x40, 0x30, 0x40, 0x3C, // w + 0x44, 0x28, 0x10, 0x28, 0x44, // x + 0x0C, 0x50, 0x50, 0x50, 0x3C, // y + 0x44, 0x64, 0x54, 0x4C, 0x44, // z + 0x00, 0x08, 0x36, 0x41, 0x41, // { + 0x00, 0x00, 0x7F, 0x00, 0x00, // | + 0x41, 0x41, 0x36, 0x08, 0x00, // } + 0x02, 0x01, 0x02, 0x04, 0x02, // ~ + 0x14, 0x14, 0x14, 0x14, 0x14, // horiz lines // DEL + 0x00 /* This byte is required for italic type of font */ +}; + +const PROGMEM uint8_t ssd1306xled_font5x7_AB []= +{ + 0x00, 0x05, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, // sp + 0x00, 0x00, 0x5F, 0x00, 0x00, // ! + 0x00, 0x03, 0x00, 0x03, 0x00, // " + 0x14, 0x3E, 0x14, 0x3E, 0x14, // # + 0x24, 0x2A, 0x7F, 0x2A, 0x12, // $ + 0x43, 0x33, 0x08, 0x66, 0x61, // % + 0x36, 0x49, 0x55, 0x22, 0x50, // & + 0x00, 0x05, 0x03, 0x00, 0x00, // ' + 0x00, 0x1C, 0x22, 0x41, 0x00, // ( + 0x00, 0x41, 0x22, 0x1C, 0x00, // ) + 0x14, 0x08, 0x3E, 0x08, 0x14, // * + 0x08, 0x08, 0x3E, 0x08, 0x08, // + + 0x00, 0x50, 0x30, 0x00, 0x00, // , + 0x08, 0x08, 0x08, 0x08, 0x08, // - + 0x00, 0x60, 0x60, 0x00, 0x00, // . + 0x20, 0x10, 0x08, 0x04, 0x02, // / + 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 + 0x00, 0x04, 0x02, 0x7F, 0x00, // 1 + 0x42, 0x61, 0x51, 0x49, 0x46, // 2 + 0x22, 0x41, 0x49, 0x49, 0x36, // 3 + 0x18, 0x14, 0x12, 0x7F, 0x10, // 4 + 0x27, 0x45, 0x45, 0x45, 0x39, // 5 + 0x3E, 0x49, 0x49, 0x49, 0x32, // 6 + 0x01, 0x01, 0x71, 0x09, 0x07, // 7 + 0x36, 0x49, 0x49, 0x49, 0x36, // 8 + 0x26, 0x49, 0x49, 0x49, 0x3E, // 9 + 0x00, 0x36, 0x36, 0x00, 0x00, // : + 0x00, 0x56, 0x36, 0x00, 0x00, // ; + 0x08, 0x14, 0x22, 0x41, 0x00, // < + 0x14, 0x14, 0x14, 0x14, 0x14, // = + 0x00, 0x41, 0x22, 0x14, 0x08, // > + 0x02, 0x01, 0x51, 0x09, 0x06, // ? + 0x3E, 0x41, 0x59, 0x55, 0x5E, // @ + 0x7E, 0x09, 0x09, 0x09, 0x7E, // A + 0x7F, 0x49, 0x49, 0x49, 0x36, // B + 0x3E, 0x41, 0x41, 0x41, 0x22, // C + 0x7F, 0x41, 0x41, 0x41, 0x3E, // D + 0x7F, 0x49, 0x49, 0x49, 0x41, // E + 0x7F, 0x09, 0x09, 0x09, 0x01, // F + 0x3E, 0x41, 0x41, 0x49, 0x3A, // G + 0x7F, 0x08, 0x08, 0x08, 0x7F, // H + 0x00, 0x41, 0x7F, 0x41, 0x00, // I + 0x30, 0x40, 0x40, 0x40, 0x3F, // J + 0x7F, 0x08, 0x14, 0x22, 0x41, // K + 0x7F, 0x40, 0x40, 0x40, 0x40, // L + 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M + 0x7F, 0x02, 0x04, 0x08, 0x7F, // N + 0x3E, 0x41, 0x41, 0x41, 0x3E, // O + 0x7F, 0x09, 0x09, 0x09, 0x06, // P + 0x1E, 0x21, 0x21, 0x21, 0x5E, // Q + 0x7F, 0x09, 0x09, 0x09, 0x76, // R + 0x26, 0x49, 0x49, 0x49, 0x32, // S + 0x01, 0x01, 0x7F, 0x01, 0x01, // T + 0x3F, 0x40, 0x40, 0x40, 0x3F, // U + 0x1F, 0x20, 0x40, 0x20, 0x1F, // V + 0x7F, 0x20, 0x10, 0x20, 0x7F, // W + 0x41, 0x22, 0x1C, 0x22, 0x41, // X + 0x07, 0x08, 0x70, 0x08, 0x07, // Y + 0x61, 0x51, 0x49, 0x45, 0x43, // Z + 0x00, 0x7F, 0x41, 0x00, 0x00, // [ + 0x02, 0x04, 0x08, 0x10, 0x20, // 55 + 0x00, 0x00, 0x41, 0x7F, 0x00, // ] + 0x04, 0x02, 0x01, 0x02, 0x04, // ^ + 0x40, 0x40, 0x40, 0x40, 0x40, // _ + 0x00, 0x01, 0x02, 0x04, 0x00, // ` + 0x00, +}; + + +/* Standard ASCII 11x16 font with digits only (Ascii codes 32 - 64) */ +const PROGMEM uint8_t courier_new_font11x16_digits []= +{ + 0x00, 0x0B, 0x10, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // char + 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x19, 0x18, 0x00, 0x00, 0x00, 0x00, // char ! + 0x00, 0x00, 0x1C, 0xFC, 0x1C, 0x00, 0x00, 0x1C, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // char " + 0x30, 0x30, 0xFF, 0xFF, 0x30, 0x30, 0xFF, 0xFF, 0x30, 0x30, 0x00, 0x03, 0x03, 0x3F, 0x3F, 0x03, 0x03, 0x3F, 0x3F, 0x03, 0x03, 0x00, // char # + 0x00, 0x38, 0x7C, 0x4C, 0xCF, 0xCF, 0xCC, 0x9C, 0x9C, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0C, 0x7C, 0x7C, 0x0C, 0x0F, 0x07, 0x00, 0x00, // char $ + 0x00, 0x1C, 0xA2, 0xA2, 0xE2, 0xDC, 0x40, 0x60, 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x00, // char % + 0x00, 0x00, 0xB0, 0xF8, 0xCC, 0x8C, 0x0C, 0x0C, 0x8C, 0x80, 0x00, 0x00, 0x0F, 0x0F, 0x19, 0x18, 0x19, 0x1B, 0x0F, 0x1F, 0x19, 0x00, // char & + 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // char ' + 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x1E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x78, 0x60, 0x00, 0x00, // char ( + 0x00, 0x00, 0x06, 0x1E, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x78, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, // char ) + 0x00, 0x00, 0x18, 0x98, 0xF0, 0xFE, 0xFE, 0xF0, 0x98, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, // char * + 0x80, 0x80, 0x80, 0x80, 0xF8, 0xF8, 0x80, 0x80, 0x80, 0x80, 0x00, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x00, // char + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3C, 0x04, 0x00, 0x00, 0x00, 0x00, // char , + 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // char - + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, // char . + 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xFC, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x60, 0x7C, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // char / + 0x00, 0xF0, 0xFC, 0x0E, 0x06, 0x06, 0x0E, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1C, 0x18, 0x18, 0x1C, 0x0F, 0x03, 0x00, 0x00, // char 0 + 0x00, 0x0C, 0x0C, 0x0C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x00, 0x00, // char 1 + 0x00, 0x18, 0x1C, 0x0E, 0x06, 0x86, 0xCE, 0x7C, 0x38, 0x00, 0x00, 0x00, 0x18, 0x1C, 0x1E, 0x1B, 0x19, 0x18, 0x18, 0x18, 0x00, 0x00, // char 2 + 0x00, 0x0C, 0x0C, 0xC6, 0xC6, 0xC6, 0xE6, 0xFC, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x19, 0x0F, 0x07, 0x00, 0x00, // char 3 + 0x00, 0x80, 0xC0, 0x70, 0x38, 0x0E, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x1B, 0x1B, 0x1F, 0x1F, 0x1B, 0x00, 0x00, // char 4 + 0x00, 0x00, 0xFE, 0xFE, 0x66, 0x66, 0xE6, 0xC6, 0x80, 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x1C, 0x0F, 0x07, 0x00, 0x00, // char 5 + 0x00, 0xE0, 0xF8, 0xDC, 0x6C, 0x66, 0xE6, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1C, 0x18, 0x18, 0x1C, 0x0F, 0x07, 0x00, 0x00, // char 6 + 0x00, 0x0E, 0x0E, 0x06, 0x06, 0x86, 0xF6, 0xFE, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, // char 7 + 0x00, 0x38, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x18, 0x18, 0x18, 0x18, 0x0F, 0x07, 0x00, 0x00, // char 8 + 0x00, 0x78, 0xFC, 0xCE, 0x86, 0x86, 0xCE, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x18, 0x18, 0x19, 0x19, 0x0D, 0x0E, 0x07, 0x01, 0x00, 0x00, // char 9 + 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, // char : + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x38, 0x0C, 0x04, 0x00, 0x00, 0x00, // char ; + 0x80, 0xC0, 0xC0, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x00, 0x00, 0x01, 0x01, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x00, // char < + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, // char = + 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0xC0, 0xC0, 0x80, 0x80, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x01, 0x00, 0x00, // char > + 0x00, 0x00, 0x38, 0x3C, 0x8C, 0x8C, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // char ? + 0x00, 0x00, 0xF8, 0x04, 0xC2, 0x22, 0x22, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x21, 0x22, 0x22, 0x13, 0x00, 0x00, 0x00, // char @ + 0x00 /* This byte is required for italic type of font */ +}; + +const uint8_t comic_sans_font24x32_123[] PROGMEM = +{ + 0x00, 0x18, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char + 0x00, 0x00, 0xF0, 0xF8, 0xF8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ! + 0x00, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char " + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xF8, 0x70, 0x00, 0x00, 0x06, 0x0F, 0x0F, 0x0F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x0F, 0x1C, 0x3C, 0x3C, 0xFC, 0xFC, 0xFE, 0xFF, 0x7F, 0x3F, 0x3F, 0x3C, 0x3C, 0x3C, 0x3C, 0xFC, 0xFC, 0xFF, 0xFF, 0x3F, 0x3F, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x0E, 0x1F, 0x1F, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1F, 0x1F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char # + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xFE, 0xFF, 0xFF, 0xE7, 0xC3, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC1, 0x81, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x07, 0x8F, 0xFF, 0xFF, 0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, // Code for char $ + 0x00, 0x00, 0xE0, 0xF0, 0xF8, 0xFC, 0x3C, 0x3C, 0x3C, 0xFC, 0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1F, 0x0F, 0x07, 0xC3, 0xF0, 0xFC, 0xFF, 0x3F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFE, 0xFF, 0x3F, 0x0F, 0x03, 0xF0, 0xFC, 0xFE, 0xFF, 0x1F, 0x0F, 0x0F, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, // Code for char % + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xCF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x7F, 0x3F, 0x1F, 0x07, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFE, 0xFF, 0x0F, 0x07, 0x03, 0x01, 0x03, 0x0F, 0x3F, 0xFF, 0xFE, 0xF8, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x0F, 0x1F, 0x3F, 0x3E, 0x18, 0x00, 0x00, 0x00, 0x00, // Code for char & + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ' + 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0x7F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x3F, 0xFF, 0xFF, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ( + 0x00, 0x30, 0x78, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x7F, 0xFF, 0xFE, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8, 0xFF, 0xFF, 0x3F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ) + 0x00, 0x80, 0xC0, 0xC0, 0x80, 0x80, 0xF0, 0xF8, 0xF8, 0xF0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x33, 0x7B, 0x7B, 0x3F, 0x1F, 0x1F, 0x0F, 0x3F, 0x7F, 0xFF, 0xF7, 0x67, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char * + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x0E, 0x0E, 0x0E, 0xFF, 0xFF, 0xFF, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFC, 0x7C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char , + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char - + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char . + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFE, 0xFF, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFE, 0x7F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char / + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 0 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 1 + 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x07, 0x03, 0x03, 0x01, 0x80, 0x80, 0xC0, 0xE0, 0xF1, 0xFF, 0xFF, 0x7F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0xFC, 0xFE, 0x3E, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 2 + 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0xC1, 0xE1, 0xE0, 0xE0, 0xF0, 0xF0, 0xF9, 0xFF, 0x7F, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x80, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x87, 0xFF, 0xFF, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 3 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0x7E, 0x1F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3D, 0x3C, 0x3C, 0x3C, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 4 + 0x00, 0x20, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xF8, 0xFC, 0x7C, 0x7C, 0x3C, 0x3C, 0x3C, 0x3C, 0x7C, 0xF8, 0xF8, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xC3, 0xC3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 5 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFE, 0xFF, 0xDF, 0xEF, 0xE7, 0xE3, 0xE1, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x83, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x87, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 6 + 0x00, 0x60, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE, 0xFF, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFF, 0xFF, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x1F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 7 + 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0xFF, 0xFF, 0xF1, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF1, 0xFF, 0xFF, 0xBF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0xFF, 0xFF, 0x8F, 0x07, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x87, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 8 + 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xFF, 0xFF, 0xC3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x83, 0xC7, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x8F, 0x8F, 0xCF, 0xCF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1E, 0x1E, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 9 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xF8, 0xF8, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char : + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xF8, 0xF8, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x7C, 0x7E, 0x3F, 0x0F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x0F, 0x1F, 0x3F, 0x7F, 0xFB, 0xF1, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char < + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char = + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF1, 0xF9, 0xFB, 0x7F, 0x7F, 0x3F, 0x1F, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char > + 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x81, 0xC3, 0xFF, 0xFF, 0xFF, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7C, 0x7C, 0x7E, 0x1F, 0x1F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x1F, 0x1F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ? +}; + +// ---------------------------------------------------------------------------- +/// ################################################################################################## +/// Calibri +// --------------------------------------------- +// -@--@@--@----------@----@-@--------@@@--@@--- +// -@--@@--@----------@----@-@-------@--@-@-@--- +// -@--@@--@-@@@@-@@@-@--@@@-@---@@@-@--@---@--- +// --@@-@@@--@--@-@---@-@--@-@--@--@-@--@---@--- +// --@@--@@--@--@-@---@-@--@-@--@--@-@--@---@--- +// --@@--@@--@--@-@---@-@--@----@--@-@--@---@--- +// --@@--@@--@@@@-@---@--@@@-@@--@@@-@@@--@@@@@- +// --------------------------------@------------ +// --------------------------------@------------ +const uint8_t free_calibri11x12[] PROGMEM = +{ +// type|width|height|first char + 0x02, 0x0B, 0x0A, 0x20, +// GROUP first ' ' total 96 chars +// unicode(LSB,MSB)|count + 0x00, 0x20, 0x60, // unicode record + 0x00, 0x00, 0x00, 0x00, // char ' ' (0x0020/32) + 0x00, 0x00, 0x02, 0x08, // char '!' (0x0021/33) + 0x00, 0x02, 0x03, 0x04, // char '"' (0x0022/34) + 0x00, 0x05, 0x05, 0x08, // char '#' (0x0023/35) + 0x00, 0x0A, 0x05, 0x09, // char '$' (0x0024/36) + 0x00, 0x14, 0x07, 0x08, // char '%' (0x0025/37) + 0x00, 0x1B, 0x07, 0x08, // char '&' (0x0026/38) + 0x00, 0x22, 0x01, 0x04, // char ''' (0x0027/39) + 0x00, 0x23, 0x02, 0x0A, // char '(' (0x0028/40) + 0x00, 0x27, 0x02, 0x0A, // char ')' (0x0029/41) + 0x00, 0x2B, 0x04, 0x04, // char '*' (0x002A/42) + 0x00, 0x2F, 0x05, 0x07, // char '+' (0x002B/43) + 0x00, 0x34, 0x02, 0x0A, // char ',' (0x002C/44) + 0x00, 0x38, 0x03, 0x06, // char '-' (0x002D/45) + 0x00, 0x3B, 0x01, 0x08, // char '.' (0x002E/46) + 0x00, 0x3C, 0x04, 0x0A, // char '/' (0x002F/47) + 0x00, 0x44, 0x04, 0x08, // char '0' (0x0030/48) + 0x00, 0x48, 0x05, 0x08, // char '1' (0x0031/49) + 0x00, 0x4D, 0x04, 0x08, // char '2' (0x0032/50) + 0x00, 0x51, 0x04, 0x08, // char '3' (0x0033/51) + 0x00, 0x55, 0x06, 0x08, // char '4' (0x0034/52) + 0x00, 0x5B, 0x04, 0x08, // char '5' (0x0035/53) + 0x00, 0x5F, 0x04, 0x08, // char '6' (0x0036/54) + 0x00, 0x63, 0x04, 0x08, // char '7' (0x0037/55) + 0x00, 0x67, 0x04, 0x08, // char '8' (0x0038/56) + 0x00, 0x6B, 0x04, 0x08, // char '9' (0x0039/57) + 0x00, 0x6F, 0x02, 0x08, // char ':' (0x003A/58) + 0x00, 0x71, 0x03, 0x0A, // char ';' (0x003B/59) + 0x00, 0x77, 0x05, 0x07, // char '<' (0x003C/60) + 0x00, 0x7C, 0x04, 0x07, // char '=' (0x003D/61) + 0x00, 0x80, 0x04, 0x07, // char '>' (0x003E/62) + 0x00, 0x84, 0x04, 0x08, // char '?' (0x003F/63) + 0x00, 0x88, 0x09, 0x09, // char '@' (0x0040/64) + 0x00, 0x9A, 0x06, 0x08, // char 'A' (0x0041/65) + 0x00, 0xA0, 0x04, 0x08, // char 'B' (0x0042/66) + 0x00, 0xA4, 0x05, 0x08, // char 'C' (0x0043/67) + 0x00, 0xA9, 0x05, 0x08, // char 'D' (0x0044/68) + 0x00, 0xAE, 0x04, 0x08, // char 'E' (0x0045/69) + 0x00, 0xB2, 0x04, 0x08, // char 'F' (0x0046/70) + 0x00, 0xB6, 0x05, 0x08, // char 'G' (0x0047/71) + 0x00, 0xBB, 0x05, 0x08, // char 'H' (0x0048/72) + 0x00, 0xC0, 0x01, 0x08, // char 'I' (0x0049/73) + 0x00, 0xC1, 0x03, 0x08, // char 'J' (0x004A/74) + 0x00, 0xC4, 0x05, 0x08, // char 'K' (0x004B/75) + 0x00, 0xC9, 0x04, 0x08, // char 'L' (0x004C/76) + 0x00, 0xCD, 0x07, 0x08, // char 'M' (0x004D/77) + 0x00, 0xD4, 0x05, 0x08, // char 'N' (0x004E/78) + 0x00, 0xD9, 0x05, 0x08, // char 'O' (0x004F/79) + 0x00, 0xDE, 0x04, 0x08, // char 'P' (0x0050/80) + 0x00, 0xE2, 0x06, 0x09, // char 'Q' (0x0051/81) + 0x00, 0xEE, 0x05, 0x08, // char 'R' (0x0052/82) + 0x00, 0xF3, 0x04, 0x08, // char 'S' (0x0053/83) + 0x00, 0xF7, 0x05, 0x08, // char 'T' (0x0054/84) + 0x00, 0xFC, 0x05, 0x08, // char 'U' (0x0055/85) + 0x01, 0x01, 0x06, 0x08, // char 'V' (0x0056/86) + 0x01, 0x07, 0x09, 0x08, // char 'W' (0x0057/87) + 0x01, 0x10, 0x06, 0x08, // char 'X' (0x0058/88) + 0x01, 0x16, 0x05, 0x08, // char 'Y' (0x0059/89) + 0x01, 0x1B, 0x05, 0x08, // char 'Z' (0x005A/90) + 0x01, 0x20, 0x02, 0x0A, // char '[' (0x005B/91) + 0x01, 0x24, 0x04, 0x09, // char '\' (0x005C/92) + 0x01, 0x2C, 0x02, 0x0A, // char ']' (0x005D/93) + 0x01, 0x30, 0x04, 0x05, // char '^' (0x005E/94) + 0x01, 0x34, 0x06, 0x08, // char '_' (0x005F/95) + 0x01, 0x3A, 0x03, 0x02, // char '`' (0x0060/96) + 0x01, 0x3D, 0x04, 0x08, // char 'a' (0x0061/97) + 0x01, 0x41, 0x04, 0x08, // char 'b' (0x0062/98) + 0x01, 0x45, 0x04, 0x08, // char 'c' (0x0063/99) + 0x01, 0x49, 0x04, 0x08, // char 'd' (0x0064/100) + 0x01, 0x4D, 0x04, 0x08, // char 'e' (0x0065/101) + 0x01, 0x51, 0x04, 0x08, // char 'f' (0x0066/102) + 0x01, 0x55, 0x05, 0x0A, // char 'g' (0x0067/103) + 0x01, 0x5F, 0x04, 0x08, // char 'h' (0x0068/104) + 0x01, 0x63, 0x01, 0x08, // char 'i' (0x0069/105) + 0x01, 0x64, 0x02, 0x0A, // char 'j' (0x006A/106) + 0x01, 0x68, 0x04, 0x08, // char 'k' (0x006B/107) + 0x01, 0x6C, 0x01, 0x08, // char 'l' (0x006C/108) + 0x01, 0x6D, 0x07, 0x08, // char 'm' (0x006D/109) + 0x01, 0x74, 0x04, 0x08, // char 'n' (0x006E/110) + 0x01, 0x78, 0x04, 0x08, // char 'o' (0x006F/111) + 0x01, 0x7C, 0x04, 0x0A, // char 'p' (0x0070/112) + 0x01, 0x84, 0x04, 0x0A, // char 'q' (0x0071/113) + 0x01, 0x8C, 0x03, 0x08, // char 'r' (0x0072/114) + 0x01, 0x8F, 0x03, 0x08, // char 's' (0x0073/115) + 0x01, 0x92, 0x03, 0x08, // char 't' (0x0074/116) + 0x01, 0x95, 0x04, 0x08, // char 'u' (0x0075/117) + 0x01, 0x99, 0x05, 0x08, // char 'v' (0x0076/118) + 0x01, 0x9E, 0x08, 0x08, // char 'w' (0x0077/119) + 0x01, 0xA6, 0x04, 0x08, // char 'x' (0x0078/120) + 0x01, 0xAA, 0x05, 0x0A, // char 'y' (0x0079/121) + 0x01, 0xB4, 0x04, 0x08, // char 'z' (0x007A/122) + 0x01, 0xB8, 0x03, 0x0A, // char '{' (0x007B/123) + 0x01, 0xBE, 0x01, 0x0A, // char '|' (0x007C/124) + 0x01, 0xC0, 0x02, 0x0A, // char '}' (0x007D/125) + 0x01, 0xC4, 0x05, 0x04, // char '~' (0x007E/126) + 0x01, 0xC9, 0x06, 0x08, // char '' (0x007F/127) +// 0x01, 0xD0, + 0x01, 0xCF, + // char ' ' (0x0020/32) + 0xBE, 0x80, // char '!' (0x0021/33) + 0x0E, 0x00, 0x0E, // char '"' (0x0022/34) + 0x28, 0xFE, 0x28, 0xF8, 0x2E, // char '#' (0x0023/35) + 0x80, 0x8E, 0x92, 0x93, 0x62, 0x00, 0x00, 0x01, 0x00, 0x00, // char '$' (0x0024/36) + 0x1E, 0x92, 0x7E, 0x10, 0xFC, 0x92, 0xF0, // char '%' (0x0025/37) + 0x00, 0xE4, 0x9A, 0xAA, 0xCE, 0x70, 0x80, // char '&' (0x0026/38) + 0x0E, // char ''' (0x0027/39) + 0xFC, 0x03, 0x00, 0x03, // char '(' (0x0028/40) + 0x03, 0xFC, 0x03, 0x00, // char ')' (0x0029/41) + 0x06, 0x0F, 0x06, 0x00, // char '*' (0x002A/42) + 0x10, 0x10, 0x7C, 0x10, 0x10, // char '+' (0x002B/43) + 0x00, 0x80, 0x02, 0x01, // char ',' (0x002C/44) + 0x20, 0x20, 0x20, // char '-' (0x002D/45) + 0x80, // char '.' (0x002E/46) + 0x00, 0xE0, 0x1C, 0x03, 0x03, 0x00, 0x00, 0x00, // char '/' (0x002F/47) + 0xFC, 0x82, 0x82, 0x7E, // char '0' (0x0030/48) + 0x84, 0x82, 0xFE, 0x80, 0x80, // char '1' (0x0031/49) + 0x84, 0xC2, 0xA2, 0x9C, // char '2' (0x0032/50) + 0x82, 0x92, 0x92, 0x6E, // char '3' (0x0033/51) + 0x30, 0x28, 0x26, 0xFE, 0x20, 0x20, // char '4' (0x0034/52) + 0x9E, 0x92, 0x92, 0x62, // char '5' (0x0035/53) + 0x7C, 0x96, 0x92, 0x72, // char '6' (0x0036/54) + 0xC2, 0x72, 0x1E, 0x06, // char '7' (0x0037/55) + 0xEC, 0x92, 0x92, 0x6E, // char '8' (0x0038/56) + 0x9C, 0x92, 0xD2, 0x7C, // char '9' (0x0039/57) + 0x88, 0x88, // char ':' (0x003A/58) + 0x00, 0x88, 0x88, 0x02, 0x01, 0x00, // char ';' (0x003B/59) + 0x10, 0x30, 0x28, 0x28, 0x44, // char '<' (0x003C/60) + 0x50, 0x50, 0x50, 0x50, // char '=' (0x003D/61) + 0x44, 0x28, 0x28, 0x10, // char '>' (0x003E/62) + 0x02, 0xB2, 0x92, 0x0C, // char '?' (0x003F/63) + 0x00, 0xF8, 0x84, 0x72, 0x4A, 0x6A, 0x7A, 0x42, 0x3C, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, // char '@' (0x0040/64) + 0x80, 0x70, 0x2E, 0x26, 0x38, 0xC0, // char 'A' (0x0041/65) + 0xFE, 0x92, 0x92, 0x6E, // char 'B' (0x0042/66) + 0x7C, 0xC6, 0x82, 0x82, 0x44, // char 'C' (0x0043/67) + 0xFE, 0x82, 0x82, 0xC6, 0x7C, // char 'D' (0x0044/68) + 0xFE, 0x92, 0x92, 0x92, // char 'E' (0x0045/69) + 0xFE, 0x12, 0x12, 0x12, // char 'F' (0x0046/70) + 0x7C, 0xC6, 0x82, 0x92, 0xF6, // char 'G' (0x0047/71) + 0xFE, 0x10, 0x10, 0x10, 0xFE, // char 'H' (0x0048/72) + 0xFE, // char 'I' (0x0049/73) + 0x80, 0x80, 0xFE, // char 'J' (0x004A/74) + 0xFE, 0x10, 0x3C, 0xC6, 0x82, // char 'K' (0x004B/75) + 0xFE, 0x80, 0x80, 0x80, // char 'L' (0x004C/76) + 0xFE, 0x06, 0x38, 0xC0, 0x38, 0x06, 0xFE, // char 'M' (0x004D/77) + 0xFE, 0x06, 0x18, 0xE0, 0xFE, // char 'N' (0x004E/78) + 0x7C, 0x86, 0x82, 0xC6, 0x7C, // char 'O' (0x004F/79) + 0xFE, 0x12, 0x12, 0x0C, // char 'P' (0x0050/80) + 0x7C, 0x86, 0x82, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // char 'Q' (0x0051/81) + 0xFE, 0x12, 0x12, 0xEC, 0x00, // char 'R' (0x0052/82) + 0x8C, 0x92, 0x92, 0x62, // char 'S' (0x0053/83) + 0x02, 0x02, 0xFE, 0x02, 0x02, // char 'T' (0x0054/84) + 0x7E, 0x80, 0x80, 0x80, 0x7E, // char 'U' (0x0055/85) + 0x06, 0x3C, 0xE0, 0xE0, 0x1C, 0x06, // char 'V' (0x0056/86) + 0x00, 0x0E, 0xF0, 0xF0, 0x0E, 0x1E, 0xF0, 0xF0, 0x0E, // char 'W' (0x0057/87) + 0x82, 0x6E, 0x38, 0x38, 0xC6, 0x00, // char 'X' (0x0058/88) + 0x02, 0x0C, 0xF0, 0x0C, 0x02, // char 'Y' (0x0059/89) + 0x82, 0xE2, 0x92, 0x8E, 0x82, // char 'Z' (0x005A/90) + 0xFF, 0x01, 0x03, 0x02, // char '[' (0x005B/91) + 0x01, 0x0E, 0x70, 0x80, 0x00, 0x00, 0x00, 0x01, // char '\' (0x005C/92) + 0x01, 0xFF, 0x02, 0x03, // char ']' (0x005D/93) + 0x1C, 0x02, 0x0C, 0x10, // char '^' (0x005E/94) + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // char '_' (0x005F/95) + 0x00, 0x01, 0x02, // char '`' (0x0060/96) + 0xE8, 0xA8, 0xA8, 0xF8, // char 'a' (0x0061/97) + 0xFE, 0x88, 0x88, 0x70, // char 'b' (0x0062/98) + 0x70, 0x88, 0x88, 0x88, // char 'c' (0x0063/99) + 0x70, 0x88, 0x88, 0xFE, // char 'd' (0x0064/100) + 0x70, 0xA8, 0xA8, 0xB0, // char 'e' (0x0065/101) + 0x08, 0xFE, 0x0A, 0x02, // char 'f' (0x0066/102) + 0x78, 0xA8, 0xA8, 0xB8, 0x08, 0x03, 0x02, 0x02, 0x03, 0x00, // char 'g' (0x0067/103) + 0xFE, 0x08, 0x08, 0xF8, // char 'h' (0x0068/104) + 0xFA, // char 'i' (0x0069/105) + 0x00, 0xFA, 0x02, 0x03, // char 'j' (0x006A/106) + 0xFE, 0x20, 0x50, 0x88, // char 'k' (0x006B/107) + 0xFE, // char 'l' (0x006C/108) + 0xF8, 0x08, 0x08, 0xF8, 0x08, 0x08, 0xF8, // char 'm' (0x006D/109) + 0xF8, 0x08, 0x08, 0xF8, // char 'n' (0x006E/110) + 0xF8, 0x88, 0x88, 0xF8, // char 'o' (0x006F/111) + 0xF8, 0x88, 0x88, 0x70, 0x03, 0x00, 0x00, 0x00, // char 'p' (0x0070/112) + 0x70, 0x88, 0x88, 0xF8, 0x00, 0x00, 0x00, 0x03, // char 'q' (0x0071/113) + 0xF8, 0x08, 0x08, // char 'r' (0x0072/114) + 0x98, 0xA8, 0xE8, // char 's' (0x0073/115) + 0x08, 0xFC, 0x88, // char 't' (0x0074/116) + 0xF8, 0x80, 0x80, 0xF8, // char 'u' (0x0075/117) + 0x18, 0x70, 0xC0, 0x60, 0x18, // char 'v' (0x0076/118) + 0x08, 0x70, 0xC0, 0x38, 0x38, 0xC0, 0x70, 0x08, // char 'w' (0x0077/119) + 0x88, 0x70, 0x70, 0x88, // char 'x' (0x0078/120) + 0x18, 0x70, 0xC0, 0x70, 0x08, 0x00, 0x02, 0x01, 0x00, 0x00, // char 'y' (0x0079/121) + 0xC8, 0xE8, 0xB8, 0x88, // char 'z' (0x007A/122) + 0x10, 0xEE, 0x01, 0x00, 0x01, 0x02, // char '{' (0x007B/123) + 0xFF, 0x03, // char '|' (0x007C/124) + 0xCF, 0x30, 0x03, 0x00, // char '}' (0x007D/125) + 0x0C, 0x04, 0x08, 0x08, 0x0C, // char '~' (0x007E/126) + 0xFE, 0x82, 0x8A, 0xAA, 0x82, 0xFE, // char '' (0x007F/127) + 0x00, 0x00, 0x00, // end of unicode tables + // FONT REQUIRES 859 BYTES +}; + +// ------------------------ +// ------------------------ +// -@@@@------------------- +// @@--@------------------- +// @@--@-@--@-@--@--@-@-@@- +// -@@@@-@--@-@--@-@@-@-@-- +// -@--@-@--@-@--@@-@-@@@-- +// @@--@-@--@-@--@@-@-@-@-- +// @@--@-@@@@@@@-@--@-@-@@- +// ------------@----------- +// ------------@----------- +const uint8_t free_calibri11x12_cyrillic[] PROGMEM = +{ +// type|width|height|first char + 0x02, 0x0A, 0x0B, 0x00, +// GROUP first 'А' total 64 chars +// unicode(LSB,MSB)|count + 0x04, 0x10, 0x40, // unicode record + 0x00, 0x00, 0x06, 0x09, // char 'А' (0x0410/1040) + 0x00, 0x0C, 0x05, 0x09, // char 'Б' (0x0411/1041) + 0x00, 0x16, 0x04, 0x09, // char 'В' (0x0412/1042) + 0x00, 0x1E, 0x04, 0x09, // char 'Г' (0x0413/1043) + 0x00, 0x26, 0x07, 0x0B, // char 'Д' (0x0414/1044) + 0x00, 0x34, 0x04, 0x09, // char 'Е' (0x0415/1045) + 0x00, 0x3C, 0x09, 0x09, // char 'Ж' (0x0416/1046) + 0x00, 0x4E, 0x04, 0x09, // char 'З' (0x0417/1047) + 0x00, 0x56, 0x05, 0x09, // char 'И' (0x0418/1048) + 0x00, 0x60, 0x05, 0x09, // char 'Й' (0x0419/1049) + 0x00, 0x6A, 0x05, 0x09, // char 'К' (0x041A/1050) + 0x00, 0x74, 0x06, 0x09, // char 'Л' (0x041B/1051) + 0x00, 0x80, 0x07, 0x09, // char 'М' (0x041C/1052) + 0x00, 0x8E, 0x05, 0x09, // char 'Н' (0x041D/1053) + 0x00, 0x98, 0x05, 0x09, // char 'О' (0x041E/1054) + 0x00, 0xA2, 0x05, 0x09, // char 'П' (0x041F/1055) + 0x00, 0xAC, 0x04, 0x09, // char 'Р' (0x0420/1056) + 0x00, 0xB4, 0x05, 0x09, // char 'С' (0x0421/1057) + 0x00, 0xBE, 0x05, 0x09, // char 'Т' (0x0422/1058) + 0x00, 0xC8, 0x07, 0x09, // char 'У' (0x0423/1059) + 0x00, 0xD6, 0x07, 0x09, // char 'Ф' (0x0424/1060) + 0x00, 0xE4, 0x06, 0x09, // char 'Х' (0x0425/1061) + 0x00, 0xF0, 0x06, 0x0B, // char 'Ц' (0x0426/1062) + 0x00, 0xFC, 0x05, 0x09, // char 'Ч' (0x0427/1063) + 0x01, 0x06, 0x08, 0x09, // char 'Ш' (0x0428/1064) + 0x01, 0x16, 0x09, 0x0B, // char 'Щ' (0x0429/1065) + 0x01, 0x28, 0x06, 0x09, // char 'Ъ' (0x042A/1066) + 0x01, 0x34, 0x07, 0x09, // char 'Ы' (0x042B/1067) + 0x01, 0x42, 0x05, 0x09, // char 'Ь' (0x042C/1068) + 0x01, 0x4C, 0x05, 0x09, // char 'Э' (0x042D/1069) + 0x01, 0x56, 0x08, 0x09, // char 'Ю' (0x042E/1070) + 0x01, 0x66, 0x05, 0x09, // char 'Я' (0x042F/1071) + 0x01, 0x70, 0x04, 0x09, // char 'а' (0x0430/1072) + 0x01, 0x78, 0x05, 0x09, // char 'б' (0x0431/1073) + 0x01, 0x82, 0x04, 0x09, // char 'в' (0x0432/1074) + 0x01, 0x8A, 0x03, 0x09, // char 'г' (0x0433/1075) + 0x01, 0x90, 0x06, 0x0B, // char 'д' (0x0434/1076) + 0x01, 0x9C, 0x04, 0x09, // char 'е' (0x0435/1077) + 0x01, 0xA4, 0x07, 0x09, // char 'ж' (0x0436/1078) + 0x01, 0xB2, 0x04, 0x09, // char 'з' (0x0437/1079) + 0x01, 0xBA, 0x04, 0x09, // char 'и' (0x0438/1080) + 0x01, 0xC2, 0x04, 0x09, // char 'й' (0x0439/1081) + 0x01, 0xCA, 0x04, 0x09, // char 'к' (0x043A/1082) + 0x01, 0xD2, 0x05, 0x09, // char 'л' (0x043B/1083) + 0x01, 0xDC, 0x06, 0x09, // char 'м' (0x043C/1084) + 0x01, 0xE8, 0x04, 0x09, // char 'н' (0x043D/1085) + 0x01, 0xF0, 0x04, 0x09, // char 'о' (0x043E/1086) + 0x01, 0xF8, 0x04, 0x09, // char 'п' (0x043F/1087) + 0x02, 0x00, 0x04, 0x0B, // char 'р' (0x0440/1088) + 0x02, 0x08, 0x04, 0x09, // char 'с' (0x0441/1089) + 0x02, 0x10, 0x05, 0x09, // char 'т' (0x0442/1090) + 0x02, 0x1A, 0x05, 0x0B, // char 'у' (0x0443/1091) + 0x02, 0x24, 0x07, 0x0B, // char 'ф' (0x0444/1092) + 0x02, 0x32, 0x04, 0x09, // char 'х' (0x0445/1093) + 0x02, 0x3A, 0x05, 0x0B, // char 'ц' (0x0446/1094) + 0x02, 0x44, 0x04, 0x09, // char 'ч' (0x0447/1095) + 0x02, 0x4C, 0x06, 0x09, // char 'ш' (0x0448/1096) + 0x02, 0x58, 0x07, 0x0B, // char 'щ' (0x0449/1097) + 0x02, 0x66, 0x06, 0x09, // char 'ъ' (0x044A/1098) + 0x02, 0x72, 0x06, 0x09, // char 'ы' (0x044B/1099) + 0x02, 0x7E, 0x04, 0x09, // char 'ь' (0x044C/1100) + 0x02, 0x86, 0x04, 0x09, // char 'э' (0x044D/1101) + 0x02, 0x8E, 0x07, 0x09, // char 'ю' (0x044E/1102) + 0x02, 0x9C, 0x04, 0x09, // char 'я' (0x044F/1103) + 0x02, 0xA6, + 0x00, 0xE0, 0x5C, 0x4C, 0x70, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, // char 'А' (0x0410/1040) + 0xFC, 0x24, 0x24, 0xE4, 0xC4, 0x01, 0x01, 0x01, 0x01, 0x00, // char 'Б' (0x0411/1041) + 0xFC, 0x24, 0x24, 0xDC, 0x01, 0x01, 0x01, 0x00, // char 'В' (0x0412/1042) + 0xFC, 0x04, 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, // char 'Г' (0x0413/1043) + 0x00, 0xC0, 0x7C, 0x04, 0x04, 0xFC, 0x00, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, // char 'Д' (0x0414/1044) + 0xFC, 0x24, 0x24, 0x24, 0x01, 0x01, 0x01, 0x01, // char 'Е' (0x0415/1045) + 0x8C, 0xDC, 0x20, 0x20, 0xFC, 0x20, 0x20, 0xDC, 0x8C, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, // char 'Ж' (0x0416/1046) + 0x04, 0x24, 0xFC, 0xDC, 0x01, 0x01, 0x01, 0x00, // char 'З' (0x0417/1047) + 0xFC, 0x80, 0x70, 0x08, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x01, // char 'И' (0x0418/1048) + 0xFC, 0x83, 0x72, 0x0B, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x01, // char 'Й' (0x0419/1049) + 0xFC, 0x20, 0x20, 0xD0, 0x0C, 0x01, 0x00, 0x00, 0x01, 0x01, // char 'К' (0x041A/1050) + 0x00, 0xC0, 0x7C, 0x04, 0x04, 0xFC, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, // char 'Л' (0x041B/1051) + 0xFC, 0x0C, 0x70, 0x80, 0x70, 0x0C, 0xFC, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, // char 'М' (0x041C/1052) + 0xFC, 0x20, 0x20, 0x20, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x01, // char 'Н' (0x041D/1053) + 0xF8, 0x0C, 0x04, 0x8C, 0xF8, 0x00, 0x01, 0x01, 0x01, 0x00, // char 'О' (0x041E/1054) + 0xFC, 0x04, 0x04, 0x04, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x01, // char 'П' (0x041F/1055) + 0xFC, 0x24, 0x24, 0x18, 0x01, 0x00, 0x00, 0x00, // char 'Р' (0x0420/1056) + 0xF8, 0x8C, 0x04, 0x04, 0x88, 0x00, 0x01, 0x01, 0x01, 0x00, // char 'С' (0x0421/1057) + 0x04, 0x04, 0xFC, 0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, // char 'Т' (0x0422/1058) + 0x00, 0x0C, 0x30, 0xC0, 0x30, 0x0C, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, // char 'У' (0x0423/1059) + 0x70, 0xD8, 0x88, 0xFC, 0x88, 0x88, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // char 'Ф' (0x0424/1060) + 0x04, 0xDC, 0x70, 0x70, 0x8C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, // char 'Х' (0x0425/1061) + 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, // char 'Ц' (0x0426/1062) + 0x1C, 0x30, 0x20, 0x20, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x01, // char 'Ч' (0x0427/1063) + 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // char 'Ш' (0x0428/1064) + 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, // char 'Щ' (0x0429/1065) + 0x04, 0x04, 0xFC, 0x20, 0xE0, 0xE0, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, // char 'Ъ' (0x042A/1066) + 0xFC, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0xFC, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, // char 'Ы' (0x042B/1067) + 0xFC, 0x20, 0x20, 0xE0, 0xC0, 0x01, 0x01, 0x01, 0x01, 0x00, // char 'Ь' (0x042C/1068) + 0x04, 0x24, 0x24, 0xFC, 0xF8, 0x01, 0x01, 0x01, 0x01, 0x00, // char 'Э' (0x042D/1069) + 0xFC, 0x20, 0x70, 0xF8, 0x04, 0x04, 0xDC, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, // char 'Ю' (0x042E/1070) + 0x98, 0xFC, 0x24, 0x24, 0xFC, 0x01, 0x01, 0x00, 0x00, 0x01, // char 'Я' (0x042F/1071) + 0xD0, 0x50, 0x50, 0xF0, 0x01, 0x01, 0x01, 0x01, // char 'а' (0x0430/1072) + 0x00, 0xF8, 0xAC, 0x94, 0xF4, 0x00, 0x00, 0x01, 0x01, 0x00, // char 'б' (0x0431/1073) + 0xF0, 0x50, 0x50, 0xB0, 0x01, 0x01, 0x01, 0x01, // char 'в' (0x0432/1074) + 0xF0, 0x10, 0x10, 0x01, 0x00, 0x00, // char 'г' (0x0433/1075) + 0x00, 0xC0, 0x70, 0x10, 0xF0, 0x00, 0x07, 0x01, 0x01, 0x01, 0x01, 0x07, // char 'д' (0x0434/1076) + 0xE0, 0x50, 0x50, 0x60, 0x00, 0x01, 0x01, 0x01, // char 'е' (0x0435/1077) + 0x10, 0xB0, 0x40, 0xF0, 0x40, 0xF0, 0x90, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, // char 'ж' (0x0436/1078) + 0x10, 0x50, 0x50, 0xB0, 0x01, 0x01, 0x01, 0x01, // char 'з' (0x0437/1079) + 0xF0, 0xC0, 0x20, 0xF0, 0x01, 0x00, 0x00, 0x01, // char 'и' (0x0438/1080) + 0xF0, 0xC6, 0x24, 0xF6, 0x01, 0x00, 0x00, 0x01, // char 'й' (0x0439/1081) + 0xF0, 0x40, 0xF0, 0x10, 0x01, 0x00, 0x01, 0x01, // char 'к' (0x043A/1082) + 0x00, 0xC0, 0x70, 0x10, 0xF0, 0x01, 0x01, 0x00, 0x00, 0x01, // char 'л' (0x043B/1083) + 0xF0, 0xE0, 0x00, 0xE0, 0xF0, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // char 'м' (0x043C/1084) + 0xF0, 0x40, 0x40, 0xF0, 0x01, 0x00, 0x00, 0x01, // char 'н' (0x043D/1085) + 0xF0, 0x10, 0x10, 0xF0, 0x01, 0x01, 0x01, 0x01, // char 'о' (0x043E/1086) + 0xF0, 0x10, 0x10, 0xF0, 0x01, 0x00, 0x00, 0x01, // char 'п' (0x043F/1087) + 0xF0, 0x10, 0x10, 0xE0, 0x07, 0x01, 0x01, 0x00, // char 'р' (0x0440/1088) + 0xE0, 0x10, 0x10, 0x10, 0x00, 0x01, 0x01, 0x01, // char 'с' (0x0441/1089) + 0x10, 0x10, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, // char 'т' (0x0442/1090) + 0x30, 0xE0, 0x80, 0xE0, 0x10, 0x00, 0x04, 0x03, 0x00, 0x00, // char 'у' (0x0443/1091) + 0xE0, 0xB0, 0x10, 0xFC, 0x10, 0x10, 0xE0, 0x00, 0x01, 0x01, 0x07, 0x01, 0x01, 0x00, // char 'ф' (0x0444/1092) + 0x10, 0xE0, 0xE0, 0x10, 0x01, 0x00, 0x00, 0x01, // char 'х' (0x0445/1093) + 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x01, 0x01, 0x01, 0x01, 0x07, // char 'ц' (0x0446/1094) + 0x70, 0x40, 0x40, 0xF0, 0x00, 0x00, 0x00, 0x01, // char 'ч' (0x0447/1095) + 0xF0, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // char 'ш' (0x0448/1096) + 0xF0, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, // char 'щ' (0x0449/1097) + 0x10, 0x10, 0xF0, 0x20, 0xE0, 0xE0, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, // char 'ъ' (0x044A/1098) + 0xF0, 0x20, 0x20, 0xE0, 0x00, 0xF0, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, // char 'ы' (0x044B/1099) + 0xF0, 0x20, 0xE0, 0xE0, 0x01, 0x01, 0x01, 0x00, // char 'ь' (0x044C/1100) + 0x50, 0x50, 0xF0, 0xE0, 0x01, 0x01, 0x01, 0x00, // char 'э' (0x044D/1101) + 0xF0, 0x40, 0xE0, 0xB0, 0x10, 0xB0, 0xE0, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, // char 'ю' (0x044E/1102) + 0xB0, 0xD0, 0x50, 0xF0, 0x01, 0x01, 0x00, 0x01, // char 'я' (0x044F/1103) + 0x00, 0x00, 0x00, // end of unicode tables + // FONT REQUIRES 944 BYTES +}; + +// --------@---------------- +// -@@-@@---@--------------- +// ------------------------- +// --@@----@@@@--@@@--@@-@@- +// --@@----@----@--@-------- +// --@-@---@----@-@@--@---@- +// -@--@---@@@@-@-@@--@@-@-- +// -@@@@---@----@--@@--@-@-- +// -@---@--@----@---@--@@@-- +// @----@--@@@@-@-@@@---@--- +// ---------------------@--- +// --------------------@---- +const uint8_t free_calibri11x12_latin[] PROGMEM = +{ +// type|width|height|first char + 0x02, 0x0A, 0x0C, 0x00, +// GROUP first '¡' total 95 chars +// unicode(LSB,MSB)|count + 0x00, 0xA1, 0x5F, // unicode record + 0x00, 0x00, 0x02, 0x0B, // char '¡' (0x00A1/161) + 0x00, 0x04, 0x04, 0x0A, // char '¢' (0x00A2/162) + 0x00, 0x0C, 0x05, 0x0A, // char '£' (0x00A3/163) + 0x00, 0x16, 0x05, 0x0A, // char '¤' (0x00A4/164) + 0x00, 0x20, 0x06, 0x0A, // char '¥' (0x00A5/165) + 0x00, 0x2C, 0x01, 0x0C, // char '¦' (0x00A6/166) + 0x00, 0x2E, 0x04, 0x0B, // char '§' (0x00A7/167) + 0x00, 0x36, 0x05, 0x04, // char '¨' (0x00A8/168) + 0x00, 0x3B, 0x07, 0x0A, // char '©' (0x00A9/169) + 0x00, 0x49, 0x03, 0x09, // char 'ª' (0x00AA/170) + 0x00, 0x4F, 0x04, 0x09, // char '«' (0x00AB/171) + 0x00, 0x57, 0x05, 0x08, // char '¬' (0x00AC/172) + 0x00, 0x5C, 0x03, 0x08, // char '' (0x00AD/173) + 0x00, 0x5F, 0x04, 0x06, // char '®' (0x00AE/174) + 0x00, 0x63, 0x04, 0x04, // char '¯' (0x00AF/175) + 0x00, 0x67, 0x03, 0x06, // char '°' (0x00B0/176) + 0x00, 0x6A, 0x05, 0x0A, // char '±' (0x00B1/177) + 0x00, 0x74, 0x03, 0x06, // char '²' (0x00B2/178) + 0x00, 0x77, 0x03, 0x06, // char '³' (0x00B3/179) + 0x00, 0x7A, 0x03, 0x04, // char '´' (0x00B4/180) + 0x00, 0x7D, 0x05, 0x0C, // char 'µ' (0x00B5/181) + 0x00, 0x87, 0x05, 0x0B, // char '¶' (0x00B6/182) + 0x00, 0x91, 0x02, 0x07, // char '·' (0x00B7/183) + 0x00, 0x93, 0x02, 0x0C, // char '¸' (0x00B8/184) + 0x00, 0x97, 0x02, 0x06, // char '¹' (0x00B9/185) + 0x00, 0x99, 0x03, 0x09, // char 'º' (0x00BA/186) + 0x00, 0x9F, 0x04, 0x09, // char '»' (0x00BB/187) + 0x00, 0xA7, 0x07, 0x0A, // char '¼' (0x00BC/188) + 0x00, 0xB5, 0x07, 0x0A, // char '½' (0x00BD/189) + 0x00, 0xC3, 0x07, 0x0A, // char '¾' (0x00BE/190) + 0x00, 0xD1, 0x04, 0x0B, // char '¿' (0x00BF/191) + 0x00, 0xD9, 0x06, 0x0A, // char 'À' (0x00C0/192) + 0x00, 0xE5, 0x06, 0x0A, // char 'Á' (0x00C1/193) + 0x00, 0xF1, 0x06, 0x0A, // char 'Â' (0x00C2/194) + 0x00, 0xFD, 0x06, 0x0A, // char 'Ã' (0x00C3/195) + 0x01, 0x09, 0x06, 0x0A, // char 'Ä' (0x00C4/196) + 0x01, 0x15, 0x06, 0x0A, // char 'Å' (0x00C5/197) + 0x01, 0x21, 0x08, 0x0A, // char 'Æ' (0x00C6/198) + 0x01, 0x31, 0x05, 0x0C, // char 'Ç' (0x00C7/199) + 0x01, 0x3B, 0x05, 0x0A, // char 'È' (0x00C8/200) + 0x01, 0x45, 0x04, 0x0A, // char 'É' (0x00C9/201) + 0x01, 0x4D, 0x05, 0x0A, // char 'Ê' (0x00CA/202) + 0x01, 0x57, 0x05, 0x0A, // char 'Ë' (0x00CB/203) + 0x01, 0x61, 0x03, 0x0A, // char 'Ì' (0x00CC/204) + 0x01, 0x67, 0x03, 0x0A, // char 'Í' (0x00CD/205) + 0x01, 0x6D, 0x05, 0x0A, // char 'Î' (0x00CE/206) + 0x01, 0x77, 0x05, 0x0A, // char 'Ï' (0x00CF/207) + 0x01, 0x81, 0x06, 0x0A, // char 'Ð' (0x00D0/208) + 0x01, 0x8D, 0x05, 0x0A, // char 'Ñ' (0x00D1/209) + 0x01, 0x97, 0x05, 0x0A, // char 'Ò' (0x00D2/210) + 0x01, 0xA1, 0x05, 0x0A, // char 'Ó' (0x00D3/211) + 0x01, 0xAB, 0x05, 0x0A, // char 'Ô' (0x00D4/212) + 0x01, 0xB5, 0x05, 0x0A, // char 'Õ' (0x00D5/213) + 0x01, 0xBF, 0x05, 0x0A, // char 'Ö' (0x00D6/214) + 0x01, 0xC9, 0x04, 0x09, // char '×' (0x00D7/215) + 0x01, 0xD1, 0x06, 0x0B, // char 'Ø' (0x00D8/216) + 0x01, 0xDD, 0x05, 0x0A, // char 'Ù' (0x00D9/217) + 0x01, 0xE7, 0x05, 0x0A, // char 'Ú' (0x00DA/218) + 0x01, 0xF1, 0x05, 0x0A, // char 'Û' (0x00DB/219) + 0x01, 0xFB, 0x05, 0x0A, // char 'Ü' (0x00DC/220) + 0x02, 0x05, 0x05, 0x0A, // char 'Ý' (0x00DD/221) + 0x02, 0x0F, 0x04, 0x0A, // char 'Þ' (0x00DE/222) + 0x02, 0x17, 0x05, 0x0A, // char 'ß' (0x00DF/223) + 0x02, 0x21, 0x04, 0x0A, // char 'à' (0x00E0/224) + 0x02, 0x29, 0x04, 0x0A, // char 'á' (0x00E1/225) + 0x02, 0x31, 0x04, 0x0A, // char 'â' (0x00E2/226) + 0x02, 0x39, 0x05, 0x0A, // char 'ã' (0x00E3/227) + 0x02, 0x43, 0x05, 0x0A, // char 'ä' (0x00E4/228) + 0x02, 0x4D, 0x04, 0x0A, // char 'å' (0x00E5/229) + 0x02, 0x55, 0x07, 0x0A, // char 'æ' (0x00E6/230) + 0x02, 0x63, 0x04, 0x0C, // char 'ç' (0x00E7/231) + 0x02, 0x6B, 0x04, 0x0A, // char 'è' (0x00E8/232) + 0x02, 0x73, 0x04, 0x0A, // char 'é' (0x00E9/233) + 0x02, 0x7B, 0x04, 0x0A, // char 'ê' (0x00EA/234) + 0x02, 0x83, 0x05, 0x0A, // char 'ë' (0x00EB/235) + 0x02, 0x8D, 0x03, 0x0A, // char 'ì' (0x00EC/236) + 0x02, 0x93, 0x03, 0x0A, // char 'í' (0x00ED/237) + 0x02, 0x99, 0x04, 0x0A, // char 'î' (0x00EE/238) + 0x02, 0xA1, 0x04, 0x0A, // char 'ï' (0x00EF/239) + 0x02, 0xA9, 0x05, 0x0A, // char 'ð' (0x00F0/240) + 0x02, 0xB3, 0x05, 0x0A, // char 'ñ' (0x00F1/241) + 0x02, 0xBD, 0x04, 0x0A, // char 'ò' (0x00F2/242) + 0x02, 0xC5, 0x04, 0x0A, // char 'ó' (0x00F3/243) + 0x02, 0xCD, 0x04, 0x0A, // char 'ô' (0x00F4/244) + 0x02, 0xD5, 0x05, 0x0A, // char 'õ' (0x00F5/245) + 0x02, 0xDF, 0x05, 0x0A, // char 'ö' (0x00F6/246) + 0x02, 0xE9, 0x05, 0x09, // char '÷' (0x00F7/247) + 0x02, 0xF3, 0x05, 0x0B, // char 'ø' (0x00F8/248) + 0x02, 0xFD, 0x04, 0x0A, // char 'ù' (0x00F9/249) + 0x03, 0x05, 0x04, 0x0A, // char 'ú' (0x00FA/250) + 0x03, 0x0D, 0x04, 0x0A, // char 'û' (0x00FB/251) + 0x03, 0x15, 0x05, 0x0A, // char 'ü' (0x00FC/252) + 0x03, 0x1F, 0x05, 0x0C, // char 'ý' (0x00FD/253) + 0x03, 0x29, 0x04, 0x0C, // char 'þ' (0x00FE/254) + 0x03, 0x31, 0x05, 0x0C, // char 'ÿ' (0x00FF/255) + 0x03, 0x3E, + 0x10, 0x90, 0x00, 0x07, // char '¡' (0x00A1/161) + 0xE0, 0xB0, 0x18, 0x10, 0x00, 0x01, 0x03, 0x01, // char '¢' (0x00A2/162) + 0x40, 0xF0, 0x58, 0x48, 0x18, 0x02, 0x03, 0x02, 0x02, 0x02, // char '£' (0x00A3/163) + 0x10, 0xE0, 0x20, 0x20, 0xD0, 0x00, 0x03, 0x01, 0x01, 0x02, // char '¤' (0x00A4/164) + 0x48, 0x58, 0xE0, 0x70, 0x48, 0x00, 0x01, 0x01, 0x03, 0x01, 0x01, 0x00, // char '¥' (0x00A5/165) + 0x3C, 0x0F, // char '¦' (0x00A6/166) + 0xF8, 0xA8, 0x68, 0xC0, 0x04, 0x05, 0x05, 0x07, // char '§' (0x00A7/167) + 0x08, 0x08, 0x00, 0x08, 0x08, // char '¨' (0x00A8/168) + 0xF0, 0x08, 0xF4, 0x94, 0x94, 0x04, 0xF8, 0x01, 0x03, 0x02, 0x02, 0x02, 0x03, 0x01, // char '©' (0x00A9/169) + 0x68, 0x68, 0x70, 0x01, 0x01, 0x01, // char 'ª' (0x00AA/170) + 0xE0, 0x10, 0xE0, 0x10, 0x00, 0x01, 0x00, 0x01, // char '«' (0x00AB/171) + 0x40, 0x40, 0x40, 0x40, 0xC0, // char '¬' (0x00AC/172) + 0x80, 0x80, 0x80, // char '' (0x00AD/173) + 0x3C, 0x2C, 0x24, 0x18, // char '®' (0x00AE/174) + 0x00, 0x08, 0x08, 0x08, // char '¯' (0x00AF/175) + 0x38, 0x28, 0x38, // char '°' (0x00B0/176) + 0x20, 0x20, 0xF8, 0x20, 0x20, 0x02, 0x02, 0x02, 0x02, 0x02, // char '±' (0x00B1/177) + 0x24, 0x34, 0x2C, // char '²' (0x00B2/178) + 0x2C, 0x2C, 0x34, // char '³' (0x00B3/179) + 0x00, 0x08, 0x04, // char '´' (0x00B4/180) + 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x02, 0x02, 0x03, 0x02, // char 'µ' (0x00B5/181) + 0x70, 0x78, 0xF8, 0x08, 0xF8, 0x00, 0x00, 0x07, 0x00, 0x07, // char '¶' (0x00B6/182) + 0x40, 0x40, // char '·' (0x00B7/183) + 0x00, 0x00, 0x08, 0x0C, // char '¸' (0x00B8/184) + 0x08, 0x3C, // char '¹' (0x00B9/185) + 0x78, 0x48, 0x78, 0x01, 0x01, 0x01, // char 'º' (0x00BA/186) + 0x10, 0xE0, 0x10, 0xE0, 0x01, 0x00, 0x01, 0x00, // char '»' (0x00BB/187) + 0x10, 0x78, 0x80, 0x40, 0xB0, 0xC8, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x03, 0x01, // char '¼' (0x00BC/188) + 0x10, 0x78, 0x80, 0x40, 0x70, 0x48, 0xC0, 0x00, 0x02, 0x01, 0x00, 0x02, 0x03, 0x02, // char '½' (0x00BD/189) + 0x58, 0x58, 0xF8, 0x40, 0xB0, 0xC8, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x03, 0x01, // char '¾' (0x00BE/190) + 0x00, 0x90, 0xD0, 0x00, 0x03, 0x04, 0x04, 0x04, // char '¿' (0x00BF/191) + 0x00, 0xC0, 0xB9, 0x9A, 0xE0, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03, // char 'À' (0x00C0/192) + 0x00, 0xC0, 0xB8, 0x9A, 0xE1, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03, // char 'Á' (0x00C1/193) + 0x00, 0xC0, 0xBA, 0x99, 0xE2, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03, // char 'Â' (0x00C2/194) + 0x00, 0xC0, 0xBB, 0x99, 0xE2, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03, // char 'Ã' (0x00C3/195) + 0x00, 0xC2, 0xBA, 0x98, 0xE2, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03, // char 'Ä' (0x00C4/196) + 0x00, 0xC7, 0xBD, 0x9F, 0xE0, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03, // char 'Å' (0x00C5/197) + 0x00, 0xC0, 0xB0, 0x88, 0xF8, 0x48, 0x48, 0x48, 0x02, 0x01, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, // char 'Æ' (0x00C6/198) + 0xF0, 0xF8, 0x08, 0x08, 0x10, 0x01, 0x03, 0x0E, 0x0E, 0x01, // char 'Ç' (0x00C7/199) + 0x00, 0xF9, 0x4A, 0x48, 0x48, 0x00, 0x03, 0x02, 0x02, 0x02, // char 'È' (0x00C8/200) + 0xF8, 0x48, 0x4A, 0x49, 0x03, 0x02, 0x02, 0x02, // char 'É' (0x00C9/201) + 0x00, 0xFA, 0x49, 0x4A, 0x48, 0x00, 0x03, 0x02, 0x02, 0x02, // char 'Ê' (0x00CA/202) + 0xFA, 0x4A, 0x48, 0x4A, 0x02, 0x03, 0x02, 0x02, 0x02, 0x00, // char 'Ë' (0x00CB/203) + 0x00, 0x01, 0xFA, 0x00, 0x00, 0x03, // char 'Ì' (0x00CC/204) + 0x00, 0xFA, 0x01, 0x00, 0x03, 0x00, // char 'Í' (0x00CD/205) + 0x00, 0x02, 0xF9, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // char 'Î' (0x00CE/206) + 0x02, 0x02, 0xF8, 0x02, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, // char 'Ï' (0x00CF/207) + 0x40, 0xF8, 0x48, 0x08, 0xB8, 0xF0, 0x00, 0x03, 0x02, 0x02, 0x03, 0x01, // char 'Ð' (0x00D0/208) + 0xF8, 0x1B, 0x61, 0x82, 0xFB, 0x03, 0x00, 0x00, 0x03, 0x03, // char 'Ñ' (0x00D1/209) + 0xF0, 0x19, 0x0A, 0x18, 0xF0, 0x01, 0x02, 0x02, 0x03, 0x01, // char 'Ò' (0x00D2/210) + 0xF0, 0x18, 0x0A, 0x19, 0xF0, 0x01, 0x02, 0x02, 0x03, 0x01, // char 'Ó' (0x00D3/211) + 0xF0, 0x1A, 0x09, 0x1A, 0xF0, 0x01, 0x02, 0x02, 0x03, 0x01, // char 'Ô' (0x00D4/212) + 0xF0, 0x1B, 0x09, 0x1A, 0xF3, 0x01, 0x02, 0x02, 0x03, 0x01, // char 'Õ' (0x00D5/213) + 0xF2, 0x1A, 0x08, 0x1A, 0xF2, 0x01, 0x02, 0x02, 0x03, 0x01, // char 'Ö' (0x00D6/214) + 0x20, 0xC0, 0xC0, 0x20, 0x01, 0x00, 0x00, 0x01, // char '×' (0x00D7/215) + 0xF0, 0x08, 0xC8, 0x38, 0x1C, 0xE0, 0x05, 0x03, 0x02, 0x02, 0x01, 0x00, // char 'Ø' (0x00D8/216) + 0xF8, 0x01, 0x02, 0x00, 0xF8, 0x01, 0x02, 0x02, 0x02, 0x01, // char 'Ù' (0x00D9/217) + 0xF8, 0x00, 0x02, 0x01, 0xF8, 0x01, 0x02, 0x02, 0x02, 0x01, // char 'Ú' (0x00DA/218) + 0xF8, 0x02, 0x01, 0x02, 0xF8, 0x01, 0x02, 0x02, 0x02, 0x01, // char 'Û' (0x00DB/219) + 0xFA, 0x02, 0x00, 0x02, 0xFA, 0x01, 0x02, 0x02, 0x02, 0x01, // char 'Ü' (0x00DC/220) + 0x08, 0x30, 0xC0, 0x32, 0x09, 0x00, 0x00, 0x03, 0x00, 0x00, // char 'Ý' (0x00DD/221) + 0xF8, 0x90, 0xF0, 0x70, 0x03, 0x00, 0x00, 0x00, // char 'Þ' (0x00DE/222) + 0xF0, 0x08, 0x68, 0xF8, 0x80, 0x03, 0x00, 0x02, 0x02, 0x03, // char 'ß' (0x00DF/223) + 0xA0, 0xA4, 0xA8, 0xE0, 0x03, 0x02, 0x02, 0x03, // char 'à' (0x00E0/224) + 0xA0, 0xA0, 0xA8, 0xE4, 0x03, 0x02, 0x02, 0x03, // char 'á' (0x00E1/225) + 0xA0, 0xA0, 0xAC, 0xE0, 0x03, 0x02, 0x02, 0x03, // char 'â' (0x00E2/226) + 0x00, 0xAC, 0xA4, 0xA8, 0xEC, 0x00, 0x03, 0x02, 0x02, 0x03, // char 'ã' (0x00E3/227) + 0xA8, 0xA8, 0xA0, 0xE8, 0x08, 0x03, 0x02, 0x02, 0x03, 0x00, // char 'ä' (0x00E4/228) + 0xAE, 0xAA, 0xAE, 0xE0, 0x03, 0x02, 0x02, 0x03, // char 'å' (0x00E5/229) + 0x20, 0xA0, 0xA0, 0xE0, 0xA0, 0xA0, 0xC0, 0x03, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, // char 'æ' (0x00E6/230) + 0xC0, 0x60, 0x20, 0x20, 0x01, 0x0B, 0x0E, 0x02, // char 'ç' (0x00E7/231) + 0xC0, 0xA4, 0xA8, 0xC0, 0x01, 0x02, 0x02, 0x02, // char 'è' (0x00E8/232) + 0xC0, 0xA0, 0xA8, 0xC4, 0x01, 0x02, 0x02, 0x02, // char 'é' (0x00E9/233) + 0xC0, 0xA0, 0xAC, 0xC0, 0x01, 0x02, 0x02, 0x02, // char 'ê' (0x00EA/234) + 0xC8, 0xA8, 0xA0, 0xC8, 0x08, 0x01, 0x02, 0x02, 0x02, 0x00, // char 'ë' (0x00EB/235) + 0x00, 0x04, 0xE8, 0x00, 0x00, 0x03, // char 'ì' (0x00EC/236) + 0x00, 0xE8, 0x04, 0x00, 0x03, 0x00, // char 'í' (0x00ED/237) + 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x03, 0x00, // char 'î' (0x00EE/238) + 0x00, 0x08, 0xE0, 0x08, 0x00, 0x00, 0x03, 0x00, // char 'ï' (0x00EF/239) + 0x80, 0xD0, 0x58, 0x78, 0xE8, 0x01, 0x03, 0x02, 0x03, 0x01, // char 'ð' (0x00F0/240) + 0x00, 0xEC, 0x24, 0x28, 0xEC, 0x00, 0x03, 0x00, 0x00, 0x03, // char 'ñ' (0x00F1/241) + 0xE0, 0x24, 0x28, 0xE0, 0x03, 0x02, 0x02, 0x03, // char 'ò' (0x00F2/242) + 0xE0, 0x20, 0x28, 0xE4, 0x03, 0x02, 0x02, 0x03, // char 'ó' (0x00F3/243) + 0xE0, 0x20, 0x2C, 0xE0, 0x03, 0x02, 0x02, 0x03, // char 'ô' (0x00F4/244) + 0x00, 0xEC, 0x24, 0x28, 0xEC, 0x00, 0x03, 0x02, 0x02, 0x03, // char 'õ' (0x00F5/245) + 0xE8, 0x28, 0x20, 0xE8, 0x08, 0x03, 0x02, 0x02, 0x03, 0x00, // char 'ö' (0x00F6/246) + 0x40, 0x40, 0x50, 0x50, 0x40, 0x00, 0x00, 0x01, 0x01, 0x00, // char '÷' (0x00F7/247) + 0xC0, 0x60, 0xE0, 0x70, 0xC0, 0x01, 0x07, 0x03, 0x03, 0x01, // char 'ø' (0x00F8/248) + 0xE0, 0x04, 0x08, 0xE0, 0x03, 0x02, 0x02, 0x03, // char 'ù' (0x00F9/249) + 0xE0, 0x00, 0x08, 0xE4, 0x03, 0x02, 0x02, 0x03, // char 'ú' (0x00FA/250) + 0xE0, 0x00, 0x0C, 0xE0, 0x03, 0x02, 0x02, 0x03, // char 'û' (0x00FB/251) + 0xE8, 0x08, 0x00, 0xE8, 0x08, 0x03, 0x02, 0x02, 0x03, 0x00, // char 'ü' (0x00FC/252) + 0x60, 0xC0, 0x08, 0xC4, 0x20, 0x00, 0x09, 0x07, 0x01, 0x00, // char 'ý' (0x00FD/253) + 0xF8, 0x40, 0x60, 0xE0, 0x0F, 0x02, 0x03, 0x01, // char 'þ' (0x00FE/254) + 0x68, 0xC8, 0x00, 0xC8, 0x28, 0x00, 0x09, 0x07, 0x01, 0x00, // char 'ÿ' (0x00FF/255) + 0x00, 0x00, 0x00, // end of unicode tables + // FONT REQUIRES 1219 BYTES +}; diff --git a/lib/libssd1306/src/ssd1306_fonts.h b/lib/libssd1306/src/ssd1306_fonts.h new file mode 100644 index 0000000..e0b852e --- /dev/null +++ b/lib/libssd1306/src/ssd1306_fonts.h @@ -0,0 +1,100 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_fonts.h Fonts for monochrome/rgb oled display + */ + +#ifndef SSD1306_FONTS_H +#define SSD1306_FONTS_H + +#include "ssd1306_hal/io.h" +#include "nano_gfx_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup LCD_FONTS FONTS: Supported LCD fonts + * @{ + */ + +/** Standard ASCII 6x8 Fixed Type font.*/ +extern const PROGMEM uint8_t ssd1306xled_font6x8 []; + +/** Standard ASCII 8x16 Fixed Type font */ +extern const PROGMEM uint8_t ssd1306xled_font8x16[]; + +/** German chars for standard ASCII 6x8 Fixed Type font */ +extern const PROGMEM uint8_t ssd1306xled_font6x8_German []; + +/** Standard ASCII 6x8 AB Fixed Type font with only capital letters */ +extern const PROGMEM uint8_t ssd1306xled_font6x8_AB []; + +/** Standard ASCII 5x7 Fixed Type font */ +extern const PROGMEM uint8_t ssd1306xled_font5x7 []; + +/** Standard ASCII 5x7 Fixed Type font with only capital letters */ +extern const PROGMEM uint8_t ssd1306xled_font5x7_AB []; + +/** Digital ASCII 5x7 Fixed Type font with only digits and operation signs */ +extern const PROGMEM uint8_t digital_font5x7_123[]; + +/** Digital ASCII 5x7 Fixed Type font with only capital letters */ +extern const PROGMEM uint8_t digital_font5x7_AB[]; + +/** Digital ASCII 5x7 Fixed Type font */ +extern const PROGMEM uint8_t digital_font5x7[]; + +/** Calibri ASCII 11x12 Free Type font */ +extern const PROGMEM uint8_t free_calibri11x12[]; + +/** Calibri ASCII 11x12 Free Type font cyrillic */ +extern const PROGMEM uint8_t free_calibri11x12_cyrillic[]; + +/** Calibri ASCII 11x12 Free Type font basic latin */ +extern const PROGMEM uint8_t free_calibri11x12_latin[]; + + +/** + * Standard ASCII Free Type font 11x16 with digits only (Ascii codes 32 - 64). + * @warning can be used only with ssd1306_printFixed() and ssd1306_setFixedFont() functions. + */ +extern const PROGMEM uint8_t courier_new_font11x16_digits []; + +/** + * Comic Sans ASCII Free Type font 24x32 with digits only (Ascii codes 32 - 64). + * @warning can be used only with ssd1306_printFixed() and ssd1306_setFixedFont() functions. + */ +extern const PROGMEM uint8_t comic_sans_font24x32_123 []; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif // SSD1306_FONTS_H diff --git a/lib/libssd1306/src/ssd1306_generic.c b/lib/libssd1306/src/ssd1306_generic.c new file mode 100644 index 0000000..75f3fa7 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_generic.c @@ -0,0 +1,395 @@ +/* + MIT License + + Copyright (c) 2016-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/////////////////////////////////////////////////////////////////////////////// +////// GENERIC FUNCTIONS APPLICABLE FOR ALL DISPLAY TYPES ///////////////////// +/////////////////////////////////////////////////////////////////////////////// + +#include "ssd1306.h" +#include "ssd1306_fonts.h" +#include "lcd/lcd_common.h" +#include "intf/i2c/ssd1306_i2c.h" +#include "intf/spi/ssd1306_spi.h" +#include "intf/ssd1306_interface.h" +#include "ssd1306_hal/io.h" +#include "nano_gfx_types.h" + +enum +{ + SSD1306_OLD_FIXED_FORMAT = 0x00, + SSD1306_NEW_FIXED_FORMAT = 0x01, + SSD1306_NEW_FORMAT = 0x02, + SSD1306_SQUIX_FORMAT = 0x03, +}; + +uint16_t ssd1306_color = 0xFFFF; +lcduint_t ssd1306_cursorX = 0; +lcduint_t ssd1306_cursorY = 0; +SFixedFontInfo s_fixedFont = {}; //{ { 0 }, 0 }; +#ifdef CONFIG_SSD1306_UNICODE_ENABLE +uint8_t g_ssd1306_unicode = 1; +#endif +static void (*s_ssd1306_getCharBitmap)(uint16_t unicode, SCharInfo *info) = NULL; + +static const uint8_t *ssd1306_getCharGlyph(char ch); +static const uint8_t *ssd1306_getU16CharGlyph(uint16_t unicode); + +lcduint_t ssd1306_displayHeight() +{ + return ssd1306_lcd.height; +} + +lcduint_t ssd1306_displayWidth() +{ + return ssd1306_lcd.width; +} + +void ssd1306_setCursor(lcdint_t x, lcdint_t y) +{ + ssd1306_cursorX = x; + ssd1306_cursorY = y; +} + +static const uint8_t * ssd1306_readUnicodeRecord(SUnicodeBlockRecord *r, const uint8_t *p) +{ + r->start_code =( pgm_read_byte(&p[0]) << 8) | (pgm_read_byte(&p[1])); + r->count = pgm_read_byte(&p[2]); + return (r->count > 0) ? (&p[3]): NULL; +} + + +void ssd1306_setSecondaryFont(const uint8_t * progmemUnicode) +{ +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + s_fixedFont.secondary_table = progmemUnicode; + if (s_fixedFont.secondary_table != NULL) + { + s_fixedFont.secondary_table += sizeof(SFontHeaderRecord); + } +#endif +} + +void ssd1306_getCharBitmap(uint16_t unicode, SCharInfo *info) +{ + return s_ssd1306_getCharBitmap( unicode, info ); +} + +uint16_t ssd1306_unicode16FromUtf8(uint8_t ch) +{ +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + static uint16_t unicode = 0; + ch &= 0x000000FF; + if (!unicode) + { + if ( ch >= 0xc0 ) + { + unicode = ch; + return SSD1306_MORE_CHARS_REQUIRED; + } + return ch; + } + uint16_t code = ((unicode & 0x1f) << 6) | (ch & 0x3f); + unicode = 0; + return code; +#else + return ch; +#endif +} + +void ssd1306_enableUtf8Mode(void) +{ +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + g_ssd1306_unicode = 1; +#endif +} + +void ssd1306_enableAsciiMode(void) +{ +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + g_ssd1306_unicode = 0; +#endif +} + +////////////////////////////////////////////////////////////////////////////////////////////////// +/// SECTION WITH FONT FORMATS +////////////////////////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////////////////////////// +/// OLD FORMAT: 1.7.6 and below +/// OLD FORMAT is supported by old and latest versions of ssd1306 library + +static const uint8_t *ssd1306_getCharGlyph(char ch) +{ + return &s_fixedFont.primary_table[ (ch - s_fixedFont.h.ascii_offset) * + s_fixedFont.glyph_size + + (s_fixedFont.h.type == 0x01 ? sizeof(SUnicodeBlockRecord) : 0) ]; +} + +#ifdef CONFIG_SSD1306_UNICODE_ENABLE +static const uint8_t *ssd1306_searchCharGlyph(const uint8_t * unicode_table, uint16_t unicode) +{ + SUnicodeBlockRecord r; + const uint8_t *data = unicode_table; + // looking for required unicode table + while (1) + { + ssd1306_readUnicodeRecord( &r, data ); + if (r.count == 0) + { + break; + } + data += sizeof(SUnicodeBlockRecord); + if ( ( unicode >= r.start_code) && ( unicode < (r.start_code + r.count) ) ) + { + break; + } + data += r.count * s_fixedFont.glyph_size; + } + if (r.count == 0) + { + // Sorry, no glyph found for the specified character + return NULL; + } + return &data[ (unicode - r.start_code) * s_fixedFont.glyph_size ]; +} +#endif + +static const uint8_t *ssd1306_getU16CharGlyph(uint16_t unicode) +{ +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + const uint8_t * glyph = NULL; + if (g_ssd1306_unicode) + { + if ((unicode < 128) && (s_fixedFont.h.type == 0x00) && (s_fixedFont.primary_table != NULL)) + { + return ssd1306_getCharGlyph(unicode); + } + if (s_fixedFont.primary_table) + { + glyph = ssd1306_searchCharGlyph( s_fixedFont.primary_table, unicode ); + } + if (!glyph && s_fixedFont.secondary_table) + { + glyph = ssd1306_searchCharGlyph( s_fixedFont.secondary_table, unicode ); + } + if (!glyph) + { + return ssd1306_getCharGlyph( s_fixedFont.h.ascii_offset ); + } + return glyph; + } + else +#endif + { + return ssd1306_getCharGlyph(unicode); + } +} + +static void __ssd1306_oldFormatGetBitmap(uint16_t unicode, SCharInfo *info) +{ + if (info) + { + info->width = s_fixedFont.h.width; + info->height = s_fixedFont.h.height; + info->spacing = 0; + info->glyph = ssd1306_getU16CharGlyph( unicode ); + } +} + +void ssd1306_setFixedFont(const uint8_t * progmemFont) +{ + s_fixedFont.h.type = pgm_read_byte( &progmemFont[0] ); + s_fixedFont.h.width = pgm_read_byte(&progmemFont[1]); + s_fixedFont.h.height = pgm_read_byte(&progmemFont[2]); + s_fixedFont.h.ascii_offset = pgm_read_byte(&progmemFont[3]); + s_fixedFont.primary_table = progmemFont + 4; + s_ssd1306_getCharBitmap = __ssd1306_oldFormatGetBitmap; + s_fixedFont.pages = (s_fixedFont.h.height + 7) >> 3; + s_fixedFont.glyph_size = s_fixedFont.pages * s_fixedFont.h.width; +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + s_fixedFont.secondary_table = NULL; +#endif +} + +void ssd1306_setFixedFont_oldStyle(const uint8_t * progmemFont) +{ + s_fixedFont.h.type = pgm_read_byte( &progmemFont[0] ); + s_fixedFont.h.width = pgm_read_byte(&progmemFont[1]); + s_fixedFont.h.height = pgm_read_byte(&progmemFont[2]); + s_fixedFont.h.ascii_offset = pgm_read_byte(&progmemFont[3]); + s_fixedFont.primary_table = progmemFont + 4; + s_fixedFont.pages = (s_fixedFont.h.height + 7) >> 3; + s_fixedFont.glyph_size = s_fixedFont.pages * s_fixedFont.h.width; +} + +////////////////////////////////////////////////////////////////////////////////////////////////// +/// NEW FORMAT: 1.7.8 and later +/// NEW FORMAT is supported only by latest versions of ssd1306 library + +static void __ssd1306_newFormatGetBitmap(uint16_t unicode, SCharInfo *info) +{ + if (info) + { +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + uint8_t table_index = 0; +#endif + const uint8_t *data = s_fixedFont.primary_table; + while (data) + { + SUnicodeBlockRecord r; + data = ssd1306_readUnicodeRecord( &r, data ); + if (!data) + { +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + if ( table_index == 0 ) + { + table_index++; + data = s_fixedFont.secondary_table; + continue; + } +#endif + break; + } + /* Check that unicode in the section being processed */ + if ( ( unicode < r.start_code) || ( unicode >= (r.start_code + r.count) ) ) + { + // skip jump table + data += r.count * 4; + // skip block bitmap data + data += ((pgm_read_byte(&data[0]) << 8) | (pgm_read_byte(&data[1]))) + 2; + continue; + } + /* At this point data points to jump table (offset|offset|bytes|width) */ + unicode -= r.start_code; + data += unicode * 4; + uint16_t offset = (pgm_read_byte(&data[0]) << 8) | (pgm_read_byte(&data[1])); + uint8_t glyph_width = pgm_read_byte(&data[2]); + uint8_t glyph_height = pgm_read_byte(&data[3]); + info->width = glyph_width; + info->height = glyph_height; + info->spacing = glyph_width ? 1 : (s_fixedFont.h.width >> 1); + info->glyph = data + (r.count - unicode) * 4 + 2 + offset; + break; + } + if (!info->glyph) + { + info->width = 0; + info->height = 0; + info->spacing = s_fixedFont.h.width >> 1; + info->glyph = s_fixedFont.primary_table; + } + } +} + +void ssd1306_setFreeFont(const uint8_t * progmemFont) +{ + s_fixedFont.h.type = pgm_read_byte( &progmemFont[0] ); + s_fixedFont.h.width = pgm_read_byte(&progmemFont[1]); + s_fixedFont.h.height = pgm_read_byte(&progmemFont[2]); + s_fixedFont.h.ascii_offset = pgm_read_byte(&progmemFont[3]); + s_fixedFont.primary_table = progmemFont + 4; + s_ssd1306_getCharBitmap = __ssd1306_newFormatGetBitmap; + s_fixedFont.pages = (s_fixedFont.h.height + 7) >> 3; +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + s_fixedFont.secondary_table = NULL; +#endif +} + +////////////////////////////////////////////////////////////////////////////////////////////////// +/// SQUIX FORMAT: 1.7.8 and later +/// SQUIX FORMAT is not fully supported. Use it at your own risk + +static void __ssd1306_squixFormatGetBitmap(uint16_t unicode, SCharInfo *info) +{ + if (info) + { + const uint8_t *data = s_fixedFont.primary_table; + /* Check that unicode in the section being processed */ + if ( !data || ( unicode < s_fixedFont.h.ascii_offset) || ( unicode >= (s_fixedFont.h.ascii_offset + s_fixedFont.count) ) ) + { + info->width = 0; + info->height = 0; + info->spacing = s_fixedFont.h.width >> 1; + info->glyph = s_fixedFont.primary_table; + return; + } + /* At this point data points to jump table (offset|offset|bytes|width) */ + const uint8_t * bitmap_data = data + (uint16_t)s_fixedFont.count * 4; + unicode -= s_fixedFont.h.ascii_offset; + data += (unicode * 4); + uint16_t offset = (pgm_read_byte(&data[0]) << 8) | pgm_read_byte(&data[1]); + uint8_t glyph_bytes = pgm_read_byte(&data[2]); +// uint8_t width = pgm_read_byte(&data[3]); + info->width = glyph_bytes; //(glyph_bytes + s_fixedFont.pages - 1) / s_fixedFont.pages; + info->height = s_fixedFont.h.height / 2; + info->spacing = 1; +// uint8_t index=0; + info->glyph = bitmap_data; + if ( offset != 0xFFFF ) + { + info->glyph += offset; + } + } +} + +void ssd1306_setSquixFont(const uint8_t * progmemFont) +{ + s_fixedFont.h.type = SSD1306_SQUIX_FORMAT; + s_fixedFont.h.width = pgm_read_byte(&progmemFont[0]); + s_fixedFont.h.height = pgm_read_byte(&progmemFont[1]); + s_fixedFont.h.ascii_offset = pgm_read_byte(&progmemFont[2]); + s_fixedFont.count = pgm_read_byte(&progmemFont[3]); + s_fixedFont.primary_table = progmemFont + 4; + s_ssd1306_getCharBitmap = __ssd1306_squixFormatGetBitmap; + s_fixedFont.pages = (s_fixedFont.h.height + 7) >> 3; + s_fixedFont.glyph_size = s_fixedFont.pages * s_fixedFont.h.width; +#ifdef CONFIG_SSD1306_UNICODE_ENABLE + s_fixedFont.secondary_table = NULL; +#endif +} + +lcduint_t ssd1306_getTextSize(const char *text, lcduint_t *height) +{ + lcduint_t width = 0; + while (*text) + { + if (*text == '\r' || *text == '\n') + { + text++; + break; + } + uint16_t unicode = ssd1306_unicode16FromUtf8(*text); + if (unicode == SSD1306_MORE_CHARS_REQUIRED) + { + text++; + continue; + } + SCharInfo char_info; + ssd1306_getCharBitmap(unicode, &char_info); + width += char_info.width + char_info.spacing; + if ( height ) *height = char_info.height; + text++; + } + return width; +} diff --git a/lib/libssd1306/src/ssd1306_generic.h b/lib/libssd1306/src/ssd1306_generic.h new file mode 100644 index 0000000..73c953d --- /dev/null +++ b/lib/libssd1306/src/ssd1306_generic.h @@ -0,0 +1,318 @@ +/* + MIT License + + Copyright (c) 2016-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_generic.h SSD1306 generic API functions + */ + + +#ifndef _SSD1306_GENERIC_H_ +#define _SSD1306_GENERIC_H_ + +#include "nano_gfx_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////// +// GENERIC GRAPH FUNCTIONS +/////////////////////////////////////////////////////////////////////// + +/** Flag means that more chars are required to decode utf-8 */ +#define SSD1306_MORE_CHARS_REQUIRED 0xffff + +/** + * @defgroup LCD_GENERIC_API DIRECT DRAW: Generic API functions, common for all displays and all display modes. + * @{ + * @brief Generic API functions, common for all displays and all display modes. + * + * @details Generic API functions, common for all displays and all display modes. + */ + +/** + * Set position in terms of display. + * @param x - horizontal position in pixels + * @param y - vertical position in blocks (pixels/8) + */ +void ssd1306_setPos(uint8_t x, uint8_t y); + +/** + * @brief Sets cursor position for text mode print functions. + * + * Sets cursor position for text mode print functions. + * @param x xpos in pixels + * @param y ypos in pixels + */ +void ssd1306_setCursor(lcdint_t x, lcdint_t y); + +/** + * Function allows to set another fixed font for the library. + * By default, the font supports only first 128 - 32 ascii chars. + * Please refer to github wiki on how to generate new fonts. + * @param progmemFont - font to setup located in Flash area + */ +void ssd1306_setFixedFont(const uint8_t * progmemFont); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +void ssd1306_setFixedFont_oldStyle(const uint8_t * progmemFont); +#endif + +/** + * Function allows to set another free font for the library. + * By default, the font supports only first 128 - 32 ascii chars. + * Please refer to github wiki on how to generate new fonts. + * @param progmemFont - font to setup located in Flash area + * @note This function supports new fonts of ssd1306 library 1.7.8 and above + */ +void ssd1306_setFreeFont(const uint8_t * progmemFont); + +/** + * Function allows sets secondary font for specific language. + * Use it if you want to use additional font to combine capabilities of + * ascii fonts and language specific font. + * @param progmemUnicode font containing unicode table (refer to + * ssd1306xled_font6x8_German as example). + */ +void ssd1306_setSecondaryFont(const uint8_t * progmemUnicode); + +/** + * Function allows to set another font for the library. + * By default, the font supports only first 128 - 32 ascii chars. + * First 32 chars of ascii table are non-printable, and removed + * from the font table to reduce flash memory consumption. + * Default font doesn't support russian characters. Using + * this function you can implement your own fonts. + * First font char must be started with \<space\> image. + * @param progmemFont - font to setup located in Flash area + * @deprecated Use ssd1306_setFixedFont() instead. + */ +void ssd1306_setFont6x8(const uint8_t * progmemFont) __attribute__ ((deprecated)); + +/** + * @brief returns char data for currently set (active) font. + * + * Function returns char data for currently set font: pointer to progmem + * data for specified char, and width, height of the char. You can use these + * data to draw char manually using ssd1306_drawBitmap(), ssd1306_drawMonoBitmap8() + * or NanoCanvasOps::drawBitmap1(). + * + * @param ch char to read from set font + * @param info pointer to SCharInfo structure to fill with char data + * + * @see ssd1306_setFixedFont + */ +void ssd1306_getCharBitmap(uint16_t ch, SCharInfo *info); + +/** + * Enables utf8 support for all text-functions. + * @note Unicode-16 only supported in text decoding functions. + */ +void ssd1306_enableUtf8Mode(void); + +/** + * Enables ascii mode for all text-functions. No any decoding will be performed + */ +void ssd1306_enableAsciiMode(void); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +/** + * Function allows to set and use squix font. + * @param progmemFont - font to setup located in Flash area + * @note This function supports squix fonts for ssd1306 library 1.7.8 and above + * @warning Squix fonts are not fully supported, use them at your own risk + */ +void ssd1306_setSquixFont(const uint8_t * progmemFont); + +/** + * Returns 16-bit unicode char, encoded in utf8 + * SSD1306_MORE_CHARS_REQUIRED if more characters is expected + * @param ch character byte to decode + * @return 16-bit unicode char, encoded in utf8 + * SSD1306_MORE_CHARS_REQUIRED if more characters is expected + */ +uint16_t ssd1306_unicode16FromUtf8(uint8_t ch); +#endif + +/** + * Returns dimensions in pixels for text provided. + * @param text text to calculate size of + * @param height variable to store text height. Can be NULL + * @return witdth of passed text in pixels + */ +lcduint_t ssd1306_getTextSize(const char *text, lcduint_t *height); + + +/////////////////////////////////////////////////////////////////////// +// HIGH-LEVEL GRAPH FUNCTIONS +/////////////////////////////////////////////////////////////////////// + +/** + * Describes menu object + */ +typedef struct +{ + /// list of menu items of the menu + const char **items; + /// count of menu items in the menu + uint8_t count; + /// currently selected item. Internally updated. + uint8_t selection; + /// selected item, when last redraw operation was performed. Internally updated. + uint8_t oldSelection; + /// position of menu scrolling. Internally updated + uint8_t scrollPosition; +} SAppMenu; + +/** + * Creates menu object with the provided list of menu items. + * List of menu items (strings) must exist all until menu object is no longer needed. + * Selection is set to the first item by default. + * + * @param menu - Pointer to SAppMenu structure + * @param items - array of null-termintated strings (located in SRAM) + * @param count - count of menu items in the array + */ +void ssd1306_createMenu(SAppMenu *menu, const char **items, uint8_t count); + +/** + * Shows menu items on the display. If menu items cannot fit the display, + * the function provides scrolling. + * + * @param menu - Pointer to SAppMenu structure + * + * @warning works only in SSD1306 compatible mode. + */ +void ssd1306_showMenu(SAppMenu *menu); + +/** + * Shows menu items on the display. If menu items cannot fit the display, + * the function provides scrolling. + * + * @param menu - Pointer to SAppMenu structure + * + * @warning works only in 8-bit RGB normal mode. + */ +void ssd1306_showMenu8(SAppMenu *menu); + +/** + * Shows menu items on the display. If menu items cannot fit the display, + * the function provides scrolling. + * + * @param menu - Pointer to SAppMenu structure + * + * @warning works only in 16-bit RGB normal mode. + */ +void ssd1306_showMenu16(SAppMenu *menu); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +static inline void ssd1331_showMenu8(SAppMenu *menu) +{ + ssd1306_showMenu8(menu); +} +#endif + +/** + * Updates menu items on the display. That is if selection is changed, + * the function will update only those areas, affected by the change. + * + * @param menu - Pointer to SAppMenu structure + */ +void ssd1306_updateMenu(SAppMenu *menu); + +/** + * Updates menu items on the display. That is if selection is changed, + * the function will update only those areas, affected by the change. + * + * @param menu - Pointer to SAppMenu structure + * + * @warning works only in SSD1306 compatible mode. + */ +void ssd1306_updateMenu8(SAppMenu *menu); + +/** + * Updates menu items on the display. That is if selection is changed, + * the function will update only those areas, affected by the change. + * + * @param menu - Pointer to SAppMenu structure + * + * @warning works only in SSD1306 compatible mode. + */ +void ssd1306_updateMenu16(SAppMenu *menu); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +static inline void ssd1331_updateMenu8(SAppMenu *menu) +{ + ssd1306_updateMenu8(menu); +} +#endif + +/** + * Returns currently selected menu item. + * First item has zero-index. + * + * @param menu - Pointer to SAppMenu structure + * + * @warning works only in 8-bit RGB normal mode. + */ +uint8_t ssd1306_menuSelection(SAppMenu *menu); + +/** + * Moves selection pointer down by 1 item. If there are no items below, + * it will set selection pointer to the first item. + * Use ssd1306_updateMenu() to refresh menu state on the display. + * + * @param menu - Pointer to SAppMenu structure + */ +void ssd1306_menuDown(SAppMenu *menu); + +/** + * Moves selection pointer up by 1 item. If selected item is the first one, + * then selection pointer will set to the last item in menu list. + * Use ssd1306_updateMenu() to refresh menu state on the display. + * + * @param menu - Pointer to SAppMenu structure + */ +void ssd1306_menuUp(SAppMenu *menu); + +/** + * Draws progress bar in the middle of the screen + * @param progress progress value in range 0 - 100. + */ +void ssd1306_drawProgressBar(int8_t progress); + +/** + * Draws progress bar in the middle of the screen + * @param progress progress value in range 0 - 100. + */ +void ssd1306_drawProgressBar8(int8_t progress); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif // _SSD1306_GENERIC_H_ diff --git a/lib/libssd1306/src/ssd1306_hal/Print_internal.h b/lib/libssd1306/src/ssd1306_hal/Print_internal.h new file mode 100644 index 0000000..b60e10e --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/Print_internal.h @@ -0,0 +1,111 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_hal/Print_internal.h SSD1306 Print class implementation + */ + +#ifndef _SSD1306_HAL_PRINT_INTERNAL_H_ +#define _SSD1306_HAL_PRINT_INTERNAL_H_ + +#if defined(ARDUINO) && !defined(ARDUINO_FAKE) + +/* Include standard print class for Arduino environment */ +#include "Print.h" + +#else + +#include "ssd1306_hal/io.h" +#include <stdio.h> + +/** Implements own Print class for plain AVR and Linux environment */ +class Print +{ +public: + /** Constructor to create Print class object */ + Print() {} + + /** + * abstract function to be defined in inherited classes + * @param ch char to print + * @return returns number of printed symbols + */ + virtual size_t write(uint8_t ch) = 0; + + /** + * Prints string via write() + * @param str string to print + * @return returns number of printed symbols + */ + size_t print(const char* str) + { + size_t n = 0; + while (*str) + { + n += write(*str); + str++; + } + return n; + } + + /** + * Prints number via write() + * @param n integer to print + * @return returns number of printed symbols + */ + size_t print(int n) + { + char a[10]; + snprintf(a, sizeof(a), "%i", n); + return print( a ); + } + + /** + * Prints string via write() and goes to next line. + * @param str string to print + * @return returns number of printed symbols + */ + size_t println(const char* str) + { + size_t n = print(str); + n += write('\n'); + return n; + }; + + /** + * Prints number via write() and goes to next line. + * @param data integer to print + * @return returns number of printed symbols + */ + size_t println(int data) + { + size_t n = print(data); + n += write('\n'); + return n; + } +}; + +#endif + +#endif diff --git a/lib/libssd1306/src/ssd1306_hal/README.md b/lib/libssd1306/src/ssd1306_hal/README.md new file mode 100644 index 0000000..3b0ef6c --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/README.md @@ -0,0 +1,14 @@ +# Hardware abstraction layer + +This directory contain platform specific implementation of hardware abstraction layer. + + * arduino dir: for all Arduino platforms (if you use Arduino IDE) + * avr dir: for plain avr-gcc environment + * esp dir: for plain esp8266/esp32 environment + * linux dir: for linux platforms including raspberry pi + * mingw dir: for running under windows + * stm32 dir: for plain stm32 support (not implemented) + * energia dir: for Energia platforms w/ MSP432P401R + +Edit UserSettings.h header file, if you want to disable some parts of ssd1306 library to reduce memory consumption in your project + diff --git a/lib/libssd1306/src/ssd1306_hal/UserSettings.h b/lib/libssd1306/src/ssd1306_hal/UserSettings.h new file mode 100644 index 0000000..5b9bc5f --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/UserSettings.h @@ -0,0 +1,96 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file UserSettings.h SSD1306 modules configuration. + */ + +#ifndef _USER_SETTINGS_H_ +#define _USER_SETTINGS_H_ + +/** + * @defgroup SSD1306_LIBRARY_CONFIG CONFIG: ssd1306 library configuration + * @{ + * + * @brief Group of settings allowing to disable/enable library modules + * + * @details Arduino IDE (at least as for 1.8.2) has a lack library configuration functionality. + * Some Arduino standard libraries are built the way, if you include them to the project, + * but do not use any functions from the, they still eat RAM and Flash on you EVK board. + * To avoid this, you need competely avoid including of such libraries. SSD1306 library + * has a wide interfaces support for different platforms, and even if you don't use + * SSD1306 communication via Arduino Wire/Spi/HardwareSerial libraries, those ones do + * bad things with your sketch size. + * To avoid this you can manually disable SSD1306 modules, you don't need in UserSettings.h + * header file, and gain another 100-200 bytes of RAM and 300-500 bytes of Flash. + */ + +/* Comment out options below if you don't need support in the library, * + * and want to reduce memory consumption. */ + +/** Define this macro if you need to enable software I2C module for compilation */ +#define CONFIG_SOFTWARE_I2C_ENABLE + +/** Define this macro if you need to enable TWI I2C module for compilation */ +#define CONFIG_TWI_I2C_ENABLE + +/** Define this macro if you need to enable AVR SPI module for compilation */ +#define CONFIG_AVR_SPI_ENABLE + +/** Define this macro if you need to enable USI SPI module for compilation */ +#define CONFIG_USI_SPI_ENABLE + +/** Define this macro if you need to enable AVR UART module for compilation */ +#define CONFIG_AVR_UART_ENABLE + +/** Define this macro if you need to enable VGA module for compilation */ +#define CONFIG_VGA_ENABLE + +/** Define this macro if you need to enable Adafruit GFX canvas support for compilation */ +#ifndef CONFIG_ADAFRUIT_GFX_ENABLE +//#define CONFIG_ADAFRUIT_GFX_ENABLE +#endif + +/** + * Define this macro if platform specific i2c interface is implemented in SSD1306 HAL. + * If you use Arduino platform, this macro enables Arduino Wire library module for compilation. + */ +#define CONFIG_PLATFORM_I2C_ENABLE + +/** + * Define this macro if platform specific spi interface is implemented in SSD1306 HAL + * If you use Arduino platform, this macro enables Arduino SPI library module for compilation. + */ +#define CONFIG_PLATFORM_SPI_ENABLE + +/** + * Defines, whenever ssd1306 library supports unicode. + * Support of unicode increases RAM and Flasg memory consumption + */ +#define CONFIG_SSD1306_UNICODE_ENABLE + +/** + * @} + */ + +#endif diff --git a/lib/libssd1306/src/ssd1306_hal/arduino/io.h b/lib/libssd1306/src/ssd1306_hal/arduino/io.h new file mode 100644 index 0000000..f121419 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/arduino/io.h @@ -0,0 +1,225 @@ +/* + MIT License + + Copyright (c) 2018-2021, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * @file hal/arduino/io.h SSD1306 ARDUINO IO communication functions + */ + +#ifndef _SSD1306_ARDUINO_IO_H_ +#define _SSD1306_ARDUINO_IO_H_ + +#if defined(ARDUINO_ARCH_STM32) // stm32duino support + #include <Arduino.h> + #include <avr/pgmspace.h> +#elif defined(ESP8266) || defined(ESP32) || defined(ESP31B) // esp arduino support + #include <Arduino.h> + #include <pgmspace.h> +#else // AVR support + #include <Arduino.h> + #if !defined(ARDUINO_ARCH_SAMD) && defined(__AVR__) + #include <avr/sleep.h> + #include <avr/pgmspace.h> + #include <avr/interrupt.h> + #elif defined(ARDUINO_ARCH_SAMD) + #include <api/deprecated-avr-comp/avr/pgmspace.h> + #include <api/deprecated-avr-comp/avr/interrupt.h> + #else + #include <avr/pgmspace.h> + #include <avr/interrupt.h> + #endif +#endif + +#if defined(ARDUINO_ARCH_STM32) + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when Wire library speed can be configured */ + #define SSD1306_WIRE_CLOCK_CONFIGURABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + /** The macro is defined when STM32 i2c implementation is available */ + #define CONFIG_STM32_I2C_AVAILABLE + +#elif defined(ARDUINO_AVR_DIGISPARK) || defined(ARDUINO_AVR_DIGISPARKPRO) + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + #if defined(ARDUINO_AVR_DIGISPARKPRO) + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + #else + /** The macro is defined when software i2c implementation is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /* Define lcdint as smallest types to reduce memo usage on tiny controllers. * + * Remember, that this can cause issues with large lcd displays, i.e. 320x240*/ + #define LCDINT_TYPES_DEFINED + typedef int8_t lcdint_t; + typedef uint8_t lcduint_t; + #endif + +#elif defined(ARDUINO_AVR_ATTINYX5) || defined(ARDUINO_AVR_ATTINYX4) + + /** The macro is defined when software i2c implementation is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when USI module is available for use */ + #define CONFIG_USI_SPI_AVAILABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + /** Define lcdint as smallest types to reduce memo usage on tiny controllers. * + * Remember, that this can cause issues with large lcd displays, i.e. 320x240*/ + #define LCDINT_TYPES_DEFINED + /** This is for Attiny controllers */ + typedef int8_t lcdint_t; + /** This is for Attiny controllers */ + typedef uint8_t lcduint_t; + /** The macro is defined when micro controller doesn't support multiplication operation */ + #define CONFIG_MULTIPLICATION_NOT_SUPPORTED + +#elif defined(__AVR_ATtinyxy4__) || defined(__AVR_ATtinyxy2__) || defined(__AVR_ATtinyxy6__) || defined(__AVR_ATtinyxy7__) + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when Wire library speed can be configured */ + // Note: Might work for faster draw. But it does brick some devices that can't run at these speeds. + // Leaving it off for now + //#define SSD1306_WIRE_CLOCK_CONFIGURABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + /** Define lcdint as smallest types to reduce memo usage on tiny controllers. * + * Remember, that this can cause issues with large lcd displays, i.e. 320x240*/ + #define LCDINT_TYPES_DEFINED + /** This is for Attiny controllers */ + typedef int8_t lcdint_t; + /** This is for Attiny controllers */ + typedef uint8_t lcduint_t; + /** The macro is defined when micro controller doesn't support multiplication operation */ + //#define CONFIG_MULTIPLICATION_NOT_SUPPORTED + + +#elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || \ + defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + + /** The macro is defined when software i2c implementation is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when USI module is available for use */ + #define CONFIG_USI_SPI_AVAILABLE + /** Define lcdint as smallest types to reduce memo usage on tiny controllers. * + * Remember, that this can cause issues with large lcd displays, i.e. 320x240*/ + #define LCDINT_TYPES_DEFINED + /** This is for Attiny controllers */ + typedef int8_t lcdint_t; + /** This is for Attiny controllers */ + typedef uint8_t lcduint_t; + /** The macro is defined when micro controller doesn't support multiplication operation */ + #define CONFIG_MULTIPLICATION_NOT_SUPPORTED + +#elif defined(ESP8266) || defined(ESP32) || defined(ESP31B) || \ + defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM) + /* SW implementation of i2c isn't supported on ESP platforms */ + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when Wire library speed can be configured */ + #define SSD1306_WIRE_CLOCK_CONFIGURABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + #if defined(ESP32) + /** The macro is defined when composite audio support is available */ + #define CONFIG_VGA_AVAILABLE + #endif + +#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when Wire library speed can be configured */ + #define SSD1306_WIRE_CLOCK_CONFIGURABLE + /** The macro is defined when TWI module is available (ATTINY) */ + #define CONFIG_TWI_I2C_AVAILABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + /** The macro is defined when SPI module is available (ATMEGA) */ + #define CONFIG_AVR_SPI_AVAILABLE + /** The macro is defined when UART module is available */ + #define CONFIG_AVR_UART_AVAILABLE + /** The macro is defined when VGA monitor control is available directly from controller */ + #define CONFIG_VGA_AVAILABLE + #if defined(__AVR_ATmega328PB__) && !defined(WIRE_INTERFACES_COUNT) + #define WIRE_INTERFACES_COUNT 2 + #endif + +#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when Wire library speed can be configured */ + #define SSD1306_WIRE_CLOCK_CONFIGURABLE + /** The macro is defined when TWI module is available (ATTINY) */ + #define CONFIG_TWI_I2C_AVAILABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + // Disable internal AVR SPI implementation for ATMEGA 2560 since, + // it doesn't work for now + // #define CONFIG_AVR_SPI_AVAILABLE + +#elif defined(NRF52) || defined(NRF5) + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when Wire library speed can be configured */ + #define SSD1306_WIRE_CLOCK_CONFIGURABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + +#elif defined(__AVR_ATmega4808__) || defined(__AVR_ATmega3208__) || defined(__AVR_ATmega1608__) + + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when Wire library speed can be configured */ + #define SSD1306_WIRE_CLOCK_CONFIGURABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + +#else + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_PLATFORM_I2C_AVAILABLE + /** The macro is defined when Wire library speed can be configured */ + #define SSD1306_WIRE_CLOCK_CONFIGURABLE + /** The macro is defined when TWI module is available (ATTINY) */ + #define CONFIG_TWI_I2C_AVAILABLE + /** The macro is defined when SPI library is available */ + #define CONFIG_PLATFORM_SPI_AVAILABLE + /** The macro is defined when SPI module is available (ATMEGA) */ + #define CONFIG_AVR_SPI_AVAILABLE +#endif + +//#ifdef CONFIG_PLATFORM_I2C_AVAILABLE +//#ifdef __cplusplus +//#include <Wire.h> +//#endif +//#endif + +#endif // _SSD1306_ARDUINO_IO_H_ + diff --git a/lib/libssd1306/src/ssd1306_hal/arduino/platform.cpp b/lib/libssd1306/src/ssd1306_hal/arduino/platform.cpp new file mode 100644 index 0000000..6a1359f --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/arduino/platform.cpp @@ -0,0 +1,220 @@ +/* + MIT License + + Copyright (c) 2016-2021, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_hal/io.h" + +#include "intf/ssd1306_interface.h" +#include "intf/i2c/ssd1306_i2c.h" +#include "intf/spi/ssd1306_spi.h" +#include "lcd/lcd_common.h" + +#if defined(ARDUINO) && !defined(ENERGIA) + +////////////////////////////////////////////////////////////////////////////////// +// ARDUINO I2C IMPLEMENTATION +////////////////////////////////////////////////////////////////////////////////// + +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && \ + defined(CONFIG_PLATFORM_I2C_ENABLE) + +#include <Wire.h> +#if defined( WIRE_INTERFACES_COUNT ) && WIRE_INTERFACES_COUNT > 1 +#include <Wire1.h> +#endif + +static uint8_t s_bytesWritten = 0; +static uint8_t s_sa = SSD1306_SA; +static TwoWire *s_i2c = nullptr; + +static void ssd1306_i2cStart_Wire(void) +{ + s_i2c->beginTransmission(s_sa); + s_bytesWritten = 0; +} + +static void ssd1306_i2cStop_Wire(void) +{ + s_i2c->endTransmission(); +} + +/** + * Inputs: SCL is LOW, SDA is has no meaning + * Outputs: SCL is LOW + */ +static void ssd1306_i2cSendByte_Wire(uint8_t data) +{ + // Do not write too many bytes for standard Wire.h. It may become broken +#if defined(ESP32) || defined(ESP31B) + if (s_bytesWritten >= (I2C_BUFFER_LENGTH >> 4)) +#elif defined(ARDUINO_ARCH_SAMD) + if (s_bytesWritten >= 64) +#elif defined(BUFFER_LENGTH) + if (s_bytesWritten >= (BUFFER_LENGTH - 2)) +#elif defined(SERIAL_BUFFER_LENGTH) + if (s_bytesWritten >= (SERIAL_BUFFER_LENGTH - 2)) +#elif defined(USI_BUF_SIZE) + if (s_bytesWritten >= (USI_BUF_SIZE -2)) +#else + if ( s_i2c->write(data) != 0 ) + { + s_bytesWritten++; + return; + } +#endif + { + ssd1306_i2cStop_Wire(); + ssd1306_i2cStart_Wire(); + ssd1306_i2cSendByte_Wire(0x40); + /* Commands never require many bytes. Thus assume that user tries to send data */ + } + s_i2c->write(data); + s_bytesWritten++; +} + +static void ssd1306_i2cSendBytes_Wire(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + ssd1306_i2cSendByte_Wire(*buffer); + buffer++; + } +} + +static void ssd1306_i2cClose_Wire() +{ +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t addr, ssd1306_platform_i2cConfig_t * cfg) +{ +#if defined(ESP8266) || defined(ESP32) || defined(ESP31B) + if ((cfg->scl >= 0) && (cfg->sda >=0)) + { + s_i2c = &Wire; + s_i2c->begin(cfg->sda, cfg->scl); + } + else +#endif + { +#if !defined( WIRE_INTERFACES_COUNT ) + s_i2c = &Wire; +#elif WIRE_INTERFACES_COUNT < 2 + s_i2c = &Wire; +#elif WIRE_INTERFACES_COUNT < 3 + if ( busId == 0 ) + { + s_i2c = &Wire; + } + else + { + s_i2c = &Wire1; + } +#endif + s_i2c->begin(); + } + #ifdef SSD1306_WIRE_CLOCK_CONFIGURABLE + s_i2c->setClock(400000); + #endif + + if (addr) s_sa = addr; + ssd1306_intf.spi = 0; + ssd1306_intf.start = ssd1306_i2cStart_Wire; + ssd1306_intf.stop = ssd1306_i2cStop_Wire; + ssd1306_intf.send = ssd1306_i2cSendByte_Wire; + ssd1306_intf.send_buffer = ssd1306_i2cSendBytes_Wire; + ssd1306_intf.close = ssd1306_i2cClose_Wire; +} + +#endif // CONFIG_PLATFORM_I2C_AVAILABLE + +////////////////////////////////////////////////////////////////////////////////// +// ARDUINO SPI IMPLEMENTATION +////////////////////////////////////////////////////////////////////////////////// +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + +/* STANDARD branch */ +#include <SPI.h> + +static void ssd1306_spiClose_hw() +{ +} + +static void ssd1306_spiStart_hw() +{ + /* anyway, oled ssd1331 cannot work faster, clock cycle should be > 150ns: * + * 1s / 150ns ~ 6.7MHz */ + SPI.beginTransaction(SPISettings(s_ssd1306_spi_clock, MSBFIRST, SPI_MODE0)); + if (s_ssd1306_cs >= 0) + { + digitalWrite(s_ssd1306_cs,LOW); + } +} + +static void ssd1306_spiStop_hw() +{ + if (ssd1306_lcd.type == LCD_TYPE_PCD8544) + { + digitalWrite(s_ssd1306_dc, LOW); + SPI.transfer( 0x00 ); // Send NOP command to allow last data byte to pass (bug in PCD8544?) + // ssd1306 E3h is NOP command + } + if (s_ssd1306_cs >= 0) + { + digitalWrite(s_ssd1306_cs, HIGH); + } + SPI.endTransaction(); +} + +static void ssd1306_spiSendByte_hw(uint8_t data) +{ + SPI.transfer(data); +} + +static void ssd1306_spiSendBytes_hw(const uint8_t *buffer, uint16_t size) +{ + /* Do not use SPI.transfer(buffer, size)! this method corrupts buffer content */ + while (size--) + { + SPI.transfer(*buffer); + buffer++; + }; +} + +void ssd1306_platform_spiInit(int8_t busId, int8_t cesPin, int8_t dcPin) +{ + if (cesPin >=0) pinMode(cesPin, OUTPUT); + if (dcPin >= 0) pinMode(dcPin, OUTPUT); + if (cesPin) s_ssd1306_cs = cesPin; + if (dcPin) s_ssd1306_dc = dcPin; + SPI.begin(); + ssd1306_intf.spi = 1; + ssd1306_intf.start = ssd1306_spiStart_hw; + ssd1306_intf.stop = ssd1306_spiStop_hw; + ssd1306_intf.send = ssd1306_spiSendByte_hw; + ssd1306_intf.send_buffer = ssd1306_spiSendBytes_hw; + ssd1306_intf.close = ssd1306_spiClose_hw; +} + +#endif // CONFIG_PLATFORM_SPI_AVAILABLE + +#endif // ARDUINO diff --git a/lib/libssd1306/src/ssd1306_hal/avr/arduino/Arduino.h b/lib/libssd1306/src/ssd1306_hal/avr/arduino/Arduino.h new file mode 100644 index 0000000..b67e842 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/avr/arduino/Arduino.h @@ -0,0 +1,13 @@ +#ifndef _ARDUINO_H_ +#define _ARDUINO_H_ + +#define ARDUINO_FAKE +#include "ssd1306_hal/avr/io.h" +#include "ssd1306_hal/Print_internal.h" + +#ifndef boolean + typedef uint8_t boolean; +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/avr/arduino/Print.h b/lib/libssd1306/src/ssd1306_hal/avr/arduino/Print.h new file mode 100644 index 0000000..11f052f --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/avr/arduino/Print.h @@ -0,0 +1,10 @@ +#ifndef _PRINT_H_ +#define _PRINT_H_ + +#include "ssd1306_hal/io.h" +#include "ssd1306_hal/Print_internal.h" + +#define __FlashStringHelper char + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/avr/arduino/Wire.h b/lib/libssd1306/src/ssd1306_hal/avr/arduino/Wire.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/avr/arduino/Wire.h @@ -0,0 +1 @@ + diff --git a/lib/libssd1306/src/ssd1306_hal/avr/io.h b/lib/libssd1306/src/ssd1306_hal/avr/io.h new file mode 100644 index 0000000..c84b1af --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/avr/io.h @@ -0,0 +1,117 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * @file ssd1306_hal/avr/io.h SSD1306 AVR IO communication functions + */ + +#ifndef _SSD1306_AVR_IO_H_ +#define _SSD1306_AVR_IO_H_ + +#include <avr/io.h> +#include <avr/interrupt.h> +#include <avr/pgmspace.h> +#include <avr/sleep.h> +#include <avr/eeprom.h> +#include <util/delay.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#define LOW 0 +#define HIGH 1 +#define INPUT 0 +#define OUTPUT 1 + +#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || \ + defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + /** The macro is defined when software i2c implementation is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when USI module is available for use */ + #define CONFIG_USI_SPI_AVAILABLE + /* Define lcdint as smallest types to reduce memo usage on tiny controllers. * + * Remember, that this can cause issues with large lcd displays, i.e. 320x240*/ + #define LCDINT_TYPES_DEFINED + typedef int8_t lcdint_t; + typedef uint8_t lcduint_t; + /** The macro is defined when micro controller doesn't support multiplication operation */ + #define CONFIG_MULTIPLICATION_NOT_SUPPORTED +#elif defined(__AVR_ATmega328P__) + /** The macro is defined when software i2c implementation is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when TWI module is available */ + #define CONFIG_TWI_I2C_AVAILABLE + /** The macro is defined when SPI module is available */ + #define CONFIG_AVR_SPI_AVAILABLE + /** The macro is defined when UART module is available */ + #define CONFIG_AVR_UART_AVAILABLE + /** The macro is defined when VGA monitor control is available directly from controller */ + #define CONFIG_VGA_AVAILABLE + +#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) + /** The macro is defined when i2c Wire library is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when TWI module is available (ATTINY) */ + #define CONFIG_TWI_I2C_AVAILABLE + /** The macro is defined when SPI module is available */ + #define CONFIG_AVR_SPI_AVAILABLE + +#else + /** The macro is defined when software i2c implementation is available */ + #define CONFIG_SOFTWARE_I2C_AVAILABLE + /** The macro is defined when TWI module is available */ + #define CONFIG_TWI_I2C_AVAILABLE + /** The macro is defined when SPI module is available */ + #define CONFIG_AVR_SPI_AVAILABLE +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// not implemented functions for plain AVR +static inline int digitalRead(int pin) { return LOW; }; +static inline int analogRead(int pin) { return 0; }; +static inline uint32_t millis() { return 0; }; +static inline void randomSeed(int seed) { }; +static inline void attachInterrupt(int pin, void (*interrupt)(), int level) { }; + +// implemented functions for plain AVR +void delay(unsigned long ms); +#define delayMicroseconds(us) _delay_us(us) + +void digitalWrite(int pin, int level); +void pinMode(int pin, int mode); + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +static inline int random(int max) { return 0; }; +static inline int random(int min, int max) { return 0; }; +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/avr/platform.c b/lib/libssd1306/src/ssd1306_hal/avr/platform.c new file mode 100644 index 0000000..fe5f0a9 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/avr/platform.c @@ -0,0 +1,96 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_hal/io.h" + +#if defined(__AVR__) && !defined(ARDUINO) + +void delay(unsigned long ms) +{ + while (ms--) + { + _delay_ms(1); + } +} + +#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + #define G0_DIR DDRB + #define G0_PORT PORTB + #define G1_DIR DDRB + #define G1_PORT PORTB + #define G2_DIR DDRB + #define G2_PORT PORTB +#elif defined(__AVR_ATmega328P__) + #define G0_DIR DDRD + #define G0_PORT PORTD + #define G1_DIR DDRB + #define G1_PORT PORTB + #define G2_DIR DDRC + #define G2_PORT PORTC +#else + static uint8_t s_stub; + #define G0_DIR s_stub + #define G0_PORT s_stub + #define G1_DIR s_stub + #define G1_PORT s_stub + #define G2_DIR s_stub + #define G2_PORT s_stub +#endif + +void digitalWrite(int pin, int level) +{ + uint8_t mask = (1<<(pin & 0x7)); + if (pin<8) + { + if (level == HIGH) G0_PORT |= mask; else G0_PORT &= ~mask; + } + else if (pin<16) + { + if (level == HIGH) G1_PORT |= mask; else G1_PORT &= ~mask; + } + else + { + if (level == HIGH) G2_PORT |= mask; else G2_PORT &= ~mask; + } +} + +void pinMode(int pin, int mode) +{ + uint8_t mask = (1<<(pin & 0x7)); + if (pin<8) + { + if (mode == OUTPUT) G0_DIR |= mask; else G0_DIR &= ~mask; + } + else if (pin<16) + { + if (mode == OUTPUT) G1_DIR |= mask; else G1_DIR &= ~mask; + } + else + { + if (mode == OUTPUT) G2_DIR |= mask; else G2_DIR &= ~mask; + } +}; + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/energia/io.h b/lib/libssd1306/src/ssd1306_hal/energia/io.h new file mode 100644 index 0000000..897f3c4 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/energia/io.h @@ -0,0 +1,176 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * @file ssd1306_hal/energia/io.h Energia IO functions abstraction + */ + +#ifndef _SSD1306_ENERGIA_IO_H_ +#define _SSD1306_ENERGIA_IO_H_ + +//========================== I. Create directory for your platform ======== +/* 1. Copy content of this folder to src/ssd1306_hal/<your_platform>/ folder */ +/* 2. Replace YOUR_PLATFORM in these files with the one, you would like to use */ +/* 3. Add #include "<your_platform>/io.h" to src/ssd1306_hal/io.h file */ +/* (remember to add required #elif defined(X) lines) */ +/* 4. Add platform.c file to SOURCES list in src/Makefile.src */ +/* 5. Implement functions below and functions in platform.c file */ + +#define SSD1306_ENERGIA_PLATFORM +//========================== I. Include libraries ========================= +/* 1. Include all required headers, specific for your platform here */ +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include "Energia.h" +#include <avr/pgmspace.h> +#include <avr/interrupt.h> +/* If your platform already has these definitions, comment out lines below */ +// #define LOW 0 +// #define HIGH 1 +// #define INPUT 0 +// #define OUTPUT 1 + +/* Progmem attribute for data, located in Flash */ +#define PROGMEM + +//========================== II. Define options =========================== +/* 2. Uncomment all options, you have support for on your platform * + * Remember that you will need to implement low level intf/i2c or * + * intf/spi layers for your platform */ + +//#define CONFIG_SOFTWARE_I2C_AVAILABLE +//#define CONFIG_TWI_I2C_AVAILABLE +//#define CONFIG_AVR_SPI_AVAILABLE +//#define CONFIG_AVR_UART_AVAILABLE +//#define CONFIG_VGA_AVAILABLE +#define CONFIG_PLATFORM_I2C_AVAILABLE +#define CONFIG_PLATFORM_SPI_AVAILABLE + +#ifdef __cplusplus +extern "C" { +#endif + +//========================== III. Implement functions ===================== +/* Implement functions below the way you like. You can make them non-static + * and implement the functions in platform.c file + */ +// !!! MANDATORY. The library will not work without these functions !!! +// static inline int digitalRead(int pin) // digitalRead() +// { +// return LOW; +// } + +// static inline void digitalWrite(int pin, int level) // digitalWrite() +// { +// } + +// static inline void pinMode(int pin, int mode) // pinMode() +// { +// } + +// static inline int analogRead(int pin) // analogRead() +// { +// return 0; +// } + +// static inline uint32_t millis(void) // millis() +// { +// return 0; +// } + +// static inline uint32_t micros(void) // micros() +// { +// return 0; +// }; + +// static inline void delay(uint32_t ms) // delay() +// { +// } + +// static inline void delayMicroseconds(uint32_t us) // delayMicroseconds() +// { +// } + +// !!! OPTIONAL !!! +//static inline void randomSeed(int seed) // randomSeed() - can be skipped +//{ +//} +// +//static inline void attachInterrupt(int pin, void (*interrupt)(), int level) // attachInterrupt() - can be skipped +//{ +//} +// +//static inline uint8_t pgm_read_byte(const void *ptr) // pgm_read_byte() - can be left as is +//{ +// return *((const uint8_t *)ptr); +//} +// +//static inline uint16_t eeprom_read_word(const void *ptr) // eeprom_read_word() - can be skipped +//{ +// return 0; +//} +// +//static inline void eeprom_write_word(const void *ptr, uint16_t val) // eeprom_write_word() - can be skipped +//{ +//} + +// static inline char *utoa(unsigned int num, char *str, int radix) // util utoa() - can be skipped +// { +// *str = '\0'; +// return str; +//} + + +// !!! PLATFORM I2C IMPLEMENTATION OPTIONAL !!! +// #if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) +// void ssd1306_platform_i2cInit(int8_t busId, uint8_t addr, ssd1306_platform_i2cConfig_t * cfg); +// #endif + + +// !!! PLATFORM SPI IMPLEMENTATION OPTIONAL !!! +//#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) +//void ssd1306_platform_spiInit(uint8_t busId, +// uint8_t cesPin, +// uint8_t dcPin); +//#endif + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +static inline int random(int max) // random(n) - can be skipped if you don't use it +{ + return 0; +} + +static inline int random(int min, int max) // random(a,b) - can be skipped if you don't use it +{ + return 0; +} +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/energia/platform.cpp b/lib/libssd1306/src/ssd1306_hal/energia/platform.cpp new file mode 100644 index 0000000..39d4b9d --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/energia/platform.cpp @@ -0,0 +1,158 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_hal/io.h" + +#if defined(SSD1306_ENERGIA_PLATFORM) + +#include "intf/ssd1306_interface.h" +#include <Wire.h> // Energia I2C implementation (Arduino-like) + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) +static uint8_t s_bytesWritten = 0; +static uint8_t s_i2c_addr = 0x3C; +static TwoWire *s_i2c = nullptr; + +static void platform_i2c_start(void) +{ + s_i2c->beginTransmission(s_i2c_addr); + s_bytesWritten = 0; +} + +static void platform_i2c_stop(void) +{ + s_i2c->endTransmission(); +} + +static void platform_i2c_send(uint8_t data) +{ + // Do not write too many bytes for standard Wire.h. It may become broken (Arduino) + if (s_bytesWritten >= (BUFFER_LENGTH - 2)) + { + platform_i2c_stop(); + platform_i2c_start(); + platform_i2c_send(0x40); + /* Commands never require many bytes. Thus assume that user tries to send data (Arduino) */ + } + s_i2c->write(data); + s_bytesWritten++; +} + +static void platform_i2c_close(void) +{ + // ... free all i2c resources here +} + +static void platform_i2c_send_buffer(const uint8_t *data, uint16_t len) +{ + while (len--) + { + platform_i2c_send(*data); + data++; + } +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t addr, ssd1306_platform_i2cConfig_t * cfg) +{ + s_i2c = &Wire; + s_i2c->begin(); + + if (addr) s_i2c_addr = addr; + ssd1306_intf.spi = 0; + ssd1306_intf.start = &platform_i2c_start; + ssd1306_intf.stop = &platform_i2c_stop; + ssd1306_intf.send = &platform_i2c_send; + ssd1306_intf.close = &platform_i2c_close; + ssd1306_intf.send_buffer = &platform_i2c_send_buffer; +} +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// !!! PLATFORM SPI IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + +#include "intf/spi/ssd1306_spi.h" +#include "lcd/lcd_common.h" +#include <SPI.h> + +static void platform_spi_start(void) +{ + digitalWrite(s_ssd1306_cs, LOW); +} + +static void platform_spi_stop(void) +{ + if (ssd1306_lcd.type == LCD_TYPE_PCD8544) + { + digitalWrite(s_ssd1306_dc, LOW); + SPI.transfer(0x00); // Send NOP command to allow last data byte to pass (bug in PCD8544?) + // ssd1306 E3h is NOP command + } + if (s_ssd1306_cs >= 0) + { + digitalWrite(s_ssd1306_cs, HIGH); + } +} + +static void platform_spi_send(uint8_t data) +{ + SPI.transfer(data); +} + +static void platform_spi_close(void) +{ + // ... free all spi resources here +} + +static void platform_spi_send_buffer(const uint8_t *data, uint16_t len) +{ + while (len--) + { + SPI.transfer(*data); + data++; + }; +} + +void ssd1306_platform_spiInit(int8_t busId, + int8_t cesPin, + int8_t dcPin) +{ + if (cesPin >=0) pinMode(cesPin, OUTPUT); + if (dcPin >= 0) pinMode(dcPin, OUTPUT); + if (cesPin>=0) s_ssd1306_cs = cesPin; + if (dcPin>=0) s_ssd1306_dc = dcPin; + SPI.begin(); + ssd1306_intf.spi = 1; + ssd1306_intf.start = &platform_spi_start; + ssd1306_intf.stop = &platform_spi_stop; + ssd1306_intf.send = &platform_spi_send; + ssd1306_intf.close = &platform_spi_close; + ssd1306_intf.send_buffer = &platform_spi_send_buffer; + // init your interface here + //... +} +#endif + +#endif // SSD1306_ENERGIA_PLATFORM diff --git a/lib/libssd1306/src/ssd1306_hal/esp/io.h b/lib/libssd1306/src/ssd1306_hal/esp/io.h new file mode 100644 index 0000000..bf13c1f --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/esp/io.h @@ -0,0 +1,135 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * @file ssd1306_hal/esp/io.h This is stm32 platform file + */ + +#ifndef _SSD1306_ESP_IO_H_ +#define _SSD1306_ESP_IO_H_ + +// TODO: To complete support. Any help is welcome + +#define SSD1306_ESP_PLATFORM +//========================== I. Include libraries ========================= +/* 1. Include all required headers, specific for your platform here */ +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#define LOW 0 +#define HIGH 1 +#define INPUT 0 +#define OUTPUT 1 +/* Progmem attribute for data, located in Flash */ +#define PROGMEM + +//========================== II. Define options =========================== +/* 2. Uncomment all options, you have support for on your platform * + * Remember that you will need to implement low level intf/i2c or * + * intf/spi layers for your platform */ + +/** The macro is defined when STM32 i2c implementation is available */ +#define CONFIG_PLATFORM_I2C_AVAILABLE +#define CONFIG_PLATFORM_SPI_AVAILABLE + +#ifdef __cplusplus +extern "C" { +#endif + +//========================== III. Implement functions ===================== +/* Implement functions below the way you like. You can make them non-static */ +// !!! MANDATORY !!! +int digitalRead(int pin); + +void digitalWrite(int pin, int level); + +void pinMode(int pin, int mode); + +static inline int analogRead(int pin) // analogRead() +{ + return 0; +} + +uint32_t millis(void); + +static inline uint32_t micros(void) // micros() +{ + return 0; +}; + +void delay(uint32_t ms); + +static inline void delayMicroseconds(uint32_t us) // delayMicroseconds() +{ +} + +// !!! OPTIONAL !!! +static inline void randomSeed(int seed) // randomSeed() - can be skipped +{ +} + +static inline void attachInterrupt(int pin, void (*interrupt)(), int level) // attachInterrupt() - can be skipped +{ +} + +static inline uint8_t pgm_read_byte(const void *ptr) // pgm_read_byte() - can be skipped +{ + return *((const uint8_t *)ptr); +} + +static inline uint16_t eeprom_read_word(const void *ptr) // eeprom_read_word() - can be skipped +{ + return 0; +} + +static inline void eeprom_write_word(const void *ptr, uint16_t val) // eeprom_write_word() - can be skipped +{ +} + +// utoa is already defined in stdlib c +//static inline char *utoa(unsigned int num, char *str, int radix) // util utoa() - can be skipped +//{ +// *str = '\0'; +// return str; +//} + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +static inline int random(int max) // random(n) - can be skipped if you don't use it +{ + return 0; +} + +static inline int random(int min, int max) // random(a,b) - can be skipped if you don't use it +{ + return 0; +} +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/esp/platform.c b/lib/libssd1306/src/ssd1306_hal/esp/platform.c new file mode 100644 index 0000000..e954eab --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/esp/platform.c @@ -0,0 +1,292 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_hal/io.h" + +#if defined(SSD1306_ESP_PLATFORM) + +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" + +#if 1 + +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) +static void platform_spi_send_cache(); +#endif + +// TODO: To complete support. Any help is welcome +int digitalRead(int pin) // digitalRead() +{ + return gpio_get_level(pin); +} + +void digitalWrite(int pin, int level) // digitalWrite() +{ +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + if (s_ssd1306_dc == pin) + { + platform_spi_send_cache(); + } +#endif + gpio_set_level(pin, level); +} + +void pinMode(int pin, int mode) +{ + if (mode == INPUT) + gpio_set_direction(pin, GPIO_MODE_INPUT); + else if (mode == OUTPUT) + gpio_set_direction(pin, GPIO_MODE_OUTPUT); +} + +uint32_t millis(void) +{ + return xTaskGetTickCount() * portTICK_PERIOD_MS; +} + +void delay(uint32_t ms) // delay() +{ + vTaskDelay(ms / portTICK_PERIOD_MS); +} + +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// !!! PLATFORM I2C IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) + +#include <stdio.h> +#include "driver/i2c.h" + +static uint8_t s_i2c_addr = 0x3C; +static int8_t s_bus_id; + +static i2c_cmd_handle_t s_cmd_handle = NULL; + +static void platform_i2c_start(void) +{ + // ... Open i2c channel for your device with specific s_i2c_addr + if (s_cmd_handle == NULL) + s_cmd_handle = i2c_cmd_link_create(); + i2c_master_start(s_cmd_handle); + i2c_master_write_byte(s_cmd_handle, ( s_i2c_addr << 1 ) | I2C_MASTER_WRITE, 0x1); +} + +static void platform_i2c_stop(void) +{ + // ... Complete i2c communication + i2c_master_stop(s_cmd_handle); + /*esp_err_t ret =*/ i2c_master_cmd_begin(s_bus_id, s_cmd_handle, 1000 / portTICK_RATE_MS); + i2c_cmd_link_delete(s_cmd_handle); + s_cmd_handle = NULL; +} + +static void platform_i2c_send(uint8_t data) +{ + // ... Send byte to i2c communication channel + i2c_master_write_byte(s_cmd_handle, data, 0x1); +} + +static void platform_i2c_close(void) +{ + // ... free all i2c resources here + i2c_driver_delete(s_bus_id); +} + +static void platform_i2c_send_buffer(const uint8_t *data, uint16_t len) +{ + // ... Send len bytes to i2c communication channel here + while (len--) + { + platform_i2c_send(*data); + data++; + } +// i2c_master_write(cmd, data_wr, size, ACK_CHECK_EN); +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t addr, ssd1306_platform_i2cConfig_t * cfg) +{ + if (addr) s_i2c_addr = addr; + ssd1306_intf.spi = 0; + ssd1306_intf.start = &platform_i2c_start; + ssd1306_intf.stop = &platform_i2c_stop; + ssd1306_intf.send = &platform_i2c_send; + ssd1306_intf.close = &platform_i2c_close; + ssd1306_intf.send_buffer = &platform_i2c_send_buffer; + // init your interface here + if ( busId < 0) busId = I2C_NUM_1; + s_bus_id = busId; + i2c_config_t conf = { 0 }; + conf.mode = I2C_MODE_MASTER; + conf.sda_io_num = cfg->sda >= 0 ? cfg->sda : 21; + conf.sda_pullup_en = GPIO_PULLUP_ENABLE; + conf.scl_io_num = cfg->scl >= 0 ? cfg->scl : 22; + conf.scl_pullup_en = GPIO_PULLUP_ENABLE; + conf.master.clk_speed = 400000; //I2C_EXAMPLE_MASTER_FREQ_HZ; + i2c_param_config(s_bus_id, &conf); + i2c_driver_install(s_bus_id, conf.mode, 0, 0, 0); +// I2C_EXAMPLE_MASTER_RX_BUF_DISABLE, +// I2C_EXAMPLE_MASTER_TX_BUF_DISABLE, 0); +} +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// !!! PLATFORM SPI IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + +#include "intf/spi/ssd1306_spi.h" +#include "driver/spi_master.h" + +// Store spi handle globally for all spi callbacks +static spi_device_handle_t s_spi; +static int8_t s_spi_bus_id; +// s_first_spi_session is used for delayed spi initialization. +// Some oled displays have slow max SPI speed, so display init function can change +// spi frequency s_ssd1306_spi_clock. Register device, only when frequency is known. +static uint8_t s_first_spi_session = 0; +static uint8_t s_spi_cache[1024]; +static int s_spi_cached_count = 0; + +static void platform_spi_send_cache() +{ + /* TODO: Yeah, sending single bytes is too slow, but * + * need to figure out how to detect data/command bytes * + * to send bytes as one block */ + uint8_t *data = s_spi_cache; + while (s_spi_cached_count) + { + size_t sz = s_spi_cached_count > 32 ? 32: s_spi_cached_count; + spi_transaction_t t; + memset(&t, 0, sizeof(t)); + t.length=8*sz; // 8 bits + t.tx_buffer=data; + // ... Send byte to spi communication channel + // We do not care here about DC line state, because + // ssd1306 library already set DC pin via ssd1306_spiDataMode() before call to send(). + spi_device_transmit(s_spi, &t); + data+=sz; + s_spi_cached_count-=sz; + } + s_spi_cached_count = 0; +} + +static void platform_spi_start(void) +{ + // ... Open spi channel for your device with specific s_ssd1306_cs, s_ssd1306_dc + if (s_first_spi_session) + { + spi_device_interface_config_t devcfg= + { + .clock_speed_hz = s_ssd1306_spi_clock, + .mode=0, + .spics_io_num=s_ssd1306_cs, + .queue_size=7, // max 7 transactions at a time + }; + spi_bus_add_device(s_spi_bus_id ? VSPI_HOST : HSPI_HOST, &devcfg, &s_spi); + s_first_spi_session = 0; + } + s_spi_cached_count = 0; +} + +static void platform_spi_stop(void) +{ + // ... Complete spi communication + // no complete actions required for this implementation + platform_spi_send_cache(); +} + +static void platform_spi_send(uint8_t data) +{ + s_spi_cache[s_spi_cached_count] = data; + s_spi_cached_count++; + if ( s_spi_cached_count >= sizeof( s_spi_cache ) ) + { + platform_spi_send_cache(); + } +} + +static void platform_spi_close(void) +{ + // ... free all spi resources here + if (!s_first_spi_session) + { + spi_bus_remove_device( s_spi ); + } + spi_bus_free( s_spi_bus_id ? VSPI_HOST : HSPI_HOST ); +} + +static void platform_spi_send_buffer(const uint8_t *data, uint16_t len) +{ + while (len--) + { + platform_spi_send(*data); + data++; + } +} + +void ssd1306_platform_spiInit(int8_t busId, + int8_t cesPin, + int8_t dcPin) +{ + // Use VSPI by default + if (busId < 0) busId = 1; + s_spi_bus_id = busId; + + // If cesPin is not provided, select by default + if (cesPin < 0) + { + cesPin = s_spi_bus_id ? 5 : 15; + } + s_ssd1306_cs = cesPin; + if (dcPin>=0) s_ssd1306_dc = dcPin; + + if (cesPin >=0) pinMode(cesPin, OUTPUT); + if (dcPin >= 0) pinMode(dcPin, OUTPUT); + + ssd1306_intf.spi = 1; + ssd1306_intf.start = &platform_spi_start; + ssd1306_intf.stop = &platform_spi_stop; + ssd1306_intf.send = &platform_spi_send; + ssd1306_intf.close = &platform_spi_close; + ssd1306_intf.send_buffer = &platform_spi_send_buffer; + + // init your interface here + spi_bus_config_t buscfg= + { + .miso_io_num= s_spi_bus_id ? 19 : 12, + .mosi_io_num= s_spi_bus_id ? 23 : 13, + .sclk_io_num= s_spi_bus_id ? 18 : 14, + .quadwp_io_num=-1, + .quadhd_io_num=-1, + .max_transfer_sz=32 + }; + spi_bus_initialize(s_spi_bus_id ? VSPI_HOST : HSPI_HOST, &buscfg, 0); // 0 -no dma + s_first_spi_session = 1; +} +#endif + +#endif // SSD1306_ESP_PLATFORM diff --git a/lib/libssd1306/src/ssd1306_hal/io.h b/lib/libssd1306/src/ssd1306_hal/io.h new file mode 100644 index 0000000..4a82ac7 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/io.h @@ -0,0 +1,136 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/** + * @file ssd1306_hal/io.h SSD1306 HAL IO communication functions + */ + +#ifndef _SSD1306_HAL_IO_H_ +#define _SSD1306_HAL_IO_H_ + +/** + * @defgroup SSD1306_HAL_API HAL: ssd1306 library hardware abstraction layer + * @{ + * + * @brief i2c/spi ssd1306 library hardware abstraction layer + * + * @details ssd1306 library hardware abstraction layer + */ + +#include "UserSettings.h" +#if defined(ARDUINO) && !defined(ENERGIA) +#include "arduino/io.h" +#elif defined(__AVR__) && !defined(ARDUINO) +#include "avr/io.h" +#elif defined(__XTENSA__) && !defined(ARDUINO) +#include "esp/io.h" +#elif defined(STM32F1) || defined(STM32F2) || defined(STM32F4) +#include "stm32/io.h" +#elif defined(__linux__) +#include "linux/io.h" +#elif defined(__MINGW32__) +#include "mingw/io.h" +#elif defined(ENERGIA) +#include "energia/io.h" +#else +#warning "Platform is not supported. Use template to add support" +#include "template/io.h" +#endif + +#ifndef LCDINT_TYPES_DEFINED +/** Macro informs if lcdint_t type is defined */ +#define LCDINT_TYPES_DEFINED +/** internal int type, used by ssd1306 library. Important for uC with low SRAM */ +typedef int lcdint_t; +/** internal int type, used by ssd1306 library. Important for uC with low SRAM */ +typedef unsigned int lcduint_t; +#endif + +/** swaps content of a and b variables of type type */ +#define ssd1306_swap_data(a, b, type) { type t = a; a = b; b = t; } + +#ifdef __cplusplus +extern "C" { +#endif + +// !!! PLATFORM I2C IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) +/** + * Structure describes i2c pins used by platform + */ +typedef struct { + int8_t sda; ///< data pin number + int8_t scl; ///< clock pin number +} ssd1306_platform_i2cConfig_t; + +/** + * @brief Initializes i2c interface for platform being used. + * + * Initializes i2c interface for platform being used. i2c implementation + * depends on platform. + * + * @param busId i2c bus number. Some platforms have several i2c buses. so, this + * argument identifies bus to use. For several platforms busId is not used. + * If you want to use default i2c bus for specific platform, please pass -1. + * @param addr i2c address of oled driver, connected to i2c bus. If you want to use default + * i2c display address, please, pass 0. + * @param cfg Specify scl and sda for the platform. If you want to use default pin numbers, + * please pass -1 for both members. + */ +void ssd1306_platform_i2cInit(int8_t busId, uint8_t addr, ssd1306_platform_i2cConfig_t * cfg); +#endif + + +// !!! PLATFORM SPI IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) +/** + * @brief Initializes spi interface for platform being used. + * + * Initializes spi interface for platform being used. spi implementation + * depends on platform. + * + * @param busId spi bus number if device has several spi buses. For most AVR platforms + * busId is not used. If you want to use default spi bus for specific platform, please + * pass -1. + * @param cesPin chip select (chip enable) pin number. If you want to use default pin, + * hard coded by ssd1306 library, please, pass -1. For Linux platform cesPin means + * second number in spidev device. + * @param dcPin data/command pin number. For most oled displays this pin number is used to + * select data or command mode for the bus. If you want to use default pin number, please + * pass -1. + */ +void ssd1306_platform_spiInit(int8_t busId, int8_t cesPin, int8_t dcPin); +#endif + +#ifdef __cplusplus +} +#endif + +/** + * @} + */ + +#endif + + diff --git a/lib/libssd1306/src/ssd1306_hal/linux/arduino/Arduino.h b/lib/libssd1306/src/ssd1306_hal/linux/arduino/Arduino.h new file mode 100644 index 0000000..69c3622 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/linux/arduino/Arduino.h @@ -0,0 +1,18 @@ +#ifndef _ARDUINO_H_ +#define _ARDUINO_H_ + +#define ARDUINO_FAKE +#if defined(__MINGW32__) +#include "ssd1306_hal/mingw/io.h" +#include "ssd1306_hal/Print_internal.h" +#else +#include "ssd1306_hal/linux/io.h" +#include "ssd1306_hal/Print_internal.h" +#endif + +#ifndef boolean + typedef uint8_t boolean; +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/linux/arduino/Print.h b/lib/libssd1306/src/ssd1306_hal/linux/arduino/Print.h new file mode 100644 index 0000000..11f052f --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/linux/arduino/Print.h @@ -0,0 +1,10 @@ +#ifndef _PRINT_H_ +#define _PRINT_H_ + +#include "ssd1306_hal/io.h" +#include "ssd1306_hal/Print_internal.h" + +#define __FlashStringHelper char + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/linux/arduino/Wire.h b/lib/libssd1306/src/ssd1306_hal/linux/arduino/Wire.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/linux/arduino/Wire.h @@ -0,0 +1 @@ + diff --git a/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/interrupt.h b/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/interrupt.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/interrupt.h @@ -0,0 +1 @@ + diff --git a/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/pgmspace.h b/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/pgmspace.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/pgmspace.h @@ -0,0 +1 @@ + diff --git a/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/sleep.h b/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/sleep.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/linux/arduino/avr/sleep.h @@ -0,0 +1 @@ + diff --git a/lib/libssd1306/src/ssd1306_hal/linux/io.h b/lib/libssd1306/src/ssd1306_hal/linux/io.h new file mode 100644 index 0000000..e3a0f69 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/linux/io.h @@ -0,0 +1,168 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * @file ssd1306_hal/linux/io.h SSD1306 LINUX IO communication functions + */ + +#ifndef _SSD1306_LINUX_IO_H_ +#define _SSD1306_LINUX_IO_H_ + +#define CONFIG_PLATFORM_I2C_AVAILABLE +#define CONFIG_PLATFORM_SPI_AVAILABLE + + +#if defined(SDL_EMULATION) // SDL Emulation mode includes +#include "sdl_core.h" +#endif + +#if defined(__KERNEL__) // KERNEL includes +#include <linux/types.h> + +#else // LINUX includes + +#include <stdio.h> +#include <stdint.h> +#include <unistd.h> +#include <time.h> +#include <string.h> +#endif + +/** Standard defines */ +#define LOW 0 +#define HIGH 1 +#define INPUT 1 +#define OUTPUT 0 +/** Pure linux implementation of the library doesn't support data, located in code area */ +#define PROGMEM + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__KERNEL__) // ============== KERNEL +static inline int digitalRead(int pin) { return LOW; }; +static inline void delay(unsigned long ms) { }; +static inline void delayMicroseconds(unsigned long us) { }; +static inline int analogRead(int pin) { return 0; }; +static inline void digitalWrite(int pin, int level) { }; +static inline uint32_t millis(void) { return 0; }; +static inline uint32_t micros(void) { return 0; }; +static inline void pinMode(int pin, int mode) {}; + +#else // ============== LINUX +static inline void delay(unsigned long ms) { usleep(ms*1000); }; +static inline void delayMicroseconds(unsigned long us) { usleep(us); }; +static inline uint32_t millis(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; +}; + +static inline uint32_t micros(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * 1000000 + ts.tv_nsec / 1000; +}; + +/* For some reason defines do not work accross the libraries * + * Didn't yet figure out, what is the reason fo this issue */ +//define min(a,b) (((a)<(b))?(a):(b)) +//define max(a,b) (((a)>(b))?(a):(b)) +static inline int min(int a, int b) { return a<b?a:b; }; +static inline int max(int a, int b) { return a>b?a:b; }; +#if !defined(SDL_EMULATION) +void pinMode(int pin, int mode); +static inline int digitalRead(int pin) { return LOW; }; +#endif + +#endif + +#if defined(SDL_EMULATION) +static inline int digitalRead(int pin) { return sdl_read_digital(pin); }; +static inline int analogRead(int pin) { return sdl_read_analog(pin); }; +static inline void digitalWrite(int pin, int level) { sdl_write_digital(pin, level); }; +static inline void pinMode(int pin, int mode) { }; +#elif !defined(__KERNEL__) +static inline int analogRead(int pin) { return 0; }; +void digitalWrite(int pin, int level); +#endif + +static inline void randomSeed(int seed) { }; +static inline void attachInterrupt(int pin, void (*interrupt)(void), int level) { }; +static inline uint8_t pgm_read_byte(const void *ptr) { return *((const uint8_t *)ptr); }; +static inline uint16_t eeprom_read_word(const void *ptr) { return 0; }; +static inline void eeprom_write_word(const void *ptr, uint16_t val) { }; + +static inline char *utoa(unsigned int num, char *str, int radix) +{ + char temp[17]; //an int can only be 16 bits long + //at radix 2 (binary) the string + //is at most 16 + 1 null long. + int temp_loc = 0; + int str_loc = 0; + + //construct a backward string of the number. + do { + int digit = (unsigned int)num % radix; + if (digit < 10) + temp[temp_loc++] = digit + '0'; + else + temp[temp_loc++] = digit - 10 + 'A'; + num = ((unsigned int)num) / radix; + } while ((unsigned int)num > 0); + + temp_loc--; + + + //now reverse the string. + while ( temp_loc >=0 ) {// while there are still chars + str[str_loc++] = temp[temp_loc--]; + } + str[str_loc] = 0; // add null termination. + + return str; +} + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +#include <cstdlib> +static inline long random(long v) +{ + return rand() % v; +} + +static inline long random(long min, long max) +{ + return rand() % (max - min + 1) + min; +} +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/linux/platform.c b/lib/libssd1306/src/ssd1306_hal/linux/platform.c new file mode 100644 index 0000000..fc3f76d --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/linux/platform.c @@ -0,0 +1,583 @@ +/* + MIT License + + Copyright (c) 2018-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#if defined(__linux__) && !defined(ARDUINO) + +#include "ssd1306_hal/io.h" +#include "intf/ssd1306_interface.h" +#include "intf/i2c/ssd1306_i2c.h" +#include "intf/spi/ssd1306_spi_conf.h" +#include "intf/spi/ssd1306_spi.h" + +#ifndef __KERNEL__ + +#include <sys/stat.h> +#include <sys/types.h> +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <linux/i2c-dev.h> +#include <linux/spi/spidev.h> + +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) \ + && !defined(SDL_EMULATION) +#define LINUX_SPI_AVAILABLE +#endif + +#define MAX_GPIO_COUNT 256 + +#ifdef IN +#undef IN +#endif +#define IN 0 + +#ifdef OUT +#undef OUT +#endif +#define OUT 1 + +#ifdef LINUX_SPI_AVAILABLE +static void platform_spi_send_cache(); +#endif + +int gpio_export(int pin) +{ + char buffer[4]; + ssize_t bytes_written; + int fd; + char path[64]; + + snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d", pin); + + if (access(path, F_OK) == 0) + { + return 0; + } + + fd = open("/sys/class/gpio/export", O_WRONLY); + if (-1 == fd) + { + fprintf(stderr, "Failed to allocate gpio pin[%d]: %s%s!\n", + pin, strerror (errno), getuid() == 0 ? "" : ", need to be root"); + return(-1); + } + + bytes_written = snprintf(buffer, sizeof(buffer), "%d", pin); + if (write(fd, buffer, bytes_written) < 0) + { + fprintf(stderr, "Failed to allocate gpio pin[%d]: %s%s!\n", + pin, strerror (errno), getuid() == 0 ? "" : ", need to be root"); + close(fd); + return -1; + } + close(fd); + return(0); +} + +int gpio_unexport(int pin) +{ + char buffer[4]; + ssize_t bytes_written; + int fd; + + fd = open("/sys/class/gpio/unexport", O_WRONLY); + if (-1 == fd) + { + fprintf(stderr, "Failed to free gpio pin resources!\n"); + return(-1); + } + + bytes_written = snprintf(buffer, sizeof(buffer), "%d", pin); + if (write(fd, buffer, bytes_written) < 0) + { + fprintf(stderr, "Failed to free gpio pin resources!\n"); + } + close(fd); + return(0); +} + +int gpio_direction(int pin, int dir) +{ + static const char s_directions_str[] = "in\0out"; + + char path[64]; + int fd; + + snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction", pin); + fd = open(path, O_WRONLY); + if (-1 == fd) + { + fprintf(stderr, "Failed to set gpio pin direction1[%d]: %s!\n", + pin, strerror(errno)); + return(-1); + } + + if (-1 == write(fd, &s_directions_str[IN == dir ? 0 : 3], IN == dir ? 2 : 3)) + { + fprintf(stderr, "Failed to set gpio pin direction2[%d]: %s!\n", + pin, strerror(errno)); + return(-1); + } + + close(fd); + return(0); +} + +int gpio_read(int pin) +{ + char path[32]; + char value_str[3]; + int fd; + + snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin); + fd = open(path, O_RDONLY); + if (-1 == fd) + { + fprintf(stderr, "Failed to read gpio pin value!\n"); + return(-1); + } + + if (-1 == read(fd, value_str, 3)) + { + fprintf(stderr, "Failed to read gpio pin value!\n"); + return(-1); + } + + close(fd); + + return(atoi(value_str)); +} + +int gpio_write(int pin, int value) +{ + static const char s_values_str[] = "01"; + + char path[64]; + int fd; + + snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin); + fd = open(path, O_WRONLY); + if (-1 == fd) + { + fprintf(stderr, "Failed to set gpio pin value[%d]: %s%s!\n", + pin, strerror (errno), getuid() == 0 ? "" : ", need to be root"); + return(-1); + } + + if (1 != write(fd, &s_values_str[LOW == value ? 0 : 1], 1)) + { + fprintf(stderr, "Failed to set gpio pin value[%d]: %s%s!\n", + pin, strerror (errno), getuid() == 0 ? "" : ", need to be root"); + return(-1); + } + + close(fd); + return(0); +} + +#if !defined(SDL_EMULATION) + +static uint8_t s_exported_pin[MAX_GPIO_COUNT] = {0}; +static uint8_t s_pin_mode[MAX_GPIO_COUNT] = {0}; + +void pinMode(int pin, int mode) +{ + if (!s_exported_pin[pin]) + { + if ( gpio_export(pin)<0 ) + { + return; + } + s_exported_pin[pin] = 1; + } + if (mode == OUTPUT) + { + gpio_direction(pin, OUT); + s_pin_mode[pin] = 1; + } + if (mode == INPUT) + { + gpio_direction(pin, IN); + s_pin_mode[pin] = 0; + } +} + +void digitalWrite(int pin, int level) +{ +#ifdef LINUX_SPI_AVAILABLE + if (s_ssd1306_dc == pin) + { + platform_spi_send_cache(); + } +#endif + + if (!s_exported_pin[pin]) + { + if ( gpio_export(pin)<0 ) + { + return; + } + s_exported_pin[pin] = 1; + } + if (!s_pin_mode[pin]) + { + pinMode(pin, OUTPUT); + } + gpio_write( pin, level ); +} + +#endif // SDL_EMULATION + +////////////////////////////////////////////////////////////////////////////////// +// LINUX I2C IMPLEMENTATION +////////////////////////////////////////////////////////////////////////////////// +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) + + + +#if !defined(SDL_EMULATION) + + +static uint8_t s_sa = SSD1306_SA; +static int s_fd = -1; +static uint8_t s_buffer[128]; +static uint8_t s_dataSize = 0; + +static void platform_i2c_start(void) +{ + s_dataSize = 0; +} + +static void platform_i2c_stop(void) +{ + if (write(s_fd, s_buffer, s_dataSize) != s_dataSize) + { + fprintf(stderr, "Failed to write to the i2c bus: %s.\n", strerror(errno)); + } + s_dataSize = 0; +} + +static void platform_i2c_send(uint8_t data) +{ + s_buffer[s_dataSize] = data; + s_dataSize++; + if (s_dataSize == sizeof(s_buffer)) + { + /* Send function puts all data to internal buffer. * + * Restart transmission if internal buffer is full. */ + ssd1306_intf.stop(); + ssd1306_intf.start(); + ssd1306_intf.send(0x40); + } +} + +static void platform_i2c_send_buffer(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + platform_i2c_send(*buffer); + buffer++; + } +} + +static void platform_i2c_close() +{ + if (s_fd >= 0) + { + close(s_fd); + s_fd = -1; + } +} + +static void empty_function() +{ +} + +static void empty_function_single_arg(uint8_t arg) +{ +} + +static void empty_function_two_args(const uint8_t *arg1, uint16_t arg2) +{ +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t sa, ssd1306_platform_i2cConfig_t * cfg) +{ + char filename[20]; + if (busId < 0) + { + busId = 1; + } + snprintf(filename, 19, "/dev/i2c-%d", busId); + ssd1306_intf.start = empty_function; + ssd1306_intf.stop = empty_function; + ssd1306_intf.close = empty_function; + ssd1306_intf.send = empty_function_single_arg; + ssd1306_intf.send_buffer = empty_function_two_args; + if ((s_fd = open(filename, O_RDWR)) < 0) + { + fprintf(stderr, "Failed to open the i2c bus %s\n", + getuid() == 0 ? "": ": need to be root"); + return; + } + if (sa) + { + s_sa = sa; + } + if (ioctl(s_fd, I2C_SLAVE, s_sa) < 0) + { + fprintf(stderr, "Failed to acquire bus access and/or talk to slave.\n"); + return; + } + ssd1306_intf.start = platform_i2c_start; + ssd1306_intf.stop = platform_i2c_stop; + ssd1306_intf.send = platform_i2c_send; + ssd1306_intf.send_buffer = platform_i2c_send_buffer; + ssd1306_intf.close = platform_i2c_close; +} + +#else /* SDL_EMULATION */ + +#include "sdl_core.h" + +static void platform_i2c_send_buffer(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + sdl_send_byte(*buffer); + buffer++; + }; +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t sa, ssd1306_platform_i2cConfig_t * cfg) +{ + sdl_core_init(); + ssd1306_intf.spi = 0; + ssd1306_intf.start = sdl_send_init; + ssd1306_intf.stop = sdl_send_stop; + ssd1306_intf.send = sdl_send_byte; + ssd1306_intf.send_buffer = platform_i2c_send_buffer; + ssd1306_intf.close = sdl_core_close; +} + +#endif /* SDL_EMULATION */ + +#endif // CONFIG_PLATFORM_I2C_AVAILABLE + + +////////////////////////////////////////////////////////////////////////////////// +// LINUX SPI IMPLEMENTATION +////////////////////////////////////////////////////////////////////////////////// +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + +#if !defined(SDL_EMULATION) + +static int s_spi_fd = -1; +extern uint32_t s_ssd1306_spi_clock; +static uint8_t s_spi_cache[1024]; +static int s_spi_cached_count = 0; + +static void platform_spi_start(void) +{ + s_spi_cached_count = 0; +} + +static void platform_spi_stop(void) +{ + platform_spi_send_cache(); +} + +static void platform_spi_send_cache() +{ + /* TODO: Yeah, sending single bytes is too slow, but * + * need to figure out how to detect data/command bytes * + * to send bytes as one block */ + if ( s_spi_cached_count == 0 ) + { + return; + } + struct spi_ioc_transfer mesg; + memset(&mesg, 0, sizeof mesg); + mesg.tx_buf = (unsigned long)&s_spi_cache[0]; + mesg.rx_buf = 0; + mesg.len = s_spi_cached_count; + mesg.delay_usecs = 0; + mesg.speed_hz = 0; + mesg.bits_per_word = 8; + mesg.cs_change = 0; + if (ioctl(s_spi_fd, SPI_IOC_MESSAGE(1), &mesg) < 1) + { + fprintf(stderr, "SPI failed to send SPI message: %s\n", strerror (errno)) ; + } + s_spi_cached_count = 0; +} + +static void platform_spi_send(uint8_t data) +{ + s_spi_cache[s_spi_cached_count] = data; + s_spi_cached_count++; + if ( s_spi_cached_count >= sizeof( s_spi_cache ) ) + { + platform_spi_send_cache(); + } +} + +static void platform_spi_close(void) +{ + if (s_spi_fd >= 0) + { + close(s_spi_fd); + s_spi_fd = -1; + } +} + +static void platform_spi_send_buffer(const uint8_t *data, uint16_t len) +{ + while (len--) + { + platform_spi_send(*data); + data++; + } +} + +static void empty_function_spi(void) +{ +} + +static void empty_function_arg_spi(uint8_t byte) +{ +} + +static void empty_function_args_spi(const uint8_t *buffer, uint16_t bytes) +{ +} + +void ssd1306_platform_spiInit(int8_t busId, + int8_t ces, + int8_t dcPin) +{ + char filename[20]; + if (busId < 0) + { + busId = 0; + } + if (ces < 0) + { + ces = 0; + } + s_ssd1306_cs = -1; // SPI interface does't need separate ces pin + s_ssd1306_dc = dcPin; + ssd1306_intf.spi = 1; + ssd1306_intf.start = empty_function_spi; + ssd1306_intf.stop = empty_function_spi; + ssd1306_intf.send = empty_function_arg_spi; + ssd1306_intf.send_buffer = empty_function_args_spi; + ssd1306_intf.close = empty_function; + + snprintf(filename, 19, "/dev/spidev%d.%d", busId, ces); + if ((s_spi_fd = open(filename, O_RDWR)) < 0) + { + printf("Failed to initialize SPI: %s%s!\n", + strerror(errno), getuid() == 0 ? "": ", need to be root"); + return; + } + unsigned int speed = s_ssd1306_spi_clock; + if (ioctl(s_spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) + { + printf("Failed to set speed on SPI line: %s!\n", strerror(errno)); + } + uint8_t mode = SPI_MODE_0; + if (ioctl (s_spi_fd, SPI_IOC_WR_MODE, &mode) < 0) + { + printf("Failed to set SPI mode: %s!\n", strerror(errno)); + } + uint8_t spi_bpw = 8; + if (ioctl (s_spi_fd, SPI_IOC_WR_BITS_PER_WORD, &spi_bpw) < 0) + { + printf("Failed to set SPI BPW: %s!\n", strerror(errno)); + } + + ssd1306_intf.spi = 1; + ssd1306_intf.start = platform_spi_start; + ssd1306_intf.stop = platform_spi_stop; + ssd1306_intf.send = platform_spi_send; + ssd1306_intf.send_buffer = platform_spi_send_buffer; + ssd1306_intf.close = platform_spi_close; +} + +#else /* SDL_EMULATION */ + +#include "sdl_core.h" + +static void sdl_send_bytes(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + sdl_send_byte(*buffer); + buffer++; + }; +} + +void ssd1306_platform_spiInit(int8_t busId, int8_t ces, int8_t dcPin) +{ + sdl_core_init(); + if (ces >= 0) + { + s_ssd1306_cs = ces; + } + if (dcPin >= 0) + { + s_ssd1306_dc = dcPin; + } + sdl_set_dc_pin(dcPin); + ssd1306_intf.spi = 1; + ssd1306_intf.start = sdl_send_init; + ssd1306_intf.stop = sdl_send_stop; + ssd1306_intf.send = sdl_send_byte; + ssd1306_intf.send_buffer = sdl_send_bytes; + ssd1306_intf.close = sdl_core_close; +} + +#endif /* SDL_EMULATION */ + +#endif // CONFIG_PLATFORM_SPI_AVAILABLE + +#else // end of !KERNEL, KERNEL is below + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t sa, ssd1306_platform_i2cConfig_t * cfg) +{ +} + +void ssd1306_platform_spiInit(int8_t busId, + int8_t ces, + int8_t dcPin) +{ +} + +#endif // KERNEL + +#endif // __linux__ diff --git a/lib/libssd1306/src/ssd1306_hal/mingw/io.h b/lib/libssd1306/src/ssd1306_hal/mingw/io.h new file mode 100644 index 0000000..58a679e --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/mingw/io.h @@ -0,0 +1,132 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * @file ssd1306_hal/mingw/io.h SSD1306 MINGW IO communication functions + */ + +#ifndef _SSD1306_MINGW_IO_H_ +#define _SSD1306_MINGW_IO_H_ + +// Use the same library interface as for Linux +#define CONFIG_PLATFORM_I2C_AVAILABLE +#define CONFIG_PLATFORM_SPI_AVAILABLE + +#if defined(SDL_EMULATION) // SDL Emulation mode includes +#include "sdl_core.h" +#endif + +#include <windows.h> +#include <stdint.h> +#include <unistd.h> +#include "sdl_core.h" +#include <time.h> +#include <string.h> + +/** Standard defines */ +#define LOW 0 +#define HIGH 1 +#define INPUT 1 +#define OUTPUT 0 +/** Pure linux implementation of the library doesn't support data, located in code area */ +#define PROGMEM + +#ifdef __cplusplus +extern "C" { +#endif + +static inline int digitalRead(int pin) { return sdl_read_digital(pin); }; +static inline void delay(unsigned long ms) { Sleep(ms); }; +static inline void delayMicroseconds(unsigned long us) { Sleep((us+500)/1000); }; +static inline uint32_t millis(void) +{ + return GetTickCount(); +}; + +static inline uint32_t micros(void) +{ + return GetTickCount()*1000; +}; + +#if defined(SDL_EMULATION) +static inline int analogRead(int pin) { return sdl_read_analog(pin); }; +static inline void digitalWrite(int pin, int level) { sdl_write_digital(pin, level); }; +static inline void pinMode(int pin, int mode) { }; +#endif + +static inline void randomSeed(int seed) { }; +static inline void attachInterrupt(int pin, void (*interrupt)(void), int level) { }; +static inline uint8_t pgm_read_byte(const void *ptr) { return *((const uint8_t *)ptr); }; +static inline uint16_t eeprom_read_word(const void *ptr) { return 0; }; +static inline void eeprom_write_word(const void *ptr, uint16_t val) { }; + +static inline char *utoa(unsigned int num, char *str, int radix) +{ + char temp[17]; //an int can only be 16 bits long + //at radix 2 (binary) the string + //is at most 16 + 1 null long. + int temp_loc = 0; + int str_loc = 0; + + //construct a backward string of the number. + do { + int digit = (unsigned int)num % radix; + if (digit < 10) + temp[temp_loc++] = digit + '0'; + else + temp[temp_loc++] = digit - 10 + 'A'; + num = ((unsigned int)num) / radix; + } while ((unsigned int)num > 0); + + temp_loc--; + + + //now reverse the string. + while ( temp_loc >=0 ) {// while there are still chars + str[str_loc++] = temp[temp_loc--]; + } + str[str_loc] = 0; // add null termination. + + return str; +} + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +#include <cstdlib> +static inline long random(long v) +{ + return rand() % v; +} + +static inline long random(long min, long max) +{ + return rand() % (max - min + 1) + min; +} +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/mingw/platform.c b/lib/libssd1306/src/ssd1306_hal/mingw/platform.c new file mode 100644 index 0000000..5aa5e99 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/mingw/platform.c @@ -0,0 +1,342 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#if defined(__MINGW32__) + +#include "ssd1306_hal/io.h" + +#include "intf/ssd1306_interface.h" +#include "intf/i2c/ssd1306_i2c.h" +#include "intf/ssd1306_interface.h" +#include "intf/spi/ssd1306_spi_conf.h" +#include "intf/spi/ssd1306_spi.h" + +#include <stdio.h> +#include <unistd.h> + +#if !defined(SDL_EMULATION) + +#include <errno.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <linux/i2c-dev.h> +#include <stdlib.h> +#include <linux/spi/spidev.h> + +#endif + +////////////////////////////////////////////////////////////////////////////////// +// MINGW I2C IMPLEMENTATION +////////////////////////////////////////////////////////////////////////////////// +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) + +#if !defined(SDL_EMULATION) + +static uint8_t s_sa = SSD1306_SA; +static int s_fd = -1; +static uint8_t s_buffer[128]; +static uint8_t s_dataSize = 0; + +static void platform_i2c_start(void) +{ + s_dataSize = 0; +} + +static void platform_i2c_stop(void) +{ + if (write(s_fd, s_buffer, s_dataSize) != s_dataSize) + { + fprintf(stderr, "Failed to write to the i2c bus: %s.\n", strerror(errno)); + } + s_dataSize = 0; +} + +static void platform_i2c_send(uint8_t data) +{ + s_buffer[s_dataSize] = data; + s_dataSize++; + if (s_dataSize == sizeof(s_buffer)) + { + /* Send function puts all data to internal buffer. * + * Restart transmission if internal buffer is full. */ + ssd1306_intf.stop(); + ssd1306_intf.start(); + ssd1306_intf.send(0x40); + } +} + +static void platform_i2c_send_buffer(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + platform_i2c_send(*buffer); + buffer++; + } +} + +static void platform_i2c_close() +{ + if (s_fd >= 0) + { + close(s_fd); + s_fd = -1; + } +} + +static void empty_function() +{ +} + +static void empty_function_single_arg(uint8_t arg) +{ +} + +static void empty_function_two_args(const uint8_t *arg1, uint16_t arg2) +{ +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t sa, ssd1306_platform_i2cConfig_t * cfg) +{ + char filename[20]; + if (busId < 0) + { + busId = 1; + } + snprintf(filename, 19, "/dev/i2c-%d", busId); + ssd1306_intf.start = empty_function; + ssd1306_intf.stop = empty_function; + ssd1306_intf.close = empty_function; + ssd1306_intf.send = empty_function_single_arg; + ssd1306_intf.send_buffer = empty_function_two_args; + if ((s_fd = open(filename, O_RDWR)) < 0) + { + fprintf(stderr, "Failed to open the i2c bus\n"); + return; + } + if (sa) + { + s_sa = sa; + } + if (ioctl(s_fd, I2C_SLAVE, s_sa) < 0) + { + fprintf(stderr, "Failed to acquire bus access and/or talk to slave.\n"); + return; + } + ssd1306_intf.start = platform_i2c_start; + ssd1306_intf.stop = platform_i2c_stop; + ssd1306_intf.send = platform_i2c_send; + ssd1306_intf.send_buffer = platform_i2c_send_buffer; + ssd1306_intf.close = platform_i2c_close; +} + +#else /* SDL_EMULATION */ + +#include "sdl_core.h" + +static void platform_i2c_send_buffer(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + sdl_send_byte(*buffer); + buffer++; + }; +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t sa, ssd1306_platform_i2cConfig_t * cfg) +{ + sdl_core_init(); + ssd1306_intf.spi = 0; + ssd1306_intf.start = sdl_send_init; + ssd1306_intf.stop = sdl_send_stop; + ssd1306_intf.send = sdl_send_byte; + ssd1306_intf.send_buffer = platform_i2c_send_buffer; + ssd1306_intf.close = sdl_core_close; +} + +#endif /* SDL_EMULATION */ + +#endif // CONFIG_PLATFORM_I2C_AVAILABLE + + +////////////////////////////////////////////////////////////////////////////////// +// MINGW SPI IMPLEMENTATION +////////////////////////////////////////////////////////////////////////////////// +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + +#if !defined(SDL_EMULATION) + +static int s_spi_fd = -1; +extern uint32_t s_ssd1306_spi_clock; + +static void platform_spi_start(void) +{ +} + +static void platform_spi_stop(void) +{ +} + +static void platform_spi_send(uint8_t data) +{ + /* TODO: Yeah, sending single bytes is too slow, but * + * need to figure out how to detect data/command bytes * + * to send bytes as one block */ + uint8_t buf[1]; + struct spi_ioc_transfer mesg; + buf[0] = data; + memset(&mesg, 0, sizeof mesg); + mesg.tx_buf = (unsigned long)&buf[0]; + mesg.rx_buf = 0; + mesg.len = 1; + mesg.delay_usecs = 0; + mesg.speed_hz = 0; + mesg.bits_per_word = 8; + mesg.cs_change = 0; + if (ioctl(s_spi_fd, SPI_IOC_MESSAGE(1), &mesg) < 1) + { + fprintf(stderr, "SPI failed to send SPI message: %s\n", strerror (errno)) ; + } +} + +static void platform_spi_close(void) +{ + if (s_spi_fd >= 0) + { + close(s_spi_fd); + s_spi_fd = -1; + } +} + +static void platform_spi_send_buffer(const uint8_t *data, uint16_t len) +{ + while (len--) + { + platform_spi_send(*data); + data++; + } +} + +static void empty_function_spi(void) +{ +} + +static void empty_function_arg_spi(uint8_t byte) +{ +} + +static void empty_function_args_spi(const uint8_t *buffer, uint16_t bytes) +{ +} + +void ssd1306_platform_spiInit(int8_t busId, + int8_t ces, + int8_t dcPin) +{ + char filename[20]; + if (busId < 0) + { + busId = 0; + } + if (ces < 0) + { + ces = 0; + } + s_ssd1306_cs = -1; // SPI interface does't need separate ces pin + s_ssd1306_dc = dcPin; + ssd1306_intf.spi = 1; + ssd1306_intf.start = empty_function_spi; + ssd1306_intf.stop = empty_function_spi; + ssd1306_intf.send = empty_function_arg_spi; + ssd1306_intf.send_buffer = empty_function_args_spi; + ssd1306_intf.close = empty_function; + + snprintf(filename, 19, "/dev/spidev%d.%d", busId, ces); + if ((s_spi_fd = open(filename, O_RDWR)) < 0) + { + printf("Failed to initialize SPI: %s!\n", strerror(errno)); + return; + } + unsigned int speed = s_ssd1306_spi_clock; + if (ioctl(s_spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) + { + printf("Failed to set speed on SPI line: %s!\n", strerror(errno)); + } + uint8_t mode = SPI_MODE_0; + if (ioctl (s_spi_fd, SPI_IOC_WR_MODE, &mode) < 0) + { + printf("Failed to set SPI mode: %s!\n", strerror(errno)); + } + uint8_t spi_bpw = 8; + if (ioctl (s_spi_fd, SPI_IOC_WR_BITS_PER_WORD, &spi_bpw) < 0) + { + printf("Failed to set SPI BPW: %s!\n", strerror(errno)); + } + + ssd1306_intf.spi = 1; + ssd1306_intf.start = platform_spi_start; + ssd1306_intf.stop = platform_spi_stop; + ssd1306_intf.send = platform_spi_send; + ssd1306_intf.send_buffer = platform_spi_send_buffer; + ssd1306_intf.close = platform_spi_close; +} + +#else /* SDL_EMULATION */ + +#include "sdl_core.h" + +static void sdl_send_bytes(const uint8_t *buffer, uint16_t size) +{ + while (size--) + { + sdl_send_byte(*buffer); + buffer++; + }; +} + +void ssd1306_platform_spiInit(int8_t busId, int8_t ces, int8_t dcPin) +{ + sdl_core_init(); + if (ces >= 0) + { + s_ssd1306_cs = ces; + } + if (dcPin >= 0) + { + s_ssd1306_dc = dcPin; + } + sdl_set_dc_pin(dcPin); + ssd1306_intf.spi = 1; + ssd1306_intf.start = sdl_send_init; + ssd1306_intf.stop = sdl_send_stop; + ssd1306_intf.send = sdl_send_byte; + ssd1306_intf.send_buffer = sdl_send_bytes; + ssd1306_intf.close = sdl_core_close; +} + +#endif /* SDL_EMULATION */ + +#endif // CONFIG_PLATFORM_SPI_AVAILABLE + +#endif // __MINGW32__ + diff --git a/lib/libssd1306/src/ssd1306_hal/stm32/io.h b/lib/libssd1306/src/ssd1306_hal/stm32/io.h new file mode 100644 index 0000000..cbe0f8c --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/stm32/io.h @@ -0,0 +1,147 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * @file ssd1306_hal/stm32/io.h This is stm32 platform file + */ + +#ifndef _SSD1306_STM32_IO_H_ +#define _SSD1306_STM32_IO_H_ + +// TODO: To add support. Any help is welcome + +#define SSD1306_STM32_PLATFORM +//========================== I. Include libraries ========================= +/* 1. Include all required headers, specific for your platform here */ +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#define LOW 0 +#define HIGH 1 +#define INPUT 0 +#define OUTPUT 1 +/* Progmem attribute for data, located in Flash */ +#define PROGMEM + +//========================== II. Define options =========================== +/* 2. Uncomment all options, you have support for on your platform * + * Remember that you will need to implement low level intf/i2c or * + * intf/spi layers for your platform */ + +/** The macro is defined when STM32 i2c implementation is available */ +#define CONFIG_PLATFORM_I2C_AVAILABLE +#define CONFIG_PLATFORM_SPI_AVAILABLE + +#ifdef __cplusplus +extern "C" { +#endif + +//========================== III. Implement functions ===================== +/* Implement functions below the way you like. You can make them non-static */ +// !!! MANDATORY !!! +static inline int digitalRead(int pin) // digitalRead() +{ + return LOW; +} + +static inline void digitalWrite(int pin, int level) // digitalWrite() +{ +} + +static inline void pinMode(int pin, int mode) // pinMode() +{ +} + +static inline int analogRead(int pin) // analogRead() +{ + return 0; +} + +static inline uint32_t millis(void) // millis() +{ + return 0; +} + +static inline uint32_t micros(void) // micros() +{ + return 0; +}; + +static inline void delay(uint32_t ms) // delay() +{ +} + +static inline void delayMicroseconds(uint32_t us) // delayMicroseconds() +{ +} + +// !!! OPTIONAL !!! +static inline void randomSeed(int seed) // randomSeed() - can be skipped +{ +} + +static inline void attachInterrupt(int pin, void (*interrupt)(), int level) // attachInterrupt() - can be skipped +{ +} + +static inline uint8_t pgm_read_byte(const void *ptr) // pgm_read_byte() - can be skipped +{ + return *((const uint8_t *)ptr); +} + +static inline uint16_t eeprom_read_word(const void *ptr) // eeprom_read_word() - can be skipped +{ + return 0; +} + +static inline void eeprom_write_word(const void *ptr, uint16_t val) // eeprom_write_word() - can be skipped +{ +} + +// utoa is already defined in stdlib c +//static inline char *utoa(unsigned int num, char *str, int radix) // util utoa() - can be skipped +//{ +// *str = '\0'; +// return str; +//} + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +static inline int random(int max) // random(n) - can be skipped if you don't use it +{ + return 0; +} + +static inline int random(int min, int max) // random(a,b) - can be skipped if you don't use it +{ + return 0; +} +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/stm32/platform.c b/lib/libssd1306/src/ssd1306_hal/stm32/platform.c new file mode 100644 index 0000000..b4b4d43 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/stm32/platform.c @@ -0,0 +1,130 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_hal/io.h" + +#if defined(SSD1306_STM32_PLATFORM) + +#include "intf/ssd1306_interface.h" +#include "stm32f1xx_hal.h" + +// TODO: To add support. Any help is welcome + +//////////////////////////////////////////////////////////////////////////////////////// +// !!! PLATFORM I2C IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) +static uint8_t s_i2c_addr = 0x3C; + +static void platform_i2c_start(void) +{ + // ... Open i2c channel for your device with specific s_i2c_addr +} + +static void platform_i2c_stop(void) +{ + // ... Complete i2c communication +} + +static void platform_i2c_send(uint8_t data) +{ + // ... Send byte to i2c communication channel +} + +static void platform_i2c_close(void) +{ + // ... free all i2c resources here +} + +static void platform_i2c_send_buffer(const uint8_t *data, uint16_t len) +{ + // ... Send len bytes to i2c communication channel here +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t addr, ssd1306_platform_i2cConfig_t * cfg) +{ + if (addr) s_i2c_addr = addr; + if (HAL_I2C_IsDeviceReady(&hi2c1, s_i2c_addr, 1, 20000) != HAL_OK) + { + return; + } + ssd1306_intf.spi = 0; + ssd1306_intf.start = &platform_i2c_start; + ssd1306_intf.stop = &platform_i2c_stop; + ssd1306_intf.send = &platform_i2c_send; + ssd1306_intf.close = &platform_i2c_close; + ssd1306_intf.send_buffer = &platform_i2c_send_buffer; + // init your interface here + //... +} +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// !!! PLATFORM SPI IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + +#include "intf/spi/ssd1306_spi.h" + +static void platform_spi_start(void) +{ + // ... Open spi channel for your device with specific s_ssd1306_cs, s_ssd1306_dc +} + +static void platform_spi_stop(void) +{ + // ... Complete spi communication +} + +static void platform_spi_send(uint8_t data) +{ + // ... Send byte to spi communication channel +} + +static void platform_spi_close(void) +{ + // ... free all spi resources here +} + +static void platform_spi_send_buffer(const uint8_t *data, uint16_t len) +{ + // ... Send len bytes to spi communication channel here +} + +void ssd1306_platform_spiInit(int8_t busId, + int8_t cesPin, + int8_t dcPin) +{ + if (cesPin>=0) s_ssd1306_cs = cesPin; + if (dcPin>=0) s_ssd1306_dc = dcPin; + ssd1306_intf.spi = 1; + ssd1306_intf.start = &platform_spi_start; + ssd1306_intf.stop = &platform_spi_stop; + ssd1306_intf.send = &platform_spi_send; + ssd1306_intf.close = &platform_spi_close; + ssd1306_intf.send_buffer = &platform_spi_send_buffer; + // init your interface here + //... +} +#endif + +#endif // YOUR_PLATFORM diff --git a/lib/libssd1306/src/ssd1306_hal/template/io.h b/lib/libssd1306/src/ssd1306_hal/template/io.h new file mode 100644 index 0000000..7fd4145 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/template/io.h @@ -0,0 +1,173 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * @file ssd1306_hal/template/io.h This is template file for new platform with detailed instructions + */ + +#ifndef _SSD1306_YOUR_PLATFORM_IO_H_ +#define _SSD1306_YOUR_PLATFORM_IO_H_ + +//========================== I. Create directory for your platform ======== +/* 1. Copy content of this folder to src/ssd1306_hal/<your_platform>/ folder */ +/* 2. Replace YOUR_PLATFORM in these files with the one, you would like to use */ +/* 3. Add #include "<your_platform>/io.h" to src/ssd1306_hal/io.h file */ +/* (remember to add required #elif defined(X) lines) */ +/* 4. Add platform.c file to SOURCES list in src/Makefile.src */ +/* 5. Implement functions below and functions in platform.c file */ + +#define YOUR_PLATFORM +//========================== I. Include libraries ========================= +/* 1. Include all required headers, specific for your platform here */ +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +/* If your platform already has these definitions, comment out lines below */ +#define LOW 0 +#define HIGH 1 +#define INPUT 0 +#define OUTPUT 1 +/* Progmem attribute for data, located in Flash */ +#define PROGMEM + +//========================== II. Define options =========================== +/* 2. Uncomment all options, you have support for on your platform * + * Remember that you will need to implement low level intf/i2c or * + * intf/spi layers for your platform */ + +//#define CONFIG_SOFTWARE_I2C_AVAILABLE +//#define CONFIG_TWI_I2C_AVAILABLE +//#define CONFIG_AVR_SPI_AVAILABLE +//#define CONFIG_AVR_UART_AVAILABLE +//#define CONFIG_VGA_AVAILABLE +//#define CONFIG_PLATFORM_I2C_AVAILABLE +//#define CONFIG_PLATFORM_SPI_AVAILABLE + +#ifdef __cplusplus +extern "C" { +#endif + +//========================== III. Implement functions ===================== +/* Implement functions below the way you like. You can make them non-static + * and implement the functions in platform.c file + */ +// !!! MANDATORY. The library will not work without these functions !!! +static inline int digitalRead(int pin) // digitalRead() +{ + return LOW; +} + +static inline void digitalWrite(int pin, int level) // digitalWrite() +{ +} + +static inline void pinMode(int pin, int mode) // pinMode() +{ +} + +static inline int analogRead(int pin) // analogRead() +{ + return 0; +} + +static inline uint32_t millis(void) // millis() +{ + return 0; +} + +static inline uint32_t micros(void) // micros() +{ + return 0; +}; + +static inline void delay(uint32_t ms) // delay() +{ +} + +static inline void delayMicroseconds(uint32_t us) // delayMicroseconds() +{ +} + +// !!! OPTIONAL !!! +static inline void randomSeed(int seed) // randomSeed() - can be skipped +{ +} + +static inline void attachInterrupt(int pin, void (*interrupt)(), int level) // attachInterrupt() - can be skipped +{ +} + +static inline uint8_t pgm_read_byte(const void *ptr) // pgm_read_byte() - can be left as is +{ + return *((const uint8_t *)ptr); +} + +static inline uint16_t eeprom_read_word(const void *ptr) // eeprom_read_word() - can be skipped +{ + return 0; +} + +static inline void eeprom_write_word(const void *ptr, uint16_t val) // eeprom_write_word() - can be skipped +{ +} + +static inline char *utoa(unsigned int num, char *str, int radix) // util utoa() - can be skipped +{ + *str = '\0'; + return str; +} + + +// !!! PLATFORM I2C IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) +void ssd1306_platform_i2cInit(int8_t busId, uint8_t addr, ssd1306_platform_i2cConfig_t * cfg); +#endif + + +// !!! PLATFORM SPI IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) +void ssd1306_platform_spiInit(uint8_t busId, + uint8_t cesPin, + uint8_t dcPin); +#endif + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +static inline int random(int max) // random(n) - can be skipped if you don't use it +{ + return 0; +} + +static inline int random(int min, int max) // random(a,b) - can be skipped if you don't use it +{ + return 0; +} +#endif + +#endif + diff --git a/lib/libssd1306/src/ssd1306_hal/template/platform.c b/lib/libssd1306/src/ssd1306_hal/template/platform.c new file mode 100644 index 0000000..2d1a16c --- /dev/null +++ b/lib/libssd1306/src/ssd1306_hal/template/platform.c @@ -0,0 +1,124 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "ssd1306_hal/io.h" + +// TODO: DON'T FORGET ADD YOUR PLATFORM FILE TO MAKEFILE + +#if defined(YOUR_PLATFORM) + +#include "intf/ssd1306_interface.h" +//////////////////////////////////////////////////////////////////////////////////////// +// !!! PLATFORM I2C IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_I2C_AVAILABLE) && defined(CONFIG_PLATFORM_I2C_ENABLE) +static uint8_t s_i2c_addr = 0x3C; + +static void platform_i2c_start(void) +{ + // ... Open i2c channel for your device with specific s_i2c_addr +} + +static void platform_i2c_stop(void) +{ + // ... Complete i2c communication +} + +static void platform_i2c_send(uint8_t data) +{ + // ... Send byte to i2c communication channel +} + +static void platform_i2c_close(void) +{ + // ... free all i2c resources here +} + +static void platform_i2c_send_buffer(const uint8_t *data, uint16_t len) +{ + // ... Send len bytes to i2c communication channel here +} + +void ssd1306_platform_i2cInit(int8_t busId, uint8_t addr, ssd1306_platform_i2cConfig_t * cfg) +{ + if (addr) s_i2c_addr = addr; + ssd1306_intf.spi = 0; + ssd1306_intf.start = &platform_i2c_start; + ssd1306_intf.stop = &platform_i2c_stop; + ssd1306_intf.send = &platform_i2c_send; + ssd1306_intf.close = &platform_i2c_close; + ssd1306_intf.send_buffer = &platform_i2c_send_buffer; + // init your interface here + //... +} +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// !!! PLATFORM SPI IMPLEMENTATION OPTIONAL !!! +#if defined(CONFIG_PLATFORM_SPI_AVAILABLE) && defined(CONFIG_PLATFORM_SPI_ENABLE) + +#include "intf/spi/ssd1306_spi.h" + +static void platform_spi_start(void) +{ + // ... Open spi channel for your device with specific s_ssd1306_cs, s_ssd1306_dc +} + +static void platform_spi_stop(void) +{ + // ... Complete spi communication +} + +static void platform_spi_send(uint8_t data) +{ + // ... Send byte to spi communication channel +} + +static void platform_spi_close(void) +{ + // ... free all spi resources here +} + +static void platform_spi_send_buffer(const uint8_t *data, uint16_t len) +{ + // ... Send len bytes to spi communication channel here +} + +void ssd1306_platform_spiInit(int8_t busId, + int8_t cesPin, + int8_t dcPin) +{ + if (cesPin>=0) s_ssd1306_cs = cesPin; + if (dcPin>=0) s_ssd1306_dc = dcPin; + ssd1306_intf.spi = 1; + ssd1306_intf.start = &platform_spi_start; + ssd1306_intf.stop = &platform_spi_stop; + ssd1306_intf.send = &platform_spi_send; + ssd1306_intf.close = &platform_spi_close; + ssd1306_intf.send_buffer = &platform_spi_send_buffer; + // init your interface here + //... +} +#endif + +#endif // YOUR_PLATFORM diff --git a/lib/libssd1306/src/ssd1306_menu.c b/lib/libssd1306/src/ssd1306_menu.c new file mode 100644 index 0000000..84e7136 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_menu.c @@ -0,0 +1,297 @@ +/* + MIT License + + Copyright (c) 2017-2019, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "font6x8.h" +#include "ssd1306.h" + +#ifndef min +#define min(x,y) ((x)<(y)?(x):(y)) +#endif + +#ifndef max +#define max(x,y) ((x)>(y)?(x):(y)) +#endif + +extern SFixedFontInfo s_fixedFont; +extern uint16_t ssd1306_color; + +static uint8_t getMaxScreenItems(void) +{ + return ((ssd1306_displayHeight() - 16) / (s_fixedFont.pages * 8)); +} + +static uint8_t getMaxScreenItems8(void) +{ + return ((ssd1306_displayHeight() - 16) / (s_fixedFont.h.height + 0)); +} + +void ssd1306_createMenu(SAppMenu *menu, const char **items, uint8_t count) +{ + menu->items = items; + menu->count = count; + menu->selection = 0; + menu->oldSelection = 0; + menu->scrollPosition = 0; +} + +static uint8_t calculateScrollPosition(SAppMenu *menu, uint8_t selection) +{ + if ( selection < menu->scrollPosition ) + { + return selection; + } + else if ( selection - menu->scrollPosition > getMaxScreenItems() - 1) + { + return selection - getMaxScreenItems() + 1; + } + return menu->scrollPosition; +} + +static uint8_t calculateScrollPosition8(SAppMenu *menu, uint8_t selection) +{ + if ( selection < menu->scrollPosition ) + { + return selection; + } + else if ( selection - menu->scrollPosition > getMaxScreenItems8() - 1) + { + return selection - getMaxScreenItems8() + 1; + } + return menu->scrollPosition; +} + +static void drawMenuItem(SAppMenu *menu, uint8_t index) +{ + if (index == menu->selection) + { + ssd1306_negativeMode(); + } + else + { + ssd1306_positiveMode(); + } + ssd1306_printFixed(8, (index - menu->scrollPosition)* (s_fixedFont.pages * 8) + 8, menu->items[index], STYLE_NORMAL ); + ssd1306_positiveMode(); +} + +static void drawMenuItem8(SAppMenu *menu, uint8_t index) +{ + if (index == menu->selection) + { + ssd1306_negativeMode(); + } + else + { + ssd1306_positiveMode(); + } + ssd1306_printFixed8(8, (index - menu->scrollPosition)*(s_fixedFont.h.height + 0) + 8, menu->items[index], STYLE_NORMAL ); + ssd1306_positiveMode(); +} + +static void drawMenuItem16(SAppMenu *menu, uint8_t index) +{ + if (index == menu->selection) + { + ssd1306_negativeMode(); + } + else + { + ssd1306_positiveMode(); + } + ssd1306_printFixed16(8, (index - menu->scrollPosition) * (s_fixedFont.h.height + 0) + 8, menu->items[index], STYLE_NORMAL ); + ssd1306_positiveMode(); +} + +void ssd1306_showMenu(SAppMenu *menu) +{ + ssd1306_drawRect(4, 4, ssd1306_displayWidth() - 5, ssd1306_displayHeight() - 5); + menu->scrollPosition = calculateScrollPosition( menu, menu->selection ); + for (uint8_t i = menu->scrollPosition; i < min(menu->count, menu->scrollPosition + getMaxScreenItems()); i++) + { + drawMenuItem(menu, i); + } + menu->oldSelection = menu->selection; +} + +void ssd1306_showMenu8(SAppMenu *menu) +{ + ssd1306_drawRect8(4, 4, ssd1306_displayWidth() - 5, ssd1306_displayHeight() - 5); + menu->scrollPosition = calculateScrollPosition8( menu, menu->selection ); + for (uint8_t i = menu->scrollPosition; i < min(menu->count, menu->scrollPosition + getMaxScreenItems8()); i++) + { + drawMenuItem8(menu, i); + } + menu->oldSelection = menu->selection; +} + +void ssd1306_showMenu16(SAppMenu *menu) +{ + ssd1306_drawRect16(4, 4, ssd1306_displayWidth() - 5, ssd1306_displayHeight() - 5); + menu->scrollPosition = calculateScrollPosition8( menu, menu->selection ); + for (uint8_t i = menu->scrollPosition; i < min(menu->count, menu->scrollPosition + getMaxScreenItems8()); i++) + { + drawMenuItem16(menu, i); + } + menu->oldSelection = menu->selection; +} + +void ssd1306_updateMenu(SAppMenu *menu) +{ + if (menu->selection != menu->oldSelection) + { + uint8_t scrollPosition = calculateScrollPosition( menu, menu->selection ); + if ( scrollPosition != menu->scrollPosition ) + { + ssd1306_clearScreen(); + ssd1306_showMenu(menu); + } + else + { + drawMenuItem(menu, menu->oldSelection); + drawMenuItem(menu, menu->selection); + menu->oldSelection = menu->selection; + } + } +} + +void ssd1306_updateMenu8(SAppMenu *menu) +{ + if (menu->selection != menu->oldSelection) + { + uint8_t scrollPosition = calculateScrollPosition8( menu, menu->selection ); + if ( scrollPosition != menu->scrollPosition ) + { + ssd1306_clearScreen8(); + ssd1306_showMenu8(menu); + } + else + { + drawMenuItem8(menu, menu->oldSelection); + drawMenuItem8(menu, menu->selection); + menu->oldSelection = menu->selection; + } + } +} + +void ssd1306_updateMenu16(SAppMenu *menu) +{ + if (menu->selection != menu->oldSelection) + { + uint8_t scrollPosition = calculateScrollPosition8( menu, menu->selection ); + if ( scrollPosition != menu->scrollPosition ) + { + ssd1306_clearScreen16(); + ssd1306_showMenu16(menu); + } + else + { + drawMenuItem16(menu, menu->oldSelection); + drawMenuItem16(menu, menu->selection); + menu->oldSelection = menu->selection; + } + } +} + +uint8_t ssd1306_menuSelection(SAppMenu *menu) +{ + return menu->selection; +} + +void ssd1306_menuDown(SAppMenu *menu) +{ + if (menu->selection < menu->count - 1) + { + menu->selection++; + } + else + { + menu->selection = 0; + } +} + +void ssd1306_menuUp(SAppMenu *menu) +{ + if (menu->selection > 0) + { + menu->selection--; + } + else + { + menu->selection = menu->count - 1; + } +} + +void ssd1306_drawProgressBar(int8_t progress) +{ + lcduint_t height = 8; + lcduint_t width = 8; + char str[5] = "100%"; + if ( progress < 100 ) + { + str[0] = ' '; + str[1] = progress / 10 + '0'; + str[2] = progress % 10 + '0'; + str[3] = '%'; + } + if ( s_fixedFont.primary_table != NULL ) + { + width = ssd1306_getTextSize( str, &height ); + } + lcdint_t middle = ssd1306_displayHeight() / 2; + lcdint_t progress_pos = 8 + (int16_t)(ssd1306_displayWidth() - 16) * progress / 100; + uint16_t color = ssd1306_color; + ssd1306_color = 0x0000; + ssd1306_fillRect( progress_pos, middle, ssd1306_displayWidth() - 8, middle + height ); + ssd1306_color = color; + ssd1306_printFixed( ssd1306_displayWidth() / 2 - width / 2, middle - height, str, STYLE_NORMAL ); + ssd1306_drawRect( 8, middle, ssd1306_displayWidth() - 8, middle + height ); + ssd1306_fillRect( 8, middle, progress_pos, middle + height ); +} + +void ssd1306_drawProgressBar8(int8_t progress) +{ + lcduint_t height = 8; + lcduint_t width = 8; + char str[5] = "100%"; + if ( progress < 100 ) + { + str[0] = ' '; + str[1] = progress / 10 + '0'; + str[2] = progress % 10 + '0'; + str[3] = '%'; + } + if ( s_fixedFont.primary_table != NULL ) + { + width = ssd1306_getTextSize( str, &height ); + } + lcdint_t middle = ssd1306_displayHeight() / 2; + lcdint_t progress_pos = 8 + (int16_t)(ssd1306_displayWidth() - 16) * progress / 100; + uint16_t color = ssd1306_color; + ssd1306_color = 0x0000; + ssd1306_fillRect8( progress_pos, middle, ssd1306_displayWidth() - 8, middle + height ); + ssd1306_color = color; + ssd1306_printFixed8( ssd1306_displayWidth() / 2 - width / 2, middle - height, str, STYLE_NORMAL ); + ssd1306_drawRect8( 8, middle, ssd1306_displayWidth() - 8, middle + height ); + ssd1306_fillRect8( 8, middle, progress_pos, middle + height ); +} diff --git a/lib/libssd1306/src/ssd1306_uart.c b/lib/libssd1306/src/ssd1306_uart.c new file mode 100644 index 0000000..b9d2902 --- /dev/null +++ b/lib/libssd1306/src/ssd1306_uart.c @@ -0,0 +1,145 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file nano_engine.h Small graphics engine, based on SSD1331 functions + */ + +#include "ssd1306_uart.h" + +#if defined(CONFIG_AVR_UART_AVAILABLE) && defined(CONFIG_AVR_UART_ENABLE) + +volatile uint8_t g_uart_put_ptr = 0; +volatile uint8_t g_uart_buf[UART_BUFFER_RX]; +static uint8_t s_uart_get_ptr = 0; +static uint8_t s_uart_interrupt = 0; + +#undef BAUD +#define BAUD 115200 +// We need to define BAUD_TOL too high, because otherwise, +// the compiler will give a warning "Baud rate achieved is higher than allowed" +// I would recommend not to use 115200 on atmega328p +#define BAUD_TOL 4 +#include <util/setbaud.h> +static const uint8_t ubrr0h_115200 = UBRRH_VALUE; +static const uint8_t ubrr0l_115200 = UBRRL_VALUE; +#ifdef USE_2X +static const uint8_t u2x0_115200 = 1; +#else +static const uint8_t u2x0_115200 = 0; +#endif + +#undef BAUD +#define BAUD 57600 +#include <util/setbaud.h> +static const uint8_t ubrr0h_57600 = UBRRH_VALUE; +static const uint8_t ubrr0l_57600 = UBRRL_VALUE; +#ifdef USE_2X +static const uint8_t u2x0_57600 = 1; +#else +static const uint8_t u2x0_57600 = 0; +#endif + +#undef BAUD +#define BAUD 38400 +#include <util/setbaud.h> +static const uint8_t ubrr0h_38400 = UBRRH_VALUE; +static const uint8_t ubrr0l_38400 = UBRRL_VALUE; +#ifdef USE_2X +static const uint8_t u2x0_38400 = 1; +#else +static const uint8_t u2x0_38400 = 0; +#endif + +#undef BAUD +#define BAUD 19200 +#include <util/setbaud.h> +static const uint8_t ubrr0h_19200 = UBRRH_VALUE; +static const uint8_t ubrr0l_19200 = UBRRL_VALUE; +#ifdef USE_2X +static const uint8_t u2x0_19200 = 1; +#else +static const uint8_t u2x0_19200 = 0; +#endif + +void uart_init_internal(uint32_t baud, uint8_t interrupt) +{ + s_uart_interrupt = interrupt; + switch (baud) + { + case 19200: + UBRR0H = ubrr0h_19200; + UBRR0L = ubrr0l_19200; + if (u2x0_19200) UCSR0A |= _BV(U2X0); else UCSR0A &= ~(_BV(U2X0)); + break; + case 38400: + UBRR0H = ubrr0h_38400; + UBRR0L = ubrr0l_38400; + if (u2x0_38400) UCSR0A |= _BV(U2X0); else UCSR0A &= ~(_BV(U2X0)); + break; + case 57600: + UBRR0H = ubrr0h_57600; + UBRR0L = ubrr0l_57600; + if (u2x0_57600) UCSR0A |= _BV(U2X0); else UCSR0A &= ~(_BV(U2X0)); + break; + case 115200: + UBRR0H = ubrr0h_115200; + UBRR0L = ubrr0l_115200; + if (u2x0_115200) UCSR0A |= _BV(U2X0); else UCSR0A &= ~(_BV(U2X0)); + break; + default: + break; + } + UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */ + UCSR0B = _BV(RXEN0) | _BV(TXEN0) | (s_uart_interrupt ? _BV(RXCIE0) : 0); +} + +void uart_send_byte(uint8_t c) +{ + loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */ + UDR0 = c; +} + +static inline uint8_t uart_byte_available_direct(void) +{ + return bit_is_set(UCSR0A, RXC0); +} + +uint8_t uart_byte_available(void) +{ + if (!s_uart_interrupt) + { + while (uart_byte_available_direct()) __uart_read_byte(); + } + return g_uart_put_ptr != s_uart_get_ptr; +} + +uint8_t uart_read_byte(void) +{ + uint8_t data = g_uart_buf[s_uart_get_ptr]; + s_uart_get_ptr = (s_uart_get_ptr + 1) & (UART_BUFFER_RX - 1); + return data; +} + +#endif + diff --git a/lib/libssd1306/src/ssd1306_uart.h b/lib/libssd1306/src/ssd1306_uart.h new file mode 100644 index 0000000..76814ea --- /dev/null +++ b/lib/libssd1306/src/ssd1306_uart.h @@ -0,0 +1,134 @@ +/* + MIT License + + Copyright (c) 2018, Alexey Dynda + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +/** + * @file ssd1306_uart.h Uart implementation for SSD1306 library + * @details Define UART_INTERRUPT_ENABLE before including this header, if you + * want interrupt-based UART support. + * Define CONFIG_AVR_UART_AVAILABLE and CONFIG_AVR_UART_ENABLE before + * including this header, if you want to use uart module outside ssd1306 library. + */ + +#ifndef _SSD1306_UART_H_ +#define _SSD1306_UART_H_ + +// This check is required if you want to use ssd1306_uart module outside ssd1306_library +#ifndef CONFIG_AVR_UART_AVAILABLE +#include "ssd1306_hal/io.h" +#endif + +#if defined(CONFIG_AVR_UART_AVAILABLE) && defined(CONFIG_AVR_UART_ENABLE) + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> + +/** Rx buffer size, used by AVR USART implementation */ +#define UART_BUFFER_RX 32 // :( Still need large buffer to process USART RX bytes + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +extern volatile uint8_t g_uart_put_ptr; + +extern volatile uint8_t g_uart_buf[]; + +void uart_init_internal(uint32_t baud, uint8_t interrupt); +#endif + +/** + * @brief Initializes uart module + * + * Initializes uart module. Depending on UART_INTERRUPT_ENABLE define, + * module will be initialized in interrupt mode or synchronouse mode. + * + * @param baud baud rate for the uart module + * @note only 115200, 57600, 38400 and 19200 are supported. + */ +static inline void uart_init(uint32_t baud) +{ +#ifdef UART_INTERRUPT_ENABLE + uart_init_internal(baud, 1); +#else + uart_init_internal(baud, 0); +#endif +} + +/** + * @brief Sends single byte over UART + * + * Sends single byte over UART. The function doesn't use any + * internal buffers, so it returns control once byte is sent. + * + * @param c byte to send. + */ +void uart_send_byte(uint8_t c); + +/** + * @brief Returns non-zero code if there are bytes in RX buffer + * + * Returns non-zero code if there are bytes in RX buffer + */ +uint8_t uart_byte_available(void); + +/** + * @brief Reads byte from UART RX buffer. + * + * Reads byte from UART RX buffer. Please, check bytes availability + * via uart_byte_available() before calling this function. + */ +uint8_t uart_read_byte(void); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +static inline void __uart_read_byte(void) +{ + g_uart_buf[g_uart_put_ptr] = UDR0; + g_uart_put_ptr = (g_uart_put_ptr+1) & (UART_BUFFER_RX - 1); +} + + +#ifdef UART_INTERRUPT_ENABLE + +ISR(USART_RX_vect, ISR_BLOCK) +{ + if (bit_is_clear(UCSR0A, FE0)) // Do not perform error checks for now + { + __uart_read_byte(); + } + else + { + volatile unsigned char data __attribute__((unused)) = UDR0; + } +} +#endif + +#endif // DOXYGEN_SHOULD_SKIP_THIS + +#ifdef __cplusplus +} +#endif + +#endif + +#endif + diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..ed0776d --- /dev/null +++ b/src/main.c @@ -0,0 +1,46 @@ +#include "twi.h" +#include "ssd1306.h" +#include "sevenseg.h" + +void main() { + TWI_Init(); + + + ssd1306_128x32_i2c_init(); +// ssd1306_128x64_spi_init(-1, 0, 1); // Use this line for nano pi (RST not used, 0=CE, gpio1=D/C) +// ssd1306_128x64_spi_init(3,4,5); // Use this line for Atmega328p (3=RST, 4=CE, 5=D/C) +// ssd1306_128x64_spi_init(24, 0, 23); // Use this line for Raspberry (gpio24=RST, 0=CE, gpio23=D/C) +// ssd1306_128x64_spi_init(22, 5, 21); // Use this line for ESP32 (VSPI) (gpio22=RST, gpio5=CE for VSPI, gpio21=D/C) +// composite_video_128x64_mono_init(); // Use this line for ESP32 with Composite video support + + ssd1306_clearScreen(); + + //ssd1306_drawLine(0,0, ssd1306_displayWidth() -1, ssd1306_displayHeight() -1); + + + const uint8_t charw = 18; + const uint8_t spacing = 6; + const uint8_t barw=4; + + struct SevenSeg sseg = { + .x0 = 0, + .y0 = 0, + .charwidth = 17, + .thick = 3, + //.charwidth = 16, + //.thick = 1, + .spacing = 4, + }; + + uint16_t i = 0; + uint16_t v; + uint16_t w; + int drawing = false; + for (;;) { + sseg_number(&sseg, i, 5, 1); + + i++; + if (i == 9999) i = 0; + _delay_ms(100); + } +} diff --git a/src/sevenseg.c b/src/sevenseg.c new file mode 100644 index 0000000..87fdf53 --- /dev/null +++ b/src/sevenseg.c @@ -0,0 +1,146 @@ +/** + * TODO file description + */ + +#include <avr/pgmspace.h> +#include "sevenseg.h" +#include "ssd1306.h" + + +void sseg_home(struct SevenSeg *disp) { + disp->x = 0; +} + +enum SevenSegBars { + T=1, RT=2, RB=4, B=8, LB=16, LT=32, M=64 +}; + +static const uint8_t PROGMEM seven[] = { + [0] = T|RT|RB|B|LB|LT, + [1] = RT|RB, + [2] = T|RT|M|LB|B, + [3] = T|RT|M|RB|B, + [4] = RT|RB|M|LT, + [5] = T|LT|M|RB|B, + [6] = T|LT|LB|B|RB|M, + [7] = T|RT|RB, + [8] = T|LT|RT|LB|RB|B|M, + [9] = T|LT|RT|RB|B|M, +}; + +static void draw_7seg_dig(uint8_t x, uint8_t y, uint8_t w, uint8_t th, uint8_t digit) { + uint8_t mask = digit == 255 ? 0 : pgm_read_byte(&seven[digit]); + + const uint8_t v = w - th * 2; + const uint8_t subs = 1; + + ssd1306_setColor((mask & T) ? 0xFFFF : 0); + ssd1306_fillRect( + x + th, + y + 0, + x + th + v - subs, + y + th - subs); + + ssd1306_setColor((mask & M) ? 0xFFFF : 0); + ssd1306_fillRect( + x + th, + y + th + v, + x + th + v - subs, + y + th * 2 + v - subs); + + ssd1306_setColor((mask & B) ? 0xFFFF : 0); + ssd1306_fillRect( + x + th, + y + th * 2 + v * 2, + x + th + v - subs, + y + th * 3 + v * 2 - subs); + + ssd1306_setColor((mask & LT) ? 0xFFFF : 0); + ssd1306_fillRect( + x + 0, + y + th, + x + th - subs, + y + th + v - subs); + + ssd1306_setColor((mask & RT) ? 0xFFFF : 0); + ssd1306_fillRect( + x + th + v, + y + th, + x + th * 2 + v - subs, + y + th + v - subs); + + ssd1306_setColor((mask & LB) ? 0xFFFF : 0); + ssd1306_fillRect( + x + 0, + y + th * 2 + v, + x + th - subs, + y + th * 2 + v * 2 - subs); + + ssd1306_setColor((mask & RB) ? 0xFFFF : 0); + ssd1306_fillRect( + x + th + v, + y + th * 2 + v, + x + th * 2 + v - subs, + y + th * 2 + v * 2 - subs); +} + +static void draw_7seg_period(uint8_t x, uint8_t y, uint8_t w, uint8_t th) { + const uint8_t v = w - th * 2; + const uint8_t subs = 1; + + ssd1306_setColor(0xFFFF); + ssd1306_fillRect( + x, + y + th * 2 + v * 2, + x + th - subs, + y + th * 3 + v * 2 - subs); +} + + +void sseg_digit(struct SevenSeg *disp, uint8_t digit) { + draw_7seg_dig(disp->x, disp->y0, disp->charwidth, disp->thick, digit); + disp->x += disp->charwidth + disp->spacing; +} + +void sseg_blank(struct SevenSeg *disp) { + draw_7seg_dig(disp->x, disp->y0, disp->charwidth, disp->thick, 255); + disp->x += disp->charwidth + disp->spacing; +} + +void sseg_period(struct SevenSeg *disp) { + draw_7seg_period(disp->x, disp->y0, disp->charwidth, disp->thick); + disp->x += disp->thick + disp->spacing; +} + +void sseg_number(struct SevenSeg *disp, uint16_t num, uint8_t places, uint8_t decimals) { + uint8_t digits[5] = {}; + uint8_t pos = 4; + while (num > 0) { + uint8_t res = num % 10; + num /= 10; + digits[pos] = res; + pos--; + } + + sseg_home(disp); + bool drawing = false; + for (uint8_t i = 5 - places; i < 5; i++) { + uint8_t d = digits[i]; + + if (i == 5 - decimals) { + sseg_period(disp); + } + + if (!drawing && d == 0) { + if (i == 5 - decimals - 1) { + sseg_digit(disp, d); + drawing = true; + } else { + sseg_blank(disp); + } + } else { + sseg_digit(disp, d); + drawing = true; + } + } +} diff --git a/src/sevenseg.h b/src/sevenseg.h new file mode 100644 index 0000000..a611931 --- /dev/null +++ b/src/sevenseg.h @@ -0,0 +1,30 @@ +/** + * TODO file description + */ + +#ifndef CPROJ_SEVENSEG_H +#define CPROJ_SEVENSEG_H + +#include <stdbool.h> + +struct SevenSeg { + uint8_t x0; + uint8_t y0; + uint8_t x; + uint8_t charwidth; + uint8_t thick; + uint8_t spacing; +}; + +void sseg_home(struct SevenSeg *disp); + +void sseg_digit(struct SevenSeg *disp, uint8_t digit); + +void sseg_blank(struct SevenSeg *disp); + +void sseg_period(struct SevenSeg *disp); + +void sseg_number(struct SevenSeg *disp, uint16_t num, uint8_t places, uint8_t decimals); + + +#endif //CPROJ_SEVENSEG_H diff --git a/src/twi.c b/src/twi.c new file mode 100644 index 0000000..da01dc1 --- /dev/null +++ b/src/twi.c @@ -0,0 +1,166 @@ +/** + * ---------------------------------------------------------------+ + * @desc Two Wire Interface / I2C Communication + * ---------------------------------------------------------------+ + * Copyright (C) 2020 Marian Hrinko. + * Written by Marian Hrinko (mato.hrinko@gmail.com) + * + * @author Marian Hrinko + * @datum 06.09.2020 + * @file twi.c + * @tested AVR Atmega16, ATmega8, Atmega328 + * + * @depend + * ---------------------------------------------------------------+ + * @usage Master Transmit Operation + */ + +// include libraries +#include <avr/io.h> +#include "twi.h" + +/** + * @desc TWI init - initialize frequency + * + * @param void + * + * @return void + */ +void TWI_Init (void) +{ + // +++++++++++++++++++++++++++++++++++++++++++++ + // Calculation fclk: + // + // fclk = (fcpu)/(16+2*TWBR*4^Prescaler) + // --------------------------------------------- + // Calculation TWBR: + // + // TWBR = {(fcpu/fclk) - 16 } / (2*4^Prescaler) + // +++++++++++++++++++++++++++++++++++++++++++++ + // @param1 value of TWBR, + // fclk = 400kHz (m16); TWBR = 3 + // fclk = 100kHz (m16); TWBR = 20 + // @param2 value of Prescaler = 1 + TWI_FREQ (3, 1); +} + +/** + * @desc TWI MT Start + * + * @param void + * + * @return char + */ +char TWI_MT_Start (void) +{ + // null status flag + TWI_TWSR &= ~0xA8; + // START + // ---------------------------------------------- + // request for bus + TWI_START(); + // wait till flag set + TWI_WAIT_TILL_TWINT_IS_SET(); + // test if start or repeated start acknowledged + if ((TWI_STATUS != TWI_START_ACK) && (TWI_STATUS != TWI_REP_START_ACK)) { + // return status + return TWI_STATUS; + } + // success + return SUCCESS; +} + +/** + * @desc TWI Send address + write + * + * @param char + * + * @return char + */ +char TWI_MT_Send_SLAW (char address) +{ + // SLA+W + // ---------------------------------------------- + TWI_TWDR = (address << 1); + // enable + TWI_ENABLE(); + // wait till flag set + TWI_WAIT_TILL_TWINT_IS_SET(); + + // test if SLA with WRITE acknowledged + if (TWI_STATUS != TWI_MT_SLAW_ACK) { + // return status + return TWI_STATUS; + } + // success + return SUCCESS; +} + +/** + * @desc TWI Send data + * + * @param char + * + * @return char + */ +char TWI_MT_Send_Data (char data) +{ + // DATA + // ---------------------------------------------- + TWI_TWDR = data; + // enable + TWI_ENABLE(); + // wait till flag set + TWI_WAIT_TILL_TWINT_IS_SET(); + + // test if data acknowledged + if (TWI_STATUS != TWI_MT_DATA_ACK) { + // return status + return TWI_STATUS; + } + // success + return SUCCESS; +} + +/** + * @desc TWI Send address + read + * + * @param char + * + * @return char + */ +char TWI_MR_Send_SLAR (char address) +{ + // SLA+R + // ---------------------------------------------- + TWI_TWDR = (address << 1) | 0x01; + // enable + TWI_ENABLE(); + // wait till flag set + TWI_WAIT_TILL_TWINT_IS_SET(); + + // test if SLA with READ acknowledged + if (TWI_STATUS != TWI_MR_SLAR_ACK) { + // return status + return TWI_STATUS; + } + // success + return SUCCESS; +} + +/** + * @desc TWI stop + * + * @param void + * + * @return void + */ +void TWI_Stop (void) +{ + // End TWI + // ------------------------------------------------- + // send stop sequence + TWI_STOP (); + // wait for TWINT flag is set +// TWI_WAIT_TILL_TWINT_IS_SET(); +} diff --git a/src/twi.h b/src/twi.h new file mode 100644 index 0000000..626d38a --- /dev/null +++ b/src/twi.h @@ -0,0 +1,178 @@ +/** + * ---------------------------------------------------------------+ + * @desc Two Wire Interface / I2C Communication + * ---------------------------------------------------------------+ + * Copyright (C) 2020 Marian Hrinko. + * Written by Marian Hrinko (mato.hrinko@gmail.com) + * + * @author Marian Hrinko + * @datum 06.09.2020 + * @file twi.h + * @tested AVR Atmega16, ATmega8, Atmega328 + * + * @depend + * ---------------------------------------------------------------+ + * @usage Basic Master Transmit Operation + */ + +#ifndef __TWI_H__ +#define __TWI_H__ + + // define register for TWI communication + // ------------------------------------------- + #if defined(__AVR_ATmega16__) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega328P__) + + #define TWI_TWAR TWAR // TWI (Slave) Address Register + #define TWI_TWBR TWBR // TWI Bit Rate Register + #define TWI_TWDR TWDR // TWI Data Register + #define TWI_TWCR TWCR // TWI Control Register + #define TWI_TWSR TWSR // TWI Status Register + + #endif + + // Success + // ------------------------------------------- + #ifndef SUCCESS + #define SUCCESS 0 + #endif + + // Error + // ------------------------------------------- + #ifndef ERROR + #define ERROR 1 + #endif + + // ++++++++++++++++++++++++++++++++++++++++++ + // + // M A S T E R M O D E + // + // ++++++++++++++++++++++++++++++++++++++++++ + // Master Mode - Transmitter / Receiver + #define TWI_START_ACK 0x08 // A START condition has been transmitted + #define TWI_REP_START_ACK 0x10 // A repeated START condition has been transmitted + #define TWI_FLAG_ARB_LOST 0x38 // Arbitration lost in SLA+W or NOT ACK bit + // Master Transmitter Mode + #define TWI_MT_SLAW_ACK 0x18 // SLA+W has been transmitted; ACK has been received + #define TWI_MT_SLAW_NACK 0x20 // SLA+W has been transmitted; NOT ACK has been received + #define TWI_MT_DATA_ACK 0x28 // Data byte has been transmitted; ACK has been received + #define TWI_MT_DATA_NACK 0x30 // Data byte has been transmitted; NOT ACK has been received + // Master Receiver Mode + #define TWI_MR_SLAR_ACK 0x40 // SLA+R has been transmitted; ACK has been received + #define TWI_MR_SLAR_NACK 0x48 // SLA+R has been transmitted; NOT ACK has been received + #define TWI_MR_DATA_ACK 0x50 // Data byte has been received; ACK has been received + #define TWI_MR_DATA_NACK 0x58 // Data byte has been received; NOT ACK has been received + + // ++++++++++++++++++++++++++++++++++++++++++ + // + // S L A V E M O D E + // + // ++++++++++++++++++++++++++++++++++++++++++ + // Slave Receiver Mode + #define TWI_SR_SLAW_ACK 0x60 // Own Slave address has been received; ACK returned + #define TWI_SR_ALMOA_ACK 0x68 // Arbitration Lost in SLA+R/W as Master; Own Slave address has been received; ACK returned + #define TWI_SR_GCALL_ACK 0x70 // General call address has been received; ACK returned + #define TWI_SR_ALMGA_ACK 0x78 // Arbitration lost in SLA+R/W as Master; General call address has been received; ACK returned + #define TWI_SR_OA_DATA_ACK 0x80 // Previously addressed with own SLA+W; data has been received; ACK returned + #define TWI_SR_OA_DATA_NACK 0x88 // Previously addressed with own SLA+W; data has been received; NOT ACK returned + #define TWI_SR_GC_DATA_ACK 0x90 // Previously addressed with general call; data has been received; ACK returned + #define TWI_SR_GC_DATA_NACK 0x98 // Previously addressed with general call; data has been received; NOT ACK returned + #define TWI_SR_STOP_RSTART 0xA0 // A STOP condition or repeated START condition has been received while still addressed as Slave + // Slave Transmitter Mode + #define TWI_ST_OA_ACK 0xA8 // Own SLA+R has been received; ACK has been returned + #define TWI_ST_ALMOA_ACK 0xB0 // Arbitration lost in SLA+R/W as Master; own SLA+R has been received; ACK has been received + #define TWI_ST_DATA_ACK 0xB8 // Data byte in TWDR has been transmitted; ACK has been received + #define TWI_ST_DATA_NACK 0xC0 // Data byte in TWDR has been transmitted; NOT ACK has been received + #define TWI_ST_DATA_LOST_ACK 0xC8 // Last data byte in TWDR has been transmitted (TWEA = '0'); ACK has been received + + // TWI CLK frequency + // ------------------------------------------- + // @param TWBR + // @param Prescaler + // TWPS1 TWPS0 - PRESCALER + // 0 0 - 1 + // 0 1 - 4 + // 1 0 - 16 + // 1 1 - 64 + #define TWI_FREQ(BIT_RATE, PRESCALER) { TWI_TWBR = BIT_RATE; TWI_TWSR |= (TWI_TWSR & 0x03) | PRESCALER; } + + // TWI start condition + // ------------------------------------------- + // (1 << TWEN) - TWI Enable + // (1 << TWINT) - TWI Interrupt Flag - must be cleared by set + // (1 << TWSTA) - TWI Start + #define TWI_START() { TWI_TWCR = (1 << TWEN) | (1 << TWINT) | (1 << TWSTA); } + + // TWI stop condition + // ------------------------------------------- + // (1 << TWEN) - TWI Enable + // (1 << TWINT) - TWI Interrupt Flag - must be cleared by set + // (1 << TWSTO) - TWI Stop + #define TWI_STOP() { TWI_TWCR = (1 << TWEN) | (1 << TWINT) | (1 << TWSTO); } + + // TWI enable + // ------------------------------------------- + // (1 << TWEN) - TWI Enable + // (1 << TWINT) - TWI Interrupt Flag - must be cleared by set + #define TWI_ENABLE() { TWI_TWCR = (1 << TWEN) | (1 << TWINT); } + + // TWI test if TWINT Flag is set + #define TWI_WAIT_TILL_TWINT_IS_SET() { while (!(TWI_TWCR & (1 << TWINT))); } + + // TWI status mask + #define TWI_STATUS ( TWI_TWSR & 0xF8 ) + + /** + * @desc TWI init + * + * @param void + * + * @return void + */ + void TWI_Init(void); + + /** + * @desc TWI MT Start + * + * @param void + * + * @return char + */ + char TWI_MT_Start(void); + + /** + * @desc TWI Send SLAW + * + * @param void + * + * @return unsigned char + */ + char TWI_MT_Send_SLAW(char); + + /** + * @desc TWI Send data + * + * @param char + * + * @return char + */ + char TWI_MT_Send_Data(char); + + /** + * @desc TWI Send SLAR + * + * @param void + * + * @return unsigned char + */ + char TWI_MR_Send_SLAR(char); + + /** + * @desc TWI stop + * + * @param void + * + * @return void + */ + void TWI_Stop(void); + +#endif