From 6839a46358b9358d7ab62e923a0de5602185aaff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sun, 12 Jan 2020 13:15:21 +0100 Subject: [PATCH] add new bitmaps, bitmap drawing func (broken) --- main/graphics/bitmaps.c | 60 +++++++++++++++++++++++++++++++-- main/graphics/drawing.c | 24 +++++++++++-- main/graphics/drawing.h | 5 ++- main/scenes/scene_bootanim.c | 2 +- main/scenes/scene_manual_menu.c | 8 +++-- 5 files changed, 90 insertions(+), 9 deletions(-) diff --git a/main/graphics/bitmaps.c b/main/graphics/bitmaps.c index 458a5b1..4e7d01e 100644 --- a/main/graphics/bitmaps.c +++ b/main/graphics/bitmaps.c @@ -3,6 +3,60 @@ #include +/* 24x24: no_flame */ +// ··········██····█······· +// ···········██···██······ +// ············██·········· +// ············███·····█··· +// ·······█····███····█···· +// ·····██····█████··█···█· +// ····██···██████··█···█·· +// ····█···██████··█···█··· +// ···██··██████··█···█···· +// ···█··██████··█···█····· +// ···█··█████··█···█······ +// ······████··█···█······· +// ·······██··█···█··█··█·· +// ··········█···█··██··██· +// ···█·····█···█··████··█· +// ··█·····█···█··█████···· +// ··██···█···█··██████···· +// ··██··█···█····█████···· +// ·····█···█·····█████···· +// ····█···█······█·███···· +// ···█···█·········██····· +// ··█···█·········██······ +// ·····█··██······█······· +// ····█··········█········ +static const uint8_t G_NO_FLAME_BYTES[] = { 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x20, 0x10, 0x80, 0xc0, 0xc1, 0xe3, 0xfe, 0xfc, 0x78, 0x20, 0x83, 0x42, 0x20, 0x10, 0x88, 0x40, 0x20, 0x00, 0x00, 0x00, 0x80, 0x47, 0x01, 0x00, 0x0e, 0x1f, 0x9f, 0x4f, 0x27, 0x13, 0x89, 0x44, 0x22, 0x91, 0xc8, 0xe4, 0xf2, 0xc1, 0x00, 0x30, 0x60, 0x00, 0x00, 0x00, 0x23, 0x13, 0x88, 0x44, 0x22, 0x11, 0x48, 0x44, 0x02, 0x01, 0x00, 0x00, 0x01, 0x8f, 0x67, 0x3f, 0x1f, 0x0f, 0x00, 0x00, 0x00, 0x00 }; + +/* 24x24: flame */ +// ··········██····█······· +// ···········██···██······ +// ············██·········· +// ············███········· +// ·······█····███········· +// ·····██····█████···█···· +// ····██···███████··█····· +// ····█···███████··██····· +// ···██··████████·██······ +// ···█··████████··██······ +// ···█··████████·███······ +// ······████████·████····· +// ·······████·███·███··█·· +// ········███·███████··██· +// ···█·····██··███████··█· +// ··█·······██·███████···· +// ··██·····███··██████···· +// ··█████·████···█████···· +// ···█████████···█████···· +// ····██████·····█·███···· +// ·····███·········██····· +// ······███·······██······ +// ········██······█······· +// ···············█········ +static const uint8_t G_FLAME_BYTES[] = { 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x20, 0x10, 0x80, 0xc0, 0xc1, 0xe3, 0xfe, 0xfc, 0xf8, 0x60, 0x03, 0x82, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x47, 0x01, 0x00, 0x0e, 0x1f, 0x3f, 0x7f, 0xff, 0x8f, 0x3f, 0xff, 0xf1, 0xec, 0xff, 0xff, 0xf8, 0xc0, 0x00, 0x30, 0x60, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0e, 0x1e, 0x3e, 0x3c, 0x6e, 0x4f, 0x07, 0x07, 0x00, 0x00, 0x01, 0x8f, 0x67, 0x3f, 0x1f, 0x0f, 0x00, 0x00, 0x00, 0x00 }; + /* 84x48: boot_logo */ // ···················································································· // ·····································································████████······· @@ -55,17 +109,19 @@ static const uint8_t G_BOOT_LOGO_BYTES[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0x40, 0xc0, 0xc0, 0x40, 0xc0, 0xa0, 0xa0, 0x20, 0xa0, 0xa0, 0xe0, 0x60, 0xd0, 0x90, 0xd0, 0xd0, 0xf0, 0xf0, 0xc8, 0xe8, 0xe8, 0xb8, 0xb8, 0x64, 0xd4, 0xb4, 0x94, 0x9c, 0x14, 0x0c, 0x0c, 0x1c, 0x14, 0x34, 0x34, 0x34, 0x12, 0x1a, 0x0a, 0x0a, 0x06, 0x82, 0x82, 0x82, 0x44, 0x44, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc0, 0xc0, 0x60, 0x60, 0x60, 0x50, 0x30, 0x30, 0x38, 0x3c, 0x3c, 0x2c, 0x2c, 0x3c, 0x2e, 0x2e, 0x3e, 0x3e, 0x37, 0x3d, 0x2b, 0x3f, 0x3d, 0x2f, 0x3f, 0x3f, 0x5f, 0x4d, 0xad, 0x25, 0x16, 0x1d, 0x1f, 0x1e, 0x0a, 0x1b, 0x09, 0x0d, 0x04, 0x02, 0x03, 0x03, 0xc3, 0x43, 0x43, 0x43, 0xa5, 0x63, 0x23, 0x22, 0x21, 0x91, 0xd1, 0x31, 0x11, 0x08, 0x08, 0x28, 0x58, 0x2c, 0x04, 0x34, 0x1c, 0x16, 0x0a, 0x0a, 0x16, 0x0a, 0x05, 0x01, 0x04, 0x0b, 0x0f, 0x3c, 0x10, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x09, 0x10, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x38, 0xe8, 0x08, 0xf4, 0x4c, 0x32, 0x29, 0x10, 0x08, 0x00, 0x10, 0x48, 0x84, 0x02, 0x05, 0x02, 0x05, 0x02, 0x01, 0x00, 0x00, 0x02, 0x05, 0x82, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x80, 0x87, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0x10, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8c, 0xb0, 0xc0, 0x80, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x11, 0x16, 0x18, 0x30, 0x28, 0x08, 0x08, 0x08, 0x08, 0x04, 0x05, 0x06, 0x04, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0xa1, 0x41, 0xa1, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0c, 0x05, 0x06, 0x02, 0x02, 0x02, 0x01, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x02, 0x07, 0x02, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x7f, 0x44, 0x44, 0x44, 0x2b, 0x10, 0x00, 0x02, 0xff, 0x19, 0x29, 0x29, 0x49, 0x49, 0xc6, 0x04, 0x0a, 0x09, 0x3f, 0x49, 0x49, 0x49, 0x49, 0x41, 0x21, 0x21, 0x00, 0x50, 0x38, 0x16, 0x11, 0x16, 0x18, 0x70, 0x40, 0x00, 0x21, 0x21, 0x3f, 0x21, 0x21, 0x11, 0x09, 0x06, 0x00, 0x0a, 0x09, 0x7f, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x1e, 0x21, 0x20, 0x20, 0x20, 0x20, 0x0e, 0x11, 0x20, 0x10, 0x09, 0x06, 0x00, 0x00, 0x00, 0x07, 0x18, 0x21, 0x1f, 0x08, 0x10, 0x20, 0x10, 0x0f, 0x00, 0x00, 0x00 }; static const struct BitmapImage bitmaps[] = { + { .name="no_flame", .width=24, .height=24, .bytes=G_NO_FLAME_BYTES }, + { .name="flame", .width=24, .height=24, .bytes=G_FLAME_BYTES }, { .name="boot_logo", .width=84, .height=48, .bytes=G_BOOT_LOGO_BYTES }, {} }; const struct BitmapImage *Bitmap_Get(const char *name) { - const struct BitmapImage *ptr = &bitmaps[0]; + const struct BitmapImage *ptr = bitmaps; while (ptr->name) { if (0 == strcmp(ptr->name, name)) { return ptr; } + ptr++; } return NULL; } - \ No newline at end of file diff --git a/main/graphics/drawing.c b/main/graphics/drawing.c index a56ebde..4708f04 100644 --- a/main/graphics/drawing.c +++ b/main/graphics/drawing.c @@ -1,6 +1,7 @@ #include "drawing.h" #include "display_spec.h" #include "font.h" +#include "bitmaps.h" extern uint8_t LCD_displayMap[LCD_WIDTH * LCD_HEIGHT / 8]; @@ -314,13 +315,32 @@ void LCD_setStrEx(const char *dString, int x, int y, enum Color color, struct Te // This function will draw an array over the screen. (For now) the // array must be the same size as the screen, covering the entirety // of the display. -void LCD_setBitmap(const uint8_t *bitArray) +void LCD_setBitmapFullScreen(const uint8_t *bitArray) { - for (int i = 0; i < (LCD_WIDTH * LCD_HEIGHT / 8); i++) { + for (int i = 0; i < sizeof(LCD_displayMap); i++) { LCD_displayMap[i] = bitArray[i]; } } +void LCD_setBitmap(const struct BitmapImage *image, int x, int y, bool bg, enum Color color) +{ + int byte_count = image->width * (image->height + 7) / 8; + + for (int xi = 0; xi < image->width; xi++) { + for (int yi = 0; yi < image->height; yi++) { + int idx = xi + ((yi + 7) / 8) * image->width; + if (idx > byte_count) continue; + bool bit = image->bytes[idx] & (1 << yi); + if (bit) { + LCD_setPixel(x + xi, y + yi, color); + } + else if (bg) { + LCD_setPixel(x + xi, y + yi, !color); + } + } + } +} + // This function clears the entire display either white (0) or // black (1). // The screen won't actually clear until you call updateDisplay()! diff --git a/main/graphics/drawing.h b/main/graphics/drawing.h index 6ebafef..ac4090e 100644 --- a/main/graphics/drawing.h +++ b/main/graphics/drawing.h @@ -11,6 +11,7 @@ #include #include "utf8.h" +#include "bitmaps.h" enum Color { WHITE = 0, @@ -34,7 +35,7 @@ void LCD_setRect(int x0, int y0, int x1, int y1, bool fill, enum Color bw); // thickness ranging from 1 to the radius of the circle. void LCD_setCircle (int x0, int y0, int radius, enum Color bw, int lineThickness); -void LCD_setBitmap(const uint8_t *bitArray); +void LCD_setBitmapFullScreen(const uint8_t *bitArray); /* FONT FUNCTIONS @@ -84,4 +85,6 @@ void LCD_clearDisplay(enum Color bw); /* Invert colors (hard change in data; does NOT send to display immediately) */ void LCD_invertDisplayData(); +void LCD_setBitmap(const struct BitmapImage *image, int x, int y, bool bg, enum Color color); + #endif //LCD_DRAWING_H diff --git a/main/scenes/scene_bootanim.c b/main/scenes/scene_bootanim.c index 98fa0ce..d3aec8a 100644 --- a/main/scenes/scene_bootanim.c +++ b/main/scenes/scene_bootanim.c @@ -24,7 +24,7 @@ static struct SceneEvent onTick(struct BootScene *self, uint32_t millis) { static void paint(struct BootScene *self) { LCD_clearDisplay(0); - LCD_setBitmap(Bitmap_Get("boot_logo")->bytes); + LCD_setBitmapFullScreen(Bitmap_Get("boot_logo")->bytes); } struct Scene *NewScene_Boot(void) { diff --git a/main/scenes/scene_manual_menu.c b/main/scenes/scene_manual_menu.c index c300e7c..340d2ad 100644 --- a/main/scenes/scene_manual_menu.c +++ b/main/scenes/scene_manual_menu.c @@ -78,12 +78,14 @@ static void paint(struct MenuScene *self) LCD_setStrEx(buf, XLINE/2, 0, BLACK, (struct TextStyle) {.size = FONT_DOUBLE, .align = ALIGN_CENTER}); LCD_setStrEx("°C", XLINE/2, 17, BLACK, (struct TextStyle) {.align = ALIGN_CENTER}); //.size = FONT_BOLD, + const struct BitmapImage *img; if (fire_enabled()) { - strcpy(buf, "RUN"); + img = Bitmap_Get("flame"); } else { - strcpy(buf, "Off"); + img = Bitmap_Get("no_flame"); } - LCD_setStrEx(buf, 0, 30, BLACK, (struct TextStyle) {.size = FONT_BOLD}); + + LCD_setBitmap(img, XLINE/2-24/2, 26, false, BLACK); priv->basePaint((struct Scene *) self); }