From de23e0b65048329d31bcfbbcca4f1a01088cb99a Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Wed, 7 Dec 2016 00:26:43 +0100 Subject: [PATCH] Cleanups --- .clang_complete | 3 +- .gitignore | 1 + Makefile | 12 +- images/logo.h | 40 ++++++ images/logo.png | Bin 0 -> 3015 bytes images/logo_bw.h | 136 +++++++++++++++++++ images/logo_bw.png | Bin 0 -> 9035 bytes spi.h => include/spi.h | 4 +- st7735.h => include/st7735.h | 14 +- st7735initcmds.h => include/st7735initcmds.h | 4 +- main.c | 19 +-- st7735.c | 90 +++++++++++- utils/img_convert.py | 48 +++++++ utils/img_convert_mono.py | 56 ++++++++ 14 files changed, 400 insertions(+), 27 deletions(-) create mode 100644 .gitignore create mode 100644 images/logo.h create mode 100644 images/logo.png create mode 100644 images/logo_bw.h create mode 100644 images/logo_bw.png rename spi.h => include/spi.h (74%) rename st7735.h => include/st7735.h (80%) rename st7735initcmds.h => include/st7735initcmds.h (99%) create mode 100644 utils/img_convert.py create mode 100644 utils/img_convert_mono.py diff --git a/.clang_complete b/.clang_complete index 171341a..9101b37 100644 --- a/.clang_complete +++ b/.clang_complete @@ -1,4 +1,5 @@ --I../sss7core +-Iinclude +-Iimages -I/usr/avr/include -D__AVR_ATmega8__ -DF_CPU=16000000 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e56e04 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/Makefile b/Makefile index 45a243f..1069151 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,8 @@ ISPPORT ?= /dev/kaboard VERSION = 0.1 -HEADERS = spi.h st7735.h st7735initcmds.h +HEADERS = include/spi.h include/st7735.h include/st7735initcmds.h +HEADERS += images/logo_bw.h images/logo.h SRC = main.c spi.c st7735.c TARGET = st7735_test OBJDIR = bin @@ -17,7 +18,7 @@ SIZE = avr-size SRC_TMP = $(subst ../,,$(SRC)) OBJ = $(SRC_TMP:%.c=$(OBJDIR)/$(AVRMCU)/%.o) -CFLAGS = -I ../sss7core/ -Os -Wall -Wstrict-prototypes +CFLAGS = -I include -I images -Os -Wall -Wstrict-prototypes CFLAGS += -ffunction-sections -fdata-sections CFLAGS += -fshort-enums -fpack-struct -funsigned-char -funsigned-bitfields CFLAGS += -mmcu=$(AVRMCU) -DF_CPU=$(F_CPU)UL -DVERSION=$(VERSION) @@ -33,6 +34,12 @@ start: @echo ":: Building for $(AVRMCU)" @echo ":: MCU operating frequency is $(F_CPU)Hz" +images/logo.h : images/logo.png utils/img_convert.py + python3 utils/img_convert.py $< $@ + +images/logo_bw.h : images/logo_bw.png utils/img_convert_mono.py + python3 utils/img_convert_mono.py $< $@ + $(OBJDIR)/$(AVRMCU)/%.o : %.c $(HEADERS) Makefile @mkdir -p $$(dirname $@) $(CC) $(CFLAGS) -c $< -o $@ @@ -50,6 +57,7 @@ size : $(OBJDIR)/$(AVRMCU)/$(TARGET).elf clean : @rm -rf $(OBJDIR) + @rm images/*.h flash : all avrdude -c arduino \ diff --git a/images/logo.h b/images/logo.h new file mode 100644 index 0000000..099e026 --- /dev/null +++ b/images/logo.h @@ -0,0 +1,40 @@ +#ifndef _LOGO_H_ +#define _LOGO_H_ +#include + +static const uint16_t PROGMEM logo[] = { + 0x20, 0x20, + 0x4081, 0x4880, 0x4880, 0x2861, 0x38c1, 0x38c1, 0x30a1, 0x3081, 0x2861, 0x1861, 0x1061, 0x28a1, 0x3060, 0x2861, 0x821, 0x1041, 0x1861, 0x821, 0x821, 0x1, 0x821, 0x1841, 0x2061, 0x1841, 0x2061, 0x2881, 0x38a1, 0x5122, 0x2104, 0x5a48, 0x5a48, 0x6aea, + 0x40a1, 0x4060, 0x4060, 0x2860, 0x48a0, 0x48a0, 0x40a0, 0x3880, 0x3880, 0x3060, 0x3060, 0x2040, 0x3060, 0x3080, 0x821, 0x1882, 0x3124, 0x1861, 0x2060, 0x2061, 0x2061, 0x2880, 0x2881, 0x28a1, 0x38a1, 0x40e2, 0x4922, 0x59a4, 0x6226, 0x8b49, 0x834a, 0x800, + 0x48e2, 0x3860, 0x3860, 0x3880, 0x4080, 0x48a0, 0x4080, 0x3880, 0x3080, 0x3060, 0x2860, 0x3060, 0x2860, 0x2860, 0x1800, 0xe71c, 0xffff, 0x2860, 0x3081, 0x30a1, 0x3081, 0x38a1, 0x30a1, 0x38c1, 0x40c1, 0x4901, 0x5142, 0x5163, 0x5162, 0x5983, 0x5183, 0x5163, + 0x6143, 0x6040, 0x5060, 0x3881, 0x2861, 0x4880, 0x40a0, 0x48a0, 0x3880, 0x1041, 0x1021, 0x1021, 0x2061, 0x40a0, 0x830b, 0xffff, 0xffff, 0xb514, 0x38a0, 0x40a1, 0x40c1, 0x40c0, 0x40c1, 0x40c1, 0x40c1, 0x40c1, 0x40c1, 0x40e1, 0x38c1, 0x38c1, 0x40c1, 0x40e2, + 0x6183, 0x5820, 0x6820, 0x5060, 0x1041, 0x4080, 0x48a0, 0x2860, 0x821, 0x801, 0x821, 0x821, 0x821, 0x2020, 0xffff, 0xef1b, 0xacd2, 0xffff, 0x5984, 0x40c1, 0x48c1, 0x48c1, 0x40c1, 0x40c1, 0x48c1, 0x48e1, 0x40c1, 0x40c1, 0x40e1, 0x40c1, 0x40c1, 0x40c1, + 0x6182, 0x5881, 0x5820, 0x6020, 0x50c0, 0x50a0, 0x48a0, 0x1021, 0x1, 0x1, 0x801, 0x1, 0x1, 0x8c71, 0xffff, 0x7aca, 0xacb2, 0xffff, 0xde99, 0x4060, 0x50e1, 0x48c0, 0x40c1, 0x48c1, 0x48c1, 0x48e1, 0x48c1, 0x50e1, 0x48e1, 0x48e1, 0x48e1, 0x48c1, + 0x6142, 0x60e1, 0x3001, 0x5800, 0x58a0, 0x58c0, 0x3880, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1082, 0xffff, 0xffdf, 0xd638, 0x8b4b, 0xffff, 0xffff, 0x7aca, 0x48c0, 0x48c1, 0x48c1, 0x48c1, 0x48c1, 0x48c1, 0x48c1, 0x48c1, 0x40c1, 0x48c1, 0x40c1, 0x40c1, + 0x5942, 0x6140, 0x5081, 0x70a1, 0x9ac4, 0x7161, 0x2860, 0x0, 0x1, 0x1, 0x0, 0x0, 0xb5b7, 0xffff, 0xffff, 0x69a5, 0x4020, 0xffff, 0xffff, 0xf7be, 0x3840, 0x48c0, 0x40a0, 0x50c1, 0x48c0, 0x40c1, 0x40a1, 0x40c1, 0x48c0, 0x40a1, 0x40a1, 0x40a1, + 0x5922, 0x6140, 0x2061, 0x4000, 0xd304, 0xc2e5, 0x2840, 0x1, 0x1, 0x0, 0x1, 0x39e7, 0xffff, 0x8b8e, 0xffff, 0x832b, 0x832c, 0xf7be, 0xdeba, 0xffff, 0x9c0f, 0x40a1, 0x48a1, 0x48c1, 0x48a1, 0x40c1, 0x40a1, 0x40c1, 0x40a1, 0x40a0, 0x40a1, 0x40a1, + 0x5922, 0x5921, 0x58e1, 0xeb04, 0xdb44, 0xc2e3, 0x801, 0x821, 0x0, 0x1, 0x0, 0xe73c, 0xffff, 0x72ca, 0xb4f3, 0x9c30, 0x6a27, 0xffdf, 0x9bce, 0xe6da, 0xffff, 0x38a1, 0x3880, 0x40a1, 0x38a1, 0x48a1, 0x40a1, 0x48a1, 0x48a1, 0x40a0, 0x38a1, 0x38a1, + 0x5922, 0x6121, 0xb2a3, 0xaa61, 0x9a40, 0x6940, 0x1020, 0x801, 0x1, 0x1, 0x632d, 0xffff, 0xe6db, 0xef3c, 0x8b8d, 0xc596, 0xc5d6, 0xe71c, 0x40a1, 0xa451, 0xffff, 0xbd75, 0x4880, 0x48a0, 0x48a0, 0x40a1, 0x30a1, 0x38a1, 0x38a1, 0x3081, 0x38a1, 0x40a1, + 0x5902, 0x6121, 0x7160, 0x6940, 0x9200, 0x7160, 0x6100, 0x801, 0x1, 0x0, 0xffff, 0xd69a, 0xef3c, 0xdeba, 0x6a28, 0xffdf, 0x7aaa, 0xd638, 0x4881, 0xffff, 0xbd96, 0xffff, 0x51a5, 0x38a1, 0x38a1, 0x40a1, 0x40a1, 0x40a1, 0x40a0, 0x48a1, 0x3881, 0x38a1, + 0x5922, 0x6121, 0x6120, 0x2040, 0x8180, 0x89c0, 0x7980, 0x6100, 0x0, 0x9cd3, 0xffff, 0x3145, 0x3820, 0xb4f3, 0xffff, 0x940f, 0x8bae, 0x8b6d, 0xc5f7, 0x9bef, 0x93cf, 0xffff, 0xe6fb, 0x3800, 0x3881, 0x4081, 0x3081, 0x3081, 0x3881, 0x3881, 0x3881, 0x38a1, + 0x5922, 0x5901, 0x50e0, 0x801, 0x0, 0x0, 0x1840, 0x2881, 0x3103, 0xffff, 0xa555, 0x2021, 0x3881, 0x3860, 0x93ef, 0x4081, 0xffff, 0x6a89, 0x8bce, 0x2000, 0xde79, 0xbd75, 0xffff, 0x7aeb, 0x3881, 0x3880, 0x3081, 0x3881, 0x3881, 0x3881, 0x3081, 0x3881, + 0x5902, 0x50e1, 0x48e0, 0x801, 0x0, 0x0, 0x0, 0x0, 0xc618, 0xffff, 0x821, 0x1841, 0x3881, 0x3860, 0xbd55, 0xffff, 0xffff, 0xffff, 0xffdf, 0x7b0a, 0x83ef, 0x9c50, 0xe6fb, 0xffdf, 0x2820, 0x3881, 0x3881, 0x3881, 0x3881, 0x4880, 0x3881, 0x3081, + 0x5902, 0x50e1, 0x48c1, 0x1, 0x1, 0x1, 0x1, 0x4a49, 0xffff, 0x73ae, 0x1, 0x1861, 0x40a2, 0x5a08, 0xde79, 0xffdf, 0x4903, 0xbd96, 0xffff, 0xa3cd, 0x93ef, 0xbdf7, 0xc5b6, 0xffff, 0x9c51, 0x3881, 0x2061, 0x2861, 0x2881, 0x3081, 0x3081, 0x2861, + 0x5902, 0x50e1, 0x40c1, 0x801, 0x1, 0x1, 0x0, 0xef7d, 0xf79e, 0x0, 0x1, 0x2861, 0x3082, 0x5a08, 0xe6db, 0xf7be, 0x2861, 0xb555, 0xffff, 0x9c50, 0x72aa, 0xad55, 0xbdb6, 0xef5d, 0xffff, 0x38a2, 0x3081, 0x2861, 0x3081, 0x2861, 0x2861, 0x2061, + 0x5902, 0x50e2, 0x40c1, 0x821, 0x0, 0x1, 0x738e, 0xffff, 0x4a49, 0x10a3, 0x6b4d, 0x1020, 0x3882, 0x4082, 0xb514, 0xffff, 0x3882, 0xce18, 0xffdf, 0x4902, 0xa4f4, 0x6b0c, 0xad55, 0x4186, 0xffff, 0xc5b6, 0x2820, 0x3081, 0x3881, 0x3061, 0x3061, 0x3061, + 0x5903, 0x50e2, 0x40c1, 0x821, 0x1, 0x20, 0xffff, 0xc639, 0x0, 0x9cf3, 0xffff, 0x3186, 0x4041, 0x9bae, 0xa474, 0x61eb, 0x2864, 0x20c4, 0x6b6d, 0x940f, 0x83ae, 0x62aa, 0xffff, 0xef5d, 0xffff, 0xffff, 0x59e7, 0x3082, 0x3881, 0x3861, 0x3881, 0x3061, + 0x6103, 0x58e2, 0x40c1, 0x1021, 0x0, 0xa534, 0xffff, 0x18e4, 0x2945, 0x9cf4, 0xce79, 0x9471, 0xce17, 0xde79, 0x1041, 0x0, 0x3145, 0x4a08, 0x1021, 0x41c7, 0x940f, 0x6b4d, 0xb555, 0x4986, 0x1800, 0xffdf, 0xef3c, 0x1800, 0x2861, 0x3061, 0x2861, 0x2061, + 0x6103, 0x58e3, 0x40c2, 0x1841, 0x2104, 0xffff, 0x9cd3, 0x2945, 0xffff, 0xdedb, 0xffff, 0xf79e, 0x4a69, 0x0, 0xb596, 0xffff, 0xef5d, 0x9492, 0x1021, 0x821, 0x1082, 0xbdf8, 0xbd96, 0xe6bb, 0xa4d3, 0x72ec, 0xffff, 0x732d, 0x2062, 0x2061, 0x2861, 0x3061, + 0x6125, 0x5903, 0x48c2, 0x800, 0xd69a, 0xffff, 0x0, 0x8c10, 0x738e, 0x21, 0xffdf, 0xffff, 0xc638, 0xffff, 0xc513, 0x3000, 0x0, 0x1021, 0x1041, 0x1041, 0x21, 0x801, 0xce59, 0x9c71, 0x1000, 0xbd76, 0xffff, 0xffff, 0x3040, 0x2862, 0x1861, 0x2861, + 0x6926, 0x5905, 0x48e4, 0x6aab, 0xffff, 0x6b4d, 0x2041, 0xa430, 0x7bef, 0x1, 0x2124, 0xffff, 0xffff, 0xf79e, 0xbcd2, 0xa3ae, 0x0, 0x1062, 0x1041, 0x1042, 0x822, 0x1062, 0x0, 0x8c30, 0xffff, 0x836e, 0x30e4, 0xffff, 0xa4b2, 0x3061, 0x2861, 0x2861, + 0x6928, 0x6107, 0x4865, 0xf7be, 0xef5d, 0x0, 0x1021, 0x5081, 0x1042, 0x1, 0x1, 0x0, 0x3187, 0x4a4b, 0x83cf, 0xb5b7, 0xef3d, 0x2105, 0x823, 0x822, 0x1043, 0x1042, 0x1042, 0x821, 0x624b, 0xffff, 0xbd76, 0xb555, 0xffff, 0x30e3, 0x2861, 0x3061, + 0x7129, 0x690a, 0xac54, 0xffff, 0x39a7, 0x0, 0x800, 0x1000, 0x1, 0x0, 0x1, 0x1, 0x2, 0x3, 0x3, 0x1, 0x526a, 0x7bcf, 0x802, 0x824, 0x1029, 0x102d, 0x102d, 0x823, 0x1843, 0x30e5, 0xef5d, 0xffff, 0xffff, 0xce18, 0x3000, 0x3882, + 0x792b, 0x694d, 0xffff, 0xffdf, 0xbdf7, 0xc638, 0xc638, 0xc638, 0xc638, 0xc638, 0xc638, 0xc638, 0xc639, 0xc63a, 0xc63a, 0xc639, 0xc639, 0xc618, 0xc63a, 0xc63d, 0xc63e, 0xc6bf, 0xc63d, 0xc63a, 0xc638, 0xc638, 0xce38, 0xffff, 0xffff, 0xffff, 0x6294, 0x2883, + 0x792c, 0x79f1, 0xef3e, 0xe6fe, 0xe6dd, 0xdedb, 0xdedb, 0xdedb, 0xdedc, 0xdedb, 0xdedc, 0xdedc, 0xdedd, 0xe6fe, 0xdedd, 0xe6de, 0xde9f, 0xe7ff, 0xe7ff, 0xe7ff, 0xe7ff, 0xe7ff, 0xdf7f, 0xdeff, 0xdedc, 0xdedb, 0xdedb, 0xdedb, 0xdedc, 0xdefc, 0x526d, 0x2061, + 0x796f, 0x7191, 0x7237, 0x597b, 0x3055, 0x809, 0x2, 0x3, 0x2, 0x1087, 0x188a, 0x9, 0x815, 0x52bb, 0x17e, 0x147e, 0x27bf, 0x37bf, 0x3f9f, 0x67bf, 0x57bf, 0x3f9f, 0x275f, 0x17e, 0x12, 0x316c, 0x0, 0x0, 0x5, 0x80d, 0x2061, 0x1041, + 0x814e, 0x7191, 0xb4db, 0x615e, 0xa4bc, 0x947b, 0xad36, 0x6330, 0x9cb5, 0x8c55, 0x8416, 0xa4fa, 0x54be, 0x86bf, 0x77fe, 0x7ffe, 0xa7ff, 0x9fdf, 0xbfff, 0xbfdf, 0xd7ff, 0x7fbf, 0xc7df, 0x8f5f, 0x2159, 0xdedd, 0x4209, 0xd679, 0x630f, 0x6b39, 0x1841, 0x821, + 0x816f, 0x79b2, 0xac3b, 0x937f, 0xb53f, 0x83ff, 0x647e, 0x7b54, 0x8417, 0x39b5, 0x41b7, 0x8e1e, 0x7ffe, 0x87fe, 0x7ffe, 0x4ffe, 0x9fff, 0x77ff, 0xb7ff, 0xa7df, 0x8fdf, 0x97df, 0x9fdf, 0x9fdf, 0x3b7e, 0x7c1b, 0x528c, 0x6b51, 0x637d, 0x1012, 0x1862, 0x821, + 0x896f, 0x79d3, 0x7a1a, 0x7a5f, 0x6b1f, 0x545f, 0x373f, 0x3ebe, 0x2979, 0x11fc, 0x567e, 0x77fe, 0x67fd, 0x5ffd, 0x67fd, 0x6ffe, 0x77fe, 0x6fff, 0x67ff, 0x5fdf, 0x5fdf, 0x57df, 0x5fdf, 0x5fbf, 0x577f, 0x80d, 0x805, 0x870, 0x18b4, 0x2070, 0x1045, 0x1021, + 0x896f, 0x79d4, 0x7a3a, 0x7a7f, 0x733f, 0x54bf, 0x3f1f, 0x4ffe, 0x7f1f, 0xaffe, 0x8ffe, 0x87fe, 0x77fe, 0x77fe, 0x77fe, 0x6ffe, 0x87fe, 0x87ff, 0x6fff, 0x67df, 0x5fbf, 0x5fbf, 0x5fbf, 0x5fbf, 0x579f, 0x3d3b, 0x1031, 0x82b, 0x211b, 0x2072, 0x1025, 0x1042, +}; +#endif diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9b8318ed95c837d0ee5a23a5c3891d0f9b2125 GIT binary patch literal 3015 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 JPDHLkV1jMasb2s9 literal 0 HcmV?d00001 diff --git a/images/logo_bw.h b/images/logo_bw.h new file mode 100644 index 0000000..022e32e --- /dev/null +++ b/images/logo_bw.h @@ -0,0 +1,136 @@ +#include + +#ifndef _LOGO_BW_H_ +#define _LOGO_BW_H_ +static const uint8_t PROGMEM logo_bw[] = { + 0xa0, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xc7, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe3, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe3, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0xf9, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xff, 0xf8, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0xf8, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x3b, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x33, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x3, 0xf8, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x3, 0xf8, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x87, 0xf9, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0xc7, 0xf1, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xe7, 0xc7, 0xf0, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe7, 0xc7, 0xf0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe3, 0xc7, 0xf0, 0xf7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xc1, 0xf, 0xf0, 0xf7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc1, 0xf, 0xf0, 0xf7, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc1, 0xf, 0xf0, 0xf3, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x83, 0xf, 0xfc, 0xe3, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x83, 0xf, 0xfe, 0x83, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x87, 0x1f, 0xff, 0x81, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x7, 0x1f, 0xff, 0x1, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0xf, 0x9f, 0xf7, 0x81, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7f, 0xcf, 0x9f, 0xf1, 0x80, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0xde, 0xfe, 0xf0, 0xc0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0x1e, 0xfe, 0xf0, 0xc0, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x3c, 0x7c, 0x70, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x7f, 0xfc, 0x70, 0xe0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xf3, 0x7f, 0xfc, 0x7e, 0xe0, 0xf3, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe1, 0xff, 0x38, 0x7e, 0xf2, 0xf3, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0x38, 0x3e, 0xf3, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x39, 0x3f, 0xfb, 0xf9, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x0, 0xfc, 0x31, 0x3f, 0x39, 0xdc, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0xf8, 0x33, 0x1e, 0x3c, 0x86, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0xe0, 0x3, 0xf, 0x1c, 0xc0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0x0, 0xc0, 0x83, 0xf, 0xc, 0xe0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x80, 0x80, 0xf, 0x0, 0xf0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x0, 0x81, 0xf, 0x8, 0xf8, 0xfd, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x80, 0xc7, 0x1f, 0x1e, 0x7c, 0xfc, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0xc0, 0xff, 0xff, 0x3f, 0x3e, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x7, 0x0, 0xc0, 0xff, 0xff, 0x3f, 0x8f, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0xc0, 0xff, 0xff, 0x1f, 0xe7, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x80, 0xff, 0xff, 0x1f, 0xf8, 0xf1, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1, 0x0, 0x0, 0xff, 0xff, 0xf, 0x1c, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x1, 0x0, 0x80, 0xff, 0xff, 0xf, 0x0, 0xf8, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x80, 0xff, 0xf9, 0x1f, 0x0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0x0, 0x0, 0x80, 0x7f, 0xe0, 0x1f, 0xf8, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0x0, 0xf8, 0x3f, 0xc0, 0xff, 0xfd, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0xfc, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0xe0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xf8, 0x3f, 0xc0, 0xff, 0x1, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0x0, 0x0, 0xc0, 0x7f, 0xe0, 0x1f, 0xfc, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, 0x80, 0xff, 0xf0, 0x1f, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xfc, 0x7, 0x0, 0x0, 0x80, 0xff, 0xf0, 0x1f, 0x0, 0xf8, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0xf, 0x0, 0x7c, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x80, 0x7f, 0xe0, 0x1f, 0x70, 0xfc, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x1, 0x1e, 0x0, 0xc0, 0x7f, 0xe0, 0x1f, 0xff, 0x40, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x3f, 0x0, 0xc0, 0x3f, 0xe0, 0x3f, 0xfc, 0x1f, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x80, 0xff, 0x80, 0x7f, 0x0, 0xc0, 0x3f, 0xc0, 0x3f, 0xc0, 0xff, 0xc7, 0x3f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x80, 0x7f, 0x80, 0x7f, 0x0, 0x80, 0x3, 0x0, 0x9e, 0x7, 0xfc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x80, 0x7f, 0x0, 0x18, 0x1, 0x0, 0x88, 0x7, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x80, 0x7f, 0x0, 0x3e, 0x0, 0x0, 0x60, 0x3c, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x80, 0x7f, 0x0, 0x3f, 0x0, 0x0, 0xc0, 0xf0, 0xf8, 0xe7, 0xff, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x3f, 0x80, 0x3f, 0x0, 0x0, 0x80, 0xc3, 0xc3, 0x3, 0xfe, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0xf, 0xe0, 0xe1, 0xff, 0xf, 0x0, 0x0, 0x0, 0x7, 0x1f, 0x0, 0xfc, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf8, 0xf, 0xf0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x1c, 0x7c, 0x0, 0xfc, 0x7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf8, 0x7, 0xf8, 0xff, 0xff, 0x3, 0x0, 0x7e, 0x0, 0x38, 0xf0, 0x1, 0xf8, 0x7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfc, 0x7, 0xfc, 0xff, 0xff, 0x1, 0xf0, 0x7f, 0x0, 0xf0, 0xc0, 0x7, 0xf8, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfc, 0x3, 0xfe, 0xff, 0xff, 0x0, 0xff, 0x7f, 0x0, 0xe0, 0xe1, 0x1f, 0xf0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0x1, 0xff, 0xff, 0x3, 0x80, 0xff, 0x7f, 0x0, 0xc0, 0xf7, 0x7f, 0xe0, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0xff, 0x7, 0xe0, 0xff, 0x3f, 0x0, 0x0, 0xff, 0xf7, 0xe1, 0x3f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xc0, 0x9f, 0xff, 0xf, 0xf8, 0xff, 0x0, 0x0, 0x0, 0xfe, 0xc7, 0xc7, 0x3f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x80, 0xff, 0xc0, 0xf, 0xff, 0x1f, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x7c, 0x0, 0xff, 0x7f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x80, 0x7f, 0xc0, 0x7, 0xfe, 0x3f, 0xff, 0x3, 0x0, 0x0, 0x0, 0xf8, 0x1, 0xfc, 0x7f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x7f, 0xc0, 0x3, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x3f, 0xc0, 0x3, 0xfc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xf, 0xc0, 0xff, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x3f, 0xc0, 0x3, 0xf8, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x1c, 0xff, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x1f, 0xc0, 0x3, 0xf0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x1c, 0xfe, 0x3, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0xf, 0xc0, 0x3, 0xe0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1, 0xfc, 0x3, 0x0, 0x0, + 0x0, 0x0, 0xf8, 0xf, 0xc0, 0x3, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfc, 0x7, 0x0, 0x0, + 0x0, 0x0, 0xf8, 0x7, 0xc0, 0x3, 0x80, 0xff, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0xf8, 0x7, 0x0, 0x0, + 0x0, 0x0, 0xfc, 0x7, 0xc0, 0x3, 0x0, 0xfe, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xf8, 0xf, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0xf0, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0xf0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x1, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe1, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe7, 0x3f, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xcf, 0x3f, 0x0, 0x0, + 0x0, 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0x7f, 0x0, 0x0, + 0x0, 0x80, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x7f, 0x0, 0x0, + 0x0, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xe0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xff, 0x1, 0x0, + 0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x1, 0x0, + 0x0, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xff, 0x3, 0x0, + 0x0, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x3, 0x0, + 0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0, + 0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0, + 0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0, + 0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0, + 0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0, + 0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0, + 0x0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +}; +#endif diff --git a/images/logo_bw.png b/images/logo_bw.png new file mode 100644 index 0000000000000000000000000000000000000000..1b658ab825bc1f105ee8995b0b12c6499505987a GIT binary patch literal 9035 zcmWlf2RN2*6vjUyv;MXaO0xG>MrIP3S=lpWWp5GLd+)txwq(z2*;{7zEM)wTy1raj zc)$03o^#IqyYJ@?9wsR!0)e>qN=jT2zNW*=3;izq8*HFY24C*#zkVr>xVinC z{yi@W{s+TaO5GNL(3HG=ArVB2iNJrN*}amLKwHATOYj`c=jdY(0`Um(N?b(QX=Yc; zQCWF%VzC_?TjCjV=2#v|=hTZVg)B8Me@T2Sq$g&#R?|IpD|%npx|T$ z+>`Mp{os#DghTD0kIo9XadQ#tJNN}S+LGWL4WuFz6 zKY9ng9BY8x+0&%};uon-NUH&~+K5@i^z`(|-$hTkwY4>6ZS6O+H5OT+Z-n8T|wN2{xZB6?xa-arNxv^z^)X1-0CnkD6NiRl8{x zDlxN0M;SS**U(T+O${AAy@j0#Z_GV`F1kj_J=|z8quq=!hl` z?(OX*zhj=9n5#6A^I$$_t}{)Jh-hsXpy29;eBhQ zsEkjZ+_{5xzhkM@#|FL|vb*|`U+Cu2)A_y6q95)cwfjE|3-Esl(gWbDmC-BsKB7n|YC~P!7v#_E9^vET zb8vEI&CF;7hK1!NCX$BiKj-6*2g~@jR#1jauh?nmE`5UEaw|O`43l{t5Q=_ z=U34)GaG$xM0m;2w0DJ&IcKcYF5N_Y`}RD9LNM{<ZZmnQsHpI{ow4PWk4;Scf_>++---@A zka+pBy{qf4IEs>z(%d&kx$W?hte0V#VqfkzBAQAm-F|fh6kjh~qy{JPTK$4YmcA(~ zENuI?-#m0eOBBR^=K<;H+2M*ak{h|OU9IK3_0@%a$>;3S();xE^qZ4ql*i3^a%uX@ zZN3Z{e{U|2<+4!N*x7NlzB#O+9@wv>r>9F|NWXb=-yc2A${~kpR2nd*Jbmqjy#(t2bZ(+flC~9eGc}a9xn50$5LUD6G zX!GG1$?lbxH3jEIbiB9RIuWK`jDaaA22Na7u7a(C56=tvNuqdefV zew5eUJ~D#)>C>nD!a_yo)Pw|#40&{_ww>w9gd4deo)8j~qt)L0{QO~tgjeME$e*25 ze+zFUGI{a(_3LNu7hL8^Fn0U`0|V(eI3lH`rIk~+x3(fvQpoY+3)3%zR?+^W2$!Kz znr#-R%5eR=S24I;yXf(Rk+EoU>+-J#`cgNgXTQr~o&7eEgt)l;+qZ=t6oORsnxziG#l=jR_wVOI8JH!1iHRXZ zMMFD|3s((z?zq?Qe0_1Y5*D*SBH&d1!$_1WLU+EwUWV++lP79wYIGI}q8aiAFGNK} zkzwy9O5SzzQ%W4%@x1GXdbZjdmCV!B>VsC4OfoL=aqK_o97)5m@v$-8cE5WE&`?{V zN6((Je;<8Uo|Z=G?CM%sQ}OjHm7}BM8Z%P5j>ow~PDy<|f3^AK8;j({&5-wPyu3VPt}C(i@MuyY-8fq7vvzP$L838xkMDM} zi3{J2o~gE4q+nDjZuyxfcepw7q}n(>I2b$kds!LleF}k|gpTN_s5^p!f*x3wMU7_T zg_6_D>w_s+T3T8;LQr8bGs?=!y5~o0(iXSVbVB~p&$-pb#f6Q7qb>Zg*x23LiM$v_ zRgRa)piwyA>gzLLyA_a~{{6AY`D{zomMfd2{P9_h)#9K)ZEdZI{4pUPAIaiRJP3DdJ1X3M3h6^~N6vKKvXQkjqUmCb(dA$Xsk6JA@%zT+rj+}?KRF^kcOz|<^zc*mL=BZxT;RU z=}KW%c{$r%|F3%C-tu(fva<* z$;o3BgiSZst|i=d5)!DfOzLe`ttAQ1?YGAAy@toel(8T3$y?}O6uvDwxc;|qFjr>- za^N2jpx~m)5F^SG_k@?17{pICv3vfTV}gT(goN3~GyM*90jGm>h3?O*tA>1hd{rj9 zKQAI&x0tPI?dd_kxVXS(@X*$#_*wcoj)lQ?cd@y7W~Uy+5GK>tYyZ84??HO)euv0Y zGfsc^=8I>ZaB@af{MXgpZL42LCl&EePha1=`R4i^eZ}Rk&Y-EUMpzdozkPhr{^M|X zF0sgwfURHg0QnPQVq!x2pm~eUfaXmyI@Pba#OZLw*~))0HNuw%cVOH; z!V9q8nPOKVGlplmyt)D!x%a``JP4omO*y85n_HuXSZQ1wv7(|PpWZkDnkO0>n&kT% zxPoyXHy2mObfwAL1u}Mh6irRd2b3SXL&=x-_sjkWxUBb+#3v;gTwR=Mn63+h5WN+B z`~F*08m|=vZ3EJ~$G`8BKhp(;EzV5>Eb{W#)zkX~{6mwWxlHvBHbq$<4JtG13b6zo z#m2>@JnA8rD$oj7@`3ekou4PCbUQ#gHlSl=H5vDYos8!+xzFmw8uiU#w-7mQB%H@$ zreiv+sYxhTF0IrK%hE|mX>}Kfln5cOqT<)m^1{DUzXJ-N`;d-nFHHE_zcYw9OD;{Q z|Mdonq zk&%+8{DwU^z=%bHVqINb-u_ElTY*qN$%3v#+S=MU0pe=qx=4R^rhS06E>C{So&A}$ zVh1#ekuvR+$N~L+?y#dfb)L* z_@UOE{Gae;`G^R1Zf>qxg}yJQh8eV_%gH8Egw$st_X{>B78oX-zklZ0T%Os8OGqrA z{QfD8OidJ&QB)KJ?8A`qm%v|xDgqsTOv2i_9B;;3jj0RPhwlypDBc0w-7)eR)pSP( zN=8OT^5fmpEDh53hK7a*LT-GRn3&O)?G6qO3>J>NGdUa%R~8D?cp`KJZ2(4jZ&E}Z z9BS|$M8N9x4-CXyaB*@fxhhSF!-arFmQfFU#ough>Yi+lBrk+|TwMtMRr~Jxw+rZW zd2g?jNNo=2ds<~X3Iu3{*m9~#Z_HlI!QNg1YAowxAZYN??(TeSd-cqq;lRKEe^FeS zMs?xzphRhDDWCHZwPXls&Qbruf_BN3)p~z|**}dYH~t!n*)Hl@-nna-dc_1ka?(M; z^bdb^7N_yk)4zJ6i^u9U&;iTAY22@SMFk7w2e-r9=R`zA)H5(30Ym)up@((<@ZzG5L>+XN zWKBhdo@h4L2pXl^Fq47(<}ea47DG+#&d!I9&Q1}kh;q{Mr+65!!#L#RAy9~f@7AC; zdsfr>6S-eMjdNP*3JE4!tTYKz;g&+=3+BNnz-A)AtZ+UyeiMe4G*Ztl;IN|>LZ=#n zaXLBnXRJVpjhFYOloUDxBV)|h4FWp#zBtyGFif+$-Zgu;zZ>%|@r?X1-ba{Cf0$SB zkdV+fHhpwdaXtCHsc8VH47-LL6Vb|U?V`$$*rK8$A5E4o;#49E3b=VZZYv?YFgo{= z%AQ$?xzE&CBt>48)T_-lP=;ibysKqMxglcFL0?gWJoep49L$74q~PN644_sKNW2FG^n-=Pc$0yJ zg)Asn9%yFH4dru(VE^kNiQQknM8RN=Wr(4Dw6V#69#=>cawp|>ba!{xsCthJD;7Ew zXwJ}l*hQ9{Xfl#1F~F0Wk?|M|N-$6**%Qg&mQ0BtHLF?$1qB8vOmP%XPfr1t6Mt?J z1~xVvun)dpzM#STLw{pYQc@PHSLTj%T24u6Nh6w3&3j*lQ5XqsLy@)q_)$3B^>3$g z$Qov}p^1s@F9F)8PuU-9oc?zi*zDuu!(Y1sC6JwyvpiK{0Kg`xsEAisRHUG+{CRFp z6Rg~0;Ev_)FiOr#05-Tn5%=fGuvfu>fo50li7@Fu$gb}1%Yk1YeVtE4NI25wi$yOW z&^X;CV7rbDm}@%DLq+9n@5%#CJ}?lIW;rDYz(X9U%}`IT^-(1z3UXxM8g*1}eoalR zh&CZQ3N;S86hqAD!E(FlU@||co_m_0t0VwpUQbVt%D1bU2F`SOx@^yze~YBPVg7XN z>=o+pHUH~Z#qF9z>vY0wuZ!_maEqHj{${At?d?7;r&|)Cp`l}?TF*yEMjnGZ{8*p7 zv$NCF(eb%@(Wo!B+6?J~{qRFzi!2xf=5DEJX>yPvSp2b>Zjy@8De=E@EV|zjx&1Ql zmCxGx`Y7z*Ch#o*C8Zp&2SBSBUchG<8Jm!asJ0bYN@+FNWq>n1CY2}qXleC+3OAlpFt>))QoD2iYQNDrN+Ym zG(BotH!w5%VR|4dBO?xLk>D81qE(0|@iUz2$&>L0vgdZ2Uckfci;I-6W0^z@4Gk+3 z4UdkF*i1*MwGrGERBH85BP0FHeu^j>9ZFG24tBb{h7n#847vv$V;B?b7?6H zz|Syje|%zMCTQRpNHU3>6s+MkUm~4=Kr- zh?Q;l1RAS2$YHey_f3i3`}gP-YSI|Y1#(W4LBp@J1il|2-9d*QrxBLGC18x|jXzFRW-xlRPT;oGf;3Tm+lUtVn5>k_ zk&H9GC4sBp(jpQPdaFFo4juzWp3ONwhVGpt<;{IuX_^VW-k&O%WctnhpF>V%E^@&( zJmyrDDZZP#`v@dlPA)F`J>icJPER|d>6Oa$+V2)?)+i8FDXXS&x2UDIGvzcnH)xAj-=v}>wkL&jzWhf*iPnenS zg;5Gm_}g3^EQ@{i^V1*AeziGM%?R#cX?688&`4Wbn|CXhCZN;y83_r=12)~3ZDudP z5VcC$4!Tj03>@cLJ60SjeP1xP@oq~zqfA)1lb)*igz@9XQs zB_j)h;x&N9u(r21I>l#9_kH*3?7EM{sly*P+4w#yD{IJp7zwA}&p+c+I_JX~V(cGR zrEs;wu?20wrVw~=E7>1DFexf2DagyW&}#-BQxVe-#(dTujAyr9nLxVV>p_ZMm5!63I)KCRfY zc2!43M!JnGAzRa?l=FY_s3rSVlv?e=*RLFQ`wJ=dNymTwtap4Fp`j=>=niGTF;`bt zciKpC9HR*rW_5LOp@O-xyu1vH=?f`|N~vZ+^xv-zyBfii!W87s9Skj7Pe=Zmo15F5 zZoL&37k>n47zPH$RIL@|uay;kB~>y-UEOpI>MyDeST$8u;?mNX=Av-9$vu(5@I+C#s8Uqy6P*kR`ZK<6EJ zLp2SJUtcIaP_g(!zzML|K)1s8BzzWVz52WN){#lIXyPSH1e^V*Z$obsmx!i_YtWhmZFFM=Vi3(92n5Iz7 zE$;@b-o77?oimUM*4NjSp~grD32<;;04h@>%!ZhtK=P38+znS|cpJztGCuwk0ZCO4 zs3`2O6o^Dl7}!t_Ufw)~EXjzhtQF6pM+giQU+E6C1X9T&WV=_@*DxDR%&`($Nh+0Dl2avDB@nQw<&eWcmbv*f$1X1En3{?6(qt;C$e5Eu3~ zARs#`J}-vFm1ZN_$~3BCm&<={3zo3$=g-Pl8`D63%W*m$tW6~BLM$)fkpZxPKWzmR_NLaut0lgI^Ly&YTxf&M~6^TJY3JOE|6dS^Gje*IT8PfkKg~l}M zAbK$5ATcvHCkYJ+0efs6Wm8y<8|x<=93TJSmWdX=yGpbC0DA3Dd9K>~B{e?2hlJ@+ z8eJFMuUhTU)|Oc{sw()uF`}>t=^Pp5vbNBP2eMATIxs>iJYn=h&7qmRSA((nqp$Dq z zRLh(W!g-iV*ej@ZO)ah2CPZ#tUZqC{9Qc%1RVlj~m~R>v6&C8J4{TYDXqqJYi9W!^ z&8Rvheej?KEKBuFt|m)2;A^?dsoB~2IX5Gf4-ZsGv7%I7dOG4Zn!P=oV^=T-zg}m( z>^-WnzOk_awXWAWQ(9Ei4p2K=gBXlw_c>LKO-n1Q*aTKi8_n!BCh*Lte=|vE(PBH1$?f7^$Qx}9m-i{C#p51RmGA+x5@p)kvy%} z2W}pS%WEv>3#$V@Z|mx)s|SFEv)dXg7&nRt=+tM@tdqB>pN8yGCgs`NH6}ASSOocQ zgVP)c4k$g&9%p7|a!G1W3S&XTR9ax9!?{wFVF`V^EN*lGeMdnBay}cumoHz0YjINH zF!b@`$0ZbRw|xE+8djUT__p8F4!s>;18J=Z{!nP`Q&SHhmUtl}gT1|X z2&7aZz+57U$jZu6Z(f4C$-(?J@YL(%W{q%bwmp%`&7xqe^)~ySU{Imv_5J+0WqO(f z<~sU+|8?KyK_G)rv~d`3E32wjWxRwTAl)W<;Y*XmWg4j%!fkIH2h=cloyg#YiH|ZH z5*xyz-RKV|dHO$dWzROV!j|^-1_^R4OQ1&jHJZ_E4Jhe5N{*U8<9k8n|O0e z-eIWIY4%8#NF#d<;RaxQE1X}d{p8Rw&Wy`V4*`9GeldUvO1k~ah9qxeC~Xl>xN*JS z$=dlTOn|CAtFe3q2GU|ZW&fJ>beMI^0L?>dKi|H*O&!5_YiJo|f@*!uEmBcdUIK(N zE0W%wuKaS!Nejo6_DM~4NUPo)QBu^!ev0;gN^jA1VS(b$pFc1>oLHI*+cqyD=3W6Q z>Hvk4S5$0Em?)6#=z{`MvxsK(DJdyQSP5^SOhrbvgk*z(hJr-{0-9~S7gknQgKEOE zW;YU*p`rKT02|B}3g8sr#cka7=FOYUIlmzfbOZvq|Ms&0^_+0rR<7HM46w5VE2x2y zp~>=6T|GgXXui)Feo-acv$MtpwC8E`-O{!fFnf#7XIPaH%*@P($3w!l8b4dw&+K2HmN0y{URzS`&E-11|U1m2fZtCy~_`k8jDbo@7$aN%1A* zvy~c@*I2|Yx4{gjwp_&QMPWG{<}jYg16e&JCx7?$JG5AX>6%AhZ||q1B(mb-Vm?91 ztw5({c_cdrhpzME4RzWJIF}T3l+iRdBqJk(F!Za(pT7&PW#iLWgfaZ}a2|(8E0?-@ zX-WR@p>`^QVffxu@E~SYu4;^rx3_Xz_7<9dP0cw-x^0)hL^HGPd4Ha4(!|5WCR3v- zF6KsWB3A9oxd-kRpXTT14`;2K=@UXM7n|nIHW-P5D$K?i-gGcq&@nTY@c;P4y@v{! z>>IUe@X1Xd>b?+f1w5iER;xe;$)JN8H{EcrJb+w5U1YgB;Rr@*431C>^Yh=2xoQwI zUP4!^`N|yz{VLcsYv0J=U2yUdI$w>7{pkg_o&j5but*?RtT8+=P-2844#U#C(a{k*>;3O^`z7e|CBt!c1Q_3`O^rbf^A?ac#mQ2wTPt`e zeVi>`YqdxN2BiVc%=%2>QzT{>qswt#@IeyiU#Q`Gh*uJC K#7jkWz5fRaQ@-i| literal 0 HcmV?d00001 diff --git a/spi.h b/include/spi.h similarity index 74% rename from spi.h rename to include/spi.h index 88e29dc..0b8b745 100644 --- a/spi.h +++ b/include/spi.h @@ -10,11 +10,11 @@ static inline void spi_write(uint8_t byte) { while(!(SPSR & (1< + #include static const uint8_t st7735_default_width = 128; @@ -91,14 +93,14 @@ void st7735_init(void); void st7735_set_orientation(enum ST7735_ORIENTATION orientation); -void st7735_draw_pixel(int16_t x, int16_t y, uint16_t color); -void st7735_fill_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); +void st7735_draw_pixel(uint8_t x, uint8_t y, uint16_t color); +void st7735_fill_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t color); -static inline void st7735_draw_fast_vline(int16_t x, int16_t y, int16_t h, uint16_t color) { +static inline void st7735_draw_fast_vline(uint8_t x, uint8_t y, uint8_t h, uint16_t color) { st7735_fill_rect(x, y, 1, h, color); } -static inline void st7735_draw_fast_hline(int16_t x, int16_t y, int16_t w, uint16_t color) { +static inline void st7735_draw_fast_hline(uint8_t x, uint8_t y, uint8_t w, uint16_t color) { st7735_fill_rect(x, y, w, 1, color); } @@ -106,4 +108,8 @@ static inline uint16_t st7735_color(uint8_t r, uint8_t g, uint8_t b) { return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); } +void st7735_draw_bitmap(uint8_t x, uint8_t y, PGM_P bitmap); + +void st7735_draw_mono_bitmap(uint8_t x, uint8_t y, PGM_P bitmap, uint16_t color_set, uint16_t color_unset); + #endif diff --git a/st7735initcmds.h b/include/st7735initcmds.h similarity index 99% rename from st7735initcmds.h rename to include/st7735initcmds.h index cdf67f2..94741b1 100644 --- a/st7735initcmds.h +++ b/include/st7735initcmds.h @@ -103,7 +103,7 @@ static const uint8_t PROGMEM st7735_red_init1[] = { // Init for 7735R, part 1 (r 0xC8, // row addr/col addr, bottom to top refresh ST7735_COLMOD, 1, // 15: set color mode, 1 arg, no delay: 0x05 // 16-bit color - }; +}; static const uint8_t PROGMEM st7735_red_init_green2[] = { // Init for 7735R, part 2 (green tab only) 2, // 2 commands in list: @@ -113,7 +113,7 @@ static const uint8_t PROGMEM st7735_red_init_green2[] = { // Init for 7735R, par ST7735_RASET, 4, // 2: Row addr set, 4 args, no delay: 0x00, 0x01, // XSTART = 0 0x00, 0x9F+0x01 // XEND = 159 - }; +}; static const uint8_t PROGMEM st7735_red_init_red2[] = { // Init for 7735R, part 2 (red tab only) 2, // 2 commands in list: diff --git a/main.c b/main.c index 51ec62a..9401f60 100644 --- a/main.c +++ b/main.c @@ -4,18 +4,19 @@ #include "spi.h" #include "st7735.h" -void main() { +#include "logo.h" +#include "logo_bw.h" + +int main(void) { spi_init(); st7735_init(); - - - st7735_set_orientation(ST7735_LANDSCAPE); - st7735_fill_rect(0, 0, 160, 128, ST7735_COLOR_GREEN); - st7735_fill_rect(0, 0, 80, 127, ST7735_COLOR_RED); - st7735_fill_rect(0, 0, 80, 64, ST7735_COLOR_CYAN); - st7735_draw_fast_hline(80, 64, 40, ST7735_COLOR_BLUE); - st7735_draw_fast_vline(120, 64, 32, ST7735_COLOR_BLUE); + st7735_fill_rect(0, 0, 160, 128, ST7735_COLOR_BLACK); + st7735_draw_mono_bitmap(0, 0, &logo_bw, ST7735_COLOR_WHITE, ST7735_COLOR_BLACK); + + st7735_draw_bitmap(10, 10, &logo); + + while(1); } diff --git a/st7735.c b/st7735.c index 97e460c..b859039 100644 --- a/st7735.c +++ b/st7735.c @@ -12,19 +12,19 @@ uint8_t st7735_width = 0; uint8_t st7735_height = 0; enum ST7735_ORIENTATION st7735_orientation = ST7735_LANDSCAPE; -static inline void st7735_set_rs() { +static inline void st7735_set_rs(void) { PORTD |= (1 << PD6); } -static inline void st7735_unset_rs() { +static inline void st7735_unset_rs(void) { PORTD &= ~(1 << PD6); } -static inline void st7735_set_rst() { +static inline void st7735_set_rst(void) { PORTD |= (1 << PD7); } -static inline void st7735_unset_rst() { +static inline void st7735_unset_rst(void) { PORTD &= ~(1 << PD7); } @@ -50,7 +50,7 @@ static inline void st7735_write_color(uint16_t color) { } -static inline void st7735_reset() { +static inline void st7735_reset(void) { spi_unset_cs(); st7735_set_rst(); _delay_ms(500); @@ -243,7 +243,7 @@ void st7735_set_addr_win(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) { st7735_write_cmd(ST7735_RAMWR); // write to RAM } -void st7735_draw_pixel(int16_t x, int16_t y, uint16_t color) { +void st7735_draw_pixel(uint8_t x, uint8_t y, uint16_t color) { if(x < 0 || x >= st7735_width || y < 0 || y >= st7735_height){ return; } @@ -259,7 +259,7 @@ void st7735_draw_pixel(int16_t x, int16_t y, uint16_t color) { } -void st7735_fill_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { +void st7735_fill_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t color) { if(x >= st7735_width || y >= st7735_height) { return; } @@ -284,3 +284,79 @@ void st7735_fill_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color spi_set_cs(); } + + +void st7735_draw_bitmap(uint8_t x, uint8_t y, PGM_P bitmap) { + if(x >= st7735_width || y >= st7735_height) { + return; + } + + uint8_t w = pgm_read_word(bitmap); + bitmap += 2; + uint8_t h = pgm_read_word(bitmap); + bitmap += 2; + + if((x + w - 1) >= st7735_width) { + return; + } + if((y + h - 1) >= st7735_height) { + return; + } + + st7735_set_addr_win(x, y, x + w - 1, y + h - 1); + + st7735_set_rs(); + spi_unset_cs(); + + for(uint8_t i = 0; i < h; i++) { + for(uint8_t j = 0; j < w; j++) { + uint16_t color = pgm_read_word(bitmap); + st7735_write_color(color); + bitmap += 2; + } + } + + spi_set_cs(); +} + +void st7735_draw_mono_bitmap(uint8_t x, uint8_t y, PGM_P bitmap, uint16_t color_set, uint16_t color_unset) { + uint8_t w = pgm_read_byte(bitmap++); + uint8_t h = pgm_read_byte(bitmap++); + + if(x >= st7735_width || y >= st7735_height) { + return; + } + + if((x + w - 1) >= st7735_width) { + return; + } + if((y + h - 1) >= st7735_height) { + return; + } + + st7735_set_addr_win(x, y, x + w - 1, y + h - 1); + + st7735_set_rs(); + spi_unset_cs(); + + uint16_t bit_pos = 0; + uint8_t byte = 0; + for(uint8_t i = 0; i < h; i++) { + for(uint8_t j = 0; j < w; j++) { + if(bit_pos % 8 == 0) { + byte = pgm_read_byte(bitmap++); + } + + if(byte & (1 << (bit_pos % 8))) { + st7735_write_color(color_set); + } + else { + st7735_write_color(color_unset); + } + bit_pos++; + } + } + + spi_set_cs(); + +} diff --git a/utils/img_convert.py b/utils/img_convert.py new file mode 100644 index 0000000..99b2fd0 --- /dev/null +++ b/utils/img_convert.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 + +import sys +import os + +from PIL import Image + + +def main(): + if len(sys.argv) != 3: + print("Usage: %s " % sys.argv[0]) + sys.exit(-1) + + img = Image.open(sys.argv[1]).convert('RGB') + + width, height = img.size + + print("Size: %d x %d = %d bytes" % (width, height, width * height * 2)) + + file_name = os.path.basename(sys.argv[2]) + include_guard = file_name.replace('.','_').upper() + variable_name = '_'.join(file_name.split('.')[:-1]) + + output_file = open(sys.argv[2], 'w') + output_file.write("#ifndef _%s_\n" % include_guard) + output_file.write("#define _%s_\n" % include_guard) + output_file.write("#include \n\n") + output_file.write("static const uint16_t PROGMEM %s[] = {\n" % variable_name) + output_file.write("\t0x%x, 0x%x,\n" % (width, height)) + + for y in range(0, height): + output_file.write("\t") + + for x in range(0, width): + r, g, b = img.getpixel((x, y)) + + packed_color = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3) + output_file.write("0x%x, " % packed_color) + + output_file.write("\n") + + output_file.write("};\n") + output_file.write("#endif\n") + output_file.close() + + +if __name__ == '__main__': + main() diff --git a/utils/img_convert_mono.py b/utils/img_convert_mono.py new file mode 100644 index 0000000..a792844 --- /dev/null +++ b/utils/img_convert_mono.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import sys +import os + +from PIL import Image + + +def main(): + if len(sys.argv) != 3: + print("Usage: %s " % sys.argv[0]) + sys.exit(-1) + + img = Image.open(sys.argv[1]).convert('RGB') + + width, height = img.size + + print("Size: %d x %d = %d bytes" % (width, height, width * height / 8)) + + file_name = os.path.basename(sys.argv[2]) + include_guard = file_name.replace('.','_').upper() + variable_name = '_'.join(file_name.split('.')[:-1]) + + output_file = open(sys.argv[2], 'w') + output_file.write("#include \n\n") + output_file.write("#ifndef _%s_\n" % include_guard) + output_file.write("#define _%s_\n" % include_guard) + output_file.write("static const uint8_t PROGMEM %s[] = {\n" % variable_name) + output_file.write("\t0x%x, 0x%x,\n" % (width, height)) + + bit_pos = 0 + bits = 0 + + for y in range(0, height): + output_file.write("\t") + for x in range(0, width): + r, g, b = img.getpixel((x, y)) + + if (r + b + g) / 3 > 127: + bits = bits | (1 << (bit_pos % 8)) + + bit_pos += 1 + + if bit_pos % 8 == 0: + output_file.write("0x%x, " % bits) + bits = 0 + + output_file.write("\n") + + output_file.write("};\n") + output_file.write("#endif\n") + output_file.close() + + +if __name__ == '__main__': + main()